My fork of the HTTPServer (working)

Dependents:   DGWWebServer LAN2

Committer:
screamer
Date:
Tue Nov 20 12:18:53 2012 +0000
Revision:
1:284f2df30cf9
Parent:
0:7a64fbb4069d
local changes

Who changed what in which revision?

UserRevisionLine numberNew contents of line
screamer 0:7a64fbb4069d 1 #include "HTTPServer.h"
screamer 0:7a64fbb4069d 2 #include "NetServer.h"
screamer 0:7a64fbb4069d 3
screamer 0:7a64fbb4069d 4 using namespace std;
screamer 0:7a64fbb4069d 5 using namespace mbed;
screamer 0:7a64fbb4069d 6
screamer 0:7a64fbb4069d 7 //unsigned int gconnections = 0;
screamer 0:7a64fbb4069d 8
screamer 0:7a64fbb4069d 9 unsigned int mbed::hash(unsigned char *str) {
screamer 0:7a64fbb4069d 10 unsigned int hash = 5381;
screamer 0:7a64fbb4069d 11 int c;
screamer 0:7a64fbb4069d 12 while((c = *(str++))!=(unsigned char)'\0') {
screamer 0:7a64fbb4069d 13 hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
screamer 0:7a64fbb4069d 14 }
screamer 0:7a64fbb4069d 15 return hash;
screamer 0:7a64fbb4069d 16 }
screamer 0:7a64fbb4069d 17
screamer 0:7a64fbb4069d 18 HTTPConnection::HTTPConnection(HTTPServer *pparent, struct tcp_pcb *pcb)
screamer 0:7a64fbb4069d 19 : TCPConnection(pparent, pcb), request_incomplete(true), data(NULL),
screamer 0:7a64fbb4069d 20 request_handler(NULL), request_status(HTTP_NotFound), parent(pparent),
screamer 0:7a64fbb4069d 21 _request_url(NULL), _request_type(0), _request_headerfields(NULL),
screamer 0:7a64fbb4069d 22 _request_length(0), _request_arg_key(NULL), _request_arg_value(NULL),
screamer 0:7a64fbb4069d 23 _request_arg_state(0), emptypolls(0) {
screamer 0:7a64fbb4069d 24 }
screamer 0:7a64fbb4069d 25
screamer 0:7a64fbb4069d 26 HTTPConnection::~HTTPConnection() {
screamer 0:7a64fbb4069d 27 deleteRequest();
screamer 0:7a64fbb4069d 28 emptypolls = 0;
screamer 0:7a64fbb4069d 29 }
screamer 0:7a64fbb4069d 30
screamer 0:7a64fbb4069d 31 const char *HTTPConnection::getField(char *key) const {
screamer 0:7a64fbb4069d 32 unsigned int h = hash((unsigned char *)key);
screamer 0:7a64fbb4069d 33 return _request_fields.find(h)->second;
screamer 0:7a64fbb4069d 34 }
screamer 0:7a64fbb4069d 35
screamer 0:7a64fbb4069d 36 void HTTPConnection::addField(char *key, char *value) {
screamer 0:7a64fbb4069d 37 unsigned int h = hash((unsigned char *)key);
screamer 0:7a64fbb4069d 38 if(parent->isField(h)) {
screamer 0:7a64fbb4069d 39 _request_fields.insert( make_pair(h, value));
screamer 0:7a64fbb4069d 40 }
screamer 0:7a64fbb4069d 41 }
screamer 0:7a64fbb4069d 42
screamer 0:7a64fbb4069d 43 void HTTPConnection::send() {
screamer 0:7a64fbb4069d 44 int i = sndbuf();
screamer 0:7a64fbb4069d 45 if(!request_incomplete&&i) {
screamer 0:7a64fbb4069d 46 switch(request_handler->send(this, i)) {
screamer 0:7a64fbb4069d 47 case HTTP_SuccessEnded:
screamer 0:7a64fbb4069d 48 case HTTP_Failed: {
screamer 0:7a64fbb4069d 49 deleteRequest();
screamer 0:7a64fbb4069d 50 release_callbacks();
screamer 0:7a64fbb4069d 51 NetServer::get()->free(this);
screamer 0:7a64fbb4069d 52 close();
screamer 0:7a64fbb4069d 53 } break;
screamer 0:7a64fbb4069d 54 default:
screamer 0:7a64fbb4069d 55 break;
screamer 0:7a64fbb4069d 56 }
screamer 0:7a64fbb4069d 57 } else {
screamer 0:7a64fbb4069d 58 if(emptypolls>10) {
screamer 0:7a64fbb4069d 59 release_callbacks();
screamer 0:7a64fbb4069d 60 NetServer::get()->free(this);
screamer 0:7a64fbb4069d 61 close();
screamer 0:7a64fbb4069d 62 }
screamer 0:7a64fbb4069d 63 }
screamer 0:7a64fbb4069d 64 }
screamer 0:7a64fbb4069d 65
screamer 0:7a64fbb4069d 66 void HTTPConnection::store(void *d, struct pbuf *p) {
screamer 0:7a64fbb4069d 67 int len = p->len-(((int)d)-((int)p->payload));
screamer 0:7a64fbb4069d 68 do {
screamer 0:7a64fbb4069d 69 switch(request_handler->data(this, d, len)) {
screamer 0:7a64fbb4069d 70 case HTTP_SuccessEnded:
screamer 0:7a64fbb4069d 71 case HTTP_Failed: {
screamer 0:7a64fbb4069d 72 deleteRequest();
screamer 0:7a64fbb4069d 73 release_callbacks();
screamer 0:7a64fbb4069d 74 NetServer::get()->free(this);
screamer 0:7a64fbb4069d 75 close();
screamer 0:7a64fbb4069d 76 } break;
screamer 0:7a64fbb4069d 77 default:
screamer 0:7a64fbb4069d 78 break;
screamer 0:7a64fbb4069d 79 }
screamer 0:7a64fbb4069d 80 p = p->next;
screamer 0:7a64fbb4069d 81 if(p) {
screamer 0:7a64fbb4069d 82 len = p->len;
screamer 0:7a64fbb4069d 83 d = static_cast<char *>(p->payload);
screamer 0:7a64fbb4069d 84 }
screamer 0:7a64fbb4069d 85 } while(_request_type&&p);
screamer 0:7a64fbb4069d 86 }
screamer 0:7a64fbb4069d 87
screamer 0:7a64fbb4069d 88 void HTTPConnection::err(err_t err) {
screamer 0:7a64fbb4069d 89 printf("Error\n");
screamer 0:7a64fbb4069d 90 release_callbacks();
screamer 0:7a64fbb4069d 91 NetServer::get()->free(this);
screamer 0:7a64fbb4069d 92 }
screamer 0:7a64fbb4069d 93
screamer 0:7a64fbb4069d 94 err_t HTTPConnection::poll() {
screamer 0:7a64fbb4069d 95 send();
screamer 0:7a64fbb4069d 96 return ERR_OK;
screamer 0:7a64fbb4069d 97 }
screamer 0:7a64fbb4069d 98
screamer 0:7a64fbb4069d 99 err_t HTTPConnection::sent(u16_t len) {
screamer 0:7a64fbb4069d 100 return poll();
screamer 0:7a64fbb4069d 101 }
screamer 0:7a64fbb4069d 102
screamer 0:7a64fbb4069d 103 err_t HTTPConnection::recv(struct pbuf *q, err_t err) {
screamer 0:7a64fbb4069d 104 struct pbuf *p = q;
screamer 0:7a64fbb4069d 105 int i;
screamer 0:7a64fbb4069d 106 char *data;
screamer 0:7a64fbb4069d 107 if(err == ERR_OK && p != NULL) {
screamer 0:7a64fbb4069d 108 /* Inform TCP that we have taken the data. */
screamer 0:7a64fbb4069d 109 recved(p->tot_len);
screamer 0:7a64fbb4069d 110 data = static_cast<char *>(p->payload);
screamer 0:7a64fbb4069d 111
screamer 0:7a64fbb4069d 112 // :1
screamer 0:7a64fbb4069d 113 // Looking if it's GET, POST,
screamer 0:7a64fbb4069d 114 // Followup from an incomplete request Header,
screamer 0:7a64fbb4069d 115 // POST data or just crap (DEL, HEAD ...).
screamer 0:7a64fbb4069d 116 if(!_request_type&&(strncmp(data, "GET ", 4) == 0)) {
screamer 0:7a64fbb4069d 117 _request_type = GET; // Need :2
screamer 0:7a64fbb4069d 118 } else if(!_request_type&&(strncmp(data, "POST ", 5) == 0)) {
screamer 0:7a64fbb4069d 119 _request_type = POST; // Need :2
screamer 0:7a64fbb4069d 120 } else if(_request_type&&request_incomplete) {
screamer 0:7a64fbb4069d 121 getFields(&p, &data); // Need :3
screamer 0:7a64fbb4069d 122 } else if(_request_type == POST) {
screamer 0:7a64fbb4069d 123 // Followup (Data) // Exits
screamer 0:7a64fbb4069d 124 data = static_cast<char *>(p->payload);
screamer 0:7a64fbb4069d 125 store(data, p);
screamer 0:7a64fbb4069d 126 emptypolls = 0;
screamer 0:7a64fbb4069d 127 pbuf_free(q);
screamer 0:7a64fbb4069d 128 data = NULL;
screamer 0:7a64fbb4069d 129 return ERR_OK;
screamer 0:7a64fbb4069d 130 } else {
screamer 0:7a64fbb4069d 131 pbuf_free(q); // Exits
screamer 0:7a64fbb4069d 132 data = NULL;
screamer 0:7a64fbb4069d 133 return ERR_OK;
screamer 0:7a64fbb4069d 134 }
screamer 0:7a64fbb4069d 135
screamer 0:7a64fbb4069d 136 // :2
screamer 0:7a64fbb4069d 137 // Processing first POST or GET Packet
screamer 0:7a64fbb4069d 138 // need :3 v--- If its 0 we have followup header data.
screamer 0:7a64fbb4069d 139 if(_request_type&&!_request_url) {
screamer 0:7a64fbb4069d 140 char *pagename = (char *)(data + _request_type);
screamer 0:7a64fbb4069d 141 for(i = _request_type; i < p->len; i++) {
screamer 0:7a64fbb4069d 142 if((data[i] == ' ') || (data[i] == '\r') || (data[i] == '\n')) {
screamer 0:7a64fbb4069d 143 data[i] = 0;
screamer 0:7a64fbb4069d 144 data = &data[i+1];
screamer 0:7a64fbb4069d 145 break;
screamer 0:7a64fbb4069d 146 }
screamer 0:7a64fbb4069d 147 }
screamer 0:7a64fbb4069d 148
screamer 0:7a64fbb4069d 149 if((pagename[0] == '/') && (pagename[1] == 0)) {
screamer 0:7a64fbb4069d 150 pagename = "/index.htm";
screamer 0:7a64fbb4069d 151 }
screamer 0:7a64fbb4069d 152
screamer 0:7a64fbb4069d 153 i = strlen(pagename);
screamer 0:7a64fbb4069d 154 _request_url = new char[i+1];
screamer 0:7a64fbb4069d 155 memcpy(_request_url, pagename, i);
screamer 0:7a64fbb4069d 156 _request_url[i] = '\0';
screamer 0:7a64fbb4069d 157 getFields(&p, &data);
screamer 0:7a64fbb4069d 158 }
screamer 0:7a64fbb4069d 159 // :3
screamer 0:7a64fbb4069d 160 // Send or store the first amoungh of data.
screamer 0:7a64fbb4069d 161 // Only when the message is complete.
screamer 0:7a64fbb4069d 162 if(!request_incomplete) {
screamer 0:7a64fbb4069d 163 emptypolls = 0;
screamer 0:7a64fbb4069d 164 // Find the right handler
screamer 0:7a64fbb4069d 165 if(!request_handler) {
screamer 0:7a64fbb4069d 166 request_handler = parent->handle(this);
screamer 0:7a64fbb4069d 167 request_status = request_handler->init(this);
screamer 0:7a64fbb4069d 168 }
screamer 0:7a64fbb4069d 169 i = strlen(_request_headerfields) + 120;
screamer 0:7a64fbb4069d 170 char *buf = new char[i];
screamer 0:7a64fbb4069d 171 sprintf(buf, "HTTP/1.1 %d OK\r\nServer:mbed embedded%s%d%s\r\nConnection: Close\r\n\r\n", request_status,
screamer 0:7a64fbb4069d 172 (_request_length?"\r\nContent-Length: ":""),_request_length,
screamer 0:7a64fbb4069d 173 getHeaderFields());
screamer 0:7a64fbb4069d 174 i = strlen(buf);
screamer 0:7a64fbb4069d 175 if(sndbuf()>i) {
screamer 0:7a64fbb4069d 176 if(request_status==HTTP_NotFound) {
screamer 0:7a64fbb4069d 177 const char *msg = {
screamer 0:7a64fbb4069d 178 "HTTP/1.1 404 Not Found\r\nServer:mbed embedded\r\n"
screamer 0:7a64fbb4069d 179 "Content-Type: text/html\r\n"
screamer 0:7a64fbb4069d 180 "Content-Length: 163\r\n"
screamer 0:7a64fbb4069d 181 "\r\n"
screamer 0:7a64fbb4069d 182 "<html>\r\n"
screamer 0:7a64fbb4069d 183 "<header>\r\n"
screamer 0:7a64fbb4069d 184 "<title>File not found<title>\r\n"
screamer 0:7a64fbb4069d 185 "</header>\r\n"
screamer 0:7a64fbb4069d 186 "<body>\r\n"
screamer 0:7a64fbb4069d 187 "<h1>HTTP 404</h1>\r\n"
screamer 0:7a64fbb4069d 188 "<p>The file you requested was not found on this mbed. </p>\r\n"
screamer 0:7a64fbb4069d 189 "</body>\r\n"
screamer 0:7a64fbb4069d 190 "</html>\r\n"
screamer 0:7a64fbb4069d 191 };
screamer 0:7a64fbb4069d 192
screamer 0:7a64fbb4069d 193 write((void *)msg, strlen(msg), 0);
screamer 0:7a64fbb4069d 194 deleteRequest();
screamer 0:7a64fbb4069d 195 } else {
screamer 0:7a64fbb4069d 196 write(buf, i, (TCP_WRITE_FLAG_COPY | TCP_WRITE_FLAG_MORE));
screamer 0:7a64fbb4069d 197 if(_request_type == POST) {
screamer 0:7a64fbb4069d 198 store(data, p);
screamer 0:7a64fbb4069d 199 } else {
screamer 0:7a64fbb4069d 200 send();
screamer 0:7a64fbb4069d 201 }
screamer 0:7a64fbb4069d 202 }
screamer 0:7a64fbb4069d 203 }
screamer 0:7a64fbb4069d 204 delete buf;
screamer 0:7a64fbb4069d 205 }
screamer 0:7a64fbb4069d 206
screamer 0:7a64fbb4069d 207 // Exits
screamer 0:7a64fbb4069d 208 pbuf_free(q);
screamer 0:7a64fbb4069d 209 data = NULL;
screamer 0:7a64fbb4069d 210 } else {
screamer 0:7a64fbb4069d 211 release_callbacks();
screamer 0:7a64fbb4069d 212 NetServer::get()->free(this);
screamer 0:7a64fbb4069d 213 close();
screamer 0:7a64fbb4069d 214 }
screamer 0:7a64fbb4069d 215 return ERR_OK;
screamer 0:7a64fbb4069d 216 }
screamer 0:7a64fbb4069d 217
screamer 0:7a64fbb4069d 218 void HTTPConnection::getFields(struct pbuf **q, char **d) {
screamer 0:7a64fbb4069d 219 if(parent->fields.empty()) {
screamer 0:7a64fbb4069d 220 while((*q)&&request_incomplete) {
screamer 0:7a64fbb4069d 221 unsigned int end = ((unsigned int)((*q)->payload)+(unsigned int)((*q)->len));
screamer 0:7a64fbb4069d 222 for(; request_incomplete && ((unsigned int)(*d) < end); (*d)++) {
screamer 0:7a64fbb4069d 223 if((*((char *)((*d)-0))=='\n')&&(*((char *)((*d)-1))=='\r')&&
screamer 0:7a64fbb4069d 224 (*((char *)((*d)-2))=='\n')&&(*((char *)((*d)-3))=='\r')) {
screamer 0:7a64fbb4069d 225 request_incomplete = false;
screamer 0:7a64fbb4069d 226 (*d) += 1;
screamer 0:7a64fbb4069d 227 break;
screamer 0:7a64fbb4069d 228 }
screamer 0:7a64fbb4069d 229 }
screamer 0:7a64fbb4069d 230 if(request_incomplete) {
screamer 0:7a64fbb4069d 231 (*q) = (*q)->next;
screamer 0:7a64fbb4069d 232 if((*q)) {
screamer 0:7a64fbb4069d 233 (*d) = static_cast<char *>((*q)->payload);
screamer 0:7a64fbb4069d 234 }
screamer 0:7a64fbb4069d 235 }
screamer 0:7a64fbb4069d 236 }
screamer 0:7a64fbb4069d 237 } else {
screamer 0:7a64fbb4069d 238 char *kb = *d, *ke = NULL, *vb = *d, *ve = NULL;
screamer 0:7a64fbb4069d 239 while((*q)&&request_incomplete) {
screamer 0:7a64fbb4069d 240 unsigned int end = ((unsigned int)((*q)->payload)+(unsigned int)((*q)->len));
screamer 0:7a64fbb4069d 241 for(; request_incomplete && ((unsigned int)(*d) < end); (*d)++) {
screamer 0:7a64fbb4069d 242 switch(**d) {
screamer 0:7a64fbb4069d 243 case ' ': switch(_request_arg_state) {
screamer 0:7a64fbb4069d 244 case 1: case 2: _request_arg_state = 2; break;
screamer 0:7a64fbb4069d 245 case 3: _request_arg_state = 3; break;
screamer 0:7a64fbb4069d 246 default: _request_arg_state = 0; break;
screamer 0:7a64fbb4069d 247 } break;
screamer 0:7a64fbb4069d 248 case ':': switch(_request_arg_state) {
screamer 0:7a64fbb4069d 249 default: _request_arg_state = 2; break;
screamer 0:7a64fbb4069d 250 case 3: _request_arg_state = 3; break;
screamer 0:7a64fbb4069d 251 } break;
screamer 0:7a64fbb4069d 252 case '\r': switch(_request_arg_state) {
screamer 0:7a64fbb4069d 253 default: _request_arg_state = 4; break;
screamer 0:7a64fbb4069d 254 case 5: case 6: _request_arg_state = 6; break;
screamer 0:7a64fbb4069d 255 } break;
screamer 0:7a64fbb4069d 256 case '\n': switch(_request_arg_state) {
screamer 0:7a64fbb4069d 257 default: _request_arg_state = 4; break;
screamer 0:7a64fbb4069d 258 case 4: case 5: _request_arg_state = 5; break;
screamer 0:7a64fbb4069d 259 case 6: _request_arg_state = 7; break;
screamer 0:7a64fbb4069d 260 } break;
screamer 0:7a64fbb4069d 261 default: switch(_request_arg_state) {
screamer 0:7a64fbb4069d 262 default: _request_arg_state = 1; break;
screamer 0:7a64fbb4069d 263 case 2: case 3: _request_arg_state = 3; break;
screamer 0:7a64fbb4069d 264 } break;
screamer 0:7a64fbb4069d 265 }
screamer 0:7a64fbb4069d 266 switch(_request_arg_state) {
screamer 0:7a64fbb4069d 267 case 0: kb = (*d)+1; break; //PreKey
screamer 0:7a64fbb4069d 268 case 1: ke = (*d); break; //Key
screamer 0:7a64fbb4069d 269 case 2: vb = (*d)+1; break; //PreValue
screamer 0:7a64fbb4069d 270 case 3: ve = (*d); break; //Value
screamer 0:7a64fbb4069d 271 default: break;
screamer 0:7a64fbb4069d 272 case 7: request_incomplete = false; break;
screamer 0:7a64fbb4069d 273 case 5: {
screamer 0:7a64fbb4069d 274 int oldkey = (_request_arg_key)?strlen(_request_arg_key):0;
screamer 0:7a64fbb4069d 275 int oldval = (_request_arg_value)?strlen(_request_arg_value):0;
screamer 0:7a64fbb4069d 276 int keylen =(ke&&kb)?ke-kb+1:0;
screamer 0:7a64fbb4069d 277 int vallen = (ve&&vb)?ve-vb+1:0;
screamer 0:7a64fbb4069d 278 char *key = new char[oldkey+keylen];
screamer 0:7a64fbb4069d 279 char *val = new char[oldval+vallen];
screamer 0:7a64fbb4069d 280 if(_request_arg_key&&oldkey) {
screamer 0:7a64fbb4069d 281 strncpy(key, _request_arg_key, oldkey);
screamer 0:7a64fbb4069d 282 }
screamer 0:7a64fbb4069d 283 if(_request_arg_value&&oldval) {
screamer 0:7a64fbb4069d 284 strncpy(val, _request_arg_value, oldval);
screamer 0:7a64fbb4069d 285 }
screamer 0:7a64fbb4069d 286 if(kb&&keylen) {
screamer 0:7a64fbb4069d 287 strncpy(&key[oldkey], kb, keylen);
screamer 0:7a64fbb4069d 288 }
screamer 0:7a64fbb4069d 289 if(vb&&vallen) {
screamer 0:7a64fbb4069d 290 strncpy(&val[oldval], vb, vallen);
screamer 0:7a64fbb4069d 291 }
screamer 0:7a64fbb4069d 292 key[oldkey+keylen] = 0;
screamer 0:7a64fbb4069d 293 val[oldval+vallen] = 0;
screamer 0:7a64fbb4069d 294 // printf("'%s':='%s'\n", key, val);
screamer 0:7a64fbb4069d 295 addField(key, val);
screamer 0:7a64fbb4069d 296 kb = vb = (*d)+1;
screamer 0:7a64fbb4069d 297 ke = ve = NULL;
screamer 0:7a64fbb4069d 298 if(_request_arg_key) {
screamer 0:7a64fbb4069d 299 delete _request_arg_key;
screamer 0:7a64fbb4069d 300 _request_arg_key = NULL;
screamer 0:7a64fbb4069d 301 }
screamer 0:7a64fbb4069d 302 if(_request_arg_value) {
screamer 0:7a64fbb4069d 303 delete _request_arg_value;
screamer 0:7a64fbb4069d 304 _request_arg_value = NULL;
screamer 0:7a64fbb4069d 305 }
screamer 0:7a64fbb4069d 306 delete key;
screamer 0:7a64fbb4069d 307 } break;
screamer 0:7a64fbb4069d 308 }
screamer 0:7a64fbb4069d 309 }
screamer 0:7a64fbb4069d 310 }
screamer 0:7a64fbb4069d 311 switch(_request_arg_state) {
screamer 0:7a64fbb4069d 312 case 0: break; // PreKey
screamer 0:7a64fbb4069d 313 case 5: break; // n-rec
screamer 0:7a64fbb4069d 314 case 6: break; // 2r-rec
screamer 0:7a64fbb4069d 315 default: break;
screamer 0:7a64fbb4069d 316 case 1: case 2: { // Key // PreValue
screamer 0:7a64fbb4069d 317 int keylen =(kb)?(*d)-kb+1:0;
screamer 0:7a64fbb4069d 318 _request_arg_key = new char[keylen];
screamer 0:7a64fbb4069d 319 strncpy(_request_arg_key, kb, keylen+1);
screamer 0:7a64fbb4069d 320 _request_arg_key[keylen] = 0;
screamer 0:7a64fbb4069d 321 } break;
screamer 0:7a64fbb4069d 322 case 3: case 4: { // Value // r-rec
screamer 0:7a64fbb4069d 323 int keylen =(ke&&kb)?ke-kb+1:0;
screamer 0:7a64fbb4069d 324 int vallen = (vb)?(*d)-vb+1:0;
screamer 0:7a64fbb4069d 325 _request_arg_key = new char[keylen];
screamer 0:7a64fbb4069d 326 _request_arg_value = new char[vallen];
screamer 0:7a64fbb4069d 327 strncpy(_request_arg_key, kb, keylen+1);
screamer 0:7a64fbb4069d 328 strncpy(_request_arg_value, vb, vallen+1);
screamer 0:7a64fbb4069d 329 _request_arg_key[keylen] = 0;
screamer 0:7a64fbb4069d 330 _request_arg_value[vallen] = 0;
screamer 0:7a64fbb4069d 331 } break;
screamer 0:7a64fbb4069d 332 }
screamer 0:7a64fbb4069d 333 if(request_incomplete) {
screamer 0:7a64fbb4069d 334 (*q) = (*q)->next;
screamer 0:7a64fbb4069d 335 if((*q)) {
screamer 0:7a64fbb4069d 336 (*d) = static_cast<char *>((*q)->payload);
screamer 0:7a64fbb4069d 337 }
screamer 0:7a64fbb4069d 338 }
screamer 0:7a64fbb4069d 339 }
screamer 0:7a64fbb4069d 340 }
screamer 0:7a64fbb4069d 341
screamer 0:7a64fbb4069d 342 HTTPServer::HTTPServer(u16_t port) : TCPListener(port) {
screamer 0:7a64fbb4069d 343 }
screamer 0:7a64fbb4069d 344
screamer 0:7a64fbb4069d 345 void HTTPConnection::deleteRequest() {
screamer 0:7a64fbb4069d 346 for(map<unsigned int, char *>::iterator iter = _request_fields.begin();
screamer 0:7a64fbb4069d 347 iter!=_request_fields.end();iter++) {
screamer 0:7a64fbb4069d 348 delete iter->second;
screamer 0:7a64fbb4069d 349 }
screamer 0:7a64fbb4069d 350 _request_fields.clear();
screamer 0:7a64fbb4069d 351 if(data) {delete data; data = NULL; };
screamer 0:7a64fbb4069d 352
screamer 0:7a64fbb4069d 353 if(_request_type) {
screamer 0:7a64fbb4069d 354 delete _request_headerfields;
screamer 0:7a64fbb4069d 355 delete _request_arg_key;
screamer 0:7a64fbb4069d 356 delete _request_arg_value;
screamer 0:7a64fbb4069d 357 if(_request_url) {
screamer 0:7a64fbb4069d 358 delete _request_url;
screamer 0:7a64fbb4069d 359 _request_url = NULL;
screamer 0:7a64fbb4069d 360 }
screamer 0:7a64fbb4069d 361 }
screamer 0:7a64fbb4069d 362 _request_type = 0;
screamer 0:7a64fbb4069d 363 request_incomplete = true;
screamer 0:7a64fbb4069d 364 }
screamer 0:7a64fbb4069d 365