Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

x/net/http/httproxy: Never uses proxy for localhost #28866

Open
vfaronov opened this issue Nov 19, 2018 · 13 comments
Open

x/net/http/httproxy: Never uses proxy for localhost #28866

vfaronov opened this issue Nov 19, 2018 · 13 comments
Labels
NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Milestone

Comments

@vfaronov
Copy link

golang.org/x/net/http/httproxy has a hardcoded rule whereby requests to localhost never use a proxy.

This may be a sensible default, but there should be a way to override it. There is no intrinsic reason why a proxy cannot or should not be used for localhost. My use case is that I have mocks of remote HTTP services running on localhost, and I want to use mitmproxy to debug the Go program’s traffic to/from these services.

One solution might be to use the current default unless there’s a non-empty NO_PROXY/NoProxy environment variable: then I could use some dummy value like NO_PROXY=foo.invalid. But a 100% backwards-compatible solution would require some hack along the lines of NO_PROXY=but_actually_localhost_ok or HTTP_PROXY_LOCALHOST=yes.

@gopherbot gopherbot added this to the Unreleased milestone Nov 19, 2018
@bcmills
Copy link
Contributor

bcmills commented Nov 19, 2018

(Attn. @bradfitz)

@bcmills bcmills added the NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one. label Nov 19, 2018
@bradfitz
Copy link
Contributor

I'm fine moving that special case rule down further pass the explicit match/no-match checks, but let's not add a new environment variable.

@vfaronov
Copy link
Author

@bradfitz Not sure I’m following you. The function returns true (use proxy) only if none of the NO_PROXY rules match the request. So if you just move the check past all those rules, it will still fire unavoidably for all localhost requests.

@vfaronov
Copy link
Author

vfaronov commented Feb 8, 2019

FWIW, I have found this easy to work around for my use cases (I add tsohlacol to my /etc/hosts and put it in my URLs instead of localhost), so I’d be OK with closing this issue.

@JoelPagliuca
Copy link

👋 Hi all, just wasted about half an hour trying to figure out why requests to localhost weren't respecting my http_proxy. Can this be documented somewhere if this is a permanent feature of the http.DefaultClient

@bradfitz
Copy link
Contributor

bradfitz commented Jan 7, 2020

Honestly I don't remember why the localhost exception exists. If somebody could dig through the history to figure that out, that'd be great. Hopefully we could just remove it. But we need to understand why first.

@vbisbest
Copy link

@bradfitz we need this so we can proxy to localhost locations. I am running web server instances in docker on my local machine for testing. I am trying to sniff the traffic using a go proxy, but it just does not work because of this localhost exception issue.

@fraenkel
Copy link
Contributor

Just for reference #1589

@gopherbot
Copy link

Change https://golang.org/cl/239164 mentions this issue: http/httpproxy: Allow localhost to be proxied

@nightlyone
Copy link
Contributor

What do other http clients do in this case? It might be beneficial to at least check curl and some of the popular browsers.

Please keep in mind that a major use case for proxies are corporate settings where the settings are often not changeable by end users and the proxy exceptions contain usually some internal services already. In those settings Go tests and Go applications spawning a browser might suddenly stop working. One important application in that area is redirecting an OAuth flow to the browser from the cli or the go trace viewer.

@fraenkel
Copy link
Contributor

MY examination of a few applications and runtimes show that the user must be explicit, i.e., if you don't want localhost proxied add it to the NO_PROXY list.

@AlexanderYastrebov
Copy link
Contributor

Related #33695

@gwatts
Copy link

gwatts commented Jan 7, 2023

Bitten by this myself today while trying to insert a proxy between my program and a locally running service it was connecting to. Editing /etc/hosts to add a non localhost name works, but is far from ideal.

Ignoring localhost by default is fine, but there really needs to be someway to disable that behaviour - Changeset https://golang.org/cl/239164 seemed reasonable - would be nice to see it merged

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
NeedsInvestigation Someone must examine and confirm this is a valid issue and not a duplicate of an existing one.
Projects
None yet
Development

No branches or pull requests

10 participants