enhanced httpd proxy handling

This commit is contained in:
hyung-hwan 2012-04-05 15:41:53 +00:00
parent 77721b0c94
commit 45b7832b99
5 changed files with 540 additions and 337 deletions

View File

@ -86,6 +86,7 @@ struct qse_htre_t
qse_size_t content_length; qse_size_t content_length;
int keepalive; int keepalive;
const qse_mchar_t* expect; const qse_mchar_t* expect;
const qse_mchar_t* status;
} attr; } attr;
/* header table */ /* header table */

View File

@ -552,6 +552,12 @@ static int capture_expect (qse_htrd_t* htrd, qse_htb_pair_t* pair)
return 0; return 0;
} }
static int capture_status (qse_htrd_t* htrd, qse_htb_pair_t* pair)
{
htrd->re.attr.status = QSE_HTB_VPTR(pair);
return 0;
}
static int capture_transfer_encoding (qse_htrd_t* htrd, qse_htb_pair_t* pair) static int capture_transfer_encoding (qse_htrd_t* htrd, qse_htb_pair_t* pair)
{ {
int n; int n;
@ -590,6 +596,7 @@ static QSE_INLINE int capture_key_header (
{ "Connection", 10, capture_connection }, { "Connection", 10, capture_connection },
{ "Content-Length", 14, capture_content_length }, { "Content-Length", 14, capture_content_length },
{ "Expect", 6, capture_expect }, { "Expect", 6, capture_expect },
{ "Status", 6, capture_status },
{ "Transfer-Encoding", 17, capture_transfer_encoding } { "Transfer-Encoding", 17, capture_transfer_encoding }
}; };

File diff suppressed because it is too large Load Diff

View File

@ -163,7 +163,8 @@ static qse_httpd_task_t* enqueue_task (
qse_httpd_allocmem (httpd, QSE_SIZEOF(*new_task) + xtnsize); qse_httpd_allocmem (httpd, QSE_SIZEOF(*new_task) + xtnsize);
if (new_task == QSE_NULL) return QSE_NULL; if (new_task == QSE_NULL) return QSE_NULL;
QSE_MEMCPY (new_task, task, QSE_SIZEOF(*new_task)); QSE_MEMSET (new_task, 0, QSE_SIZEOF(*new_task) + xtnsize);
*new_task = *task;
if (new_task->init) if (new_task->init)
{ {
@ -430,6 +431,7 @@ qse_printf (QSE_T("failed to accept from server %s\n"), tmp);
return -1; return -1;
} }
qse_printf (QSE_T("MUX ADDHND CLIENT READ %d\n"), client->handle.i);
if (httpd->cbs->mux.addhnd ( if (httpd->cbs->mux.addhnd (
httpd, mux, client->handle, QSE_HTTPD_MUX_READ, httpd, mux, client->handle, QSE_HTTPD_MUX_READ,
perform_client_task, client) <= -1) perform_client_task, client) <= -1)
@ -533,6 +535,7 @@ qse_printf (QSE_T("FAILED TO ACTIVATE SERVER....\n"));
continue; continue;
} }
qse_printf (QSE_T("MUX ADDHND SERVER %d\n"), server->handle.i);
if (httpd->cbs->mux.addhnd ( if (httpd->cbs->mux.addhnd (
httpd, httpd->mux, server->handle, QSE_HTTPD_MUX_READ, httpd, httpd->mux, server->handle, QSE_HTTPD_MUX_READ,
accept_client, server) <= -1) accept_client, server) <= -1)
@ -1001,8 +1004,14 @@ qse_httpd_task_t* qse_httpd_entask (
{ {
qse_httpd_task_t* new_task; qse_httpd_task_t* new_task;
if (client->status & CLIENT_BAD) return QSE_NULL;
new_task = enqueue_task (httpd, client, pred, task, xtnsize); new_task = enqueue_task (httpd, client, pred, task, xtnsize);
if (new_task == QSE_NULL) purge_client (httpd, client); if (new_task == QSE_NULL)
{
/*purge_client (httpd, client);*/
client->status |= CLIENT_BAD;
}
else if (new_task->prev == QSE_NULL) else if (new_task->prev == QSE_NULL)
{ {
/* this new task is the first task for a client */ /* this new task is the first task for a client */
@ -1014,12 +1023,14 @@ qse_httpd_task_t* qse_httpd_entask (
httpd->cbs->mux.delhnd (httpd, httpd->mux, client->handle); httpd->cbs->mux.delhnd (httpd, httpd->mux, client->handle);
client->status &= ~CLIENT_HANDLE_IN_MUX; client->status &= ~CLIENT_HANDLE_IN_MUX;
qse_printf (QSE_T("MUX ADDHND CLIENT RW(ENTASK) %d\n"), client->handle.i);
if (httpd->cbs->mux.addhnd ( if (httpd->cbs->mux.addhnd (
httpd, httpd->mux, client->handle, httpd, httpd->mux, client->handle,
QSE_HTTPD_MUX_READ | QSE_HTTPD_MUX_WRITE, QSE_HTTPD_MUX_READ | QSE_HTTPD_MUX_WRITE,
perform_client_task, client) <= -1) perform_client_task, client) <= -1)
{ {
purge_client (httpd, client); /*purge_client (httpd, client);*/
client->status |= CLIENT_BAD;
new_task = QSE_NULL; new_task = QSE_NULL;
} }
client->status |= CLIENT_HANDLE_IN_MUX; /* READ | WRITE */ client->status |= CLIENT_HANDLE_IN_MUX; /* READ | WRITE */

View File

@ -605,7 +605,6 @@ static int mux_addhnd (
ev.data.ptr = mev; ev.data.ptr = mev;
qse_printf (QSE_T("MUX ADDING %d\n"), (int)handle.i);
if (epoll_ctl (mux->fd, EPOLL_CTL_ADD, handle.i, &ev) <= -1) if (epoll_ctl (mux->fd, EPOLL_CTL_ADD, handle.i, &ev) <= -1)
{ {
/* don't rollback ee.ptr */ /* don't rollback ee.ptr */
@ -627,7 +626,6 @@ static int mux_delhnd (qse_httpd_t* httpd, void* vmux, qse_ubi_t handle)
return -1; return -1;
} }
qse_printf (QSE_T("MUX DELETING %d\n"), (int)handle.i);
mux->ee.len--; mux->ee.len--;
return 0; return 0;
} }
@ -660,7 +658,6 @@ static int mux_poll (qse_httpd_t* httpd, void* vmux, qse_ntime_t timeout)
if (mev->reqmask & QSE_HTTPD_MUX_WRITE) mask |= QSE_HTTPD_MUX_WRITE; if (mev->reqmask & QSE_HTTPD_MUX_WRITE) mask |= QSE_HTTPD_MUX_WRITE;
} }
qse_printf (QSE_T("MUX EXEC %d\n"), (int)mev->handle.i);
mev->cbfun (httpd, mux, mev->handle, mask, mev->cbarg); mev->cbfun (httpd, mux, mev->handle, mask, mev->cbarg);
} }
return 0; return 0;