summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--debian/changelog3
-rw-r--r--methods/http.cc49
-rw-r--r--methods/http.h2
3 files changed, 53 insertions, 1 deletions
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 <michael.vogt@ubuntu.com> 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;