ah: double-check timeouts on all active ah independent of wsi and dump info
This commit is contained in:
parent
58195fbc1e
commit
c60b2413a4
1 changed files with 67 additions and 0 deletions
|
@ -854,6 +854,10 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t
|
|||
if (pollfd)
|
||||
our_fd = pollfd->fd;
|
||||
|
||||
/*
|
||||
* Phase 1: check every wsi on the timeout check list
|
||||
*/
|
||||
|
||||
wsi = context->pt[tsi].timeout_list;
|
||||
while (wsi) {
|
||||
/* we have to take copies, because he may be deleted */
|
||||
|
@ -868,7 +872,70 @@ lws_service_fd_tsi(struct lws_context *context, struct lws_pollfd *pollfd, int t
|
|||
}
|
||||
wsi = wsi1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Phase 2: double-check active ah timeouts independent of wsi
|
||||
* timeout status
|
||||
*/
|
||||
|
||||
for (n = 0; n < context->max_http_header_pool; n++)
|
||||
if (pt->ah_pool[n].in_use && pt->ah_pool[n].wsi &&
|
||||
pt->ah_pool[n].assigned &&
|
||||
now - pt->ah_pool[n].assigned > 60) {
|
||||
int len;
|
||||
char buf[256];
|
||||
const unsigned char *c;
|
||||
|
||||
/*
|
||||
* a single ah session somehow got held for
|
||||
* an unreasonable amount of time.
|
||||
*
|
||||
* Dump info on the connection...
|
||||
*/
|
||||
|
||||
wsi = pt->ah_pool[n].wsi;
|
||||
buf[0] = '\0';
|
||||
lws_get_peer_simple(wsi, buf, sizeof(buf));
|
||||
lwsl_notice("ah excessive hold: wsi %p\n"
|
||||
" peer address: %s\n"
|
||||
" ah rxpos %u, rxlen %u, pos %u\n",
|
||||
wsi, buf, pt->ah_pool[n].rxpos,
|
||||
pt->ah_pool[n].rxlen,
|
||||
pt->ah_pool[n].pos);
|
||||
|
||||
m = 0;
|
||||
do {
|
||||
c = lws_token_to_string(m);
|
||||
if (!c)
|
||||
break;
|
||||
|
||||
len = lws_hdr_total_length(wsi, m);
|
||||
if (!len || len > sizeof(buf) - 1) {
|
||||
m++;
|
||||
continue;
|
||||
}
|
||||
|
||||
lws_hdr_copy(wsi, buf, sizeof buf, m);
|
||||
buf[sizeof(buf) - 1] = '\0';
|
||||
|
||||
lwsl_notice(" %s = %s\n",
|
||||
(const char *)c, buf);
|
||||
m++;
|
||||
} while (1);
|
||||
|
||||
/* ... and then drop the connection */
|
||||
|
||||
if (wsi->desc.sockfd == our_fd)
|
||||
/* it was the guy we came to service! */
|
||||
timed_out = 1;
|
||||
|
||||
lws_close_free_wsi(wsi, LWS_CLOSE_STATUS_NOSTATUS);
|
||||
}
|
||||
|
||||
#ifdef LWS_WITH_CGI
|
||||
/*
|
||||
* Phase 3: handle cgi timeouts
|
||||
*/
|
||||
lws_cgi_kill_terminated(pt);
|
||||
#endif
|
||||
#if 0
|
||||
|
|
Loading…
Add table
Reference in a new issue