Some quick code to use UDP-only (no TCP) with mBed. Echos received packets and sends packets when a button is pressed

Dependencies:   mbed

Committer:
pehrhovey
Date:
Sun Mar 14 00:54:12 2010 +0000
Revision:
0:a548a085de55

        

Who changed what in which revision?

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