-
Notifications
You must be signed in to change notification settings - Fork 1
/
http_parser.cpp
129 lines (106 loc) · 2.64 KB
/
http_parser.cpp
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
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <iostream>
#include <string>
#include <http_parser.hpp>
const char* test = "GET /favicon.ico HTTP/1.1\r\n"
"Host: 0.0.0.0=5000\r\n"
"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r\n"
"Accept-Language: en-us,en;q=0.5\r\n"
"Accept-Encoding: gzip,deflate\r\n"
"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n"
"Keep-Alive: 300\r\n"
"Connection: keep-alive\r\n"
"\r\n";
const char* bad = "GET /favicon.ico HTTP/1.1\r\n"
"absdfkajl\r\n";
const char* url1 = "GET /favi";
const char* url2 = "con.ico HTTP/1.1\r\n\n";
const char* chunked = "POST /post_chunked_all_your_base HTTP/1.1\r\n"
"Transfer-Encoding: chunked\r\n"
"\r\n"
"1e\r\nall your base are belong to us\r\n"
"d\r\nanother chunk\r\n"
"0\r\n"
"\r\n";
struct Nil
{
template< typename T > int operator()(const T&)
{
std::cout << typeid(T).name() << std::endl;
return 0;
}
};
struct RequestHandler
{
int operator()(const nodejs::events::on_message_begin&)
{
return 0;
}
int operator()(const nodejs::events::on_message_end&)
{
return 0;
}
int operator()(const nodejs::events::on_header_begin&)
{
return 0;
}
int operator()(const nodejs::events::on_header_end& a)
{
std::cout << "url: " << a.url << "(" << a.method << ")" << std::endl;
return 0;
}
int operator()(const nodejs::events::on_header& h)
{
std::cout << h.key << ": " << h.value << std::endl;
return 0;
}
int operator()(const nodejs::events::on_body& h)
{
std::cout << "body: " << h.body << std::endl;
return 0;
}
};
int main(int argc, char** argv)
{
try
{
nodejs::http_request_parser<Nil> parser;
parser.parse(bad, strlen(bad));
}
catch(const nodejs::exceptions::parse_error&)
{
std::cerr << "failed to parse" << std::endl;
}
std::cout << "===" << std::endl;
try
{
nodejs::http_request_parser<RequestHandler> parser;
parser.parse(test, strlen(test));
}
catch(const nodejs::exceptions::parse_error&)
{
std::cerr << "failed to parse" << std::endl;
}
std::cout << "===" << std::endl;
try
{
nodejs::http_request_parser<RequestHandler> parser;
parser.parse(url1, strlen(url1));
parser.parse(url2, strlen(url2));
}
catch(const nodejs::exceptions::parse_error&)
{
std::cerr << "failed to parse" << std::endl;
}
std::cout << "===" << std::endl;
try
{
nodejs::http_request_parser<RequestHandler> parser;
parser.parse(chunked, strlen(chunked));
}
catch(const nodejs::exceptions::parse_error&)
{
std::cerr << "failed to parse" << std::endl;
}
//std::cout << sizeof(nodejs::http_request_parser<int>) << std::endl;
return 0;
}