When you talk about HTT/2.0 Upgrades, do you also deal with TLS? You can use a 
network tracer instead of curl to debug the whole exchange.

But you might need to turn on TLS debug to dump the session key (so the 
protocol analyser like wireshark can actually decrypt it)

BTW you added one empty line too much in your Simulator Server now, so it’s 62 
bytes.

Gruss
Bernd
--
http://bernd.eckenfels.net
________________________________
From: net-dev <net-dev-boun...@openjdk.java.net> on behalf of Simon Roberts 
<si...@dancingcloudservices.com>
Sent: Tuesday, May 15, 2018 10:47:35 PM
To: net-dev@openjdk.java.net
Subject: Re: EOF excption in HTTP 1.1 server interaction

Well, I give up. I'ts something to do with nodejs (which would seem like a 
popular enough server to be of interest, but whatever) and perhaps the way that 
node responds when asked to perform an HTTP2.0 upgrade.

Node generated a response that caused httpClient to fail. I used curl to try to 
extract that response and pasted it into my "fake server". The response from my 
fake server works. Of course, the one remaining difference is that I cannot 
tell how node might be reacting to the upgrade request, since curl didn't issue 
that part of the request. So, I think the problem is there.

  public static final String[] response = {
      "HTTP/1.1 200 OK",
      "X-Powered-By: Expressd",
      "Content-Type: text/html; charset=utf-8",
      "Content-Length: 60",
      "ETag: W/\"3c-CQHFqoSATSxoI5iZHLfu5OeEG3k\"",
      "Date: Tue, 15 May 2018 20:34:49 GMT",
      "Connection: keep-alive",
      "",
      "",
      "<html><body><h1>Heading</h1><p>Some Text</p></body></html>",
      ""
  };

  public static void main(String[] args) throws Throwable {
    var ss = new ServerSocket(8080);
    var s = ss.accept();
    var in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
      System.out.println("< " + line);
      if ("".equals(line)) break;
    }
    var out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
    for (var st : response) {
      out.print(st + "\r\n");
      System.out.println("> " + st);
    }
    out.flush();
    s.close();
  }
}

On Tue, May 15, 2018 at 1:55 PM Simon Roberts 
<si...@dancingcloudservices.com<mailto:si...@dancingcloudservices.com>> wrote:
Wooops, bran failure. JLS 3.10.4 :( Will fix to use \r\n and get back...


On Tue, May 15, 2018 at 1:43 PM Bernd Eckenfels 
<e...@zusammenkunft.net<mailto:e...@zusammenkunft.net>> wrote:
Try using out.print(st+“\n\r“); instead. (And Account for the extra bytes in 
the body as well or output the last string without the EOLs.

Gruss
Bernd
--
http://bernd.eckenfels.net
________________________________
From: net-dev 
<net-dev-boun...@openjdk.java.net<mailto:net-dev-boun...@openjdk.java.net>> on 
behalf of Simon Roberts 
<si...@dancingcloudservices.com<mailto:si...@dancingcloudservices.com>>
Sent: Tuesday, May 15, 2018 8:44:08 PM
To: net-dev@openjdk.java.net<mailto:net-dev@openjdk.java.net>
Subject: Re: EOF excption in HTTP 1.1 server interaction

Thanks for the clarification; as I mentioned, I tried a number of variations, 
with and without the "excess" empty lines. I also copied the output from a curl 
session with a server that provides a successful interaction with the client 
(so the content length etc were all correct). In every case the *send* failed 
regardless. I'm finding myself inclined to believe that something about the way 
the upgrade to 2.0 request is being handled is relevant. That said, I'm unsure 
what line endings I'm sending in my fake server, but I'm running on Linux, not 
windows (perhaps that's your point).

So that we can finally put to bed one way or the other the suggestion that this 
is the server-side's fault, perhaps you could indicate an exact (minimal) 
string, that you believe should work in my fake-server? I'm not an expert in 
the HTTP specification, so it could be pretty inefficient to keep cycling round 
this loop ;)



On Tue, May 15, 2018 at 12:16 PM Bernd Eckenfels 
<e...@zusammenkunft.net<mailto:e...@zusammenkunft.net>> wrote:
Your example code writes 2 (emp5) lines more than the Content-Length includes. 
You should also use crlf for the end of http headers (Sample works only on 
Windows)ö

Gruss
Bernd

Gruss
Bernd
--
http://bernd.eckenfels.net
________________________________
From: net-dev 
<net-dev-boun...@openjdk.java.net<mailto:net-dev-boun...@openjdk.java.net>> on 
behalf of Simon Roberts 
<si...@dancingcloudservices.com<mailto:si...@dancingcloudservices.com>>
Sent: Tuesday, May 15, 2018 7:22:27 PM
To: net-dev@openjdk.java.net<mailto:net-dev@openjdk.java.net>
Subject: EOF excption in HTTP 1.1 server interaction

(Added subject line, sorry, not sure how I missed that in the first place!)

I can pretty much confirm this has nothing to do with content length. I wrote 
the code below to allow experimentation and even as it stands, which I believe 
has a correct content length, and a bunch of other stuff removed from the 
response) the client still fails. I also tried it with various combinations of 
the response lines commented out, and all of them present, failure every time.

If you'd like to suggest the combination that "should" work, I'd be happy to 
try it of course.

public final class Main {
  public static final String[] response = {
      "HTTP/1.1 200 OK",
//      "X-Powered-By: Express",
//      "Content-Type: text/html; charset=utf-8",
      "Content-Length: 58",
//      "ETag: W/\"3a-EwoPOQKsJivlqZA3z/ulngzMv9U\"",
//      "Date: Tue, 15 May 2018 00:18:47 GMT",
//      "Connection: keep-alive",
      "",
      "<html><body><h1>Heading</h1><p>Some Text</p></body></html>",
      "",
      ""
  };

  public static void main(String[] args) throws Throwable {
    var ss = new ServerSocket(8080);
    var s = ss.accept();
    var in = new BufferedReader(new InputStreamReader(s.getInputStream()));
    String line;
    while ((line = in.readLine()) != null) {
      System.out.println("< " + line);
      if ("".equals(line)) break;
    }
    var out = new PrintWriter(new OutputStreamWriter(s.getOutputStream()));
    for (var st : response) {
      out.println(st);
      System.out.println("> " + st);
    }
    out.flush();
    s.close();

  }
}


On Tue, May 15, 2018 at 9:46 AM Chris Hegarty 
<chris.hega...@oracle.com<mailto:chris.hega...@oracle.com>> wrote:
Simon,

Only a partial reply, I’ll reply with other details later.

> On 15 May 2018, at 16:10, Simon Roberts 
> <si...@dancingcloudservices.com<mailto:si...@dancingcloudservices.com>> wrote:
>
> If I understand you correctly, you are saying that the "simple" version of 
> the code-code by the way that the project's main web page presents as it's 
> first example--is so simple that it's actually unusable in any production 
> scenario.

That is not what I am saying. What I am saying is that the String handler is a 
convenience handler that buffers all the response data and returns it once 
decoded. In some circumstances it is just not possible to return, as a String, 
the response data, if the server behaves incorrectly. In the scenario you are 
encountering it appears that the server is returning too little data. It may 
not be possible to always decode this partial data. And even if you do decode 
this partial data, something further up the stack is likely to fail, if parsing 
JSON for example.

My point is that if you want fault tolerance in the case of a misbehaving 
server there are other ways to achieve that.

> I know I cannot use code for production that fails to read any data from a 
> (presumably) merely mis-configured server (a server from which all other 
> tools successfully read data.

What do you hope to do with partial data read from the server? If it’s JSON can 
you decode it, or a gif can you display it?

> Did I interpret correctly, or did I miss something? If correctly, I'd be 
> surprised if that doesn't strike you as sub-optimal to the point your pride 
> in your work would want to make it more usable.

We do have pride in our work. I am engaging here to try to help you.

> It doesn't seem inappropriate to report a "warning" situation using an 
> exception? Would not an aggregate return that includes data, headers, status 
> code, ... and warnings be more helpful in this case?

There are other ways to achieve that, but IMO doing so for the String handler 
would not be helpful to the vast majority of Java developers, that would not 
check the carried warning.

> Mis-configured servers (assuming that's the cause) are not uncommon around 
> the web.

Sure, but many clients will not be able to operate correctly with such, it’s a 
matter of where and how they fail.

> But perhaps more importantly, whatever the problem is, it is not fixed by 
> your code. The error is actually thrown by the *send* call, as I've now 
> determined as a result of trying your code. (I modified it very slightly so 
> as to complete it, and catch the exception.)

D’oh! Apologies, that’s what I get for sending something without testing it 
more carefully, but you seem to have gotten past it.

-Chris


--
Simon Roberts
(303) 249 3613



--
Simon Roberts
(303) 249 3613



--
Simon Roberts
(303) 249 3613



--
Simon Roberts
(303) 249 3613

Reply via email to