Hello Graham

Thanks a lot for your explanation ! 

I really appreciate.

Mauro

On Tuesday, December 6, 2022 at 7:58:01 AM UTC gbarr wrote:

> Hi Mauro,
>
> In your curl examples the CONNECT method was used in both cases because 
> you forced it to with the --proxytunnel option. If you run those same 
> commands without that option then you will find that curl will operate the 
> same as Go and will only use the CONNECT method when the target is HTTPS
>
> So yes the transport could operate in a way that you describe, as 
> demonstrated by your curl commands. But doing so would add overhead that is 
> unnecessary for a plain HTTP request. By using CONNECT you impose an extra 
> round trip between the client and the proxy because first it has to 
> establish the connection to the target site with the CONNECT then it sends 
> the request.
>
> Graham.
>
> On Monday, December 5, 2022 at 11:32:40 PM UTC maumon...@gmail.com wrote:
>
>> Hello Graham,
>>
>> Would not make more sense to deal with both cases HTTPS and HTTP in the 
>> same way? The transport could send the CONNECT method to establish the TCP 
>> tunnel and then send the request after that. Of course, if the target 
>> request is based on HTTPS, the TLS handshake would start otherwise the 
>> request would be sent in plain text. For instance, I tested both scenarios 
>> using curl command and they  behave exactly the same way, sending a CONNECT 
>> request.
>>
>> *curl -v --proxytunnel --proxy-insecure -x https://localhost:7443 
>> <https://localhost:7443> http://localhost:8001 <http://localhost:8001> ->* 
>> The proxy is HTTPS and the target is HTTP, curl sends a CONNECT and then 
>> the GET method
>>
>> *curl -v --proxytunnel --proxy-insecure -x https://localhost:7443 
>> <https://localhost:7443> https://www.google.com <https://www.google.com> *
>> *->* The proxy is HTTPS and the target is HTTPS, curl sends a CONNECT 
>> and then the GET method
>>
>> Based on what i understood from you comment, please sorry whether I 
>> misunderstood, the proxy would need to have a logic to check whether the 
>> target is HTTPS or HTTP and the act differently depending on the case. For 
>> HTTPS it would create the TCP tunnel while for HTTP it would forward the 
>> request received. Is it true?
>>
>> Mauro
>> On Monday, December 5, 2022 at 8:23:18 AM UTC gbarr wrote:
>>
>>> On Saturday, December 3, 2022 at 4:46:54 PM UTC maumon...@gmail.com 
>>> wrote:
>>>
>>>> Hello all,
>>>>
>>>> I have been facing an issue when I try to create a HTTP client which 
>>>> needs to connect through a HTTPS proxy using the HTTP CONNEC method. I 
>>>> know 
>>>> that it can be achieved setting my own http.Transport object. However the 
>>>> issue seems to be in the current implementation of /net/http/transport.go 
>>>> code.
>>>>
>>>> In my environment, I am developing a HTTP client which ALWAYS use a 
>>>> HTTPS proxy using HTTP CONNECT method. This client is allowed to reach 
>>>> HTTP 
>>>> or HTTPS targets. Therefore, I noticed that when I try to reach a HTTPS 
>>>> target, the the transport layer works as expected and it uses the HTTP 
>>>> CONNECT method. However, when I try to reach a HTTP target, the transport 
>>>> does not use the CONNECT  method.
>>>>
>>>
>>> This is normal. The CONNECT method allows a client to create a TCP 
>>> tunnel through your gateway. This allows your client to perform all TLS 
>>> negotiation.
>>>
>>> However for HTTP requests this extra layering is not required. In the 
>>> standard library you can see the setting of pconn.isProxy=true at 
>>> https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;l=1093
>>>   
>>> this is later used when writing the request at 
>>> https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/request.go;l=521
>>>
>>> Essentially it changes the form of the http method from GET 
>>> /path/to/resource to GET http://hostname/path/to/resource so your 
>>> gateway would then know that this is a proxy request and perform the 
>>> external request
>>>
>>> Graham.
>>>
>>>
>>>> Looking at the transport.go code, I realized that the check to use the 
>>>> CONNECT method is based on the protocol of the target instead of being on 
>>>> the protocol of the proxy URL. Below is a link showing that:
>>>>
>>>> 1. HTTP check
>>>>
>>>>
>>>> https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;l=1092
>>>>
>>>> 2. HTTPS check
>>>>
>>>>
>>>> https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;l=1099
>>>>
>>>> As can be seen on the links above, the condition is based on cm 
>>>> <https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;drc=7ab361531514764fdccb23283a2e7f1916b74b87;l=1570>
>>>> .targetScheme 
>>>> <https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;drc=7ab361531514764fdccb23283a2e7f1916b74b87;l=1816>
>>>>  instead 
>>>> of cm 
>>>> <https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;drc=7ab361531514764fdccb23283a2e7f1916b74b87;l=1570>
>>>> .proxyURL 
>>>> <https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/http/transport.go;drc=7ab361531514764fdccb23283a2e7f1916b74b87;l=1815>
>>>> .Scheme 
>>>> <https://cs.opensource.google/go/go/+/refs/tags/go1.9.5:src/net/url/url.go;drc=7ab361531514764fdccb23283a2e7f1916b74b87;l=363>.
>>>>  
>>>> Is it a bug?
>>>>
>>>> *Go version: go version go1.19.3 linux/amd64*
>>>>
>>>> Mauro
>>>>
>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"golang-nuts" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to golang-nuts+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/golang-nuts/93f5f1da-707f-49ef-9007-3da4f1d8dac0n%40googlegroups.com.

Reply via email to