added more code for qse_httpd_t
added qse_htre_gethdrval()
This commit is contained in:
File diff suppressed because it is too large
Load Diff
@ -56,3 +56,12 @@ int qse_htre_setstrfromxstr (
|
||||
return (qse_mbs_ncpy (str, xstr->ptr, xstr->len) == (qse_size_t)-1)? -1: 0;
|
||||
}
|
||||
|
||||
const qse_mchar_t* qse_htre_gethdrval (
|
||||
qse_htre_t* re, const qse_mchar_t* name)
|
||||
{
|
||||
qse_htb_pair_t* pair;
|
||||
pair = qse_htb_search (&re->hdrtab, name, qse_mbslen(name));
|
||||
if (pair == QSE_NULL) return pair;
|
||||
return QSE_HTB_VPTR(pair);
|
||||
}
|
||||
|
||||
|
@ -610,7 +610,7 @@ static void delete_from_client_array (qse_httpd_t* httpd, int fd)
|
||||
|
||||
qse_htrd_close (array->data[fd].htrd);
|
||||
array->data[fd].htrd = QSE_NULL;
|
||||
close (array->data[fd].fd);
|
||||
close (array->data[fd].handle.i);
|
||||
array->size--;
|
||||
}
|
||||
}
|
||||
@ -636,6 +636,7 @@ static qse_httpd_client_t* insert_into_client_array (qse_httpd_t* httpd, int fd,
|
||||
{
|
||||
htrd_xtn_t* xtn;
|
||||
client_array_t* array = &httpd->client.array;
|
||||
int opt;
|
||||
|
||||
if (fd >= array->capa)
|
||||
{
|
||||
@ -655,10 +656,17 @@ static qse_httpd_client_t* insert_into_client_array (qse_httpd_t* httpd, int fd,
|
||||
|
||||
QSE_ASSERT (array->data[fd].htrd == QSE_NULL);
|
||||
|
||||
array->data[fd].fd = fd;
|
||||
array->data[fd].addr = *addr;
|
||||
array->data[fd].htrd = qse_htrd_open (httpd->mmgr, QSE_SIZEOF(*xtn));
|
||||
if (array->data[fd].htrd == QSE_NULL) return QSE_NULL;
|
||||
opt = qse_htrd_getoption (array->data[fd].htrd);
|
||||
opt |= QSE_HTRD_REQUEST;
|
||||
opt &= ~QSE_HTRD_RESPONSE;
|
||||
qse_htrd_setoption (array->data[fd].htrd, opt);
|
||||
|
||||
array->data[fd].bad = 0;
|
||||
array->data[fd].handle.i = fd;
|
||||
array->data[fd].addr = *addr;
|
||||
|
||||
pthread_mutex_init (&array->data[fd].task.mutex, NULL);
|
||||
|
||||
xtn = (htrd_xtn_t*)qse_htrd_getxtn (array->data[fd].htrd);
|
||||
@ -765,14 +773,14 @@ static int make_fd_set_from_client_array (qse_httpd_t* httpd, fd_set* r, fd_set*
|
||||
{
|
||||
if (r)
|
||||
{
|
||||
FD_SET (ca->data[fd].fd, r);
|
||||
if (ca->data[fd].fd > max) max = ca->data[fd].fd;
|
||||
FD_SET (ca->data[fd].handle.i, r);
|
||||
if (ca->data[fd].handle.i > max) max = ca->data[fd].handle.i;
|
||||
}
|
||||
if (w && ca->data[fd].task.queue.count > 0)
|
||||
if (w && (ca->data[fd].task.queue.count > 0 || ca->data[fd].bad))
|
||||
{
|
||||
/* add it to the set if it has a response to send */
|
||||
FD_SET (ca->data[fd].fd, w);
|
||||
if (ca->data[fd].fd > max) max = ca->data[fd].fd;
|
||||
FD_SET (ca->data[fd].handle.i, w);
|
||||
if (ca->data[fd].handle.i > max) max = ca->data[fd].handle.i;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -793,7 +801,7 @@ static void perform_task (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
||||
if (n <= -1)
|
||||
{
|
||||
dequeue_task_locked (httpd, client);
|
||||
shutdown (client->fd, SHUT_RDWR);
|
||||
shutdown (client->handle.i, SHUT_RDWR);
|
||||
}
|
||||
else if (n == 0)
|
||||
{
|
||||
@ -853,9 +861,14 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: select returned failure - %S\n"), strerro
|
||||
|
||||
if (!client->htrd) continue;
|
||||
|
||||
if (FD_ISSET(client->fd, &w))
|
||||
if (FD_ISSET(client->handle.i, &w))
|
||||
{
|
||||
if (client->task.queue.count > 0) perform_task (httpd, client);
|
||||
if (client->bad)
|
||||
{
|
||||
/*send (client->handle, i, "INTERNAL SERVER ERROR..", ...);*/
|
||||
shutdown (client->handle.i, 0);
|
||||
}
|
||||
else if (client->task.queue.count > 0) perform_task (httpd, client);
|
||||
}
|
||||
|
||||
}
|
||||
@ -871,13 +884,13 @@ static int read_from_client (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
||||
qse_ssize_t m;
|
||||
|
||||
reread:
|
||||
m = read (client->fd, buf, QSE_SIZEOF(buf));
|
||||
m = read (client->handle.i, buf, QSE_SIZEOF(buf));
|
||||
if (m <= -1)
|
||||
{
|
||||
if (errno != EINTR)
|
||||
{
|
||||
httpd->errnum = QSE_HTTPD_ESOCKET;
|
||||
qse_fprintf (QSE_STDERR, QSE_T("Error: failed to read from a client %d\n"), client->fd);
|
||||
qse_fprintf (QSE_STDERR, QSE_T("Error: failed to read from a client %d\n"), client->handle.i);
|
||||
return -1;
|
||||
}
|
||||
goto reread;
|
||||
@ -885,7 +898,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: failed to read from a client %d\n"), clie
|
||||
else if (m == 0)
|
||||
{
|
||||
httpd->errnum = QSE_HTTPD_EDISCON;
|
||||
qse_fprintf (QSE_STDERR, QSE_T("Debug: connection closed %d\n"), client->fd);
|
||||
qse_fprintf (QSE_STDERR, QSE_T("Debug: connection closed %d\n"), client->handle.i);
|
||||
return -1;
|
||||
}
|
||||
|
||||
@ -974,7 +987,7 @@ qse_fprintf (QSE_STDERR, QSE_T("Error: select returned failure\n"));
|
||||
|
||||
if (!client->htrd) continue;
|
||||
|
||||
if (FD_ISSET(client->fd, &r))
|
||||
if (FD_ISSET(client->handle.i, &r))
|
||||
{
|
||||
/* got input */
|
||||
if (read_from_client (httpd, client) <= -1)
|
||||
@ -1237,7 +1250,15 @@ int qse_httpd_entask (
|
||||
{
|
||||
int ret;
|
||||
ret = enqueue_task_locked (httpd, client, task, xtnsize);
|
||||
if (ret >= 0) pthread_cond_signal (&httpd->client.cond);
|
||||
if (ret <= -1) client->bad = 1; /* mark this client bad */
|
||||
else pthread_cond_signal (&httpd->client.cond);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void qse_httpd_markclientbad (qse_httpd_t* httpd, qse_httpd_client_t* client)
|
||||
{
|
||||
/* mark that something is wrong in processing requests from this client.
|
||||
* this client could be bad... or the system could encounter some errors
|
||||
* like memory allocation failure */
|
||||
client->bad = 1;
|
||||
}
|
||||
|
@ -20,7 +20,7 @@
|
||||
static int task_main_disconnect (
|
||||
qse_httpd_t* httpd, qse_httpd_client_t* client, qse_httpd_task_t* task)
|
||||
{
|
||||
shutdown (client->fd, SHUT_RDWR);
|
||||
shutdown (client->handle.i, SHUT_RDWR);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -67,7 +67,7 @@ static int httpd_main_sendtext (
|
||||
if (count >= ctx->left) count = ctx->left;
|
||||
|
||||
n = send (
|
||||
client->fd,
|
||||
client->handle.i,
|
||||
ctx->ptr,
|
||||
count,
|
||||
0
|
||||
@ -143,7 +143,7 @@ static int httpd_main_sendfmt (
|
||||
if (count >= ctx->left) count = ctx->left;
|
||||
|
||||
n = send (
|
||||
client->fd,
|
||||
client->handle.i,
|
||||
ctx->ptr,
|
||||
count,
|
||||
0
|
||||
@ -287,7 +287,7 @@ static int httpd_main_sendfile (
|
||||
if (count >= ctx->left) count = ctx->left;
|
||||
|
||||
n = sendfile (
|
||||
client->fd,
|
||||
client->handle.i,
|
||||
ctx->fd,
|
||||
&ctx->offset,
|
||||
count
|
||||
@ -295,6 +295,12 @@ static int httpd_main_sendfile (
|
||||
|
||||
if (n <= -1) return -1;
|
||||
|
||||
if (n == 0 && count > 0)
|
||||
{
|
||||
/* TODO: .... */
|
||||
/* anything to do in this case? can this happen if the file has been truncated during transfer.... */
|
||||
}
|
||||
|
||||
ctx->left -= n;
|
||||
if (ctx->left <= 0) return 0;
|
||||
|
||||
|
Reference in New Issue
Block a user