[ 
https://issues.apache.org/jira/browse/HTTPCLIENT-2200?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=17482721#comment-17482721
 ] 

Andrei Vasilev commented on HTTPCLIENT-2200:
--------------------------------------------

[~olegk] 
> However, when executing a request, these interceptors are called at point 
> when the application protocol has not been established yet.

Sorry, I should have clarified that I meant the FINAL protocol. The protocol 
version is available from HttpContext, but it seems that the interceptors are 
always called prior to the connection ever being upgraded to h2. So the 
protocol returned is always http/1.1, the protocol of the initial CONNECT 
request.

> Protocol interceptors are executed before the connection route has been fully 
> established
> -----------------------------------------------------------------------------------------
>
>                 Key: HTTPCLIENT-2200
>                 URL: https://issues.apache.org/jira/browse/HTTPCLIENT-2200
>             Project: HttpComponents HttpClient
>          Issue Type: Bug
>          Components: HttpClient (async)
>    Affects Versions: 5.1.2, 5.2-alpha1
>            Reporter: Andrei Vasilev
>            Priority: Major
>
> Currently, a user is able to add HttpRequestInterceptor when building a new 
> client using HttpAsyncClientBuilder. However, when executing a request, these 
> interceptors are called at point when the application protocol has not been 
> established yet. Since the interceptors do not have access to this 
> information, then the user must commit to an application protocol 
> pre-emptively when constructing their request in terms of header 
> capitalization, including the Host/Connection header or not, how cookies are 
> appended, etc. This is clearly problematic since it cannot be known 
> pre-emptively what protocol the server on the other end will end up choosing 
> when a connection is established. 
> On line 925 of HttpAsyncClientBuilder, I can see that a DefaultHttpProcessor 
> is provided to the IOEventHandlerFactory, which contains 
> HttpRequestInterceptors that DO have access to the application protocol 
> information, because they are called at a later point in time when this 
> information has been established and is now available. I see that if the 
> protocol was assumed by the user to be H2, but the connection ends up being 
> established using 1.1, then a Host and Connection header are added to the 
> request if they are missing. However, the opposite is not provided. That is, 
> if the protocol is assumed to be 1.1 and the Host / Connection headers are 
> included by the user, but the connection upgrades to H2, it results in an 
> illegal request due to invalid headers.
> To solve this issue, it would be nice if a user was able to add additional 
> interceptors to the DefaultHttpProcessor on line 925, so that they too are 
> able to have access to protocol information and potentially augment their 
> request where needed.
> https://github.com/apache/httpcomponents-client/blob/master/httpclient5/src/main/java/org/apache/hc/client5/http/impl/async/HttpAsyncClientBuilder.java



--
This message was sent by Atlassian Jira
(v8.20.1#820001)

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

Reply via email to