On Wed, 2020-05-27 at 00:01 +0200, Michael Osipov wrote:
> Am 2020-05-26 um 23:09 schrieb Oleg Kalnichevski:
> > On Tue, 2020-05-26 at 22:28 +0200, Michael Osipov wrote:
> > > Am 2020-05-26 um 20:20 schrieb Oleg Kalnichevski:
> > > > On Tue, 2020-05-26 at 17:58 +0000, Bernd Eckenfels wrote:
> > > > > Michael, this looks a bit like the packets in between have
> > > > > been
> > > > > TLS
> > > > > handshakes which have not been carried out because the engine
> > > > > was
> > > > > not
> > > > > kicked off. Maybe a starHandshake() would help? Or can you
> > > > > share
> > > > > the
> > > > > full traces? Did you try http as well?
> > > > > 
> > > > 
> > > > Michael,
> > > > 
> > > > I can only second what Bernd has said. Try to simplify the
> > > > setup
> > > > and
> > > > see if you can get things to work with plain HTTP first.
> > > > 
> > > > Also feel free to tweak my code as you see fit.
> > > 
> > > I followed Bernd's advise and disabled TLS. Although I already
> > > had a
> > > clue what is going wrong. Attached is a patch on top of Oleg's
> > > branch
> > > which makes it work unencrypted and encrypted. I will explain in
> > > detail
> > > why the changes are necessary.
> > > 
> > > > -    public static final Timeout
> > > > DEFAULT_WAIT_FOR_EARLY_RESPONSE =
> > > > Timeout.ofMilliseconds(5);
> > > > +    public static final Timeout
> > > > DEFAULT_WAIT_FOR_EARLY_RESPONSE =
> > > > Timeout.ofMilliseconds(50);
> > > 
> > > unless client and server are physically next to each other 5 ms
> > > are
> > > virtually impossible. I have tried with our server at work. I am
> > > connected with my laptop via VPN to the corporate network, I
> > > don't
> > > know
> > > where the peering point of our VPN provider is, but the server is
> > > physically 10 km away from me and with TLS 1.3 it takes 28 ms to
> > > produce
> > > the 401.
> > > 
> > > Maybe both timeouts (expect and early) should be configurable via
> > > RequestConfig?
> > > 
> > > > +            conn.flush();
> > 
> > Michael
> > 
> > You are absolutely right. Not flushing the request head was the
> > cause
> > of the problem.
> > 
> > Could you please try out a slightly different take on your original
> > patch, though?
> > 
> > 
https://github.com/ok2c/httpcomponents-core/commit/39f6d69a87586c147dc080431d45d6d48acb2c80
> > 
> > HttpRequestExecutor ought not be flushing all request message heads
> > indiscriminately and should still try to pack small payload
> > messages
> > into a single IP frame for performance reasons.
> 
> Makes sense!
> 
> > I also would not overload RequestConfig with too many options but
> > we
> > can discuss that later.
> 
> Agreed.
> 
> > > This is why it did not work before is that headers were stuck in
> > > the
> > > local buffer and were flushed only when the body was sent. So the
> > > server
> > > never saw the headers before the body. The wait was pointless.
> > > 
> > > Please also note that even the buffer for headers might be large
> > > due
> > > to
> > > some authnz tokens. E.g., JWT or SPNEGO, cookies, etc.
> > > 
> > > > +                        response =
> > > > conn.receiveResponseHeader();
> > > 
> > > One needs to read the headers because the client shall be able to
> > > see
> > > the status code and if fast enough the response body. In my case
> > > the
> > > error page from Tomcat.
> > > 
> > > RFC 7230, section 6.5 says:
> > > >     A client sending a message body SHOULD monitor the network
> > > > connection
> > > >     for an error response while it is transmitting the
> > > > request.  If
> > > > the
> > > >     client sees a response that indicates the server does not
> > > > wish
> > > > to
> > > >     receive the message body and is closing the connection, the
> > > > client
> > > >     SHOULD immediately cease transmitting the body and close
> > > > its
> > > > side of
> > > >     the connection.
> > > 
> > > I have issued another request and HttpClient reuses the
> > > connection
> > > because Tomcat forgot to send "Connection: close".
> > 
> > Hmm. That sounds weird. HttpClient must terminate the connection if
> > it
> > failed to submit the entire message body declared in `Content-
> > Length`
> > header. The #terminateRequest should have marked the connection as
> > `inconsistent`.
> > 
> > Could you please send me a wire log of the session?
> 
> So far, the patch works and I can access the first 401 response.
> 

This should fix the problem with incorrect connection re-use. Please
review:

https://github.com/apache/httpcomponents-client/commit/a554aadabafe26ae5412b26a311ffa105e623cc2

Oleg 



---------------------------------------------------------------------
To unsubscribe, e-mail: httpclient-users-unsubscr...@hc.apache.org
For additional commands, e-mail: httpclient-users-h...@hc.apache.org

Reply via email to