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_location, | ||||
|   http_header_content_type, | ||||
|   http_header_content_disposition | ||||
|   http_header_content_disposition, | ||||
|   http_header_server, | ||||
|   http_header_content_length | ||||
| } http_header; | ||||
| 
 | ||||
| typedef enum http_body_type { | ||||
|  |  | |||
|  | @ -97,7 +97,9 @@ const char *http_header_names[] = { | |||
|   "Connection", | ||||
|   "Location", | ||||
|   "Content-Type", | ||||
|   "Content-Disposition" | ||||
|   "Content-Disposition", | ||||
|   "Server", | ||||
|   "Content-Length" | ||||
| }; | ||||
| 
 | ||||
| const char *http_mime_type_names[][2] = { | ||||
|  |  | |||
|  | @ -1,10 +1,19 @@ | |||
| #include "http_loop.h" | ||||
| #include "log.h" | ||||
| 
 | ||||
| // cppcheck-suppress syntaxError
 | ||||
| static const char *http_response_format = "HTTP/1.1 %i %s\n" | ||||
|                                           "Server: lander/" LANDER_VERSION "\n" | ||||
|                                           "Content-Length: %lu\n"; | ||||
| static const char *server = "lander/" LANDER_VERSION; | ||||
| 
 | ||||
| static int num_digits(size_t n) { | ||||
|   int digits = 1; | ||||
| 
 | ||||
|   while (n > 9) { | ||||
|     digits++; | ||||
| 
 | ||||
|     n /= 10; | ||||
|   } | ||||
| 
 | ||||
|   return digits; | ||||
| } | ||||
| 
 | ||||
| /*
 | ||||
|  * 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; | ||||
|   } | ||||
| 
 | ||||
|   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 = | ||||
|       http_status_names[res->status / 100 - 1][res->status % 100]; | ||||
| 
 | ||||
|   // First we calculate the size of the start of the header
 | ||||
|   int buf_size = snprintf(NULL, 0, http_response_format, res->status, | ||||
|                           response_type_name, res->body.expected_len); | ||||
|   int buf_size = | ||||
|       snprintf(NULL, 0, "HTTP/1.1 %i %s\n", res->status, response_type_name); | ||||
| 
 | ||||
|   // We add each header's required size
 | ||||
|   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
 | ||||
|   // with the required final newline
 | ||||
|   char *buf = malloc(buf_size + 1); | ||||
|   buf_size = sprintf(buf, http_response_format, res->status, response_type_name, | ||||
|                      res->body.expected_len); | ||||
|   buf_size = sprintf(buf, "HTTP/1.1 %i %s\n", res->status, response_type_name); | ||||
| 
 | ||||
|   for (size_t i = 0; i < res->headers.len; i++) { | ||||
|     buf_size += sprintf(&buf[buf_size], "%s: %s\n", | ||||
|  |  | |||
		Loading…
	
		Reference in New Issue