Open maddo7 opened 1 year ago
Hi @maddo7, this is a good question. This happens because there's two different ways of doing HTTP proxying.
The first way is that the client sends a request to the proxy like GET http://example.com/abc
- i.e. it sends the entire request to the proxy, and the proxy parses that, extracts the target server (example.com) and forwards the request there. In this case, all headers are included in that one request. This is probably what's happening with your HTTP proxying.
The second way is that the client sends a CONNECT request to the proxy like CONNECT example.com:80
, asking for a tunnel a remote server, and then it sends a separate request like GET /abc
inside that tunnel, talking directly to the remote server. In this case, proxy-specific headers only appear on the first request. Wikipedia has some more details: https://en.wikipedia.org/wiki/HTTP_tunnel.
Currently, in that second case, you can't interact with the outer tunneling request or see that data via Mockttp at all. Mockttp simply unwraps and discards all layers of CONNECT tunnelling, and only considers the final request to the end server. Extending this is a bit more complicated than it sounds, because requests aren't even 1-1, for example a client can CONNECT through the proxy once, and then send many independent requests inside the resulting tunnel to the remote server (or even none at all, if it changes its mind). You can even CONNECT to create a tunnel to a different proxy server, and then CONNECT there too, at unlimited depth, using different authentication headers for each step.
For this specific use case of authenticated tunneling though, I think it's probably possible to handle this though - we could add a proxyAuth
option like getLocal({ https, proxyAuth: { username: '...', password: '...' } })
, and then enforce that on incoming requests before we start normal final-request processing. PRs very welcome if that's something you'd be interested in.
I want to create a mitm proxy that can only be access by providing correct credentials, e.g. I check if proxy-authentication has the correct value:
With http it works flawlessly, the proxy-authorization header is present:
Now the problem is that if it runs through https, the proxy-authorization disappears:
Is there anything I'm unaware of that causes this behaviour?