-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathhttp_header_parse.c
More file actions
97 lines (93 loc) · 2.74 KB
/
http_header_parse.c
File metadata and controls
97 lines (93 loc) · 2.74 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#include "http_header_parse.h"
#include "debug.h"
enum HEADER_LINE_STATE init_header_line_state() {
return HEADER_STATE_START;
}
/*
* Check if argument is a valid part of a word.
* @param True if argument is a digit or alpha.
*/
static int valid_value_letter(char letter) {
int is_digit = (48 <= letter) && (letter <= 57);
int is_alpha_down = (65 <= letter) && (letter <= 90);
int is_alpha_up = (97 <= letter) && (letter <= 122);
int is_dash = letter == '-';
int is_slash = letter == '/';
int is_colon = letter == ':';
int is_semicolon = letter == ';';
int is_comma = letter == ',';
int is_dot = letter == '.';
int is_space = letter == ' ';
int is_equal = letter == '=';
return is_digit || is_alpha_down || is_alpha_up || is_dash || is_slash || is_colon || is_semicolon || is_comma || is_dot || is_space || is_equal;
}
static int valid_key_letter(char letter) {
int is_digit = (48 <= letter) && (letter <= 57);
int is_alpha_down = (65 <= letter) && (letter <= 90);
int is_alpha_up = (97 <= letter) && (letter <= 122);
int is_dash = letter == '-';
int is_slash = letter == '/';
int is_semicolon = letter == ';';
int is_comma = letter == ',';
int is_dot = letter == '.';
return is_digit || is_alpha_down || is_alpha_up || is_dash || is_slash || is_semicolon || is_comma || is_dot;
}
enum HEADER_LINE_STATE update_header_line_state(enum HEADER_LINE_STATE state, char input) {
enum HEADER_LINE_STATE new_state;
switch (state) {
case HEADER_STATE_START:
if (valid_key_letter(input)) {
new_state = HEADER_STATE_NAME;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_NAME:
if (valid_key_letter(input)) {
new_state = HEADER_STATE_NAME;
} else if (input == ':') {
new_state = HEADER_STATE_SEP;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_SEP:
if (input == ' ') {
new_state = HEADER_STATE_SPACE;
} else if (valid_value_letter(input)) {
new_state = HEADER_STATE_VAL;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_SPACE:
if (valid_value_letter(input)) {
new_state = HEADER_STATE_VAL;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_VAL:
if (valid_value_letter(input)) {
new_state = HEADER_STATE_VAL;
} else if (input == '\r') {
new_state = HEADER_STATE_R_1;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_R_1:
if (input == '\n') {
new_state = HEADER_STATE_N_2;
} else {
new_state = HEADER_STATE_START;
}
break;
case HEADER_STATE_N_2:
new_state = HEADER_STATE_N_2;
break;
default:
dbgPanic(0);
}
return new_state;
}