MCPcopy Create free account
hub / github.com/defold/defold / ParseHeader

Function ParseHeader

engine/dlib/src/dlib/http_server_private.cpp:22–90  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

20namespace 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;

Callers

nothing calls this directly

Calls 1

dmStrTokFunction · 0.85

Tested by

no test coverage detected