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 
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://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/6a05b385-cea5-45d0-bda9-ae8caba73e51n%40googlegroups.com.

Reply via email to