| 20 | namespace dmHttpServerPrivate |
| 21 | { |
| 22 | ParseResult ParseHeader(char* header_str, |
| 23 | void* user_data, |
| 24 | void (*request)(void* user_data, const char* request_method, const char* resource, int major, int minor), |
| 25 | void (*header)(void* user_data, const char* key, const char* value), |
| 26 | void (*response)(void* user_data, int offset)) |
| 27 | { |
| 28 | char* end = strstr(header_str, "\r\n\r\n"); |
| 29 | if (end == 0) |
| 30 | return PARSE_RESULT_NEED_MORE_DATA; |
| 31 | |
| 32 | char* end_version = strstr(header_str, "\r\n"); |
| 33 | *end_version = '\0'; |
| 34 | |
| 35 | char* method = header_str; |
| 36 | char* end_method = strchr(method, ' '); |
| 37 | if (!end_method) |
| 38 | return PARSE_RESULT_SYNTAX_ERROR; |
| 39 | *end_method = '\0'; |
| 40 | |
| 41 | char* resource = end_method + 1; |
| 42 | char* end_resource = strchr(resource, ' '); |
| 43 | if (!end_resource) |
| 44 | return PARSE_RESULT_SYNTAX_ERROR; |
| 45 | *end_resource = '\0'; |
| 46 | |
| 47 | int major, minor; |
| 48 | int count = sscanf(end_resource+1, "HTTP/%d.%d", &major, &minor); |
| 49 | if (count != 2) |
| 50 | { |
| 51 | return PARSE_RESULT_SYNTAX_ERROR; |
| 52 | } |
| 53 | |
| 54 | /* |
| 55 | // Find status string, ie "OK" in "HTTP/1.1 200 OK" |
| 56 | char* tok; |
| 57 | char* last; |
| 58 | tok = dmStrTok(version_str, " ", &last); |
| 59 | tok = dmStrTok(0, " ", &last); |
| 60 | tok = dmStrTok(0, " ", &last); |
| 61 | if (tok == 0) |
| 62 | return PARSE_RESULT_SYNTAX_ERROR;*/ |
| 63 | |
| 64 | request(user_data, method, resource, major, minor); |
| 65 | |
| 66 | // Skip \r\n\r\n |
| 67 | end += 4; |
| 68 | int c = *end; |
| 69 | *end = '\0'; // Terminate headers (up to body) |
| 70 | char* last; |
| 71 | char* tok = dmStrTok(end_version + 2, "\r\n", &last); |
| 72 | while (tok) |
| 73 | { |
| 74 | char* colon = strstr(tok, ":"); |
| 75 | if (!colon) |
| 76 | return PARSE_RESULT_SYNTAX_ERROR; |
| 77 | |
| 78 | char* value = colon + 2; |
| 79 | int c = *colon; |
nothing calls this directly
no test coverage detected