You are viewing a plain text version of this content. The canonical link for it is here.
Posted to cvs@httpd.apache.org by tr...@apache.org on 2003/11/23 02:06:29 UTC
cvs commit: httpd-2.0/modules/proxy proxy_connect.c
trawick 2003/11/22 17:06:29
Modified: modules/proxy proxy_connect.c
Log:
switch to new pollset api
Revision Changes Path
1.63 +55 -45 httpd-2.0/modules/proxy/proxy_connect.c
Index: proxy_connect.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/proxy/proxy_connect.c,v
retrieving revision 1.62
retrieving revision 1.63
diff -u -r1.62 -r1.63
--- proxy_connect.c 3 Sep 2003 19:27:07 -0000 1.62
+++ proxy_connect.c 23 Nov 2003 01:06:29 -0000 1.63
@@ -131,7 +131,9 @@
char buffer[HUGE_STRING_LEN];
apr_socket_t *client_socket = ap_get_module_config(r->connection->conn_config, &core_module);
int failed;
- apr_pollfd_t *pollfd;
+ apr_pollset_t *pollset;
+ apr_pollfd_t pollfd;
+ const apr_pollfd_t *signalled;
apr_int32_t pollcnt;
apr_int16_t pollevent;
apr_sockaddr_t *uri_addr, *connect_addr;
@@ -305,24 +307,28 @@
/* r->sent_bodyct = 1;*/
- if((rv = apr_poll_setup(&pollfd, 2, r->pool)) != APR_SUCCESS)
+ if ((rv = apr_pollset_create(&pollset, 2, r->pool, 0)) != APR_SUCCESS)
{
apr_socket_close(sock);
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r,
- "proxy: CONNECT: error apr_poll_setup()");
+ "proxy: CONNECT: error apr_pollset_create()");
return HTTP_INTERNAL_SERVER_ERROR;
}
/* Add client side to the poll */
- apr_poll_socket_add(pollfd, client_socket, APR_POLLIN);
+ pollfd.p = r->pool;
+ pollfd.desc_type = APR_POLL_SOCKET;
+ pollfd.reqevents = APR_POLLIN;
+ pollfd.desc.s = client_socket;
+ pollfd.client_data = NULL;
+ apr_pollset_add(pollset, &pollfd);
/* Add the server side to the poll */
- apr_poll_socket_add(pollfd, sock, APR_POLLIN);
+ pollfd.desc.s = sock;
+ apr_pollset_add(pollset, &pollfd);
while (1) { /* Infinite loop until error (one side closes the connection) */
-/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server, "proxy: CONNECT: going to sleep (poll)");*/
- if ((rv = apr_poll(pollfd, 2, &pollcnt, -1)) != APR_SUCCESS)
- {
+ if ((rv = apr_pollset_poll(pollset, -1, &pollcnt, &signalled)) != APR_SUCCESS) {
apr_socket_close(sock);
ap_log_rerror(APLOG_MARK, APLOG_ERR, rv, r, "proxy: CONNECT: error apr_poll()");
return HTTP_INTERNAL_SERVER_ERROR;
@@ -330,62 +336,66 @@
/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: CONNECT: woke from select(), i=%d", pollcnt);*/
- if (pollcnt) {
- apr_poll_revents_get(&pollevent, sock, pollfd);
- if (pollevent & APR_POLLIN) {
+ for (i = 0; i < pollcnt; i++) {
+ const apr_pollfd_t *cur = &signalled[i];
+
+ if (cur->desc.s == sock) {
+ pollevent = cur->rtnevents;
+ if (pollevent & APR_POLLIN) {
/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: CONNECT: sock was set");*/
- nbytes = sizeof(buffer);
- if (apr_socket_recv(sock, buffer, &nbytes) == APR_SUCCESS) {
- o = 0;
- i = nbytes;
- while(i > 0)
- {
- nbytes = i;
+ nbytes = sizeof(buffer);
+ if (apr_socket_recv(sock, buffer, &nbytes) == APR_SUCCESS) {
+ o = 0;
+ i = nbytes;
+ while(i > 0)
+ {
+ nbytes = i;
/* This is just plain wrong. No module should ever write directly
* to the client. For now, this works, but this is high on my list of
* things to fix. The correct line is:
* if ((nbytes = ap_rwrite(buffer + o, nbytes, r)) < 0)
* rbb
*/
- if (apr_socket_send(client_socket, buffer + o, &nbytes) != APR_SUCCESS)
- break;
- o += nbytes;
- i -= nbytes;
+ if (apr_socket_send(client_socket, buffer + o, &nbytes) != APR_SUCCESS)
+ break;
+ o += nbytes;
+ i -= nbytes;
+ }
}
+ else
+ break;
}
- else
+ else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP))
break;
}
- else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP))
- break;
-
-
- apr_poll_revents_get(&pollevent, client_socket, pollfd);
- if (pollevent & APR_POLLIN) {
+ else if (cur->desc.s == client_socket) {
+ pollevent = cur->rtnevents;
+ if (pollevent & APR_POLLIN) {
/* ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,
"proxy: CONNECT: client was set");*/
- nbytes = sizeof(buffer);
- if (apr_socket_recv(client_socket, buffer, &nbytes) == APR_SUCCESS) {
- o = 0;
- i = nbytes;
- while(i > 0)
- {
- nbytes = i;
- if (apr_socket_send(sock, buffer + o, &nbytes) != APR_SUCCESS)
- break;
- o += nbytes;
- i -= nbytes;
+ nbytes = sizeof(buffer);
+ if (apr_socket_recv(client_socket, buffer, &nbytes) == APR_SUCCESS) {
+ o = 0;
+ i = nbytes;
+ while(i > 0)
+ {
+ nbytes = i;
+ if (apr_socket_send(sock, buffer + o, &nbytes) != APR_SUCCESS)
+ break;
+ o += nbytes;
+ i -= nbytes;
+ }
}
+ else
+ break;
}
- else
+ else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP))
break;
}
- else if ((pollevent & APR_POLLERR) || (pollevent & APR_POLLHUP))
- break;
+ else
+ break;
}
- else
- break;
}
ap_log_error(APLOG_MARK, APLOG_DEBUG, 0, r->server,