refactor(http): pass Server & Content-Length as proper headers
ci/woodpecker/push/build Pipeline was successful
Details
ci/woodpecker/push/build Pipeline was successful
Details
parent
380605ea08
commit
1587b923c1
|
@ -125,7 +125,9 @@ typedef enum http_header {
|
||||||
http_header_connection = 0,
|
http_header_connection = 0,
|
||||||
http_header_location,
|
http_header_location,
|
||||||
http_header_content_type,
|
http_header_content_type,
|
||||||
http_header_content_disposition
|
http_header_content_disposition,
|
||||||
|
http_header_server,
|
||||||
|
http_header_content_length
|
||||||
} http_header;
|
} http_header;
|
||||||
|
|
||||||
typedef enum http_body_type {
|
typedef enum http_body_type {
|
||||||
|
|
|
@ -97,7 +97,9 @@ const char *http_header_names[] = {
|
||||||
"Connection",
|
"Connection",
|
||||||
"Location",
|
"Location",
|
||||||
"Content-Type",
|
"Content-Type",
|
||||||
"Content-Disposition"
|
"Content-Disposition",
|
||||||
|
"Server",
|
||||||
|
"Content-Length"
|
||||||
};
|
};
|
||||||
|
|
||||||
const char *http_mime_type_names[][2] = {
|
const char *http_mime_type_names[][2] = {
|
||||||
|
|
|
@ -1,10 +1,19 @@
|
||||||
#include "http_loop.h"
|
#include "http_loop.h"
|
||||||
#include "log.h"
|
#include "log.h"
|
||||||
|
|
||||||
// cppcheck-suppress syntaxError
|
static const char *server = "lander/" LANDER_VERSION;
|
||||||
static const char *http_response_format = "HTTP/1.1 %i %s\n"
|
|
||||||
"Server: lander/" LANDER_VERSION "\n"
|
static int num_digits(size_t n) {
|
||||||
"Content-Length: %lu\n";
|
int digits = 1;
|
||||||
|
|
||||||
|
while (n > 9) {
|
||||||
|
digits++;
|
||||||
|
|
||||||
|
n /= 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
return digits;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This function precalculates the size of the total buffer required using
|
* This function precalculates the size of the total buffer required using
|
||||||
|
@ -17,12 +26,20 @@ void http_loop_init_header(http_response *res) {
|
||||||
res->status = http_ok;
|
res->status = http_ok;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
http_res_add_header(res, http_header_server, server, false);
|
||||||
|
|
||||||
|
char *content_length_header = malloc(num_digits(res->body.expected_len) + 1);
|
||||||
|
sprintf(content_length_header, "%zu", res->body.expected_len);
|
||||||
|
|
||||||
|
http_res_add_header(res, http_header_content_length, content_length_header,
|
||||||
|
true);
|
||||||
|
|
||||||
const char *response_type_name =
|
const char *response_type_name =
|
||||||
http_status_names[res->status / 100 - 1][res->status % 100];
|
http_status_names[res->status / 100 - 1][res->status % 100];
|
||||||
|
|
||||||
// First we calculate the size of the start of the header
|
// First we calculate the size of the start of the header
|
||||||
int buf_size = snprintf(NULL, 0, http_response_format, res->status,
|
int buf_size =
|
||||||
response_type_name, res->body.expected_len);
|
snprintf(NULL, 0, "HTTP/1.1 %i %s\n", res->status, response_type_name);
|
||||||
|
|
||||||
// We add each header's required size
|
// We add each header's required size
|
||||||
for (size_t i = 0; i < res->headers.len; i++) {
|
for (size_t i = 0; i < res->headers.len; i++) {
|
||||||
|
@ -34,8 +51,7 @@ void http_loop_init_header(http_response *res) {
|
||||||
// The + 1 is required to store the final null byte, but we will replace it
|
// The + 1 is required to store the final null byte, but we will replace it
|
||||||
// with the required final newline
|
// with the required final newline
|
||||||
char *buf = malloc(buf_size + 1);
|
char *buf = malloc(buf_size + 1);
|
||||||
buf_size = sprintf(buf, http_response_format, res->status, response_type_name,
|
buf_size = sprintf(buf, "HTTP/1.1 %i %s\n", res->status, response_type_name);
|
||||||
res->body.expected_len);
|
|
||||||
|
|
||||||
for (size_t i = 0; i < res->headers.len; i++) {
|
for (size_t i = 0; i < res->headers.len; i++) {
|
||||||
buf_size += sprintf(&buf[buf_size], "%s: %s\n",
|
buf_size += sprintf(&buf[buf_size], "%s: %s\n",
|
||||||
|
|
Loading…
Reference in New Issue