diff --git a/chttp.c b/chttp.c index f9ef146..36048ef 100644 --- a/chttp.c +++ b/chttp.c @@ -4327,6 +4327,54 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str) 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) { HTTP_ServerConn *conn = builder_to_conn(builder); diff --git a/chttp.h b/chttp.h index 9419184..64bed6f 100644 --- a/chttp.h +++ b/chttp.h @@ -1142,6 +1142,11 @@ void http_response_builder_header(HTTP_ResponseBuilder builder, HTTP_String str) // Append some bytes to the response's body 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 // the response builder handle. void http_response_builder_send(HTTP_ResponseBuilder builder); diff --git a/src/server.c b/src/server.c index 605d75b..4fde5f0 100644 --- a/src/server.c +++ b/src/server.c @@ -491,6 +491,54 @@ void http_response_builder_body(HTTP_ResponseBuilder builder, HTTP_String str) 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) { HTTP_ServerConn *conn = builder_to_conn(builder); diff --git a/src/server.h b/src/server.h index c99bfa8..fa79a0c 100644 --- a/src/server.h +++ b/src/server.h @@ -220,6 +220,11 @@ void http_response_builder_header(HTTP_ResponseBuilder builder, HTTP_String str) // Append some bytes to the response's body 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 // the response builder handle. void http_response_builder_send(HTTP_ResponseBuilder builder);