Add zero-copy interface version of http_response_builder_body

This commit is contained in:
2025-11-22 23:51:43 +01:00
parent b881feb93a
commit fa9b0e9919
4 changed files with 106 additions and 0 deletions
+48
View File
@@ -4327,6 +4327,54 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str)
byte_queue_write(&conn->output, str.ptr, str.len); byte_queue_write(&conn->output, str.ptr, str.len);
} }
void http_response_builder_body_cap(HTTP_ResponseBuilder builder, int cap)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return;
if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) {
append_special_headers(conn);
conn->state = HTTP_SERVER_CONN_WAIT_BODY;
}
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return;
byte_queue_write_setmincap(&conn->output, cap);
}
char *http_response_builder_body_buf(HTTP_ResponseBuilder builder, int *cap)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return NULL;
if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) {
append_special_headers(conn);
conn->state = HTTP_SERVER_CONN_WAIT_BODY;
}
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return NULL;
ByteView tmp = byte_queue_write_buf(&conn->output);
*cap = tmp.len;
return tmp.ptr;
}
void http_response_builder_body_ack(HTTP_ResponseBuilder builder, int num)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return;
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return;
byte_queue_write_ack(&conn->output, num);
}
void http_response_builder_send(HTTP_ResponseBuilder builder) void http_response_builder_send(HTTP_ResponseBuilder builder)
{ {
HTTP_ServerConn *conn = builder_to_conn(builder); HTTP_ServerConn *conn = builder_to_conn(builder);
+5
View File
@@ -1142,6 +1142,11 @@ void http_response_builder_header(HTTP_ResponseBuilder builder, HTTP_String str)
// Append some bytes to the response's body // Append some bytes to the response's body
void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str); void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str);
// TODO: comment
void http_response_builder_body_cap(HTTP_ResponseBuilder builder, int cap);
char *http_response_builder_body_buf(HTTP_ResponseBuilder builder, int *cap);
void http_response_builder_body_ack(HTTP_ResponseBuilder builder, int num);
// Mark the response as complete. This will invalidate // Mark the response as complete. This will invalidate
// the response builder handle. // the response builder handle.
void http_response_builder_send(HTTP_ResponseBuilder builder); void http_response_builder_send(HTTP_ResponseBuilder builder);
+48
View File
@@ -491,6 +491,54 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str)
byte_queue_write(&conn->output, str.ptr, str.len); byte_queue_write(&conn->output, str.ptr, str.len);
} }
void http_response_builder_body_cap(HTTP_ResponseBuilder builder, int cap)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return;
if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) {
append_special_headers(conn);
conn->state = HTTP_SERVER_CONN_WAIT_BODY;
}
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return;
byte_queue_write_setmincap(&conn->output, cap);
}
char *http_response_builder_body_buf(HTTP_ResponseBuilder builder, int *cap)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return NULL;
if (conn->state != HTTP_SERVER_CONN_WAIT_HEADER) {
append_special_headers(conn);
conn->state = HTTP_SERVER_CONN_WAIT_BODY;
}
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return NULL;
ByteView tmp = byte_queue_write_buf(&conn->output);
*cap = tmp.len;
return tmp.ptr;
}
void http_response_builder_body_ack(HTTP_ResponseBuilder builder, int num)
{
HTTP_ServerConn *conn = builder_to_conn(builder);
if (conn == NULL)
return;
if (conn->state != HTTP_SERVER_CONN_WAIT_BODY)
return;
byte_queue_write_ack(&conn->output, num);
}
void http_response_builder_send(HTTP_ResponseBuilder builder) void http_response_builder_send(HTTP_ResponseBuilder builder)
{ {
HTTP_ServerConn *conn = builder_to_conn(builder); HTTP_ServerConn *conn = builder_to_conn(builder);
+5
View File
@@ -220,6 +220,11 @@ void http_response_builder_header(HTTP_ResponseBuilder builder, HTTP_String str)
// Append some bytes to the response's body // Append some bytes to the response's body
void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str); void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str);
// TODO: comment
void http_response_builder_body_cap(HTTP_ResponseBuilder builder, int cap);
char *http_response_builder_body_buf(HTTP_ResponseBuilder builder, int *cap);
void http_response_builder_body_ack(HTTP_ResponseBuilder builder, int num);
// Mark the response as complete. This will invalidate // Mark the response as complete. This will invalidate
// the response builder handle. // the response builder handle.
void http_response_builder_send(HTTP_ResponseBuilder builder); void http_response_builder_send(HTTP_ResponseBuilder builder);