Re: New Version Notification for draft-kazuho-early-hints-status-code-00.txt

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