mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-09-02 15:45:25 +00:00
Do not use vector socket functions in HTTP server code
Refactor code in lib/isc/httpd.c to no longer use isc_socket_sendv() as this function will be removed shortly.
This commit is contained in:
committed by
Michał Kępień
parent
3b6f9db3fb
commit
07eebc42e4
@@ -114,9 +114,9 @@ struct isc_httpd {
|
|||||||
* compressed HTTP data, if compression is used.
|
* compressed HTTP data, if compression is used.
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
isc_bufferlist_t bufflist;
|
|
||||||
isc_buffer_t headerbuffer;
|
isc_buffer_t headerbuffer;
|
||||||
isc_buffer_t compbuffer;
|
isc_buffer_t compbuffer;
|
||||||
|
isc_buffer_t *sendbuffer;
|
||||||
|
|
||||||
const char *mimetype;
|
const char *mimetype;
|
||||||
unsigned int retcode;
|
unsigned int retcode;
|
||||||
@@ -667,10 +667,9 @@ isc_httpd_accept(isc_task_t *task, isc_event_t *ev) {
|
|||||||
}
|
}
|
||||||
isc_buffer_init(&httpd->headerbuffer, headerdata, HTTP_SENDGROW);
|
isc_buffer_init(&httpd->headerbuffer, headerdata, HTTP_SENDGROW);
|
||||||
|
|
||||||
ISC_LIST_INIT(httpd->bufflist);
|
|
||||||
|
|
||||||
isc_buffer_initnull(&httpd->compbuffer);
|
isc_buffer_initnull(&httpd->compbuffer);
|
||||||
isc_buffer_initnull(&httpd->bodybuffer);
|
isc_buffer_initnull(&httpd->bodybuffer);
|
||||||
|
httpd->sendbuffer = NULL;
|
||||||
reset_client(httpd);
|
reset_client(httpd);
|
||||||
|
|
||||||
r.base = (unsigned char *)httpd->recvbuf;
|
r.base = (unsigned char *)httpd->recvbuf;
|
||||||
@@ -840,12 +839,13 @@ isc_httpd_compress(isc_httpd_t *httpd) {
|
|||||||
|
|
||||||
static void
|
static void
|
||||||
isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) {
|
isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) {
|
||||||
isc_region_t r;
|
|
||||||
isc_result_t result;
|
isc_result_t result;
|
||||||
isc_httpd_t *httpd = ev->ev_arg;
|
isc_httpd_t *httpd = ev->ev_arg;
|
||||||
isc_socketevent_t *sev = (isc_socketevent_t *)ev;
|
isc_socketevent_t *sev = (isc_socketevent_t *)ev;
|
||||||
isc_httpdurl_t *url;
|
isc_httpdurl_t *url;
|
||||||
isc_time_t now;
|
isc_time_t now;
|
||||||
|
isc_region_t headerr, datar, r;
|
||||||
|
size_t total;
|
||||||
bool is_compressed = false;
|
bool is_compressed = false;
|
||||||
char datebuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
|
char datebuf[ISC_FORMATHTTPTIMESTAMP_SIZE];
|
||||||
|
|
||||||
@@ -963,22 +963,20 @@ isc_httpd_recvdone(isc_task_t *task, isc_event_t *ev) {
|
|||||||
|
|
||||||
isc_httpd_endheaders(httpd); /* done */
|
isc_httpd_endheaders(httpd); /* done */
|
||||||
|
|
||||||
ISC_LIST_APPEND(httpd->bufflist, &httpd->headerbuffer, link);
|
isc_buffer_usedregion(&httpd->headerbuffer, &headerr);
|
||||||
/*
|
|
||||||
* Link the data buffer into our send queue, should we have any data
|
|
||||||
* rendered into it. If no data is present, we won't do anything
|
|
||||||
* with the buffer.
|
|
||||||
*/
|
|
||||||
if (is_compressed == true) {
|
if (is_compressed == true) {
|
||||||
ISC_LIST_APPEND(httpd->bufflist, &httpd->compbuffer, link);
|
isc_buffer_usedregion(&httpd->compbuffer, &datar);
|
||||||
} else {
|
} else {
|
||||||
if (isc_buffer_length(&httpd->bodybuffer) > 0) {
|
isc_buffer_usedregion(&httpd->bodybuffer, &datar);
|
||||||
ISC_LIST_APPEND(httpd->bufflist, &httpd->bodybuffer, link);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
total = headerr.length + datar.length;
|
||||||
|
isc_buffer_allocate(httpd->mgr->mctx, &httpd->sendbuffer, total);
|
||||||
|
isc_buffer_copyregion(httpd->sendbuffer, &headerr);
|
||||||
|
isc_buffer_copyregion(httpd->sendbuffer, &datar);
|
||||||
|
isc_buffer_usedregion(httpd->sendbuffer, &r);
|
||||||
|
|
||||||
/* check return code? */
|
/* check return code? */
|
||||||
(void)isc_socket_sendv(httpd->sock, &httpd->bufflist, task,
|
(void)isc_socket_send(httpd->sock, &r, task,
|
||||||
isc_httpd_senddone, httpd);
|
isc_httpd_senddone, httpd);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
@@ -1126,13 +1124,7 @@ isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) {
|
|||||||
ENTER("senddone");
|
ENTER("senddone");
|
||||||
INSIST(ISC_HTTPD_ISSEND(httpd));
|
INSIST(ISC_HTTPD_ISSEND(httpd));
|
||||||
|
|
||||||
/*
|
isc_buffer_free(&httpd->sendbuffer);
|
||||||
* First, unlink our header buffer from the socket's bufflist. This
|
|
||||||
* is sort of an evil hack, since we know our buffer will be there,
|
|
||||||
* and we know it's address, so we can just remove it directly.
|
|
||||||
*/
|
|
||||||
NOTICE("senddone unlinked header");
|
|
||||||
ISC_LIST_UNLINK(sev->bufferlist, &httpd->headerbuffer, link);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We will always want to clean up our receive buffer, even if we
|
* We will always want to clean up our receive buffer, even if we
|
||||||
@@ -1149,13 +1141,6 @@ isc_httpd_senddone(isc_task_t *task, isc_event_t *ev) {
|
|||||||
}
|
}
|
||||||
NOTICE("senddone free callback performed");
|
NOTICE("senddone free callback performed");
|
||||||
}
|
}
|
||||||
if (ISC_LINK_LINKED(&httpd->bodybuffer, link)) {
|
|
||||||
ISC_LIST_UNLINK(sev->bufferlist, &httpd->bodybuffer, link);
|
|
||||||
NOTICE("senddone body buffer unlinked");
|
|
||||||
} else if (ISC_LINK_LINKED(&httpd->compbuffer, link)) {
|
|
||||||
ISC_LIST_UNLINK(sev->bufferlist, &httpd->compbuffer, link);
|
|
||||||
NOTICE("senddone compressed data unlinked and freed");
|
|
||||||
}
|
|
||||||
|
|
||||||
if (sev->result != ISC_R_SUCCESS) {
|
if (sev->result != ISC_R_SUCCESS) {
|
||||||
destroy_client(&httpd);
|
destroy_client(&httpd);
|
||||||
|
Reference in New Issue
Block a user