connection.c revision b0f20a4a26bcfa85724b1c2e5ec6a077f12ef44c
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder/* ====================================================================
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * Copyright (c) 1995-1999 The Apache Group. All rights reserved.
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens Elkner *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * Redistribution and use in source and binary forms, with or without
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * modification, are permitted provided that the following conditions
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu Prodescu * are met:
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * 1. Redistributions of source code must retain the above copyright
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * notice, this list of conditions and the following disclaimer.
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly *
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * 2. Redistributions in binary form must reproduce the above copyright
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * notice, this list of conditions and the following disclaimer in
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * the documentation and/or other materials provided with the
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * distribution.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly *
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly * 3. All advertising materials mentioning features or use of this
57221209d11b05aa0373cc3892d5df89ba96ebf9Christian Maeder * software must display the following acknowledgment:
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder * "This product includes software developed by the Apache Group
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder * for use in the Apache HTTP server project (http://www.apache.org/)."
e90dc723887d541f809007ae81c9bb73ced9592eChristian Maeder *
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * 4. The names "Apache Server" and "Apache Group" must not be used to
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * endorse or promote products derived from this software without
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly * prior written permission. For written permission, please contact
66bc8d6e69cde43f1ccbeb76104cf7b8038acd6cChristian Maeder * apache@apache.org.
a00461fcf7432205a79a0f12dbe6c1ebc58bc000Christian Maeder *
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * 5. Products derived from this software may not be called "Apache"
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * nor may "Apache" appear in their names without prior written
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * permission of the Apache Group.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder *
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * 6. Redistributions of any form whatsoever must retain the following
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder * acknowledgment:
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly * "This product includes software developed by the Apache Group
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * for use in the Apache HTTP server project (http://www.apache.org/)."
50c62c8c45643f09bcb2f4a99b07bf1d072ecf40Christian Maeder *
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * THIS SOFTWARE IS PROVIDED BY THE APACHE GROUP ``AS IS'' AND ANY
c0833539c8cf577dd3f2497792fbdd818442744cChristian Maeder * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE APACHE GROUP OR
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
036ecbd8f721096321f47cf6a354a9d1bf3d032fChristian Maeder * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * OF THE POSSIBILITY OF SUCH DAMAGE.
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder * ====================================================================
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder *
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder * This software consists of voluntary contributions made by many
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * individuals on behalf of the Apache Group and was originally based
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * on public domain software written at the National Center for
53bd0c89aa4743dc41a6394db5a90717c1ca4517Liam O'Reilly * Supercomputing Applications, University of Illinois, Urbana-Champaign.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * For more information on the Apache Group and the Apache HTTP server
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * project, please see <http://www.apache.org/>.
9e5f4073e948104307d43c3962d624b8416f191fLiam O'Reilly *
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#define CORE_PRIVATE
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "httpd.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "http_connection.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "http_request.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "http_protocol.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "ap_mpm.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "mpm_status.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "http_config.h"
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#include "http_vhost.h"
ebd23ec61635b0bebf7969d14f65b9d1e39f2b26Liam O'Reilly#include "ap_config.h"
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian MaederHOOK_STRUCT(
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly HOOK_LINK(pre_connection)
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly HOOK_LINK(process_connection)
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian MaederIMPLEMENT_HOOK_VOID(pre_connection,(conn_rec *c),(c))
648fe1220044aac847acbdfbc4155af5556063ebChristian MaederIMPLEMENT_HOOK_RUN_FIRST(int,process_connection,(conn_rec *c),(c),DECLINED)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder/* TODO: reimplement the lingering close stuff */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder#define NO_LINGCLOSE
1a38107941725211e7c3f051f7a8f5e12199f03acmaeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly/*
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * More machine-dependent networking gooo... on some systems,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * you've got to be *really* sure that all the packets are acknowledged
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * before closing the connection, since the client will not be able
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * to see the last response if their TCP buffer is flushed by a RST
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * packet from us, which is what the server's TCP stack will send
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * if it receives any request data after closing the connection.
fa373bc327620e08861294716b4454be8d25669fChristian Maeder *
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * In an ideal world, this function would be accomplished by simply
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * setting the socket option SO_LINGER and handling it within the
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * server's TCP stack while the process continues on to the next request.
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * Unfortunately, it seems that most (if not all) operating systems
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * block the server process on close() when SO_LINGER is used.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * For those that don't, see USE_SO_LINGER below. For the rest,
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder * we have created a home-brew lingering_close.
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly *
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly * Many operating systems tend to block, puke, or otherwise mishandle
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * calls to shutdown only half of the connection. You should define
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder * NO_LINGCLOSE in ap_config.h if such is the case for your system.
9aeda2b3ae8ce0b018955521e4ca835a8ba8a27bLiam O'Reilly */
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly#ifndef MAX_SECS_TO_LINGER
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder#define MAX_SECS_TO_LINGER 30
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder#endif
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder
e7cd36335f0f7be9ed5005e71d94c2856b588d62Christian Maeder#ifdef USE_SO_LINGER
e8d99f05c231b379be702a1aa8c7dd0b3c666928Liam O'Reilly#define NO_LINGCLOSE /* The two lingering options are exclusive */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maederstatic void sock_enable_linger(int s)
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct linger li;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder li.l_onoff = 1;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder li.l_linger = MAX_SECS_TO_LINGER;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder if (setsockopt(s, SOL_SOCKET, SO_LINGER,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder (char *) &li, sizeof(struct linger)) < 0) {
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ap_log_error(APLOG_MARK, APLOG_WARNING, server_conf,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder "setsockopt: (SO_LINGER)");
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* not a fatal error */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder}
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder#else
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder#define sock_enable_linger(s) /* NOOP */
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder#endif /* USE_SO_LINGER */
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder#ifndef NO_LINGCLOSE
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder/* Since many clients will abort a connection instead of closing it,
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder * attempting to log an error message from this routine will only
eb48217dfa67ddb87b8fbd846de293d0636bd578Christian Maeder * confuse the webmaster. There doesn't seem to be any portable way to
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder * distinguish between a dropped connection and something that might be
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * worth logging.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maederstatic void lingering_close(request_rec *r)
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder{
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /*TODO remove the hardwired 512. This is an IO Buffer Size */
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder char dummybuf[512];
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder struct pollfd pd;
ebd23ec61635b0bebf7969d14f65b9d1e39f2b26Liam O'Reilly int lsd;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder int max_wait;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
ebd23ec61635b0bebf7969d14f65b9d1e39f2b26Liam O'Reilly /* Prevent a slow-drip client from holding us here indefinitely */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder max_wait = 30;
4314e26a12954cb1c9be4dea10aa8103edac5bbbChristian Maeder ap_bsetopt(r->connection->client, BO_TIMEOUT, &max_wait);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* Send any leftover data to the client, but never try to again */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly if (ap_bflush(r->connection->client) != APR_SUCCESS) {
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder ap_bclose(r->connection->client);
d5833d2ee7bafcbf2fdd2bdfd9a728c769b100c7Christian Maeder return;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder }
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder ap_bsetflag(r->connection->client, B_EOUT, 1);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
e0f1794e365dd347e97b37d7d22b2fce27296fa1Christian Maeder /* Close our half of the connection --- send the client a FIN */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder lsd = r->connection->client->fd;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder if ((shutdown(lsd, 1) != 0)
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder || ap_is_aborted(r->connection)) {
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder ap_bclose(r->connection->client);
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder return;
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder }
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder /* Set up to wait for readable data on socket... */
7857a35e3af533dfbd0f0e18638ebd211e6358a0Christian Maeder pd.fd = lsd;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder pd.events = POLLIN;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder /* Wait for readable data or error condition on socket;
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * slurp up any data that arrives... We exit when we go for an
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * interval of tv length without getting any more data, get an error
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * from poll(), get an error or EOF on a read, or the timer expires.
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder */
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder /* We use a 2 second timeout because current (Feb 97) browsers
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * fail to close a connection after the server closes it. Thus,
648fe1220044aac847acbdfbc4155af5556063ebChristian Maeder * to avoid keeping the child busy, we are only lingering long enough
bcd914850de931848b86d7728192a149f9c0108bChristian Maeder * for a client that is actively sending data on a connection.
33bdce26495121cdbce30331ef90a1969126a840Liam O'Reilly * This should be sufficient unless the connection is massively
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly * losing packets, in which case we might have missed the RST anyway.
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly * These parameters are reset on each pass, since they might be
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly * changed by poll.
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder */
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder do {
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder pd.revents = 0;
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder } while ((poll(&pd, 1, 2) == 1)
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder && read(lsd, dummybuf, sizeof(dummybuf)));
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly /* && (time() = epoch) < max_wait); */
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly
f21c7417bdd1c0282025cba0f5cb0ff5bc5c98eeLiam O'Reilly /* Should now have seen final ack. Safe to finally kill socket */
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder ap_bclose(r->connection->client);
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder}
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder#endif /* ndef NO_LINGCLOSE */
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von SchroederCORE_EXPORT(void) ap_process_connection(conn_rec *c)
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder{
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder ap_update_vhost_given_ip(c);
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder ap_run_pre_connection(c);
d381ab99d6e2e56e09030577d65d9a118f246d35Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder ap_run_process_connection(c);
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder /*
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder * Close the connection, being careful to send out whatever is still
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder * in our buffers. If possible, try to avoid a hard close until the
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly * client has ACKed our FIN and/or has stopped sending us data.
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly#ifdef NO_LINGCLOSE
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly ap_bclose(c->client); /* just close it */
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly#else
580f1724640a78be687e79d0ec95dd2665e77e91Liam O'Reilly if (r && r->connection
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder && !r->connection->aborted
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder && r->connection->client
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder && (r->connection->client->fd >= 0)) {
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder lingering_close(r);
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly }
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly else {
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly ap_bsetflag(c->client, B_EOUT, 1);
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly ap_bclose(c->client);
7d96b1ef2b8597330aedee6713615ec15508edcfLiam O'Reilly }
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly#endif
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly}
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reillyint ap_process_http_connection(conn_rec *c)
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly {
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly request_rec *r;
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly /*
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly * Read and process each request found on our connection
bc350328e6ac2d9074317e222b4207a6aa49afeaLiam O'Reilly * until no requests are left or we decide to close.
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly */
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder ap_update_connection_status(c->id, "Status", "Reading");
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder while ((r = ap_read_request(c)) != NULL) {
3d3889e0cefcdce9b3f43c53aaa201943ac2e895Jonathan von Schroeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder /* process the request if it was read without error */
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder ap_update_connection_status(c->id, "Status", "Writing");
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder if (r->status == HTTP_OK)
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder ap_process_request(r);
dc403ff45531bc75a7544b8b5fc52a5217a1a54aChristian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder if (!c->keepalive || c->aborted)
45e2bc90dd11147156ddd7f9651ce8b2ec00f2a1Christian Maeder break;
45e2bc90dd11147156ddd7f9651ce8b2ec00f2a1Christian Maeder
ee48a7a67da604356b665e51aa7545536a09b737Christian Maeder ap_update_connection_status(c->id, "Status", "Keepalive");
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder ap_destroy_pool(r->pool);
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder if (ap_graceful_stop_signalled()) {
f19dc06364e8d6ea36f7c170e1f7a0677de63184Liam O'Reilly /* XXX: hey wait, this should do a lingering_close! */
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder ap_bclose(c->client);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return OK;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder }
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder ap_reset_connection_status(c->id);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder return OK;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder}
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder/* Clearly some of this stuff doesn't belong in a generalised connection
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder structure, but for now...
fa373bc327620e08861294716b4454be8d25669fChristian Maeder*/
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maederconn_rec *ap_new_connection(ap_context_t *p, server_rec *server, BUFF *inout,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder const struct sockaddr_in *remaddr,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder const struct sockaddr_in *saddr, long id)
b1f12c962a6fb28a298b36cf6a1dcf2ad788fb58Christian Maeder{
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn_rec *conn = (conn_rec *) ap_pcalloc(p, sizeof(conn_rec));
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder /* Got a connection structure, so initialize what fields we can
fa373bc327620e08861294716b4454be8d25669fChristian Maeder * (the rest are zeroed out by pcalloc).
fa373bc327620e08861294716b4454be8d25669fChristian Maeder */
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->conn_config=ap_create_conn_config(p);
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->pool = p;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->local_addr = *saddr;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->local_ip = ap_pstrdup(conn->pool,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder inet_ntoa(conn->local_addr.sin_addr));
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder conn->base_server = server;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->client = inout;
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->remote_addr = *remaddr;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->remote_ip = ap_pstrdup(conn->pool,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder inet_ntoa(conn->remote_addr.sin_addr));
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder conn->id = id;
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder return conn;
fa373bc327620e08861294716b4454be8d25669fChristian Maeder}
aa4d26536fffe0153cd81d28925985892ac2f300Christian Maeder
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maeder
fa373bc327620e08861294716b4454be8d25669fChristian Maederconn_rec *ap_new_apr_connection(ap_context_t *p, server_rec *server, BUFF *inout,
fa373bc327620e08861294716b4454be8d25669fChristian Maeder const ap_socket_t *conn_socket, long id)
fa373bc327620e08861294716b4454be8d25669fChristian Maeder{
56899f6457976a2ee20f6a23f088cb5655b15715Liam O'Reilly struct sockaddr_in *sa_local, *sa_remote;
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder ap_get_local_name(&sa_local, conn_socket);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder ap_get_remote_name(&sa_remote, conn_socket);
7830e8fa7442fb7452af7ecdba102bc297ae367eChristian Maeder return ap_new_connection(p, server, inout, sa_remote, sa_local, id);
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder}
2a5b885d9350ec6dd8bc4992ee91d2f68aa592f4Christian Maeder