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:
Tue Nov 06 08:54:19 2012 +0000
Revision:
19:cad912f5a6ba
Parent:
18:4b97804c37d1
Child:
20:151b5a4fdd29
fix

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 18:4b97804c37d1 5 #define HTTPD_REQUEST 0
gsfan 18:4b97804c37d1 6 #define HTTPD_HEAD 1
gsfan 18:4b97804c37d1 7 #define HTTPD_SPACE 2
gsfan 18:4b97804c37d1 8 #define HTTPD_BODY 3
gsfan 18:4b97804c37d1 9 #define HTTPD_ERROR 4
gsfan 18:4b97804c37d1 10
gsfan 19:cad912f5a6ba 11 #define MIMETABLE_NUM 6
gsfan 19:cad912f5a6ba 12 struct {
gsfan 19:cad912f5a6ba 13 char ext[5];
gsfan 19:cad912f5a6ba 14 char type[24];
gsfan 19:cad912f5a6ba 15 } mimetable[MIMETABLE_NUM] = {
gsfan 19:cad912f5a6ba 16 {".txt", "text/plain"},
gsfan 19:cad912f5a6ba 17 {".htm", "text/html"},
gsfan 19:cad912f5a6ba 18 {".css", "text/css"},
gsfan 19:cad912f5a6ba 19 {".jpg", "image/jpeg"},
gsfan 19:cad912f5a6ba 20 {".png", "image/png"},
gsfan 19:cad912f5a6ba 21 {".gif", "image/gif"},
gsfan 19:cad912f5a6ba 22 };
gsfan 19:cad912f5a6ba 23
gsfan 18:4b97804c37d1 24 int GSwifi::httpd (int port) {
gsfan 18:4b97804c37d1 25 int i;
gsfan 18:4b97804c37d1 26 char cmd[GS_CMD_SIZE];
gsfan 18:4b97804c37d1 27
gsfan 18:4b97804c37d1 28 if (! _connect || _status != GSSTAT_READY) return -1;
gsfan 18:4b97804c37d1 29
gsfan 18:4b97804c37d1 30 for (i = 0; i < 16; i ++) {
gsfan 18:4b97804c37d1 31 _httpd[i].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 32 _httpd[i].buf = NULL;
gsfan 18:4b97804c37d1 33 _httpd[i].uri = NULL;
gsfan 18:4b97804c37d1 34 }
gsfan 18:4b97804c37d1 35 _handler_count = 0;
gsfan 18:4b97804c37d1 36
gsfan 18:4b97804c37d1 37 sprintf(cmd, "AT+NSTCP=%d", port);
gsfan 18:4b97804c37d1 38 if (command(cmd, GSRES_CONNECT)) return -1;
gsfan 18:4b97804c37d1 39
gsfan 18:4b97804c37d1 40 newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, NULL);
gsfan 19:cad912f5a6ba 41 /*
gsfan 19:cad912f5a6ba 42 // newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, &GSwifi::poll_httpd);
gsfan 19:cad912f5a6ba 43 // newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, reinterpret_cast<onGsReceiveFunc>(&GSwifi::poll_httpd));
gsfan 19:cad912f5a6ba 44 void (GSwifi::*f1)(int,int) = &GSwifi::poll_httpd;
gsfan 19:cad912f5a6ba 45 onGsReceiveFunc f2 = reinterpret_cast<onGsReceiveFunc>(f1);
gsfan 19:cad912f5a6ba 46 newSock(_cid, GSTYPE_SERVER, GSPROT_HTTPD, f2);
gsfan 19:cad912f5a6ba 47 */
gsfan 18:4b97804c37d1 48 return _cid;
gsfan 18:4b97804c37d1 49 }
gsfan 18:4b97804c37d1 50
gsfan 18:4b97804c37d1 51 void GSwifi::poll_httpd (int cid, int len) {
gsfan 18:4b97804c37d1 52 int i, j, flg = 0;
gsfan 18:4b97804c37d1 53 char c;
gsfan 18:4b97804c37d1 54
gsfan 18:4b97804c37d1 55 if (len == 0) {
gsfan 18:4b97804c37d1 56 _httpd[cid].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 57 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 58 _httpd[cid].keepalive = 0;
gsfan 18:4b97804c37d1 59 return;
gsfan 18:4b97804c37d1 60 }
gsfan 18:4b97804c37d1 61
gsfan 18:4b97804c37d1 62 while (_gs_sock[cid].connect && _gs_sock[cid].data->use()) {
gsfan 18:4b97804c37d1 63 flg = 0;
gsfan 18:4b97804c37d1 64 if (_httpd[cid].buf == NULL) {
gsfan 18:4b97804c37d1 65 _httpd[cid].buf = new char[HTTPD_BUF_SIZE];
gsfan 18:4b97804c37d1 66 }
gsfan 18:4b97804c37d1 67 for (j = 0; j < len; j ++) {
gsfan 18:4b97804c37d1 68 _gs_sock[cid].data->get(&c);
gsfan 18:4b97804c37d1 69 if (c == '\r') continue;
gsfan 18:4b97804c37d1 70 if (c == '\n' && _httpd[cid].mode != HTTPD_BODY) break;
gsfan 18:4b97804c37d1 71
gsfan 18:4b97804c37d1 72 if (_httpd[cid].len < HTTPD_BUF_SIZE - 1) {
gsfan 18:4b97804c37d1 73 _httpd[cid].buf[_httpd[cid].len] = c;
gsfan 18:4b97804c37d1 74 }
gsfan 18:4b97804c37d1 75 _httpd[cid].len ++;
gsfan 18:4b97804c37d1 76 if (_httpd[cid].len >= _httpd[cid].length && _httpd[cid].mode == HTTPD_BODY) break;
gsfan 18:4b97804c37d1 77 }
gsfan 18:4b97804c37d1 78 if (j >= len) return;
gsfan 18:4b97804c37d1 79 if (_httpd[cid].len < HTTPD_BUF_SIZE) {
gsfan 18:4b97804c37d1 80 _httpd[cid].buf[_httpd[cid].len] = 0;
gsfan 18:4b97804c37d1 81 DBG("httpd: %d %s (%d)\r\n", _httpd[cid].mode, _httpd[cid].buf, _httpd[cid].len);
gsfan 18:4b97804c37d1 82 }
gsfan 18:4b97804c37d1 83
gsfan 18:4b97804c37d1 84 switch (_httpd[cid].mode) {
gsfan 18:4b97804c37d1 85 case HTTPD_REQUEST:
gsfan 18:4b97804c37d1 86 if (strncmp(_httpd[cid].buf, "GET ", 4) == 0) {
gsfan 19:cad912f5a6ba 87 _httpd[cid].type = GSPROT_HTTPGET;
gsfan 18:4b97804c37d1 88 j = 4;
gsfan 18:4b97804c37d1 89 } else
gsfan 18:4b97804c37d1 90 if (strncmp(_httpd[cid].buf, "POST ", 5) == 0) {
gsfan 19:cad912f5a6ba 91 _httpd[cid].type = GSPROT_HTTPPOST;
gsfan 18:4b97804c37d1 92 j = 5;
gsfan 18:4b97804c37d1 93 } else {
gsfan 18:4b97804c37d1 94 _httpd[cid].mode = HTTPD_ERROR;
gsfan 18:4b97804c37d1 95 break;
gsfan 18:4b97804c37d1 96 }
gsfan 18:4b97804c37d1 97
gsfan 18:4b97804c37d1 98 for (i = j; i < _httpd[cid].len; i ++) {
gsfan 18:4b97804c37d1 99 if (_httpd[cid].buf[i] == ' ') break;
gsfan 18:4b97804c37d1 100 }
gsfan 18:4b97804c37d1 101 i = i - j;
gsfan 18:4b97804c37d1 102 if (i) {
gsfan 18:4b97804c37d1 103 if (_httpd[cid].uri == NULL) {
gsfan 18:4b97804c37d1 104 _httpd[cid].uri = new char[HTTPD_URI_SIZE];
gsfan 18:4b97804c37d1 105 }
gsfan 18:4b97804c37d1 106 strncpy(_httpd[cid].uri, &_httpd[cid].buf[j], i);
gsfan 18:4b97804c37d1 107 _httpd[cid].uri[i] = 0;
gsfan 18:4b97804c37d1 108 }
gsfan 18:4b97804c37d1 109 _httpd[cid].mode = HTTPD_HEAD;
gsfan 18:4b97804c37d1 110 _httpd[cid].length = 0;
gsfan 18:4b97804c37d1 111 DBG("uri: %s\r\n", _httpd[cid].uri);
gsfan 18:4b97804c37d1 112 break;
gsfan 18:4b97804c37d1 113
gsfan 18:4b97804c37d1 114 case HTTPD_HEAD:
gsfan 18:4b97804c37d1 115 if (_httpd[cid].len == 0) {
gsfan 18:4b97804c37d1 116 _httpd[cid].mode = HTTPD_BODY;
gsfan 19:cad912f5a6ba 117 if (_httpd[cid].length == 0) flg = 1; // no body
gsfan 18:4b97804c37d1 118 } else
gsfan 18:4b97804c37d1 119 if (strncmp(_httpd[cid].buf, "Content-length: ", 16) == 0) {
gsfan 18:4b97804c37d1 120 _httpd[cid].length = atoi(&_httpd[cid].buf[16]);
gsfan 18:4b97804c37d1 121 } else
gsfan 18:4b97804c37d1 122 if (strncmp(_httpd[cid].buf, "Connection: Keep-Alive", 22) == 0) {
gsfan 18:4b97804c37d1 123 if (! _httpd[cid].keepalive) {
gsfan 18:4b97804c37d1 124 _httpd[cid].keepalive = HTTPD_KEEPALIVE;
gsfan 18:4b97804c37d1 125 }
gsfan 18:4b97804c37d1 126 }
gsfan 18:4b97804c37d1 127 break;
gsfan 18:4b97804c37d1 128
gsfan 18:4b97804c37d1 129 case HTTPD_BODY:
gsfan 18:4b97804c37d1 130 if (_httpd[cid].len >= _httpd[cid].length) {
gsfan 18:4b97804c37d1 131 DBG("body: %s\r\n", _httpd[cid].buf);
gsfan 18:4b97804c37d1 132 flg = 1;
gsfan 18:4b97804c37d1 133 }
gsfan 18:4b97804c37d1 134 break;
gsfan 18:4b97804c37d1 135 }
gsfan 18:4b97804c37d1 136
gsfan 18:4b97804c37d1 137 if (flg) {
gsfan 18:4b97804c37d1 138 // http request
gsfan 18:4b97804c37d1 139 _httpd[cid].buf[_httpd[cid].len] = 0;
gsfan 18:4b97804c37d1 140 // scan handler
gsfan 18:4b97804c37d1 141 flg = 0;
gsfan 18:4b97804c37d1 142 for (i = 0; i < _handler_count; i ++) {
gsfan 18:4b97804c37d1 143 j = strlen(_handler[i].uri);
gsfan 18:4b97804c37d1 144 if (strncmp(_httpd[cid].uri, _handler[i].uri, j) == NULL) {
gsfan 19:cad912f5a6ba 145 // found
gsfan 19:cad912f5a6ba 146 _httpd[cid].host = _gs_sock[cid].host;
gsfan 19:cad912f5a6ba 147 _httpd[cid].file = &_httpd[cid].uri[j];
gsfan 19:cad912f5a6ba 148 _httpd[cid].query = NULL;
gsfan 19:cad912f5a6ba 149 for (; j < strlen(_httpd[cid].uri); j ++) {
gsfan 19:cad912f5a6ba 150 if (_httpd[cid].uri[j] == '?') {
gsfan 19:cad912f5a6ba 151 // query_string
gsfan 19:cad912f5a6ba 152 _httpd[cid].uri[j] = 0;
gsfan 19:cad912f5a6ba 153 _httpd[cid].query = &_httpd[cid].uri[j + 1];
gsfan 19:cad912f5a6ba 154 break;
gsfan 19:cad912f5a6ba 155 }
gsfan 19:cad912f5a6ba 156 }
gsfan 19:cad912f5a6ba 157
gsfan 18:4b97804c37d1 158 if (_handler[i].dir) {
gsfan 18:4b97804c37d1 159 // file
gsfan 19:cad912f5a6ba 160 httpd_request(cid, &_httpd[cid], _handler[i].dir);
gsfan 18:4b97804c37d1 161 flg = 1;
gsfan 18:4b97804c37d1 162 } else
gsfan 18:4b97804c37d1 163 if (_handler[i].onHttpCgi) {
gsfan 18:4b97804c37d1 164 // cgi
gsfan 19:cad912f5a6ba 165 _handler[i].onHttpCgi(cid, &_httpd[cid]);
gsfan 19:cad912f5a6ba 166 _httpd[cid].keepalive = 0;
gsfan 18:4b97804c37d1 167 flg = 1;
gsfan 18:4b97804c37d1 168 }
gsfan 18:4b97804c37d1 169 break;
gsfan 18:4b97804c37d1 170 }
gsfan 18:4b97804c37d1 171 }
gsfan 18:4b97804c37d1 172 if (! flg) {
gsfan 19:cad912f5a6ba 173 // not found
gsfan 18:4b97804c37d1 174 send_httpd_error(cid, 403);
gsfan 18:4b97804c37d1 175 }
gsfan 18:4b97804c37d1 176
gsfan 18:4b97804c37d1 177 if (_httpd[cid].keepalive) {
gsfan 18:4b97804c37d1 178 _httpd[cid].mode = HTTPD_REQUEST;
gsfan 18:4b97804c37d1 179 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 180 _httpd[cid].length = 0;
gsfan 18:4b97804c37d1 181 _httpd[cid].keepalive --;
gsfan 18:4b97804c37d1 182 } else {
gsfan 18:4b97804c37d1 183 close(cid);
gsfan 18:4b97804c37d1 184 }
gsfan 18:4b97804c37d1 185 }
gsfan 18:4b97804c37d1 186
gsfan 18:4b97804c37d1 187 if (_httpd[cid].mode == HTTPD_ERROR) {
gsfan 18:4b97804c37d1 188 send_httpd_error(cid, 400);
gsfan 18:4b97804c37d1 189 }
gsfan 18:4b97804c37d1 190
gsfan 18:4b97804c37d1 191 _httpd[cid].len = 0;
gsfan 18:4b97804c37d1 192 }
gsfan 18:4b97804c37d1 193 }
gsfan 18:4b97804c37d1 194
gsfan 19:cad912f5a6ba 195 int GSwifi::httpd_request (int cid, GS_httpd *gshttpd, char *dir) {
gsfan 18:4b97804c37d1 196 FILE *fp;
gsfan 18:4b97804c37d1 197 int i, j;
gsfan 19:cad912f5a6ba 198 char buf[100];
gsfan 18:4b97804c37d1 199
gsfan 18:4b97804c37d1 200 strcpy(buf, dir);
gsfan 19:cad912f5a6ba 201 strcat(buf, gshttpd->file);
gsfan 18:4b97804c37d1 202 if (buf[strlen(buf) - 1] == '/') {
gsfan 18:4b97804c37d1 203 strcat(buf, "index.htm");
gsfan 18:4b97804c37d1 204 }
gsfan 18:4b97804c37d1 205 DBG("file: %s\r\n", buf);
gsfan 18:4b97804c37d1 206
gsfan 18:4b97804c37d1 207 fp = fopen(buf, "r");
gsfan 18:4b97804c37d1 208 if (fp) {
gsfan 19:cad912f5a6ba 209 send(cid, "HTTP/1.1 200 OK\r\n", 17);
gsfan 18:4b97804c37d1 210 {
gsfan 19:cad912f5a6ba 211 // file size
gsfan 18:4b97804c37d1 212 j = ftell(fp);
gsfan 18:4b97804c37d1 213 fseek(fp, 0, SEEK_END);
gsfan 18:4b97804c37d1 214 i = ftell(fp);
gsfan 18:4b97804c37d1 215 fseek(fp, j, SEEK_SET);
gsfan 18:4b97804c37d1 216 }
gsfan 18:4b97804c37d1 217 sprintf(buf, "Content-Length: %d\r\n", i);
gsfan 18:4b97804c37d1 218 send(cid, buf, strlen(buf));
gsfan 19:cad912f5a6ba 219 sprintf(buf, "Content-Type: %s\r\n", mimetype(gshttpd->file));
gsfan 18:4b97804c37d1 220 send(cid, buf, strlen(buf));
gsfan 19:cad912f5a6ba 221 if (gshttpd->keepalive) {
gsfan 18:4b97804c37d1 222 strcpy(buf, "Connection: Keep-Alive\r\n");
gsfan 18:4b97804c37d1 223 } else {
gsfan 18:4b97804c37d1 224 strcpy(buf, "Connection: close\r\n");
gsfan 18:4b97804c37d1 225 }
gsfan 18:4b97804c37d1 226 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 227 strcpy(buf, "Server: GSwifi httpd\r\n");
gsfan 18:4b97804c37d1 228 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 229 send(cid, "\r\n", 2);
gsfan 18:4b97804c37d1 230
gsfan 18:4b97804c37d1 231 for (;;) {
gsfan 18:4b97804c37d1 232 i = fread(buf, sizeof(char), sizeof(buf), fp);
gsfan 18:4b97804c37d1 233 if (i == 0) break;
gsfan 18:4b97804c37d1 234 send(cid, buf, i);
gsfan 18:4b97804c37d1 235 if (feof(fp)) break;
gsfan 18:4b97804c37d1 236 }
gsfan 18:4b97804c37d1 237 fclose(fp);
gsfan 18:4b97804c37d1 238 return 0;
gsfan 18:4b97804c37d1 239 }
gsfan 18:4b97804c37d1 240
gsfan 18:4b97804c37d1 241 send_httpd_error(cid, 404);
gsfan 18:4b97804c37d1 242 return -1;
gsfan 18:4b97804c37d1 243 }
gsfan 18:4b97804c37d1 244
gsfan 19:cad912f5a6ba 245 char *GSwifi::mimetype (char *file) {
gsfan 19:cad912f5a6ba 246 int i, j;
gsfan 19:cad912f5a6ba 247
gsfan 19:cad912f5a6ba 248 for (i = 0; i < MIMETABLE_NUM; i ++) {
gsfan 19:cad912f5a6ba 249 j = strlen(mimetable[i].ext);
gsfan 19:cad912f5a6ba 250 if (strncmp(&file[strlen(file) - j], mimetable[i].ext, j) == NULL) {
gsfan 19:cad912f5a6ba 251 return mimetable[i].type;
gsfan 19:cad912f5a6ba 252 }
gsfan 19:cad912f5a6ba 253 }
gsfan 19:cad912f5a6ba 254 return mimetable[0].type;
gsfan 19:cad912f5a6ba 255 }
gsfan 19:cad912f5a6ba 256
gsfan 18:4b97804c37d1 257 void GSwifi::send_httpd_error (int cid, int err) {
gsfan 18:4b97804c37d1 258 char buf[100], msg[30];
gsfan 18:4b97804c37d1 259
gsfan 18:4b97804c37d1 260 switch (err) {
gsfan 18:4b97804c37d1 261 case 400:
gsfan 18:4b97804c37d1 262 strcpy(msg, "Bad Request");
gsfan 18:4b97804c37d1 263 break;
gsfan 18:4b97804c37d1 264 case 403:
gsfan 18:4b97804c37d1 265 strcpy(msg, "Forbidden");
gsfan 18:4b97804c37d1 266 break;
gsfan 18:4b97804c37d1 267 case 404:
gsfan 18:4b97804c37d1 268 strcpy(msg, "Not Found");
gsfan 18:4b97804c37d1 269 break;
gsfan 18:4b97804c37d1 270 case 500:
gsfan 18:4b97804c37d1 271 default:
gsfan 18:4b97804c37d1 272 strcpy(msg, "Internal Server Error");
gsfan 18:4b97804c37d1 273 break;
gsfan 18:4b97804c37d1 274 }
gsfan 18:4b97804c37d1 275 DBG("httpd error: %d %d %s\r\n", cid, err, msg);
gsfan 18:4b97804c37d1 276
gsfan 18:4b97804c37d1 277 sprintf(buf, "HTTP/1.1 %d %s\r\n", err, msg);
gsfan 18:4b97804c37d1 278 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 279 strcpy(buf, "Content-Type: text/html\r\n");
gsfan 18:4b97804c37d1 280 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 281 send(cid, "\r\n", 2);
gsfan 18:4b97804c37d1 282
gsfan 18:4b97804c37d1 283 sprintf(buf, "<html><head><title>%d %s</title></head>\r\n", err, msg);
gsfan 18:4b97804c37d1 284 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 285 sprintf(buf, "<body><h1>%s</h1></body></html>\r\n", msg);
gsfan 18:4b97804c37d1 286 send(cid, buf, strlen(buf));
gsfan 18:4b97804c37d1 287 close(cid);
gsfan 18:4b97804c37d1 288 }
gsfan 18:4b97804c37d1 289
gsfan 19:cad912f5a6ba 290 int GSwifi::attach_httpd (const char *uri, const char *dir) {
gsfan 18:4b97804c37d1 291 if (_handler_count < HTTPD_HANDLE) {
gsfan 18:4b97804c37d1 292 _handler[_handler_count].uri = new char[strlen(uri) + 1];
gsfan 18:4b97804c37d1 293 strcpy(_handler[_handler_count].uri, uri);
gsfan 18:4b97804c37d1 294 _handler[_handler_count].dir = new char[strlen(dir) + 1];
gsfan 18:4b97804c37d1 295 strcpy(_handler[_handler_count].dir, dir);
gsfan 18:4b97804c37d1 296 _handler[_handler_count].onHttpCgi = NULL;
gsfan 18:4b97804c37d1 297 _handler_count ++;
gsfan 18:4b97804c37d1 298 return 0;
gsfan 18:4b97804c37d1 299 } else {
gsfan 18:4b97804c37d1 300 return -1;
gsfan 18:4b97804c37d1 301 }
gsfan 18:4b97804c37d1 302 }
gsfan 18:4b97804c37d1 303
gsfan 19:cad912f5a6ba 304 int GSwifi::attach_httpd (const char *uri, onHttpdCgiFunc ponHttpCgi) {
gsfan 18:4b97804c37d1 305 if (_handler_count < HTTPD_HANDLE) {
gsfan 18:4b97804c37d1 306 _handler[_handler_count].uri = new char[strlen(uri) + 1];
gsfan 18:4b97804c37d1 307 strcpy(_handler[_handler_count].uri, uri);
gsfan 18:4b97804c37d1 308 _handler[_handler_count].dir = NULL;
gsfan 18:4b97804c37d1 309 _handler[_handler_count].onHttpCgi = ponHttpCgi;
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 }