- From: Julian Reschke <julian.reschke@gmx.de>
- Date: Tue, 8 Nov 2016 15:21:22 +0100
- To: Cory Benfield <cory@lukasa.co.uk>, Kazuho Oku <kazuhooku@gmail.com>
- Cc: HTTP Working Group <ietf-http-wg@w3.org>
On 2016-10-31 19:21, Cory Benfield wrote:
> ...
> While I’m here, I’d like to discuss section 3. To provide some data points, most of the HTTP/1.1 clients in the Python ecosystem will not handle a new 1XX status code very well. A quick survey of the ecosystem suggests that the following tools will all misbehave:
>
> - every standard library http client (urllib, urllib2, httplib), all of which treat only “100 Continue” specially: the rest will treat the 103 header block as the final response and, because it MUST NOT have a content-length, will read until connection close.
> - every third-party library built on top of those tools, including urllib3, Requests, and httplib2, which inherit their misbehaviour.
> - aiohttp, which special-cases 100 and 101 but not any others
> - Twisted’s client, which special-cases 100
> ...
FWIW,
I just did a small Java test with a) JDK's URLConnection and b) Apache
HTTP client 4.5.x.
a) Works in that it returns the correct response, but only after waiting
for a timeout to occur it seems (needs to be investigated)
b) Works properly.
Neither API exposes the intermediate status, but at least for b) it
looks like a relatively simple change.
-- snip --
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import org.apache.http.HttpException;
import org.apache.http.HttpResponse;
import org.apache.http.HttpResponseInterceptor;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.protocol.HttpContext;
import org.apache.http.util.EntityUtils;
public class Test103 {
public static void main(String[] args) throws IOException {
apache();
java();
}
private static void apache() throws IOException {
HttpClient c = HttpClientBuilder.create().build();
HttpGet get = new HttpGet("https://nghttp2.org/?103-eh");
HttpResponse resp = c.execute(get);
System.out.println(resp.getStatusLine());
System.out.println(EntityUtils.toString(resp.getEntity()));
}
private static void java() throws IOException {
URL test = new URL("https://nghttp2.org/?103-eh");
InputStream is = test.openConnection().getInputStream();
byte[] bytes = readFully(is);
System.out.println(new String(bytes));
}
public static byte[] readFully(InputStream is) throws IOException {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
int nRead;
byte[] data = new byte[16384];
while ((nRead = is.read(data, 0, data.length)) != -1) {
buffer.write(data, 0, nRead);
}
buffer.flush();
return buffer.toByteArray();
}
}
-- snip --
Best regards, Julian
Received on Tuesday, 8 November 2016 14:21:59 UTC