From bd49b02c03f09f9e7e76da8055f1364943b9dc57 Mon Sep 17 00:00:00 2001 From: Michael Vogt Date: Fri, 5 Feb 2010 18:34:27 -0800 Subject: add Acquire::http::ProxyAutoDetect configuration that can be used to call a external helper to figure out the proxy configuration and return it to apt via stdout --- debian/changelog | 3 +++ methods/http.cc | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- methods/http.h | 2 ++ 3 files changed, 53 insertions(+), 1 deletion(-) diff --git a/debian/changelog b/debian/changelog index 03936a31b..329ea29b5 100644 --- a/debian/changelog +++ b/debian/changelog @@ -20,6 +20,9 @@ apt (0.7.25.1) UNRELEASED; urgency=low * methods/http.cc: - add cache-control headers even if no cache is given to allow adding options for intercepting proxies + - add Acquire::http::ProxyAutoDetect configuration that + can be used to call a external helper to figure out the + proxy configuration and return it to apt via stdout -- Michael Vogt Fri, 18 Dec 2009 16:54:18 +0100 diff --git a/methods/http.cc b/methods/http.cc index 2bd57024b..b05444691 100644 --- a/methods/http.cc +++ b/methods/http.cc @@ -1073,7 +1073,11 @@ bool HttpMethod::Configuration(string Message) PipelineDepth = _config->FindI("Acquire::http::Pipeline-Depth", PipelineDepth); Debug = _config->FindB("Debug::Acquire::http",false); - + AutoDetectProxyCmd = _config->Find("Acquire::http::ProxyAutoDetect"); + + // Get the proxy to use + AutoDetectProxy(); + return true; } /*}}}*/ @@ -1323,6 +1327,49 @@ int HttpMethod::Loop() return 0; } /*}}}*/ +// HttpMethod::AutoDetectProxy - auto detect proxy /*{{{*/ +// --------------------------------------------------------------------- +/* */ +bool HttpMethod::AutoDetectProxy() +{ + if (AutoDetectProxyCmd.empty()) + return true; + + if (Debug) + clog << "Using auto proxy detect command: " << AutoDetectProxyCmd << endl; + + int Pipes[2] = {-1,-1}; + if (pipe(Pipes) != 0) + return _error->Errno("pipe", "Failed to create Pipe"); + + pid_t Process = ExecFork(); + if (Process == 0) + { + dup2(Pipes[1],STDOUT_FILENO); + SetCloseExec(STDOUT_FILENO,false); + + const char *Args[2]; + Args[0] = AutoDetectProxyCmd.c_str(); + Args[1] = 0; + execv(Args[0],(char **)Args); + cerr << "Failed to exec method " << Args[0] << endl; + _exit(100); + } + char buf[512]; + int InFd = Pipes[0]; + if (read(InFd, buf, sizeof(buf)) < 0) + return _error->Errno("read", "Failed to read"); + ExecWait(Process, "ProxyAutoDetect"); + + if (Debug) + clog << "auto detect command returned: '" << buf << "'" << endl; + + if (strstr(buf, "http://") == buf) + _config->Set("Acquire::http::proxy", _strstrip(buf)); + + return true; +} + /*}}}*/ int main() { diff --git a/methods/http.h b/methods/http.h index 13f02ec77..ceee36cbe 100644 --- a/methods/http.h +++ b/methods/http.h @@ -134,6 +134,7 @@ class HttpMethod : public pkgAcqMethod bool Flush(ServerState *Srv); bool ServerDie(ServerState *Srv); int DealWithHeaders(FetchResult &Res,ServerState *Srv); + bool AutoDetectProxy(); virtual bool Fetch(FetchItem *); virtual bool Configuration(string Message); @@ -145,6 +146,7 @@ class HttpMethod : public pkgAcqMethod static void SigTerm(int); string NextURI; + string AutoDetectProxyCmd; public: friend class ServerState; -- cgit v1.2.3