aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--http.c56
1 files changed, 46 insertions, 10 deletions
diff --git a/http.c b/http.c
index d34f931..42f5181 100644
--- a/http.c
+++ b/http.c
@@ -475,25 +475,51 @@ static void ctx_free(struct ctx *const c)
*c = (const struct ctx){0};
}
+static void free_response_headers(struct http_response *const r)
+{
+ for (size_t i = 0; i < r->n_headers; i++)
+ {
+ const struct http_header *const hdr = &r->headers[i];
+
+ free(hdr->header);
+ free(hdr->value);
+ }
+
+ free(r->headers);
+ r->headers = NULL;
+ r->n_headers = 0;
+}
+
static int prepare_headers(struct http_ctx *const h)
{
+ int ret = -1;
struct write_ctx *const w = &h->wctx;
struct dynstr *const d = &w->d;
+ struct http_response *const r = &w->r;
dynstr_init(d);
for (size_t i = 0; i < w->r.n_headers; i++)
{
- const struct http_header *const hdr = &w->r.headers[i];
+ const struct http_header *const hdr = &r->headers[i];
- dynstr_append_or_ret_nonzero(d, "%s: %s\r\n", hdr->header, hdr->value);
- free(hdr->header);
- free(hdr->value);
+ if (dynstr_append(d, "%s: %s\r\n", hdr->header, hdr->value))
+ {
+ fprintf(stderr, "%s: dynstr_append hdr failed\n", __func__);
+ goto end;
+ }
}
- free(w->r.headers);
- dynstr_append_or_ret_nonzero(d, "\r\n");
- return 0;
+ if (dynstr_append(d, "\r\n"))
+ {
+ fprintf(stderr, "%s: dynstr_append crlf failed\n", __func__);
+ goto end;
+ }
+
+ ret = 0;
+end:
+ free_response_headers(r);
+ return ret;
}
static int rw_error(const int r, bool *const close)
@@ -579,6 +605,7 @@ static int write_ctx_free(struct write_ctx *const w)
fprintf(stderr, "%s: fclose(3): %s\n", __func__, strerror(errno));
dynstr_free(&w->d);
+ free_response_headers(&w->r);
*w = (const struct write_ctx){0};
return ret;
}
@@ -767,8 +794,13 @@ static int start_response(struct http_ctx *const h)
w->pending = true;
dynstr_init(&w->d);
- dynstr_append_or_ret_nonzero(&w->d, HTTP_VERSION " %d %s\r\n",
- c->code, c->descr);
+
+ if (dynstr_append(&w->d, HTTP_VERSION " %d %s\r\n", c->code, c->descr))
+ {
+ fprintf(stderr, "%s: dynstr_append failed\n", __func__);
+ return -1;
+ }
+
return 0;
}
@@ -1829,8 +1861,12 @@ static int append_expire(struct dynstr *const d)
fprintf(stderr, "%s: strftime(3) failed\n", __func__);
return -1;
}
+ else if (dynstr_append(d, "; Expires=%s", s))
+ {
+ fprintf(stderr, "%s: dynstr_append failed\n", __func__);
+ return -1;
+ }
- dynstr_append_or_ret_nonzero(d, "; Expires=%s", s);
return 0;
}