Port of LwIP performed by Ralf in 2010. Not recommended for use with recent mbed libraries, but good demos of raw LwIP possible

Dependents:   LwIP_raw_API_serverExample tiny-dtls

Committer:
RodColeman
Date:
Tue Sep 18 14:41:24 2012 +0000
Revision:
0:0791c1fece8e
[mbed] converted /Eth_TCP_Wei_Server/lwip

Who changed what in which revision?

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