81 |
* does some basic initialization and adds it to the ready queue;. |
* does some basic initialization and adds it to the ready queue;. |
82 |
*/ |
*/ |
83 |
|
|
84 |
void get_request(server_params* params, socket_type server_s) |
void get_request(server_params* params, socket_type *server_s) |
85 |
{ |
{ |
86 |
int fd; /* socket */ |
int fd; /* socket */ |
87 |
struct SOCKADDR remote_addr; /* address */ |
struct SOCKADDR remote_addr; /* address */ |
99 |
* 0 or 1, and we have 2 mutexes, one for the secure port, |
* 0 or 1, and we have 2 mutexes, one for the secure port, |
100 |
* and one of the normal http port. |
* and one of the normal http port. |
101 |
*/ |
*/ |
102 |
pthread_mutex_lock( &accept_mutex[ server_s.secure]); |
pthread_mutex_lock( &accept_mutex[ server_s->secure]); |
103 |
#endif |
#endif |
104 |
|
|
105 |
fd = accept(server_s.socket, (struct sockaddr *) &remote_addr, |
fd = accept(server_s->socket, (struct sockaddr *) &remote_addr, |
106 |
&remote_addrlen); |
&remote_addrlen); |
107 |
|
|
108 |
#ifdef ENABLE_SMP |
#ifdef ENABLE_SMP |
109 |
pthread_mutex_unlock( &accept_mutex[ server_s.secure]); |
pthread_mutex_unlock( &accept_mutex[ server_s->secure]); |
110 |
#endif |
#endif |
111 |
|
|
112 |
if (fd == -1) { |
if (fd == -1) { |
115 |
WARN("accept"); |
WARN("accept"); |
116 |
else |
else |
117 |
/* no requests */ |
/* no requests */ |
118 |
server_s.pending_requests = 0; |
server_s->pending_requests = 0; |
119 |
return; |
return; |
120 |
} |
} |
121 |
if (fd >= FD_SETSIZE) { |
if (fd >= FD_SETSIZE) { |
159 |
#endif |
#endif |
160 |
|
|
161 |
#ifdef ENABLE_SSL |
#ifdef ENABLE_SSL |
162 |
if ( server_s.secure) { |
if ( server_s->secure) { |
163 |
ssl_state = initialize_ssl_session(); |
ssl_state = initialize_ssl_session(); |
164 |
if (ssl_state == NULL) { |
if (ssl_state == NULL) { |
165 |
WARN("Could not initialize ssl state."); |
WARN("Could not initialize ssl state."); |
187 |
conn->fd = fd; |
conn->fd = fd; |
188 |
conn->ssl_state = ssl_state; |
conn->ssl_state = ssl_state; |
189 |
|
|
190 |
if (server_s.secure != 0) conn->secure = 1; |
if (server_s->secure != 0) conn->secure = 1; |
191 |
else conn->secure = 0; |
else conn->secure = 0; |
192 |
|
|
193 |
if ( server_s.secure != 0) |
if ( server_s->secure != 0) |
194 |
conn->status = FINISH_HANDSHAKE; |
conn->status = FINISH_HANDSHAKE; |
195 |
else conn->status = READ_HEADER; |
else conn->status = READ_HEADER; |
196 |
|
|
246 |
|
|
247 |
params->status.requests++; |
params->status.requests++; |
248 |
|
|
249 |
#ifdef USE_TCPNODELAY |
#ifdef HAVE_TCP_CORK |
|
/* Thanks to Jef Poskanzer <jef@acme.com> for this tweak */ |
|
250 |
{ |
{ |
251 |
int one = 1; |
int one = 1; |
252 |
if (setsockopt(conn->fd, IPPROTO_TCP, TCP_NODELAY, |
if (setsockopt(conn->fd, IPPROTO_TCP, TCP_CORK, |
253 |
(void *) &one, sizeof (one)) == -1) { |
(void *) &one, sizeof (one)) == -1) { |
254 |
DIE("setsockopt: unable to set TCP_NODELAY"); |
WARN("setsockopt: unable to set TCP_CORK"); |
255 |
} |
} |
256 |
|
|
257 |
} |
} |
258 |
#endif |
#endif /* TCP_CORK */ |
259 |
|
|
260 |
|
|
261 |
#ifndef NO_RATE_LIMIT |
#ifndef NO_RATE_LIMIT |
262 |
if (conn->fd > max_connections) { |
if (conn->fd > max_connections) { |
263 |
send_r_service_unavailable(conn); |
send_r_service_unavailable(conn); |
264 |
conn->status = DONE; |
conn->status = DONE; |
265 |
server_s.pending_requests = 0; |
server_s->pending_requests = 0; |
266 |
} |
} |
267 |
#endif /* NO_RATE_LIMIT */ |
#endif /* NO_RATE_LIMIT */ |
268 |
|
|
442 |
gnutls_deinit( req->ssl_state); |
gnutls_deinit( req->ssl_state); |
443 |
} |
} |
444 |
#endif |
#endif |
445 |
|
/* Needed when TCP_CORK is used... */ |
446 |
|
socket_flush( req->fd); |
447 |
|
|
448 |
close(req->fd); |
close(req->fd); |
449 |
|
|
464 |
* ready list for more procesing. |
* ready list for more procesing. |
465 |
*/ |
*/ |
466 |
|
|
467 |
void process_requests(server_params* params, socket_type server_s) |
void process_requests(server_params* params, socket_type *server_s) |
468 |
{ |
{ |
469 |
int retval = 0; |
int retval = 0; |
470 |
request *current, *trailer; |
request *current, *trailer; |
471 |
|
|
472 |
if (server_s.pending_requests) { |
if (server_s->pending_requests) { |
473 |
get_request(params, server_s); |
get_request(params, server_s); |
474 |
#ifdef ORIGINAL_BEHAVIOR |
#ifdef ORIGINAL_BEHAVIOR |
475 |
server_s.pending_requests = 0; |
server_s->pending_requests = 0; |
476 |
#endif |
#endif |
477 |
} |
} |
478 |
|
|
563 |
* if we are on the last request, and get_request is successful, |
* if we are on the last request, and get_request is successful, |
564 |
* current->next is valid! |
* current->next is valid! |
565 |
*/ |
*/ |
566 |
if (server_s.pending_requests) |
if (server_s->pending_requests) |
567 |
get_request(params, server_s); |
get_request(params, server_s); |
568 |
|
|
569 |
switch (retval) { |
switch (retval) { |