more handlers

Dependents:   bandwidth-meter-net mbedRail24v

Fork of Tiny-HTTPD by ban4jp -

Committer:
ban4jp
Date:
Sat Feb 01 15:46:26 2014 +0000
Revision:
1:5f009a651656
Parent:
0:d18dff347122
Deleted RTOS support. (for low memory platforms.)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
okini3939 0:d18dff347122 1 /* Copyright (C) 2013 Hiroshi Suga, MIT License
okini3939 0:d18dff347122 2 *
okini3939 0:d18dff347122 3 * Permission is hereby granted, free of charge, to any person obtaining a copy of this software
okini3939 0:d18dff347122 4 * and associated documentation files (the "Software"), to deal in the Software without restriction,
okini3939 0:d18dff347122 5 * including without limitation the rights to use, copy, modify, merge, publish, distribute,
okini3939 0:d18dff347122 6 * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is
okini3939 0:d18dff347122 7 * furnished to do so, subject to the following conditions:
okini3939 0:d18dff347122 8 *
okini3939 0:d18dff347122 9 * The above copyright notice and this permission notice shall be included in all copies or
okini3939 0:d18dff347122 10 * substantial portions of the Software.
okini3939 0:d18dff347122 11 *
okini3939 0:d18dff347122 12 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING
okini3939 0:d18dff347122 13 * BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
okini3939 0:d18dff347122 14 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
okini3939 0:d18dff347122 15 * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
okini3939 0:d18dff347122 16 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
okini3939 0:d18dff347122 17 */
okini3939 0:d18dff347122 18
okini3939 0:d18dff347122 19 #include "HTTPD.h"
okini3939 0:d18dff347122 20
okini3939 0:d18dff347122 21 HTTPD * HTTPD::_inst;
okini3939 0:d18dff347122 22
okini3939 0:d18dff347122 23 HTTPD::HTTPD () {
okini3939 0:d18dff347122 24 _inst = this;
okini3939 0:d18dff347122 25 memset(_state, 0, sizeof(_state));
okini3939 0:d18dff347122 26 _handler_count = 0;
okini3939 0:d18dff347122 27 }
okini3939 0:d18dff347122 28
okini3939 0:d18dff347122 29 int HTTPD::start (int port) {
okini3939 0:d18dff347122 30 int i;
okini3939 0:d18dff347122 31
okini3939 0:d18dff347122 32 for (i = 0; i < HTTPD_MAX_CLIENTS; i ++) {
okini3939 0:d18dff347122 33 _state[i].buf = new CircBuffer<char>(HTTPD_BUF_SIZE);
ban4jp 1:5f009a651656 34 //_state[i].thread = new Thread(child, (void*)i, osPriorityNormal, HTTPD_STACK_SIZE);
okini3939 0:d18dff347122 35 _state[i].client = new TCPSocketConnection;
okini3939 0:d18dff347122 36 }
okini3939 0:d18dff347122 37 #ifdef HTTPD_ENABLE_CLOSER
okini3939 0:d18dff347122 38 _state[HTTPD_MAX_CLIENTS].thread = new Thread(closer, (void*)HTTPD_MAX_CLIENTS, osPriorityNormal, 128);
okini3939 0:d18dff347122 39 _state[HTTPD_MAX_CLIENTS].client = new TCPSocketConnection;
okini3939 0:d18dff347122 40 #endif
okini3939 0:d18dff347122 41
okini3939 0:d18dff347122 42 _server.bind(port);
okini3939 0:d18dff347122 43 _server.listen();
ban4jp 1:5f009a651656 44 //_daemon = new Thread(daemon, NULL, osPriorityNormal, 256);
okini3939 0:d18dff347122 45 return 0;
okini3939 0:d18dff347122 46 }
okini3939 0:d18dff347122 47
ban4jp 1:5f009a651656 48 void HTTPD::poll () {
ban4jp 1:5f009a651656 49 HTTPD::daemon(NULL);
ban4jp 1:5f009a651656 50 }
ban4jp 1:5f009a651656 51
okini3939 0:d18dff347122 52 void HTTPD::daemon (void const *args) {
okini3939 0:d18dff347122 53 HTTPD *httpd = HTTPD::getInstance();
okini3939 0:d18dff347122 54 int i, t = 0;
okini3939 0:d18dff347122 55
okini3939 0:d18dff347122 56 INFO("Wait for new connection...\r\n");
ban4jp 1:5f009a651656 57 //for (;;) {
okini3939 0:d18dff347122 58 if (t >= 0) {
okini3939 0:d18dff347122 59 if (httpd->_server.accept(*httpd->_state[t].client) == 0) {
okini3939 0:d18dff347122 60 INFO("accept %d\r\n", t);
ban4jp 1:5f009a651656 61 //httpd->_state[t].thread->signal_set(1);
ban4jp 1:5f009a651656 62 httpd->child((void*)t);
okini3939 0:d18dff347122 63 }
okini3939 0:d18dff347122 64 } else {
okini3939 0:d18dff347122 65 #ifdef HTTPD_ENABLE_CLOSER
okini3939 0:d18dff347122 66 if (httpd->_server.accept(*httpd->_state[HTTPD_MAX_CLIENTS].client) == 0) {
okini3939 0:d18dff347122 67 INFO("accept x\r\n");
okini3939 0:d18dff347122 68 httpd->_state[HTTPD_MAX_CLIENTS].thread->signal_set(1);
okini3939 0:d18dff347122 69 }
okini3939 0:d18dff347122 70 #endif
okini3939 0:d18dff347122 71 }
okini3939 0:d18dff347122 72
ban4jp 1:5f009a651656 73 t = 0;
ban4jp 1:5f009a651656 74 /*
okini3939 0:d18dff347122 75 t = -1;
okini3939 0:d18dff347122 76 for (i = 0; i < HTTPD_MAX_CLIENTS; i ++) {
okini3939 0:d18dff347122 77 if (httpd->_state[i].thread->get_state() == Thread::WaitingAnd) {
okini3939 0:d18dff347122 78 if (t < 0) t = i; // next empty thread
okini3939 0:d18dff347122 79 }
okini3939 0:d18dff347122 80 }
ban4jp 1:5f009a651656 81 */
ban4jp 1:5f009a651656 82 //}
okini3939 0:d18dff347122 83 }
okini3939 0:d18dff347122 84
okini3939 0:d18dff347122 85 void HTTPD::child (void const *arg) {
okini3939 0:d18dff347122 86 HTTPD *httpd = HTTPD::getInstance();
okini3939 0:d18dff347122 87 int id = (int)arg;
okini3939 0:d18dff347122 88 int i, n;
okini3939 0:d18dff347122 89 char buf[HTTPD_BUF_SIZE];
okini3939 0:d18dff347122 90
ban4jp 1:5f009a651656 91 //for (;;) {
ban4jp 1:5f009a651656 92 // Thread::signal_wait(1);
okini3939 0:d18dff347122 93
okini3939 0:d18dff347122 94 httpd->_state[id].mode = MODE_REQUEST;
okini3939 0:d18dff347122 95 httpd->_state[id].buf->flush();
okini3939 0:d18dff347122 96 httpd->_state[id].keepalive = 0;
okini3939 0:d18dff347122 97 INFO("Connection from %s\r\n", httpd->_state[id].client->get_address());
okini3939 0:d18dff347122 98 httpd->_state[id].client->set_blocking(false, HTTPD_TIMEOUT);
okini3939 0:d18dff347122 99 for (;;) {
okini3939 0:d18dff347122 100 if (! httpd->_state[id].client->is_connected()) break;
okini3939 0:d18dff347122 101
okini3939 0:d18dff347122 102 n = httpd->_state[id].client->receive(buf, sizeof(buf));
okini3939 0:d18dff347122 103 if (n < 0) break;
okini3939 0:d18dff347122 104 buf[n] = 0;
okini3939 0:d18dff347122 105 // DBG("Recv %d '%s'", n, buf);
okini3939 0:d18dff347122 106
okini3939 0:d18dff347122 107 for (i = 0; i < n; i ++) {
okini3939 0:d18dff347122 108 httpd->recvData(id, buf[i]);
okini3939 0:d18dff347122 109 }
okini3939 0:d18dff347122 110 }
okini3939 0:d18dff347122 111
okini3939 0:d18dff347122 112 httpd->_state[id].client->close();
okini3939 0:d18dff347122 113 INFO("Close %s\r\n", httpd->_state[id].client->get_address());
ban4jp 1:5f009a651656 114 //}
okini3939 0:d18dff347122 115 }
okini3939 0:d18dff347122 116
okini3939 0:d18dff347122 117 void HTTPD::closer (void const *arg) {
okini3939 0:d18dff347122 118 HTTPD *httpd = HTTPD::getInstance();
okini3939 0:d18dff347122 119 int id = (int)arg;
okini3939 0:d18dff347122 120
ban4jp 1:5f009a651656 121 //for (;;) {
ban4jp 1:5f009a651656 122 // Thread::signal_wait(1);
okini3939 0:d18dff347122 123
okini3939 0:d18dff347122 124 httpd->_state[id].client->close();
okini3939 0:d18dff347122 125 INFO("Close %s\r\n", httpd->_state[id].client->get_address());
ban4jp 1:5f009a651656 126 //}
okini3939 0:d18dff347122 127 }
okini3939 0:d18dff347122 128