[svn.haxx.se] · SVN Dev · SVN Users · SVN Org · TSVN Dev · TSVN Users · Subclipse Dev · Subclipse Users · this month's index

[Dale Thatcher <subversion@dalethatcher.com>] Posting to the list

From: Ben Collins-Sussman <sussman_at_collab.net>
Date: 2001-09-13 19:16:00 CEST

Karl Fogel is currently setup as having to "approve" all new posters
to the dev list. I'll see if I can fix that. I'm forwarding this
message to the list.

Joe, Greg, you guys wanna review this patch? It looks extremely useful.

------- Start of forwarded message -------
Date: Thu, 13 Sep 2001 17:11:41 +0000
From: Dale Thatcher <subversion@dalethatcher.com>
To: Ben Collins-Sussman <sussman@collab.net>
Subject: Posting to the list
Message-ID: <20010913171140.A310@grim.ws>
References: <20010912185106.4e6b3279.supermo@bayarea.net> <861ylb58w9.fsf@kepler.ch.collab.net>
Mime-Version: 1.0
Content-Type: multipart/mixed; boundary="BOKacYhQ+x31HxR3"

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: inline

Hi,

For some reason the list isn't letting me post at the moment. Would you mind
forwarding this to the list?

thanks,

- Dale Thatcher

--BOKacYhQ+x31HxR3
Content-Type: text/plain; charset=us-ascii
Content-Disposition: attachment; filename=patch

Hi,

The following is a patch for all those stranded behind http proxies. It
allows users to set their http_proxy environment variable in the same way as a
few other programs e.g. dselect and wget.

export http_proxy=http://username:password@proxyhost:proxyport/

It's probably not suitable to go in as is. In fact I'm not sure if most
people will like passing in the settings from the environment. But it allows
me to checkout while at work which is much better than CVS.

thanks,

- Dale Thatcher

2001-09-12 Dale Thatcher <subversion@dalethatcher.com>

        ra_dav.h
        Added new fields to svn_ra_session_t to store the proxy
        uri, username and password.
        session.c
        Added two new routines proxy_auth_authenticate,
        init_http_proxy and modified svn_ra_get_authenticator to
        call out to the neon http proxy support. User can now set
        the http_proxy environment variable to use a proxy.

Index: ./subversion/libsvn_ra_dav/ra_dav.h
===================================================================
--- ./subversion/libsvn_ra_dav/SVN/text-base/ra_dav.h Wed Sep 12 18:45:57 2001
+++ ./subversion/libsvn_ra_dav/ra_dav.h Wed Sep 12 18:45:57 2001
@@ -42,6 +42,10 @@
   const char *username;
   const char *password;
 
+ struct uri proxyuri;
+ char *proxyusername;
+ char *proxypassword;
+
   ne_session *sess; /* HTTP session to server */
   ne_session *sess2;
 
Index: ./subversion/libsvn_ra_dav/session.c
===================================================================
--- ./subversion/libsvn_ra_dav/SVN/text-base/session.c Wed Sep 12 18:45:58 2001
+++ ./subversion/libsvn_ra_dav/session.c Wed Sep 12 18:51:27 2001
@@ -84,6 +84,31 @@
   return 0;
 }
 
+static int request_proxy_auth (void *userdata, const char *realm,
+ char **proxyusername, char **proxypassword)
+{
+ svn_ra_session_t *ras = userdata;
+ apr_size_t l;
+
+ l = strlen(ras->proxyusername) + 1;
+ *proxyusername = malloc(l);
+ memcpy(*proxyusername, ras->proxyusername, l);
+
+ if (ras->proxypassword == NULL)
+ {
+ *proxypassword = malloc(1);
+ **proxypassword = '\0';
+ }
+ else
+ {
+ l = strlen(ras->proxypassword) + 1;
+ *proxypassword = malloc(l);
+ memcpy(*proxypassword, ras->proxypassword, l);
+ }
+
+ return 0;
+}
+
 static svn_error_t * auth_authenticate (void **session_baton, void *auth_baton)
 {
   svn_ra_session_t *ras = auth_baton;
@@ -108,6 +133,80 @@
   auth_authenticate
 };
 
+static svn_error_t * proxy_auth_authenticate (void **session_baton, void *auth_baton,
+ char *authinfo)
+{
+ char *c;
+ char *usernameend = NULL;
+ apr_size_t l;
+ svn_ra_session_t *ras = auth_baton;
+
+ /* parse out username and password */
+ ras->proxyusername = NULL;
+
+ for (c = authinfo; *c != '\0'; c++)
+ {
+ if (usernameend == NULL && *c == ':')
+ {
+ usernameend = c;
+ }
+ }
+
+ if (usernameend == NULL)
+ {
+ usernameend = c;
+ }
+
+ l = usernameend - authinfo;
+ ras->proxyusername = apr_pcalloc(ras->pool, l + 1);
+ memcpy(ras->proxyusername, authinfo, l);
+ *(ras->proxyusername + l) = '\0';
+
+ if (usernameend != c)
+ {
+ l = (c - usernameend) - 1;
+ ras->proxypassword = apr_pcalloc(ras->pool, l + 1);
+ memcpy(ras->proxypassword, usernameend + 1, l);
+ *(ras->proxypassword + l) = '\0';
+ }
+
+ ne_set_proxy_auth(ras->sess, request_proxy_auth, ras);
+ ne_set_proxy_auth(ras->sess2, request_proxy_auth, ras);
+
+ *session_baton = ras;
+
+ return SVN_NO_ERROR;
+}
+
+static svn_error_t * init_http_proxy(void **session_baton, void *baton)
+{
+ svn_ra_session_t *ras = baton;
+ struct uri proxyuri = ras->proxyuri;
+
+ if (ne_session_proxy(ras->sess, proxyuri.host, proxyuri.port) ||
+ ne_session_proxy(ras->sess2, proxyuri.host, proxyuri.port))
+ {
+ return svn_error_create(SVN_ERR_RA_ILLEGAL_URL, 0, NULL, ras->pool,
+ "illegal URL for proxy");
+ }
+
+ if (proxyuri.authinfo != NULL)
+ {
+ svn_error_t *err;
+
+ err = proxy_auth_authenticate((void **)&ras, ras, proxyuri.authinfo);
+ if (err != SVN_NO_ERROR)
+ {
+ return err;
+ }
+ }
+
+ *session_baton = ras;
+
+ return SVN_NO_ERROR;
+}
+
+
 /* ### need an ne_session_dup to avoid the second gethostbyname
  * call and make this halfway sane. */
 
@@ -118,6 +217,7 @@
                                                apr_pool_t *pool)
 {
   const char *repository = repos_URL->data;
+ const char *httpproxy = getenv("http_proxy");
   apr_size_t len;
   ne_session *sess, *sess2;
   struct uri uri = { 0 };
@@ -162,6 +262,28 @@
   ne_set_useragent(sess, "SVN/" SVN_VERSION);
   ne_set_useragent(sess2, "SVN/" SVN_VERSION);
 
+ ras = apr_pcalloc(pool, sizeof(*ras));
+ ras->pool = pool;
+ ras->root = uri;
+ ras->sess = sess;
+ ras->sess2 = sess2;
+
+ /* set the proxy up if required */
+ if (httpproxy != NULL)
+ {
+ struct uri proxyuri;
+
+ if (uri_parse(httpproxy, &proxyuri, NULL))
+ {
+ return svn_error_create(SVN_ERR_RA_ILLEGAL_URL, 0, NULL, ras->pool,
+ "illegal URL for http proxy");
+ }
+
+ ras->proxyuri = proxyuri;
+
+ init_http_proxy((void **)&ras, ras);
+ }
+
   /* we want to know if the repository is actually somewhere else */
   /* ### not yet: http_redirect_register(sess, ... ); */
 
@@ -203,12 +325,6 @@
   len = strlen(uri.path);
   if (len > 1 && uri.path[len - 1] == '/')
     uri.path[len - 1] = '\0';
-
- ras = apr_pcalloc(pool, sizeof(*ras));
- ras->pool = pool;
- ras->root = uri;
- ras->sess = sess;
- ras->sess2 = sess2;
 
   if (method == SVN_RA_AUTH_USERNAME)
     *authenticator = &username_authenticator;

--BOKacYhQ+x31HxR3--

------- End of forwarded message -------

---------------------------------------------------------------------
To unsubscribe, e-mail: dev-unsubscribe@subversion.tigris.org
For additional commands, e-mail: dev-help@subversion.tigris.org
Received on Sat Oct 21 14:36:41 2006

This is an archived mail posted to the Subversion Dev mailing list.