GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
Dependents: GSwifi_httpd GSwifi_websocket GSwifi_tcpclient GSwifi_tcpserver ... more
Fork of GSwifi by
GainSpan Wi-Fi library
The GS1011 is an ultra low power 802.11b wireless module from GainSpan.
see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
ゲインスパン Wi-Fi モジュール ライブラリ
ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。
解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/
GSwifi_httpd.cpp@20:151b5a4fdd29, 2012-11-08 (annotated)
- Committer:
- gsfan
- Date:
- Thu Nov 08 01:28:45 2012 +0000
- Revision:
- 20:151b5a4fdd29
- Parent:
- 19:cad912f5a6ba
- Child:
- 22:9b077e2823ce
suport httpd cgi handler
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
gsfan | 18:4b97804c37d1 | 1 | #include "dbg.h" |
gsfan | 18:4b97804c37d1 | 2 | #include "mbed.h" |
gsfan | 18:4b97804c37d1 | 3 | #include "GSwifi.h" |
gsfan | 18:4b97804c37d1 | 4 | |
gsfan | 20:151b5a4fdd29 | 5 | #ifdef GS_USE_HTTPD |
gsfan | 20:151b5a4fdd29 | 6 | |
gsfan | 18:4b97804c37d1 | 7 | #define HTTPD_REQUEST 0 |
gsfan | 18:4b97804c37d1 | 8 | #define HTTPD_HEAD 1 |
gsfan | 18:4b97804c37d1 | 9 | #define HTTPD_SPACE 2 |
gsfan | 18:4b97804c37d1 | 10 | #define HTTPD_BODY 3 |
gsfan | 18:4b97804c37d1 | 11 | #define HTTPD_ERROR 4 |
gsfan | 18:4b97804c37d1 | 12 | |
gsfan | 20:151b5a4fdd29 | 13 | #define MIMETABLE_NUM 7 |
gsfan | 19:cad912f5a6ba | 14 | struct { |
gsfan | 20:151b5a4fdd29 | 15 | char ext[6]; |
gsfan | 20:151b5a4fdd29 | 16 | char type[20]; |
gsfan | 19:cad912f5a6ba | 17 | } mimetable[MIMETABLE_NUM] = { |
gsfan | 19:cad912f5a6ba | 18 | {".txt", "text/plain"}, |
gsfan | 20:151b5a4fdd29 | 19 | {".html", "text/html"}, |
gsfan | 19:cad912f5a6ba | 20 | {".htm", "text/html"}, |
gsfan | 19:cad912f5a6ba | 21 | {".css", "text/css"}, |
gsfan | 19:cad912f5a6ba | 22 | {".jpg", "image/jpeg"}, |
gsfan | 19:cad912f5a6ba | 23 | {".png", "image/png"}, |
gsfan | 19:cad912f5a6ba | 24 | {".gif", "image/gif"}, |
gsfan | 19:cad912f5a6ba | 25 | }; |
gsfan | 19:cad912f5a6ba | 26 | |
gsfan | 18:4b97804c37d1 | 27 | int GSwifi::httpd (int port) { |
gsfan | 18:4b97804c37d1 | 28 | int i; |
gsfan | 18:4b97804c37d1 | 29 | char cmd[GS_CMD_SIZE]; |
gsfan | 18:4b97804c37d1 | 30 | |
gsfan | 18:4b97804c37d1 | 31 | if (! _connect || _status != GSSTAT_READY) return -1; |
gsfan | 18:4b97804c37d1 | 32 | |
gsfan | 18:4b97804c37d1 | 33 | for (i = 0; i < 16; i ++) { |
gsfan | 18:4b97804c37d1 | 34 | _httpd[i].mode = HTTPD_REQUEST; |
gsfan | 18:4b97804c37d1 | 35 | _httpd[i].buf = NULL; |
gsfan | 18:4b97804c37d1 | 36 | _httpd[i].uri = NULL; |
gsfan | 18:4b97804c37d1 | 37 | } |
gsfan | 18:4b97804c37d1 | 38 | _handler_count = 0; |
gsfan | 18:4b97804c37d1 | 39 | |
gsfan | 18:4b97804c37d1 | 40 | sprintf(cmd, "AT+NSTCP=%d", port); |
gsfan | 18:4b97804c37d1 | 41 | if (command(cmd, GSRES_CONNECT)) return -1; |
gsfan | 18:4b97804c37d1 | 42 | |
gsfan | 18:4b97804c37d1 | 43 | newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, NULL); |
gsfan | 19:cad912f5a6ba | 44 | /* |
gsfan | 19:cad912f5a6ba | 45 | // newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, &GSwifi::poll_httpd); |
gsfan | 19:cad912f5a6ba | 46 | // newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, reinterpret_cast<onGsReceiveFunc>(&GSwifi::poll_httpd)); |
gsfan | 19:cad912f5a6ba | 47 | void (GSwifi::*f1)(int,int) = &GSwifi::poll_httpd; |
gsfan | 19:cad912f5a6ba | 48 | onGsReceiveFunc f2 = reinterpret_cast<onGsReceiveFunc>(f1); |
gsfan | 19:cad912f5a6ba | 49 | newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, f2); |
gsfan | 19:cad912f5a6ba | 50 | */ |
gsfan | 18:4b97804c37d1 | 51 | return _cid; |
gsfan | 18:4b97804c37d1 | 52 | } |
gsfan | 18:4b97804c37d1 | 53 | |
gsfan | 18:4b97804c37d1 | 54 | void GSwifi::poll_httpd (int cid, int len) { |
gsfan | 18:4b97804c37d1 | 55 | int i, j, flg = 0; |
gsfan | 18:4b97804c37d1 | 56 | char c; |
gsfan | 18:4b97804c37d1 | 57 | |
gsfan | 18:4b97804c37d1 | 58 | if (len == 0) { |
gsfan | 18:4b97804c37d1 | 59 | _httpd[cid].mode = HTTPD_REQUEST; |
gsfan | 18:4b97804c37d1 | 60 | _httpd[cid].len = 0; |
gsfan | 18:4b97804c37d1 | 61 | _httpd[cid].keepalive = 0; |
gsfan | 18:4b97804c37d1 | 62 | return; |
gsfan | 18:4b97804c37d1 | 63 | } |
gsfan | 18:4b97804c37d1 | 64 | |
gsfan | 18:4b97804c37d1 | 65 | while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) { |
gsfan | 18:4b97804c37d1 | 66 | flg = 0; |
gsfan | 18:4b97804c37d1 | 67 | if (_httpd[cid].buf == NULL) { |
gsfan | 18:4b97804c37d1 | 68 | _httpd[cid].buf = new char[HTTPD_BUF_SIZE]; |
gsfan | 18:4b97804c37d1 | 69 | } |
gsfan | 18:4b97804c37d1 | 70 | for (j = 0; j < len; j ++) { |
gsfan | 18:4b97804c37d1 | 71 | _gs_sock[cid].data->get(&c); |
gsfan | 18:4b97804c37d1 | 72 | if (c == '\r') continue; |
gsfan | 18:4b97804c37d1 | 73 | if (c == '\n' && _httpd[cid].mode != HTTPD_BODY) break; |
gsfan | 18:4b97804c37d1 | 74 | |
gsfan | 18:4b97804c37d1 | 75 | if (_httpd[cid].len < HTTPD_BUF_SIZE - 1) { |
gsfan | 18:4b97804c37d1 | 76 | _httpd[cid].buf[_httpd[cid].len] = c; |
gsfan | 18:4b97804c37d1 | 77 | } |
gsfan | 18:4b97804c37d1 | 78 | _httpd[cid].len ++; |
gsfan | 18:4b97804c37d1 | 79 | if (_httpd[cid].len >= _httpd[cid].length && _httpd[cid].mode == HTTPD_BODY) break; |
gsfan | 18:4b97804c37d1 | 80 | } |
gsfan | 18:4b97804c37d1 | 81 | if (j >= len) return; |
gsfan | 18:4b97804c37d1 | 82 | if (_httpd[cid].len < HTTPD_BUF_SIZE) { |
gsfan | 18:4b97804c37d1 | 83 | _httpd[cid].buf[_httpd[cid].len] = 0; |
gsfan | 20:151b5a4fdd29 | 84 | DBG("httpd %d: %d %s (%d)\r\n", cid, _httpd[cid].mode, _httpd[cid].buf, _httpd[cid].len); |
gsfan | 18:4b97804c37d1 | 85 | } |
gsfan | 18:4b97804c37d1 | 86 | |
gsfan | 18:4b97804c37d1 | 87 | switch (_httpd[cid].mode) { |
gsfan | 18:4b97804c37d1 | 88 | case HTTPD_REQUEST: |
gsfan | 18:4b97804c37d1 | 89 | if (strncmp(_httpd[cid].buf, "GET ", 4) == 0) { |
gsfan | 19:cad912f5a6ba | 90 | _httpd[cid].type = GSPROT_HTTPGET; |
gsfan | 18:4b97804c37d1 | 91 | j = 4; |
gsfan | 18:4b97804c37d1 | 92 | } else |
gsfan | 18:4b97804c37d1 | 93 | if (strncmp(_httpd[cid].buf, "POST ", 5) == 0) { |
gsfan | 19:cad912f5a6ba | 94 | _httpd[cid].type = GSPROT_HTTPPOST; |
gsfan | 18:4b97804c37d1 | 95 | j = 5; |
gsfan | 18:4b97804c37d1 | 96 | } else { |
gsfan | 18:4b97804c37d1 | 97 | _httpd[cid].mode = HTTPD_ERROR; |
gsfan | 18:4b97804c37d1 | 98 | break; |
gsfan | 18:4b97804c37d1 | 99 | } |
gsfan | 18:4b97804c37d1 | 100 | |
gsfan | 18:4b97804c37d1 | 101 | for (i = j; i < _httpd[cid].len; i ++) { |
gsfan | 18:4b97804c37d1 | 102 | if (_httpd[cid].buf[i] == ' ') break; |
gsfan | 18:4b97804c37d1 | 103 | } |
gsfan | 18:4b97804c37d1 | 104 | i = i - j; |
gsfan | 18:4b97804c37d1 | 105 | if (i) { |
gsfan | 18:4b97804c37d1 | 106 | if (_httpd[cid].uri == NULL) { |
gsfan | 18:4b97804c37d1 | 107 | _httpd[cid].uri = new char[HTTPD_URI_SIZE]; |
gsfan | 18:4b97804c37d1 | 108 | } |
gsfan | 18:4b97804c37d1 | 109 | strncpy(_httpd[cid].uri, &_httpd[cid].buf[j], i); |
gsfan | 18:4b97804c37d1 | 110 | _httpd[cid].uri[i] = 0; |
gsfan | 18:4b97804c37d1 | 111 | } |
gsfan | 18:4b97804c37d1 | 112 | _httpd[cid].mode = HTTPD_HEAD; |
gsfan | 18:4b97804c37d1 | 113 | _httpd[cid].length = 0; |
gsfan | 18:4b97804c37d1 | 114 | DBG("uri: %s\r\n", _httpd[cid].uri); |
gsfan | 18:4b97804c37d1 | 115 | break; |
gsfan | 18:4b97804c37d1 | 116 | |
gsfan | 18:4b97804c37d1 | 117 | case HTTPD_HEAD: |
gsfan | 18:4b97804c37d1 | 118 | if (_httpd[cid].len == 0) { |
gsfan | 18:4b97804c37d1 | 119 | _httpd[cid].mode = HTTPD_BODY; |
gsfan | 19:cad912f5a6ba | 120 | if (_httpd[cid].length == 0) flg = 1; // no body |
gsfan | 18:4b97804c37d1 | 121 | } else |
gsfan | 20:151b5a4fdd29 | 122 | if (strncmp(_httpd[cid].buf, "Content-Length: ", 16) == 0) { |
gsfan | 18:4b97804c37d1 | 123 | _httpd[cid].length = atoi(&_httpd[cid].buf[16]); |
gsfan | 18:4b97804c37d1 | 124 | } else |
gsfan | 18:4b97804c37d1 | 125 | if (strncmp(_httpd[cid].buf, "Connection: Keep-Alive", 22) == 0) { |
gsfan | 18:4b97804c37d1 | 126 | if (! _httpd[cid].keepalive) { |
gsfan | 18:4b97804c37d1 | 127 | _httpd[cid].keepalive = HTTPD_KEEPALIVE; |
gsfan | 18:4b97804c37d1 | 128 | } |
gsfan | 18:4b97804c37d1 | 129 | } |
gsfan | 18:4b97804c37d1 | 130 | break; |
gsfan | 18:4b97804c37d1 | 131 | |
gsfan | 18:4b97804c37d1 | 132 | case HTTPD_BODY: |
gsfan | 18:4b97804c37d1 | 133 | if (_httpd[cid].len >= _httpd[cid].length) { |
gsfan | 18:4b97804c37d1 | 134 | DBG("body: %s\r\n", _httpd[cid].buf); |
gsfan | 18:4b97804c37d1 | 135 | flg = 1; |
gsfan | 18:4b97804c37d1 | 136 | } |
gsfan | 18:4b97804c37d1 | 137 | break; |
gsfan | 18:4b97804c37d1 | 138 | } |
gsfan | 18:4b97804c37d1 | 139 | |
gsfan | 18:4b97804c37d1 | 140 | if (flg) { |
gsfan | 18:4b97804c37d1 | 141 | // http request |
gsfan | 18:4b97804c37d1 | 142 | _httpd[cid].buf[_httpd[cid].len] = 0; |
gsfan | 18:4b97804c37d1 | 143 | // scan handler |
gsfan | 18:4b97804c37d1 | 144 | flg = 0; |
gsfan | 18:4b97804c37d1 | 145 | for (i = 0; i < _handler_count; i ++) { |
gsfan | 18:4b97804c37d1 | 146 | j = strlen(_handler[i].uri); |
gsfan | 18:4b97804c37d1 | 147 | if (strncmp(_httpd[cid].uri, _handler[i].uri, j) == NULL) { |
gsfan | 19:cad912f5a6ba | 148 | // found |
gsfan | 19:cad912f5a6ba | 149 | _httpd[cid].host = _gs_sock[cid].host; |
gsfan | 19:cad912f5a6ba | 150 | _httpd[cid].file = &_httpd[cid].uri[j]; |
gsfan | 19:cad912f5a6ba | 151 | _httpd[cid].query = NULL; |
gsfan | 19:cad912f5a6ba | 152 | for (; j < strlen(_httpd[cid].uri); j ++) { |
gsfan | 19:cad912f5a6ba | 153 | if (_httpd[cid].uri[j] == '?') { |
gsfan | 20:151b5a4fdd29 | 154 | // query string |
gsfan | 19:cad912f5a6ba | 155 | _httpd[cid].uri[j] = 0; |
gsfan | 19:cad912f5a6ba | 156 | _httpd[cid].query = &_httpd[cid].uri[j + 1]; |
gsfan | 19:cad912f5a6ba | 157 | break; |
gsfan | 19:cad912f5a6ba | 158 | } |
gsfan | 19:cad912f5a6ba | 159 | } |
gsfan | 19:cad912f5a6ba | 160 | |
gsfan | 18:4b97804c37d1 | 161 | if (_handler[i].dir) { |
gsfan | 18:4b97804c37d1 | 162 | // file |
gsfan | 19:cad912f5a6ba | 163 | httpd_request(cid, &_httpd[cid], _handler[i].dir); |
gsfan | 18:4b97804c37d1 | 164 | flg = 1; |
gsfan | 18:4b97804c37d1 | 165 | } else |
gsfan | 18:4b97804c37d1 | 166 | if (_handler[i].onHttpCgi) { |
gsfan | 18:4b97804c37d1 | 167 | // cgi |
gsfan | 19:cad912f5a6ba | 168 | _handler[i].onHttpCgi(cid, &_httpd[cid]); |
gsfan | 19:cad912f5a6ba | 169 | _httpd[cid].keepalive = 0; |
gsfan | 20:151b5a4fdd29 | 170 | LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]); |
gsfan | 20:151b5a4fdd29 | 171 | LOG("%s %s %d 200 -\r\n", _httpd[cid].type == GSPROT_HTTPGET ? "GET" : "POST", _httpd[cid].uri, _httpd[cid].length); |
gsfan | 18:4b97804c37d1 | 172 | flg = 1; |
gsfan | 18:4b97804c37d1 | 173 | } |
gsfan | 18:4b97804c37d1 | 174 | break; |
gsfan | 18:4b97804c37d1 | 175 | } |
gsfan | 18:4b97804c37d1 | 176 | } |
gsfan | 18:4b97804c37d1 | 177 | if (! flg) { |
gsfan | 19:cad912f5a6ba | 178 | // not found |
gsfan | 18:4b97804c37d1 | 179 | send_httpd_error(cid, 403); |
gsfan | 18:4b97804c37d1 | 180 | } |
gsfan | 18:4b97804c37d1 | 181 | |
gsfan | 18:4b97804c37d1 | 182 | if (_httpd[cid].keepalive) { |
gsfan | 18:4b97804c37d1 | 183 | _httpd[cid].mode = HTTPD_REQUEST; |
gsfan | 18:4b97804c37d1 | 184 | _httpd[cid].len = 0; |
gsfan | 18:4b97804c37d1 | 185 | _httpd[cid].length = 0; |
gsfan | 18:4b97804c37d1 | 186 | _httpd[cid].keepalive --; |
gsfan | 18:4b97804c37d1 | 187 | } else { |
gsfan | 18:4b97804c37d1 | 188 | close(cid); |
gsfan | 18:4b97804c37d1 | 189 | } |
gsfan | 18:4b97804c37d1 | 190 | } |
gsfan | 18:4b97804c37d1 | 191 | |
gsfan | 18:4b97804c37d1 | 192 | if (_httpd[cid].mode == HTTPD_ERROR) { |
gsfan | 18:4b97804c37d1 | 193 | send_httpd_error(cid, 400); |
gsfan | 18:4b97804c37d1 | 194 | } |
gsfan | 18:4b97804c37d1 | 195 | |
gsfan | 18:4b97804c37d1 | 196 | _httpd[cid].len = 0; |
gsfan | 18:4b97804c37d1 | 197 | } |
gsfan | 18:4b97804c37d1 | 198 | } |
gsfan | 18:4b97804c37d1 | 199 | |
gsfan | 19:cad912f5a6ba | 200 | int GSwifi::httpd_request (int cid, GS_httpd *gshttpd, char *dir) { |
gsfan | 18:4b97804c37d1 | 201 | FILE *fp; |
gsfan | 20:151b5a4fdd29 | 202 | int i, len; |
gsfan | 20:151b5a4fdd29 | 203 | char buf[HTTPD_BUF_SIZE]; |
gsfan | 20:151b5a4fdd29 | 204 | char file[HTTPD_URI_SIZE]; |
gsfan | 18:4b97804c37d1 | 205 | |
gsfan | 20:151b5a4fdd29 | 206 | strcpy(file, dir); |
gsfan | 20:151b5a4fdd29 | 207 | strcat(file, gshttpd->file); |
gsfan | 20:151b5a4fdd29 | 208 | if (file[strlen(file) - 1] == '/') { |
gsfan | 20:151b5a4fdd29 | 209 | strcat(file, "index.htm"); |
gsfan | 18:4b97804c37d1 | 210 | } |
gsfan | 20:151b5a4fdd29 | 211 | DBG("file: %s\r\n", file); |
gsfan | 18:4b97804c37d1 | 212 | |
gsfan | 20:151b5a4fdd29 | 213 | fp = fopen(file, "r"); |
gsfan | 18:4b97804c37d1 | 214 | if (fp) { |
gsfan | 19:cad912f5a6ba | 215 | send(cid, "HTTP/1.1 200 OK\r\n", 17); |
gsfan | 18:4b97804c37d1 | 216 | { |
gsfan | 19:cad912f5a6ba | 217 | // file size |
gsfan | 20:151b5a4fdd29 | 218 | i = ftell(fp); |
gsfan | 18:4b97804c37d1 | 219 | fseek(fp, 0, SEEK_END); |
gsfan | 20:151b5a4fdd29 | 220 | len = ftell(fp); |
gsfan | 20:151b5a4fdd29 | 221 | fseek(fp, i, SEEK_SET); |
gsfan | 18:4b97804c37d1 | 222 | } |
gsfan | 20:151b5a4fdd29 | 223 | sprintf(buf, "Content-Length: %d\r\n", len); |
gsfan | 18:4b97804c37d1 | 224 | send(cid, buf, strlen(buf)); |
gsfan | 20:151b5a4fdd29 | 225 | sprintf(buf, "Content-Type: %s\r\n", mimetype(file)); |
gsfan | 18:4b97804c37d1 | 226 | send(cid, buf, strlen(buf)); |
gsfan | 19:cad912f5a6ba | 227 | if (gshttpd->keepalive) { |
gsfan | 18:4b97804c37d1 | 228 | strcpy(buf, "Connection: Keep-Alive\r\n"); |
gsfan | 18:4b97804c37d1 | 229 | } else { |
gsfan | 18:4b97804c37d1 | 230 | strcpy(buf, "Connection: close\r\n"); |
gsfan | 18:4b97804c37d1 | 231 | } |
gsfan | 18:4b97804c37d1 | 232 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 233 | strcpy(buf, "Server: GSwifi httpd\r\n"); |
gsfan | 18:4b97804c37d1 | 234 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 235 | send(cid, "\r\n", 2); |
gsfan | 18:4b97804c37d1 | 236 | |
gsfan | 18:4b97804c37d1 | 237 | for (;;) { |
gsfan | 18:4b97804c37d1 | 238 | i = fread(buf, sizeof(char), sizeof(buf), fp); |
gsfan | 20:151b5a4fdd29 | 239 | if (i <= 0) break; |
gsfan | 18:4b97804c37d1 | 240 | send(cid, buf, i); |
gsfan | 20:151b5a4fdd29 | 241 | #if defined(TARGET_LPC1768) || defined(TARGET_LPC2368) |
gsfan | 18:4b97804c37d1 | 242 | if (feof(fp)) break; |
gsfan | 20:151b5a4fdd29 | 243 | #endif |
gsfan | 18:4b97804c37d1 | 244 | } |
gsfan | 18:4b97804c37d1 | 245 | fclose(fp); |
gsfan | 20:151b5a4fdd29 | 246 | LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]); |
gsfan | 20:151b5a4fdd29 | 247 | LOG("%s %s %d 200 %d\r\n", _httpd[cid].type == GSPROT_HTTPGET ? "GET" : "POST", _httpd[cid].uri, _httpd[cid].length, len); |
gsfan | 18:4b97804c37d1 | 248 | return 0; |
gsfan | 18:4b97804c37d1 | 249 | } |
gsfan | 18:4b97804c37d1 | 250 | |
gsfan | 18:4b97804c37d1 | 251 | send_httpd_error(cid, 404); |
gsfan | 18:4b97804c37d1 | 252 | return -1; |
gsfan | 18:4b97804c37d1 | 253 | } |
gsfan | 18:4b97804c37d1 | 254 | |
gsfan | 19:cad912f5a6ba | 255 | char *GSwifi::mimetype (char *file) { |
gsfan | 19:cad912f5a6ba | 256 | int i, j; |
gsfan | 19:cad912f5a6ba | 257 | |
gsfan | 20:151b5a4fdd29 | 258 | DBG("<%s>\r\n", file); |
gsfan | 19:cad912f5a6ba | 259 | for (i = 0; i < MIMETABLE_NUM; i ++) { |
gsfan | 19:cad912f5a6ba | 260 | j = strlen(mimetable[i].ext); |
gsfan | 19:cad912f5a6ba | 261 | if (strncmp(&file[strlen(file) - j], mimetable[i].ext, j) == NULL) { |
gsfan | 19:cad912f5a6ba | 262 | return mimetable[i].type; |
gsfan | 19:cad912f5a6ba | 263 | } |
gsfan | 19:cad912f5a6ba | 264 | } |
gsfan | 19:cad912f5a6ba | 265 | return mimetable[0].type; |
gsfan | 19:cad912f5a6ba | 266 | } |
gsfan | 19:cad912f5a6ba | 267 | |
gsfan | 18:4b97804c37d1 | 268 | void GSwifi::send_httpd_error (int cid, int err) { |
gsfan | 18:4b97804c37d1 | 269 | char buf[100], msg[30]; |
gsfan | 18:4b97804c37d1 | 270 | |
gsfan | 18:4b97804c37d1 | 271 | switch (err) { |
gsfan | 18:4b97804c37d1 | 272 | case 400: |
gsfan | 18:4b97804c37d1 | 273 | strcpy(msg, "Bad Request"); |
gsfan | 18:4b97804c37d1 | 274 | break; |
gsfan | 18:4b97804c37d1 | 275 | case 403: |
gsfan | 18:4b97804c37d1 | 276 | strcpy(msg, "Forbidden"); |
gsfan | 18:4b97804c37d1 | 277 | break; |
gsfan | 18:4b97804c37d1 | 278 | case 404: |
gsfan | 18:4b97804c37d1 | 279 | strcpy(msg, "Not Found"); |
gsfan | 18:4b97804c37d1 | 280 | break; |
gsfan | 18:4b97804c37d1 | 281 | case 500: |
gsfan | 18:4b97804c37d1 | 282 | default: |
gsfan | 18:4b97804c37d1 | 283 | strcpy(msg, "Internal Server Error"); |
gsfan | 18:4b97804c37d1 | 284 | break; |
gsfan | 18:4b97804c37d1 | 285 | } |
gsfan | 18:4b97804c37d1 | 286 | DBG("httpd error: %d %d %s\r\n", cid, err, msg); |
gsfan | 18:4b97804c37d1 | 287 | |
gsfan | 18:4b97804c37d1 | 288 | sprintf(buf, "HTTP/1.1 %d %s\r\n", err, msg); |
gsfan | 18:4b97804c37d1 | 289 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 290 | strcpy(buf, "Content-Type: text/html\r\n"); |
gsfan | 18:4b97804c37d1 | 291 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 292 | send(cid, "\r\n", 2); |
gsfan | 18:4b97804c37d1 | 293 | |
gsfan | 18:4b97804c37d1 | 294 | sprintf(buf, "<html><head><title>%d %s</title></head>\r\n", err, msg); |
gsfan | 18:4b97804c37d1 | 295 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 296 | sprintf(buf, "<body><h1>%s</h1></body></html>\r\n", msg); |
gsfan | 18:4b97804c37d1 | 297 | send(cid, buf, strlen(buf)); |
gsfan | 18:4b97804c37d1 | 298 | close(cid); |
gsfan | 20:151b5a4fdd29 | 299 | LOG("%d.%d.%d.%d ", _httpd[cid].host.getIp()[0], _httpd[cid].host.getIp()[1], _httpd[cid].host.getIp()[2], _httpd[cid].host.getIp()[3]); |
gsfan | 20:151b5a4fdd29 | 300 | LOG("%s %s %d %d -\r\n", _httpd[cid].type == GSPROT_HTTPGET ? "GET" : "POST", _httpd[cid].uri, _httpd[cid].length, err); |
gsfan | 18:4b97804c37d1 | 301 | } |
gsfan | 18:4b97804c37d1 | 302 | |
gsfan | 19:cad912f5a6ba | 303 | int GSwifi::attach_httpd (const char *uri, const char *dir) { |
gsfan | 18:4b97804c37d1 | 304 | if (_handler_count < HTTPD_HANDLE) { |
gsfan | 18:4b97804c37d1 | 305 | _handler[_handler_count].uri = new char[strlen(uri) + 1]; |
gsfan | 18:4b97804c37d1 | 306 | strcpy(_handler[_handler_count].uri, uri); |
gsfan | 18:4b97804c37d1 | 307 | _handler[_handler_count].dir = new char[strlen(dir) + 1]; |
gsfan | 18:4b97804c37d1 | 308 | strcpy(_handler[_handler_count].dir, dir); |
gsfan | 18:4b97804c37d1 | 309 | _handler[_handler_count].onHttpCgi = NULL; |
gsfan | 18:4b97804c37d1 | 310 | _handler_count ++; |
gsfan | 18:4b97804c37d1 | 311 | return 0; |
gsfan | 18:4b97804c37d1 | 312 | } else { |
gsfan | 18:4b97804c37d1 | 313 | return -1; |
gsfan | 18:4b97804c37d1 | 314 | } |
gsfan | 18:4b97804c37d1 | 315 | } |
gsfan | 18:4b97804c37d1 | 316 | |
gsfan | 19:cad912f5a6ba | 317 | int GSwifi::attach_httpd (const char *uri, onHttpdCgiFunc ponHttpCgi) { |
gsfan | 18:4b97804c37d1 | 318 | if (_handler_count < HTTPD_HANDLE) { |
gsfan | 18:4b97804c37d1 | 319 | _handler[_handler_count].uri = new char[strlen(uri) + 1]; |
gsfan | 18:4b97804c37d1 | 320 | strcpy(_handler[_handler_count].uri, uri); |
gsfan | 18:4b97804c37d1 | 321 | _handler[_handler_count].dir = NULL; |
gsfan | 18:4b97804c37d1 | 322 | _handler[_handler_count].onHttpCgi = ponHttpCgi; |
gsfan | 18:4b97804c37d1 | 323 | _handler_count ++; |
gsfan | 18:4b97804c37d1 | 324 | return 0; |
gsfan | 18:4b97804c37d1 | 325 | } else { |
gsfan | 18:4b97804c37d1 | 326 | return -1; |
gsfan | 18:4b97804c37d1 | 327 | } |
gsfan | 18:4b97804c37d1 | 328 | } |
gsfan | 20:151b5a4fdd29 | 329 | |
gsfan | 20:151b5a4fdd29 | 330 | #endif |