GainSpan Wi-Fi library see: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Fork of GSwifi_old by gs fan

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/

Information

Please change the baud rate in advance.

  • ATB=115200
  • AT&W0

It may be better and sometimes faster.
GSwifi gs(p13, p14, baud);

Heavily modified new library: http://mbed.org/users/gsfan/code/GSwifi

ゲインスパン Wi-Fi モジュール ライブラリ

ゲインスパン社の低電力 Wi-Fiモジュール(無線LAN) GS1011 シリーズ用のライブラリです。

解説: http://mbed.org/users/gsfan/notebook/gainspan_wifi/

Information

モジュールはあらかじめ次のコマンドでボーレートを変更しておく。

  • ATB=115200
  • AT&W0

場合によってはもっと高速の方がいいかもしれない。クラス宣言時にレート設定をする。
GSwifi gs(p13, p14, baud);

大幅に更新された新しいライブラリ: http://mbed.org/users/gsfan/code/GSwifi

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?

UserRevisionLine numberNew 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