I've noticed a difference in behaviour from Jetty HttpClient version
7.2.0 to 7.5.4 when a web server indicates a Content-Length, sends back
some data (but not the full amount) and then closes the connection. With
version 7.2.0 onException() wouldn't be called and onResponseComplete()
would, but in 7.5.4 onException() gets called but not
onResponseComplete(). Note that this only seems to happen when using
HTTP 1.0 with the HttpClient.
Is this change in behaviour expected? Which is the correct behaviour? I
see this in the the HTTP spec (
http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html):
" When a Content-Length is given in a message where a message-body is
allowed, its field value MUST exactly match the number of OCTETs in the
message-body. HTTP/1.1 user agents MUST notify the user when an invalid
length is received and detected."
However, browsers seem to handle the situation without an error.
https://www.fidelity.com is an example of a web page that sets the
Content-Length but doesn't send the full amount.
I've attached a test program that I was using to reproduce this.
Thanks,
Chris
import org.eclipse.jetty.client.ContentExchange;
import org.eclipse.jetty.client.HttpClient;
import org.eclipse.jetty.http.HttpHeaders;
import org.eclipse.jetty.http.HttpSchemes;
import org.eclipse.jetty.util.thread.QueuedThreadPool;
public class JettyTest
{
public static void main(String[] args)
throws Exception
{
HttpClient client = new HttpClient();
ContentExchange exchange = new ContentExchange(true);
try
{
client.setConnectorType(HttpClient.CONNECTOR_SELECT_CHANNEL);
client.setThreadPool(new QueuedThreadPool());
client.setTimeout(30000);
client.start();
exchange.setScheme(HttpSchemes.HTTPS_BUFFER);
exchange.setMethod("GET");
exchange.setVersion("HTTP/1.0");
exchange.addRequestHeader(HttpHeaders.HOST, "www.fidelity.com");
exchange.setURL("https://www.fidelity.com/");
exchange.setRequestHeader("Accept-Encoding", "gzip");
client.send(exchange);
exchange.waitForDone();
System.out.println("Return code: " + exchange.getResponseStatus());
System.out.println("Content-Length: " + exchange.getResponseFields().getStringField("Content-Length"));
System.out.println("Received length: " + exchange.getResponseContent().length());
}
catch (Exception e)
{
System.out.println("Exception: " + e.getMessage());
}
client.stop();
}
}_______________________________________________
jetty-users mailing list
[email protected]
https://dev.eclipse.org/mailman/listinfo/jetty-users