-
Notifications
You must be signed in to change notification settings - Fork 56
/
Copy pathHTTPRequest.cpp
141 lines (116 loc) · 3.06 KB
/
HTTPRequest.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
130
131
132
133
134
135
136
137
138
139
140
141
#include "HTTPRequest.h"
#include <iostream>
#include <string>
#include <assert.h>
#include <errno.h>
#include "HttpUtils.h"
#include "StringUtils.h"
using namespace std;
#define CONNECT_REPLY "HTTP/1.1 200 Connection Established\r\n\r\n"
HTTPRequest::HTTPRequest(MySocket *sock, int serverPort)
{
m_sock = sock;
m_http = new HTTP();
m_serverPort = serverPort;
m_totalBytesRead = 0;
m_totalBytesWritten = 0;
}
HTTPRequest::~HTTPRequest()
{
delete m_http;
}
void HTTPRequest::printDebugInfo()
{
cerr << " isDone = " << m_http->isDone() << endl;
cerr << " bytesRead = " << m_totalBytesRead << endl;
cerr << " bytesWritte = " << m_totalBytesWritten << endl;
cerr << " url = " << m_http->getUrl() << endl;
}
map<string, string> HTTPRequest::getParams() {
return HttpUtils::params(m_http->getQuery());
}
WwwFormEncodedDict HTTPRequest::formEncodedBody() {
WwwFormEncodedDict dict(m_http->getBody());
return dict;
}
string HTTPRequest::getPath() {
return m_http->getPath();
}
string HTTPRequest::getHeader(string key) {
vector<pair<string *, string *> >::iterator iter;
vector<pair<string *, string *> > headers = m_http->getHeaders();
for (iter = headers.begin(); iter != headers.end(); iter++) {
string header_key = *(iter->first);
if (header_key == key) {
return *(iter->second);
}
}
throw "could not find header";
}
bool HTTPRequest::hasAuthToken() {
try {
getHeader("x-auth-token");
return true;
} catch (...) {
return false;
}
}
string HTTPRequest::getAuthToken() {
try {
return getHeader("x-auth-token");
} catch (...) {
return "";
}
}
vector<string> HTTPRequest::getPathComponents() {
return StringUtils::split(getPath(), '/');
}
bool HTTPRequest::readRequest()
{
assert(!m_http->isDone());
string readData;
while(!m_http->isDone()) {
readData = m_sock->read();
onRead(readData.c_str(), readData.size());
}
return true;
}
void HTTPRequest::onRead(const char *buffer, unsigned int len)
{
m_totalBytesRead += len;
unsigned int bytesRead = 0;
assert(len > 0);
while(bytesRead < len) {
assert(!m_http->isDone());
int ret = m_http->addData((const unsigned char *) (buffer + bytesRead), len - bytesRead);
assert(ret > 0);
bytesRead += ret;
// This is a workaround for a parsing bug that sometimes
// crops up with connect commands. The parser will think
// it is done before it reads the last newline of some
// properly formatted connect requests
if(m_http->isDone() && (bytesRead < len)) {
if(m_http->isConnect() && ((len-bytesRead) == 1) && (buffer[bytesRead] == '\n')) {
break;
} else {
assert(false);
}
}
}
}
string HTTPRequest::getHost()
{
return m_http->getHost();
}
string HTTPRequest::getRequest()
{
return m_http->getProxyRequest();
}
string HTTPRequest::getUrl()
{
return m_http->getUrl();
}
bool HTTPRequest::isConnect()
{
return m_http->isConnect();
}