From 243a34d725873ca40b4ef514c26a4b7ae87bbe83 Mon Sep 17 00:00:00 2001 From: Dirk Engling Date: Sat, 24 Oct 2026 12:55:37 +0200 Subject: Replace libowfat's array with our new blob abstraction --- opentracker.c | 17 ++++++++--------- ot_http.c | 28 ++++++++++++++++------------ ot_http.h | 4 +++- 3 files changed, 27 insertions(+), 22 deletions(-) diff --git a/opentracker.c b/opentracker.c index 0ae98e6..354e837 100644 --- a/opentracker.c +++ b/opentracker.c @@ -163,7 +163,7 @@ static void handle_dead(const int64 sock) { for (i = 0; i < cookie->batches; ++i) iob_reset(cookie->batch + i); free(cookie->batch); - array_reset(&cookie->request); + buf_reset(&cookie->request); if (cookie->flag & (STRUCT_HTTP_FLAG_WAITINGFORTASK | STRUCT_HTTP_FLAG_CHUNKED_IN_TRANSFER)) mutex_workqueue_canceltask(sock); free(cookie); @@ -189,25 +189,24 @@ static void handle_read(const int64 sock, struct ot_workstruct *ws) { ws->keep_alive = 0; /* If we get the whole request in one packet, handle it without copying */ - if (!array_start(&cookie->request)) { + if (!cookie->request.data) { if ((ws->header_size = header_complete(ws->inbuf, byte_count))) { ws->request = ws->inbuf; ws->request_size = byte_count; http_handle_request(sock, ws); - } else - array_catb(&cookie->request, ws->inbuf, (size_t)byte_count); + } else if (buf_cat(&cookie->request, ws->inbuf, (size_t)byte_count)) + handle_dead(sock); return; } - array_catb(&cookie->request, ws->inbuf, byte_count); - if (array_failed(&cookie->request) || array_bytes(&cookie->request) > 8192) { + if (buf_cat(&cookie->request, ws->inbuf, (size_t)byte_count) || cookie->request.size > G_INBUF_SIZE) { http_issue_error(sock, ws, CODE_HTTPERROR_500); return; } - while ((ws->header_size = header_complete(array_start(&cookie->request), array_bytes(&cookie->request)))) { - ws->request = array_start(&cookie->request); - ws->request_size = array_bytes(&cookie->request); + while ((ws->header_size = header_complete(cookie->request.data, (ssize_t)cookie->request.size))) { + ws->request = cookie->request.data; + ws->request_size = (ssize_t)cookie->request.size; http_handle_request(sock, ws); #ifdef WANT_KEEPALIVE if (!ws->keep_alive) diff --git a/ot_http.c b/ot_http.c index 3174002..85bfcb6 100644 --- a/ot_http.c +++ b/ot_http.c @@ -15,7 +15,6 @@ #include /* Libowfat */ -#include "array.h" #include "iob.h" #include "ip6.h" @@ -54,20 +53,25 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) { return; } - /* whoever sends data is not interested in its input-array */ + /* whoever sends data is not interested in its input buffer */ if (ws->keep_alive && ws->header_size != ws->request_size) { size_t rest = ws->request_size - ws->header_size; - if (array_start(&cookie->request)) { - memmove(array_start(&cookie->request), ws->request + ws->header_size, rest); - array_truncate(&cookie->request, 1, rest); - } else - array_catb(&cookie->request, ws->request + ws->header_size, rest); + if (cookie->request.data) { + memmove(cookie->request.data, ws->request + ws->header_size, rest); + buf_truncate(&cookie->request, rest); + } else if (buf_cat(&cookie->request, ws->request + ws->header_size, rest)) { + /* Without room for what the client pipelined behind this request, answer + this one and let the connection close, rather than keeping it open + around a request we have silently dropped */ + buf_reset(&cookie->request); + ws->keep_alive = 0; + } } else - array_reset(&cookie->request); + buf_reset(&cookie->request); written_size = write(sock, ws->reply, ws->reply_size); if ((written_size < 0) || ((written_size == ws->reply_size) && !ws->keep_alive)) { - array_reset(&cookie->request); + buf_reset(&cookie->request); free(cookie); io_close(sock); return; @@ -78,7 +82,7 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) { tai6464 t; if (!(outbuf = malloc(ws->reply_size - written_size))) { - array_reset(&cookie->request); + buf_reset(&cookie->request); free(cookie); io_close(sock); return; @@ -90,7 +94,7 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) { if (!cookie->batch || OT_IOB_INIT(cookie->batch) == -1) { free(cookie->batch); free(outbuf); - array_reset(&cookie->request); + buf_reset(&cookie->request); free(cookie); io_close(sock); return; @@ -155,7 +159,7 @@ ssize_t http_sendiovecdata(const int64 sock, struct ot_workstruct *ws, size_t io } /* If this socket collected request in a buffer, free it now */ - array_reset(&cookie->request); + buf_reset(&cookie->request); /* If we came here, wait for the answer is over */ if (cookie->flag & STRUCT_HTTP_FLAG_WAITINGFORTASK) { diff --git a/ot_http.h b/ot_http.h index 8980682..e53accc 100644 --- a/ot_http.h +++ b/ot_http.h @@ -6,6 +6,8 @@ #ifndef OT_HTTP_H__ #define OT_HTTP_H__ +#include "ot_buf.h" + typedef enum { STRUCT_HTTP_FLAG_WAITINGFORTASK = 1, STRUCT_HTTP_FLAG_GZIP = 2, @@ -16,7 +18,7 @@ typedef enum { } STRUCT_HTTP_FLAG; struct http_data { - array request; + ot_buf request; io_batch *batch; size_t batches; ot_ip6 ip; -- cgit v1.3