Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-31 Thread Isaac Li
Hi,

On Tue, Aug 30, 2011 at 5:31 PM, Konstantin Kolinko
knst.koli...@gmail.comwrote:


 Attachments are usually dropped by mailing list software. The one you
 mention above is no exception.



  GET / HTTP/1.1
  Date: Tue, 30 Aug 2011 02:28:50 GMT
  Content-Type:
  Authorization: AWS AKIAJHSWPWM6W6KUXAIQ:u4QnOMbP0vuTsgpUXQ0WfXIWz9c=
  Host: s3.amazonaws.com:80
  Connection: Keep-Alive
  User-Agent: Cyberduck/4.1 (8911) (Windows 7/6.1) (x86)
  Accept-Encoding: gzip,deflate

 1) GET requests cannot have content, and thus having a Content-Type
 header there is confusing.

 2) Content-Type header is defined in section 14.17 of RFC2616 as

 Content-Type   = Content-Type : media-type

 and

 media-type = type / subtype *( ; parameter )

 The media-type is not optional and it cannot be empty.


Thanks for letting me know and your further explanation!


By the way, my friend has provide me a workaround using filter, post it here
in case some other might need it.

I have tested it locally and it works.


1)   CleanHeaderFilter.java

package org.sample;

import java.io.IOException;
import java.util.Collection;
import java.util.Collections;
import java.util.Enumeration;
import java.util.LinkedList;
import java.util.List;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class CleanHeaderFilter implements Filter {

@Override
public void init(FilterConfig filterConfig) throws ServletException {
}

@Override
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain)
throws IOException, ServletException {

HttpServletRequest httpReq = new
HttpServletRequestWrapper((HttpServletRequest) request) {

@Override
public Enumeration getHeaderNames() {
if (GET.equalsIgnoreCase(getMethod())) {
CollectionString c = new LinkedListString();
Enumeration headers = super.getHeaderNames();
while (headers.hasMoreElements()) {
String header = (String) headers.nextElement();
if (!Content-Type.equalsIgnoreCase(header)) {
c.add(header);
} else {
System.err.println(Remove Content-Type for
GET);
}
}
return Collections.enumeration(c);
}
return super.getHeaderNames();
}

};
chain.doFilter(httpReq, response);
}

@Override
public void destroy() {
}

}

2) add following config to your web.xml

  filter

filter-namecleanHeaderFilter/filter-name

filter-classorg.sample.CleanHeaderFilter/filter-class

  /filter

  filter-mapping

filter-namecleanHeaderFilter/filter-name

url-pattern/*/url-pattern

  /filter-mapping


Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-30 Thread Mark Thomas
On 30/08/2011 03:00, Isaac Li wrote:
 Thank André and Mark for your quick response, detailed answer and
 references!
 
 I'll try to report this issue to Cyberduck.
 
 One more question: when I uses current version of Cyberduck to connect
 Amazon S3, it can accept this kind of invalid request,
 is it a kind of fault tolerance design of  Amazon S3?

I assume so.

 Should it be encouraged?

Servers should be tolerant of client errors but that is not an excuse
for clients to violate the spec. It is certainly possible to modify
Tomcat to add an option to ignore the invalid header but given the
rarity of clients that do this, I don't see such a change as a priority.

Mark

 or I missed something here?
 
 
 On Mon, Aug 29, 2011 at 9:44 PM, Mark Thomas ma...@apache.org wrote:
 
 On 29/08/2011 09:10, Isaac Li wrote:
 Hello,

 I'm using Cyberduck as client to send request to my web server which
 using
 apache-tomcat-7.0.16 as web container.

 When Cyberduck sent a request with an empty Content Type, web server
 returned following errors:

 Cyberduck is broken and is violating RFC2616.

 HTTP/1.1 400 Bad Request (text/plain)

 Bad Content-Type header value: ''

 I thought this error is reported by tomcat, since it has not running into
 my
 code.

 Tomcat is rejected this request. The request is invalid.

 I've enabled Tomcat debug log, and have no clue, following are some
 catalina
 log:

 If you want a clue, try reading RFC2616.

 So is it possible to modify tomcat setting to allow empty Content Type of
 request?

 No.

 or I should try other ways (I heard someone said adding some
 filters?)

 Whoever said a filter was a solution to this problem is clueless. The
 request is rejected long before the filters are reached.

  - and What's the detailed steps?

 1. Get the bug in Cyberduck fixed.
 2. Try again.

 Mark

 -
 To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
 For additional commands, e-mail: users-h...@tomcat.apache.org


 


-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-30 Thread Konstantin Kolinko
2011/8/30 Isaac Li tingjun...@gmail.com:
 On Tue, Aug 30, 2011 at 10:00 AM, Isaac Li tingjun...@gmail.com wrote:

 Thank André and Mark for your quick response, detailed answer and
 references!
 I'll try to report this issue to Cyberduck.
 One more question: when I uses current version of Cyberduck to connect
 Amazon S3,

 See request at No.25 of  Cyberduck_login_amazon_s3_ok.pcap (attched)

Attachments are usually dropped by mailing list software. The one you
mention above is no exception.

 GET / HTTP/1.1
 Date: Tue, 30 Aug 2011 02:28:50 GMT
 Content-Type:
 Authorization: AWS AKIAJHSWPWM6W6KUXAIQ:u4QnOMbP0vuTsgpUXQ0WfXIWz9c=
 Host: s3.amazonaws.com:80
 Connection: Keep-Alive
 User-Agent: Cyberduck/4.1 (8911) (Windows 7/6.1) (x86)
 Accept-Encoding: gzip,deflate

1) GET requests cannot have content, and thus having a Content-Type
header there is confusing.

2) Content-Type header is defined in section 14.17 of RFC2616 as

Content-Type   = Content-Type : media-type

and

media-type = type / subtype *( ; parameter )

The media-type is not optional and it cannot be empty.


Best regards,
Konstantin Kolinko

-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-29 Thread André Warnier

Isaac Li wrote:

Hello,

I'm using Cyberduck as client to send request to my web server which using
apache-tomcat-7.0.16 as web container.

When Cyberduck sent a request with an empty Content Type, web server
returned following errors:

HTTP/1.1 400 Bad Request (text/plain)

Bad Content-Type header value: ''


That is clearly incorrect, so Tomcat would be right to complain.




I thought this error is reported by tomcat, since it has not running into my
code.



...


So is it possible to modify tomcat setting to allow empty Content Type of
request? 


Why should Tomcat be modifiedt to accept incorrect HTTP requests ?
Tomcat is a HTTP server, so it must follow the HTTP specs.  And the HTTP specs probably 
say that if a request header is clearly incorrect (as this one is), the server MUST 
respond with a 400 error.


or I should try other ways

Yes, fix the client.
(Or report the problem on the Cyberduck mailing list).

 (I heard someone said adding some

filters?)


Would probably not help, as the error may be generated before the filter is 
ever called.


-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-29 Thread Mark Thomas
On 29/08/2011 09:10, Isaac Li wrote:
 Hello,
 
 I'm using Cyberduck as client to send request to my web server which using
 apache-tomcat-7.0.16 as web container.
 
 When Cyberduck sent a request with an empty Content Type, web server
 returned following errors:

Cyberduck is broken and is violating RFC2616.

 HTTP/1.1 400 Bad Request (text/plain)
 
 Bad Content-Type header value: ''
 
 I thought this error is reported by tomcat, since it has not running into my
 code.

Tomcat is rejected this request. The request is invalid.

 I've enabled Tomcat debug log, and have no clue, following are some catalina
 log:

If you want a clue, try reading RFC2616.

 So is it possible to modify tomcat setting to allow empty Content Type of
 request?

No.

 or I should try other ways (I heard someone said adding some
 filters?)

Whoever said a filter was a solution to this problem is clueless. The
request is rejected long before the filters are reached.

  - and What's the detailed steps?

1. Get the bug in Cyberduck fixed.
2. Try again.

Mark

-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org



Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-29 Thread Isaac Li
Thank André and Mark for your quick response, detailed answer and
references!

I'll try to report this issue to Cyberduck.

One more question: when I uses current version of Cyberduck to connect
Amazon S3, it can accept this kind of invalid request,
is it a kind of fault tolerance design of  Amazon S3?  Should it be
encouraged?  or I missed something here?


On Mon, Aug 29, 2011 at 9:44 PM, Mark Thomas ma...@apache.org wrote:

 On 29/08/2011 09:10, Isaac Li wrote:
  Hello,
 
  I'm using Cyberduck as client to send request to my web server which
 using
  apache-tomcat-7.0.16 as web container.
 
  When Cyberduck sent a request with an empty Content Type, web server
  returned following errors:

 Cyberduck is broken and is violating RFC2616.

  HTTP/1.1 400 Bad Request (text/plain)
 
  Bad Content-Type header value: ''
 
  I thought this error is reported by tomcat, since it has not running into
 my
  code.

 Tomcat is rejected this request. The request is invalid.

  I've enabled Tomcat debug log, and have no clue, following are some
 catalina
  log:

 If you want a clue, try reading RFC2616.

  So is it possible to modify tomcat setting to allow empty Content Type of
  request?

 No.

  or I should try other ways (I heard someone said adding some
  filters?)

 Whoever said a filter was a solution to this problem is clueless. The
 request is rejected long before the filters are reached.

   - and What's the detailed steps?

 1. Get the bug in Cyberduck fixed.
 2. Try again.

 Mark

 -
 To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
 For additional commands, e-mail: users-h...@tomcat.apache.org




Re: Is empty Content Type of Request allowed in Tomcat?

2011-08-29 Thread Isaac Li
On Tue, Aug 30, 2011 at 10:00 AM, Isaac Li tingjun...@gmail.com wrote:

 Thank André and Mark for your quick response, detailed answer and
 references!

 I'll try to report this issue to Cyberduck.

 One more question: when I uses current version of Cyberduck to connect
 Amazon S3,


See request at No.25 of  Cyberduck_login_amazon_s3_ok.pcap (attched)

GET / HTTP/1.1
Date: Tue, 30 Aug 2011 02:28:50 GMT
Content-Type:
Authorization: AWS AKIAJHSWPWM6W6KUXAIQ:u4QnOMbP0vuTsgpUXQ0WfXIWz9c=
Host: s3.amazonaws.com:80
Connection: Keep-Alive
User-Agent: Cyberduck/4.1 (8911) (Windows 7/6.1) (x86)
Accept-Encoding: gzip,deflate



 it can accept this kind of invalid request,


request at No.31 of Cyberduck_login_amazon_s3_ok.pcap

31 5.805868 207.171.189.80 192.168.1.104 HTTP/XML 64 HTTP/1.1 200 OK



 Is it a kind of fault tolerance design of  Amazon S3?  Should it be
 encouraged?  or I missed something here?


-
To unsubscribe, e-mail: users-unsubscr...@tomcat.apache.org
For additional commands, e-mail: users-h...@tomcat.apache.org