|
 |
814382 |
--- cvs-1.11.21/src/client.h.proxy 2005-08-02 22:46:57.000000000 +0200
|
|
 |
814382 |
+++ cvs-1.11.21/src/client.h 2005-11-10 10:26:24.000000000 +0100
|
|
 |
814382 |
@@ -83,6 +83,9 @@
|
|
 |
814382 |
# ifndef CVS_AUTH_PORT
|
|
 |
814382 |
# define CVS_AUTH_PORT 2401
|
|
 |
814382 |
# endif /* CVS_AUTH_PORT */
|
|
 |
814382 |
+# ifndef CVS_PROXY_PORT
|
|
 |
814382 |
+# define CVS_PROXY_PORT 80
|
|
 |
814382 |
+# endif /* CVS_PROXY_PORT */
|
|
 |
814382 |
# endif /* (AUTH_CLIENT_SUPPORT) || defined (HAVE_GSSAPI) */
|
|
 |
814382 |
|
|
 |
814382 |
# if HAVE_KERBEROS
|
|
 |
814382 |
--- cvs-1.11.21/src/client.c.proxy 2005-09-22 17:58:46.000000000 +0200
|
|
 |
814382 |
+++ cvs-1.11.21/src/client.c 2005-11-10 10:26:24.000000000 +0100
|
|
 |
814382 |
@@ -144,6 +144,7 @@
|
|
 |
814382 |
|
|
 |
814382 |
static size_t try_read_from_server PROTO ((char *, size_t));
|
|
 |
814382 |
|
|
 |
814382 |
+static void proxy_connect PROTO ((cvsroot_t *, int));
|
|
 |
814382 |
static void auth_server PROTO ((cvsroot_t *, struct buffer *, struct buffer *,
|
|
 |
814382 |
int, int, struct hostent *));
|
|
 |
814382 |
|
|
 |
814382 |
@@ -3802,7 +3803,7 @@
|
|
 |
814382 |
int port_number;
|
|
 |
814382 |
struct sockaddr_in client_sai;
|
|
 |
814382 |
struct hostent *hostinfo;
|
|
 |
814382 |
- struct buffer *to_server, *from_server;
|
|
 |
814382 |
+ struct buffer *local_to_server, *local_from_server;
|
|
 |
814382 |
|
|
 |
814382 |
sock = socket (AF_INET, SOCK_STREAM, 0);
|
|
 |
814382 |
if (sock == -1)
|
|
 |
814382 |
@@ -3810,7 +3811,17 @@
|
|
 |
814382 |
error (1, 0, "cannot create socket: %s", SOCK_STRERROR (SOCK_ERRNO));
|
|
 |
814382 |
}
|
|
 |
814382 |
port_number = get_cvs_port_number (root);
|
|
 |
814382 |
- hostinfo = init_sockaddr (&client_sai, root->hostname, port_number);
|
|
 |
814382 |
+
|
|
 |
814382 |
+ /* if we have a proxy connect to that instead */
|
|
 |
814382 |
+ if (root->proxy_hostname)
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ hostinfo = init_sockaddr (&client_sai, root->proxy_hostname, root->proxy_port);
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+ else
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ hostinfo = init_sockaddr (&client_sai, root->hostname, port_number);
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+
|
|
 |
814382 |
if (trace)
|
|
 |
814382 |
{
|
|
 |
814382 |
fprintf (stderr, " -> Connecting to %s(%s):%d\n",
|
|
 |
814382 |
@@ -3820,29 +3831,41 @@
|
|
 |
814382 |
if (connect (sock, (struct sockaddr *) &client_sai, sizeof (client_sai))
|
|
 |
814382 |
< 0)
|
|
 |
814382 |
error (1, 0, "connect to %s(%s):%d failed: %s",
|
|
 |
814382 |
- root->hostname,
|
|
 |
814382 |
+ root->proxy_hostname ? root->proxy_hostname : root->hostname,
|
|
 |
814382 |
inet_ntoa (client_sai.sin_addr),
|
|
 |
814382 |
- port_number, SOCK_STRERROR (SOCK_ERRNO));
|
|
 |
814382 |
+ root->proxy_hostname ? root->proxy_port : port_number,
|
|
 |
814382 |
+ SOCK_STRERROR (SOCK_ERRNO));
|
|
 |
814382 |
|
|
 |
814382 |
- make_bufs_from_fds (sock, sock, 0, &to_server, &from_server, 1);
|
|
 |
814382 |
+ make_bufs_from_fds (sock, sock, 0, &local_to_server, &local_from_server, 1);
|
|
 |
814382 |
|
|
 |
814382 |
- auth_server (root, to_server, from_server, verify_only, do_gssapi, hostinfo);
|
|
 |
814382 |
+ if (root->proxy_hostname)
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ // REALLY ugly hack to allow proxy_connect() to use send_to_server().
|
|
 |
814382 |
+ // The proper fix would be to remove the global to_server & from_server
|
|
 |
814382 |
+ // variables, and instead let send_to_server() etc. take the target
|
|
 |
814382 |
+ // server struct as a paramter.
|
|
 |
814382 |
+ to_server = local_to_server;
|
|
 |
814382 |
+ from_server = local_from_server;
|
|
 |
814382 |
+ proxy_connect (root, port_number);
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+
|
|
 |
814382 |
+ auth_server (root, local_to_server, local_from_server, verify_only, do_gssapi, hostinfo);
|
|
 |
814382 |
|
|
 |
814382 |
if (verify_only)
|
|
 |
814382 |
{
|
|
 |
814382 |
int status;
|
|
 |
814382 |
|
|
 |
814382 |
- status = buf_shutdown (to_server);
|
|
 |
814382 |
+ status = buf_shutdown (local_to_server);
|
|
 |
814382 |
if (status != 0)
|
|
 |
814382 |
error (0, status, "shutting down buffer to server");
|
|
 |
814382 |
- buf_free (to_server);
|
|
 |
814382 |
- to_server = NULL;
|
|
 |
814382 |
+ buf_free (local_to_server);
|
|
 |
814382 |
+ local_to_server = NULL;
|
|
 |
814382 |
|
|
 |
814382 |
- status = buf_shutdown (from_server);
|
|
 |
814382 |
+ status = buf_shutdown (local_from_server);
|
|
 |
814382 |
if (status != 0)
|
|
 |
814382 |
error (0, status, "shutting down buffer from server");
|
|
 |
814382 |
- buf_free (from_server);
|
|
 |
814382 |
- from_server = NULL;
|
|
 |
814382 |
+ buf_free (local_from_server);
|
|
 |
814382 |
+ local_from_server = NULL;
|
|
 |
814382 |
|
|
 |
814382 |
/* Don't need to set server_started = 0 since we don't set it to 1
|
|
 |
814382 |
* until returning from this call.
|
|
 |
814382 |
@@ -3850,8 +3873,8 @@
|
|
 |
814382 |
}
|
|
 |
814382 |
else
|
|
 |
814382 |
{
|
|
 |
814382 |
- *to_server_p = to_server;
|
|
 |
814382 |
- *from_server_p = from_server;
|
|
 |
814382 |
+ *to_server_p = local_to_server;
|
|
 |
814382 |
+ *from_server_p = local_from_server;
|
|
 |
814382 |
}
|
|
 |
814382 |
|
|
 |
814382 |
return;
|
|
 |
814382 |
@@ -3860,6 +3883,46 @@
|
|
 |
814382 |
|
|
 |
814382 |
|
|
 |
814382 |
static void
|
|
 |
814382 |
+proxy_connect (root, port_number)
|
|
 |
814382 |
+ cvsroot_t *root;
|
|
 |
814382 |
+ int port_number;
|
|
 |
814382 |
+{
|
|
 |
814382 |
+#define CONNECT_STRING "CONNECT %s:%d HTTP/1.0\r\n\r\n"
|
|
 |
814382 |
+ /* Send a "CONNECT" command to proxy: */
|
|
 |
814382 |
+ char* read_buf;
|
|
 |
814382 |
+ int codenum, count;
|
|
 |
814382 |
+
|
|
 |
814382 |
+ /* 4 characters for port covered by the length of %s & %d */
|
|
 |
814382 |
+ char* write_buf = xmalloc (strlen (CONNECT_STRING) + strlen (root->hostname) + 20 + 1);
|
|
 |
814382 |
+ int len = sprintf (write_buf, CONNECT_STRING, root->hostname, port_number);
|
|
 |
814382 |
+ send_to_server (write_buf, len);
|
|
 |
814382 |
+
|
|
 |
814382 |
+ /* Wait for HTTP status code, bail out if you don't get back a 2xx code.*/
|
|
 |
814382 |
+ count = read_line (&read_buf);
|
|
 |
814382 |
+ sscanf (read_buf, "%s %d", write_buf, &codenum);
|
|
 |
814382 |
+
|
|
 |
814382 |
+ if ((codenum / 100) != 2)
|
|
 |
814382 |
+ error (1, 0, "proxy server %s:%d does not support http tunnelling",
|
|
 |
814382 |
+ root->proxy_hostname, root->proxy_port);
|
|
 |
814382 |
+ free (read_buf);
|
|
 |
814382 |
+ free (write_buf);
|
|
 |
814382 |
+
|
|
 |
814382 |
+ /* Skip through remaining part of MIME header, recv_line
|
|
 |
814382 |
+ consumes the trailing \n */
|
|
 |
814382 |
+ while(read_line (&read_buf) > 0)
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ if (read_buf[0] == '\r' || read_buf[0] == 0)
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ free (read_buf);
|
|
 |
814382 |
+ break;
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+ free (read_buf);
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+}
|
|
 |
814382 |
+
|
|
 |
814382 |
+
|
|
 |
814382 |
+
|
|
 |
814382 |
+static void
|
|
 |
814382 |
auth_server (root, lto_server, lfrom_server, verify_only, do_gssapi, hostinfo)
|
|
 |
814382 |
cvsroot_t *root;
|
|
 |
814382 |
struct buffer *lto_server;
|
|
 |
814382 |
--- cvs-1.11.21/src/root.c.proxy 2005-09-04 02:26:43.000000000 +0200
|
|
 |
814382 |
+++ cvs-1.11.21/src/root.c 2005-11-10 10:26:24.000000000 +0100
|
|
 |
814382 |
@@ -298,7 +298,7 @@
|
|
 |
814382 |
newroot->port = 0;
|
|
 |
814382 |
newroot->directory = NULL;
|
|
 |
814382 |
newroot->proxy_hostname = NULL;
|
|
 |
814382 |
- newroot->proxy_port = 0;
|
|
 |
814382 |
+ newroot->proxy_port = CVS_PROXY_PORT;
|
|
 |
814382 |
#endif /* CLIENT_SUPPORT */
|
|
 |
814382 |
|
|
 |
814382 |
return newroot;
|
|
 |
814382 |
@@ -371,6 +371,7 @@
|
|
 |
814382 |
char *cvsroot_copy, *p, *q; /* temporary pointers for parsing */
|
|
 |
814382 |
#ifdef CLIENT_SUPPORT
|
|
 |
814382 |
int check_hostname, no_port, no_password;
|
|
 |
814382 |
+ const char *env_var;
|
|
 |
814382 |
#endif /* CLIENT_SUPPORT */
|
|
 |
814382 |
|
|
 |
814382 |
assert (root_in);
|
|
 |
814382 |
@@ -406,6 +407,31 @@
|
|
 |
814382 |
cvsroot_copy = ++p;
|
|
 |
814382 |
|
|
 |
814382 |
#ifdef CLIENT_SUPPORT
|
|
 |
814382 |
+ /* Determine proxy */
|
|
 |
814382 |
+ env_var = getenv("CVS_PROXY");
|
|
 |
814382 |
+/*
|
|
 |
814382 |
+ if (!env_var)
|
|
 |
814382 |
+ env_var = getenv("HTTP_PROXY");
|
|
 |
814382 |
+ if (!env_var)
|
|
 |
814382 |
+ env_var = getenv("http_proxy");
|
|
 |
814382 |
+*/
|
|
 |
814382 |
+ /* Check if a proxy was specified, and if it is a HTTP proxy */
|
|
 |
814382 |
+ if (env_var && !memcmp(env_var, "http://", 7))
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ char *port_str;
|
|
 |
814382 |
+
|
|
 |
814382 |
+ /* Try to parse the proxy data */
|
|
 |
814382 |
+ env_var += 7;
|
|
 |
814382 |
+ /* TODO - parse username/password data, too */
|
|
 |
814382 |
+ port_str = strchr(env_var, ':');
|
|
 |
814382 |
+ if (port_str)
|
|
 |
814382 |
+ {
|
|
 |
814382 |
+ *port_str++ = 0;
|
|
 |
814382 |
+ newroot->proxy_port = atoi(port_str);
|
|
 |
814382 |
+ newroot->proxy_hostname = xstrdup(env_var);
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+ }
|
|
 |
814382 |
+
|
|
 |
814382 |
/* Look for method options, for instance, proxy, proxyport.
|
|
 |
814382 |
* We don't handle these, but we like to try and warn the user that
|
|
 |
814382 |
* they are being ignored.
|