My apologies, I mis-understood the email below.
After re-reading it, I retract my question.

Sorry,
David

________________________________
From: [email protected] [[email protected]] on 
behalf of Jesse McConnell [[email protected]]
Sent: Friday, May 24, 2013 13:28
To: JETTY user mailing list
Subject: Re: [jetty-users] Jetty 9 bug


Has there been a decision to upgrade "SHOULD" requirements to "MUST" for
other fields as well?

sorry, I am not understanding your question?  A decision by whom for what 
exactly? If User-Agent header should be required?

cheers,
jesse



________________________________
From: [email protected]<mailto:[email protected]> 
[[email protected]<mailto:[email protected]>] on 
behalf of Joakim Erdfelt [[email protected]<mailto:[email protected]>]
Sent: Friday, May 24, 2013 11:04
To: JETTY user mailing list
Subject: Re: [jetty-users] Jetty 9 bug

Per RFC2616 (The HTTP/1.1 spec)
Section 14.43  User-Agent.
http://tools.ietf.org/html/rfc2616#section-14.43

You are required to provide a value, otherwise the header is deemed invalid.

In your example request headers, jetty parses the User-Agent header, sees no 
valid, deems it to be bad, and excludes it from the header map.
Jetty has a philosophy of being tolerant on what it can accept, and strict on 
what it generates.
If we didn't have this philosophy, your bad header would result in an error 400 
(Bad Request).

The fact that Jetty 8 gave you a blank is that Jetty 8 had the bug of keeping a 
reference to a bad header.
The Jetty 8 behavior is at best, undefined.

With the common http handling introduced in Jetty 9 (for HTTP 1.0, HTTP 1.1, 
SPDY, and HTTP 2.0) many of these kinds of undefined behavior have been 
addressed.

Sorry :(


--
Joakim Erdfelt <[email protected]<mailto:[email protected]>>
webtide.com<http://www.webtide.com/>
Developer advice, services and support
from the Jetty & CometD experts
eclipse.org/jetty<http://eclipse.org/jetty/> - cometd.org<http://cometd.org/>


On Fri, May 24, 2013 at 10:30 AM, Denis Bardadym 
<[email protected]<mailto:[email protected]>> wrote:
Hello.

I found that jetty 9.0.2.v20130417 HttpServletRequest.getHeader return null 
when header is empty. You can see this in simple application:

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.servlet.ServletHandler;

public class MinimalServlets {

    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);
        ServletHandler handler = new ServletHandler();
        server.setHandler(handler);
        handler.addServletWithMapping(HelloServlet.class, "/*");
        server.start();
        server.join();
    }

    public static class HelloServlet extends HttpServlet {

        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException {
            response.setContentType("text/html");
            response.setStatus(HttpServletResponse.SC_OK);
            java.io.Writer w = response.getWriter();
            w.println(request.getHeader("User-Agent"));
            w.println(request.getHeader("X-Not-Exists"));
        }
    }
}

When i send curl request like this:

mac:liftweb den$ curl -v -D - -H "User-Agent;" -H "User-Agent:" 
http://localhost:8080
* About to connect() to localhost port 8080 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> Accept: */*
> User-Agent:
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Content-Type: text/html; charset=ISO-8859-1
Content-Type: text/html; charset=ISO-8859-1
< Transfer-Encoding: chunked
Transfer-Encoding: chunked
< Server: Jetty(9.0.2.v20130417)
Server: Jetty(9.0.2.v20130417)

<
null
null
* Connection #0 to host localhost left intact
* Closing connection #0

It returns both nulls. But by javadoc it should return null only if header not 
presented but you see that User-Agent: just empty.

This does not happen in jetty8:

@SuppressWarnings("serial")
public class HelloServlet extends HttpServlet
{
    String greeting = "Hello";

    public HelloServlet()
    {
    }

    public HelloServlet(String hi)
    {
        greeting = hi;
    }

    private String getVal(String s) {
        if(s == null) return "null";
        else return s;
    }

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse 
response) throws ServletException, IOException
    {
        response.setContentType("text/html");
        response.setStatus(HttpServletResponse.SC_OK);
        PrintWriter writer = response.getWriter();
        writer.println("User-Agent: " + 
getVal(request.getHeader("User-Agent")));
        writer.println("X-Not-Exists: " + 
getVal(request.getHeader("X-Not-Exists")));
        writer.flush();
        writer.close();
    }
}

and
public class OneServletContext {
    public static void main(String[] args) throws Exception {
        Server server = new Server(8080);

        ServletContextHandler context = new 
ServletContextHandler(ServletContextHandler.SESSIONS);
        context.setContextPath("/");
        server.setHandler(context);

        // Server content from tmp
        ServletHolder holder = 
context.addServlet(org.eclipse.jetty.servlet.DefaultServlet.class, "/tmp/*");
        holder.setInitParameter("resourceBase", "/tmp");
        holder.setInitParameter("pathInfoOnly", "true");

        // Serve some hello world servlets
        context.addServlet(new ServletHolder(new HelloServlet()), "/*");
        context.addServlet(new ServletHolder(new HelloServlet("Buongiorno 
Mondo")), "/it/*");
        context.addServlet(new ServletHolder(new HelloServlet("Bonjour le 
Monde")), "/fr/*");

        server.start();
        server.join();
    }
}

so when i send it request:

mac:liftweb den$ curl -v -D - -H "User-Agent;" -H "User-Agent:" 
http://localhost:8080
* About to connect() to localhost port 8080 (#0)
*   Trying ::1...
* connected
* Connected to localhost (::1) port 8080 (#0)
> GET / HTTP/1.1
> Host: localhost:8080
> Accept: */*
> User-Agent:
>
< HTTP/1.1 200 OK
HTTP/1.1 200 OK
< Content-Type: text/html;charset=ISO-8859-1
Content-Type: text/html;charset=ISO-8859-1
< Transfer-Encoding: chunked
Transfer-Encoding: chunked
< Server: Jetty(8.1.10.v20130312)
Server: Jetty(8.1.10.v20130312)

<
User-Agent:
X-Not-Exists: null
* Connection #0 to host localhost left intact
* Closing connection #0


Does it really bug??

Thanks, Denis Bardadym.


_______________________________________________
jetty-users mailing list
[email protected]<mailto:[email protected]>
https://dev.eclipse.org/mailman/listinfo/jetty-users


_______________________________________________
jetty-users mailing list
[email protected]<mailto:[email protected]>
https://dev.eclipse.org/mailman/listinfo/jetty-users


_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users

Reply via email to