summaryrefslogtreecommitdiff
path: root/ot_http.c
diff options
context:
space:
mode:
authorDirk Engling <erdgeist@erdgeist.org>2026-10-24 12:55:37 +0200
committerDirk Engling <erdgeist@erdgeist.org>2026-10-24 12:55:37 +0200
commit243a34d725873ca40b4ef514c26a4b7ae87bbe83 (patch)
treec27d1a6645b297a4777d55213ab7bbf7d976e36e /ot_http.c
parent1c73d4452b75d936b1ed8158a1a333017b065a92 (diff)
Replace libowfat's array with our new blob abstraction
Diffstat (limited to 'ot_http.c')
-rw-r--r--ot_http.c28
1 files changed, 16 insertions, 12 deletions
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 @@
15#include <unistd.h> 15#include <unistd.h>
16 16
17/* Libowfat */ 17/* Libowfat */
18#include "array.h"
19#include "iob.h" 18#include "iob.h"
20#include "ip6.h" 19#include "ip6.h"
21 20
@@ -54,20 +53,25 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) {
54 return; 53 return;
55 } 54 }
56 55
57 /* whoever sends data is not interested in its input-array */ 56 /* whoever sends data is not interested in its input buffer */
58 if (ws->keep_alive && ws->header_size != ws->request_size) { 57 if (ws->keep_alive && ws->header_size != ws->request_size) {
59 size_t rest = ws->request_size - ws->header_size; 58 size_t rest = ws->request_size - ws->header_size;
60 if (array_start(&cookie->request)) { 59 if (cookie->request.data) {
61 memmove(array_start(&cookie->request), ws->request + ws->header_size, rest); 60 memmove(cookie->request.data, ws->request + ws->header_size, rest);
62 array_truncate(&cookie->request, 1, rest); 61 buf_truncate(&cookie->request, rest);
63 } else 62 } else if (buf_cat(&cookie->request, ws->request + ws->header_size, rest)) {
64 array_catb(&cookie->request, ws->request + ws->header_size, rest); 63 /* Without room for what the client pipelined behind this request, answer
64 this one and let the connection close, rather than keeping it open
65 around a request we have silently dropped */
66 buf_reset(&cookie->request);
67 ws->keep_alive = 0;
68 }
65 } else 69 } else
66 array_reset(&cookie->request); 70 buf_reset(&cookie->request);
67 71
68 written_size = write(sock, ws->reply, ws->reply_size); 72 written_size = write(sock, ws->reply, ws->reply_size);
69 if ((written_size < 0) || ((written_size == ws->reply_size) && !ws->keep_alive)) { 73 if ((written_size < 0) || ((written_size == ws->reply_size) && !ws->keep_alive)) {
70 array_reset(&cookie->request); 74 buf_reset(&cookie->request);
71 free(cookie); 75 free(cookie);
72 io_close(sock); 76 io_close(sock);
73 return; 77 return;
@@ -78,7 +82,7 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) {
78 tai6464 t; 82 tai6464 t;
79 83
80 if (!(outbuf = malloc(ws->reply_size - written_size))) { 84 if (!(outbuf = malloc(ws->reply_size - written_size))) {
81 array_reset(&cookie->request); 85 buf_reset(&cookie->request);
82 free(cookie); 86 free(cookie);
83 io_close(sock); 87 io_close(sock);
84 return; 88 return;
@@ -90,7 +94,7 @@ static void http_senddata(const int64 sock, struct ot_workstruct *ws) {
90 if (!cookie->batch || OT_IOB_INIT(cookie->batch) == -1) { 94 if (!cookie->batch || OT_IOB_INIT(cookie->batch) == -1) {
91 free(cookie->batch); 95 free(cookie->batch);
92 free(outbuf); 96 free(outbuf);
93 array_reset(&cookie->request); 97 buf_reset(&cookie->request);
94 free(cookie); 98 free(cookie);
95 io_close(sock); 99 io_close(sock);
96 return; 100 return;
@@ -155,7 +159,7 @@ ssize_t http_sendiovecdata(const int64 sock, struct ot_workstruct *ws, size_t io
155 } 159 }
156 160
157 /* If this socket collected request in a buffer, free it now */ 161 /* If this socket collected request in a buffer, free it now */
158 array_reset(&cookie->request); 162 buf_reset(&cookie->request);
159 163
160 /* If we came here, wait for the answer is over */ 164 /* If we came here, wait for the answer is over */
161 if (cookie->flag & STRUCT_HTTP_FLAG_WAITINGFORTASK) { 165 if (cookie->flag & STRUCT_HTTP_FLAG_WAITINGFORTASK) {