Hi,
On Mit 16.11.2005 19:09, Alexander Lazic wrote:
@Joe Orton: do you have a patch for mod_proxy_connect?
http://issues.apache.org/bugzilla/show_bug.cgi?id=19188
as joe suggested i have start to implement the connect call with
proxy_connect.c.
I have attached my first attempt, but it always segfaults :-(, fyi i
have try to add as little as necessary to the code.
I have 2 major problems:
1.) when i want to add a parameter to
proxy_connect.c:ap_proxy_http_handler() i get a
warning at proxy_connect.c:proxy_hook_scheme_handler(). I have want
to add a flag to see if the function was called from
proxy_http.c:ap_proxy_http_create_connection().
2.) i think i use the pools in some wrong way?!
I don't know if i am on the right way. We need these fuction and it
would be nice that the mod_proxy talk 'in the right way' with the
upstream proxies for https_calls in http-context.
Thanx for all who wan't and can help, btw. here the backtrace from the
core:
---
#0 0xb7ca6421 in __read_nocancel () from /lib/tls/libpthread.so.0
(gdb) bt
#0 0xb7ca6421 in __read_nocancel () from /lib/tls/libpthread.so.0
#1 0x080ac2b7 in ap_mpm_pod_check (pod=0xfffffe00) at pod.c:54
#2 0x080aa563 in child_main (child_num_arg=Variable "child_num_arg" is
not available.) at worker.c:1195
#3 0x080aa6d0 in make_child (s=0x80fc850, slot=0) at worker.c:1278
#4 0x080aa77b in startup_children (number_to_start=2) at worker.c:1312
#5 0x080ab1ac in ap_mpm_run (_pconf=0x80f70a8, plog=0x81351a0,
s=0x80fc850) at worker.c:1661
#6 0x080b15ce in main (argc=3, argv=0xbfa0c624) at main.c:618
---
Greetings
Alex
Index: httpd-2.0.x-2005-11-17/modules/proxy/proxy_http.c
===================================================================
--- httpd-2.0.x-2005-11-17/modules/proxy/proxy_http.c (revision 345304)
+++ httpd-2.0.x-2005-11-17/modules/proxy/proxy_http.c (working copy)
@@ -31,6 +31,8 @@
apr_sockaddr_t *addr;
apr_socket_t *sock;
int close;
+ /* Does use the HTTP connect method to connect to the web server ? */
+ int does_use_http_connect;
} proxy_http_conn_t;
static apr_status_t ap_proxy_http_cleanup(request_rec *r,
@@ -243,9 +245,12 @@
conn_rec *c, conn_rec **origin,
proxy_conn_rec *backend,
proxy_server_conf *conf,
- const char *proxyname) {
+ const char *proxyname,
+ char *url,
+ apr_port_t proxyport) {
int failed=0, new=0;
apr_socket_t *client_socket = NULL;
+ apr_uri_t *uri;
/* We have determined who to connect to. Now make the connection,
supporting
* a KeepAlive connection.
@@ -320,10 +325,17 @@
* For now we do nothing, ie we get DNS round robin.
* XXX FIXME
*/
- failed = ap_proxy_connect_to_backend(&p_conn->sock, "HTTP",
+ /*
+ failed = ap_proxy_connect_to_backend(&p_conn->sock, "HTTP",
p_conn->addr, p_conn->name,
conf, r->server, c->pool);
+ */
+ failed = ap_proxy_connect_to_backend(&p_conn->sock,
+ (p_conn->does_use_http_connect ?
"CONNECT" : "HTTP"),
+ p_conn->addr, p_conn->name,
+ conf, r->server, c->pool);
+
/* handle a permanent error on the connect */
if (failed) {
if (proxyname) {
@@ -362,6 +374,11 @@
"for %pI (%s)", p_conn->addr, p_conn->name);
return HTTP_INTERNAL_SERVER_ERROR;
}
+ if (p_conn->does_use_http_connect) {
+ apr_uri_parse(c->pool,url, uri);
+ char *connect_url = apr_psprintf(c->pool,"%s:443",uri->hostinfo);
+ ap_proxy_connect_handler(r,conf,connect_url,proxyname,proxyport);
+ }
}
else {
ap_proxy_ssl_disable(backend->connection);
@@ -1599,9 +1616,11 @@
conn_rec *c = r->connection;
apr_bucket_brigade *bb = apr_brigade_create(p, c->bucket_alloc);
apr_uri_t *uri = apr_palloc(r->connection->pool, sizeof(*uri));
- proxy_http_conn_t *p_conn = apr_pcalloc(r->connection->pool,
+ proxy_http_conn_t *p_conn = (proxy_http_conn_t
*)apr_pcalloc(r->connection->pool,
sizeof(*p_conn));
+ p_conn->does_use_http_connect = 0;
+
/* is it for us? */
if (strncasecmp(url, "https:", 6) == 0) {
if (!ap_proxy_ssl_enable(NULL)) {
@@ -1611,6 +1630,10 @@
return DECLINED;
}
is_ssl = 1;
+
+ if (proxyname) {
+ p_conn->does_use_http_connect = 1;
+ }
}
else if (!(strncasecmp(url, "http:", 5)==0 || (strncasecmp(url, "ftp:",
4)==0 && proxyname))) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
@@ -1652,7 +1675,7 @@
/* Step Two: Make the Connection */
status = ap_proxy_http_create_connection(p, r, p_conn, c, &origin, backend,
- conf, proxyname);
+ conf, proxyname,url,proxyport);
if ( status != OK ) {
return status;
}
Index: httpd-2.0.x-2005-11-17/modules/proxy/proxy_connect.c
===================================================================
--- httpd-2.0.x-2005-11-17/modules/proxy/proxy_connect.c (revision
345304)
+++ httpd-2.0.x-2005-11-17/modules/proxy/proxy_connect.c (working copy)
@@ -102,7 +102,7 @@
if (r->method_number != M_CONNECT) {
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: CONNECT: declining URL %s", url);
- return DECLINED;
+ /* return DECLINED; */
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: CONNECT: serving URL %s", url);
@@ -116,8 +116,8 @@
/* we break the URL into host, port, uri */
if (APR_SUCCESS != apr_uri_parse_hostinfo(p, url, &uri)) {
- return ap_proxyerror(r, HTTP_BAD_REQUEST,
- apr_pstrcat(p, "URI cannot be parsed: ", url,
NULL));
+ /* return */ ap_proxyerror(r, HTTP_BAD_REQUEST,
+ apr_pstrcat(p, "ap_proxy_connect_handler() URI
cannot be parsed: ", url, NULL));
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,