mirror of
https://gitlab.isc.org/isc-projects/bind9
synced 2025-08-30 05:57:52 +00:00
additional code cleanups in httpd.c
- use isc_buffer functions when appropriate, rather than converting to and from isc_region unnecessarily - use the zlib total_out value instead of calculating it - use c99 struct initialization
This commit is contained in:
parent
7f4889e159
commit
4b7248545e
@ -823,7 +823,7 @@ render_500(const char *url, isc_httpdurl_t *urlinfo, const char *querystring,
|
|||||||
|
|
||||||
#ifdef HAVE_ZLIB
|
#ifdef HAVE_ZLIB
|
||||||
/*%<
|
/*%<
|
||||||
* Reallocates compbuffer to size, does nothing if compbuffer is already
|
* Reallocates compbuffer to size; does nothing if compbuffer is already
|
||||||
* larger than size.
|
* larger than size.
|
||||||
*/
|
*/
|
||||||
static void
|
static void
|
||||||
@ -831,11 +831,11 @@ alloc_compspace(isc_httpd_t *httpd, unsigned int size) {
|
|||||||
char *newspace = NULL;
|
char *newspace = NULL;
|
||||||
isc_region_t r;
|
isc_region_t r;
|
||||||
|
|
||||||
isc_buffer_region(&httpd->compbuffer, &r);
|
if (size <= isc_buffer_length(&httpd->compbuffer)) {
|
||||||
if (size < r.length) {
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
isc_buffer_region(&httpd->compbuffer, &r);
|
||||||
newspace = isc_mem_get(httpd->mgr->mctx, size);
|
newspace = isc_mem_get(httpd->mgr->mctx, size);
|
||||||
isc_buffer_reinit(&httpd->compbuffer, newspace, size);
|
isc_buffer_reinit(&httpd->compbuffer, newspace, size);
|
||||||
|
|
||||||
@ -860,25 +860,23 @@ alloc_compspace(isc_httpd_t *httpd, unsigned int size) {
|
|||||||
static isc_result_t
|
static isc_result_t
|
||||||
httpd_compress(isc_httpd_t *httpd) {
|
httpd_compress(isc_httpd_t *httpd) {
|
||||||
z_stream zstr;
|
z_stream zstr;
|
||||||
isc_region_t r;
|
int ret, inputlen;
|
||||||
int ret;
|
|
||||||
int inputlen;
|
|
||||||
|
|
||||||
inputlen = isc_buffer_usedlength(&httpd->bodybuffer);
|
|
||||||
alloc_compspace(httpd, inputlen);
|
|
||||||
isc_buffer_clear(&httpd->compbuffer);
|
|
||||||
isc_buffer_region(&httpd->compbuffer, &r);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We're setting output buffer size to input size so it fails if the
|
* We're setting output buffer size to input size so it fails if the
|
||||||
* compressed data size would be bigger than the input size.
|
* compressed data size would be bigger than the input size.
|
||||||
*/
|
*/
|
||||||
memset(&zstr, 0, sizeof(zstr));
|
inputlen = isc_buffer_usedlength(&httpd->bodybuffer);
|
||||||
zstr.total_in = zstr.avail_in = zstr.total_out = zstr.avail_out =
|
alloc_compspace(httpd, inputlen);
|
||||||
inputlen;
|
isc_buffer_clear(&httpd->compbuffer);
|
||||||
|
|
||||||
zstr.next_in = isc_buffer_base(&httpd->bodybuffer);
|
zstr = (z_stream){
|
||||||
zstr.next_out = r.base;
|
.total_in = inputlen,
|
||||||
|
.avail_out = inputlen,
|
||||||
|
.avail_in = inputlen,
|
||||||
|
.next_in = isc_buffer_base(&httpd->bodybuffer),
|
||||||
|
.next_out = isc_buffer_base(&httpd->compbuffer),
|
||||||
|
};
|
||||||
|
|
||||||
ret = deflateInit(&zstr, Z_DEFAULT_COMPRESSION);
|
ret = deflateInit(&zstr, Z_DEFAULT_COMPRESSION);
|
||||||
if (ret == Z_OK) {
|
if (ret == Z_OK) {
|
||||||
@ -886,7 +884,7 @@ httpd_compress(isc_httpd_t *httpd) {
|
|||||||
}
|
}
|
||||||
deflateEnd(&zstr);
|
deflateEnd(&zstr);
|
||||||
if (ret == Z_STREAM_END) {
|
if (ret == Z_STREAM_END) {
|
||||||
isc_buffer_add(&httpd->compbuffer, inputlen - zstr.avail_out);
|
isc_buffer_add(&httpd->compbuffer, zstr.total_out);
|
||||||
return (ISC_R_SUCCESS);
|
return (ISC_R_SUCCESS);
|
||||||
} else {
|
} else {
|
||||||
return (ISC_R_FAILURE);
|
return (ISC_R_FAILURE);
|
||||||
@ -1025,9 +1023,8 @@ httpd_request(isc_nmhandle_t *handle, isc_result_t eresult,
|
|||||||
isc_buffer_clear(&httpd->headerbuffer);
|
isc_buffer_clear(&httpd->headerbuffer);
|
||||||
isc_buffer_setautorealloc(httpd->sendbuffer, true);
|
isc_buffer_setautorealloc(httpd->sendbuffer, true);
|
||||||
databuffer = (is_compressed ? &httpd->compbuffer : &httpd->bodybuffer);
|
databuffer = (is_compressed ? &httpd->compbuffer : &httpd->bodybuffer);
|
||||||
isc_buffer_usedregion(databuffer, &r);
|
isc_buffer_putmem(httpd->sendbuffer, isc_buffer_base(databuffer),
|
||||||
result = isc_buffer_copyregion(httpd->sendbuffer, &r);
|
isc_buffer_usedlength(databuffer));
|
||||||
RUNTIME_CHECK(result == ISC_R_SUCCESS);
|
|
||||||
|
|
||||||
/* Consume the request from the recv buffer. */
|
/* Consume the request from the recv buffer. */
|
||||||
if (httpd->consume != 0U) {
|
if (httpd->consume != 0U) {
|
||||||
@ -1206,18 +1203,11 @@ httpd_senddone(isc_nmhandle_t *handle, isc_result_t result, void *arg) {
|
|||||||
REQUIRE(VALID_HTTPD(httpd));
|
REQUIRE(VALID_HTTPD(httpd));
|
||||||
REQUIRE(httpd->handle == handle);
|
REQUIRE(httpd->handle == handle);
|
||||||
|
|
||||||
|
/* Clean up buffers */
|
||||||
isc_buffer_free(&httpd->sendbuffer);
|
isc_buffer_free(&httpd->sendbuffer);
|
||||||
|
if (httpd->freecb != NULL && isc_buffer_length(&httpd->bodybuffer) > 0)
|
||||||
/*
|
{
|
||||||
* We will always want to clean up our receive buffer, even if we
|
httpd->freecb(&httpd->bodybuffer, httpd->freecb_arg);
|
||||||
* got an error on send or we are shutting down.
|
|
||||||
*/
|
|
||||||
if (httpd->freecb != NULL) {
|
|
||||||
isc_buffer_t *b = NULL;
|
|
||||||
if (isc_buffer_length(&httpd->bodybuffer) > 0) {
|
|
||||||
b = &httpd->bodybuffer;
|
|
||||||
httpd->freecb(b, httpd->freecb_arg);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
isc_nmhandle_detach(&httpd->sendhandle);
|
isc_nmhandle_detach(&httpd->sendhandle);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user