HttpServer Library for "mbed-os" which added a snapshot handler.

Dependents:   GR-PEACH-webcam GR-Boards_WebCamera GR-Boards_WebCamera GR-Boards_WebCamera

Fork of HttpServer_snapshot by Renesas

Committer:
1050186
Date:
Fri Oct 23 11:02:35 2015 +0000
Revision:
8:a9fb8fe9b8a3
Parent:
5:b8f6a11c70db
Child:
11:0700755d64ae
Add an exclusive feature to the file system.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
yueee_yt 0:fdf9c2c5200f 1 /*
yueee_yt 0:fdf9c2c5200f 2 Permission is hereby granted, free of charge, to any person obtaining a copy
yueee_yt 0:fdf9c2c5200f 3 of this software and associated documentation files (the "Software"), to deal
yueee_yt 0:fdf9c2c5200f 4 in the Software without restriction, including without limitation the rights
yueee_yt 0:fdf9c2c5200f 5 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
yueee_yt 0:fdf9c2c5200f 6 copies of the Software, and to permit persons to whom the Software is
yueee_yt 0:fdf9c2c5200f 7 furnished to do so, subject to the following conditions:
yueee_yt 4:1b6b021ee21d 8
yueee_yt 0:fdf9c2c5200f 9 The above copyright notice and this permission notice shall be included in
yueee_yt 0:fdf9c2c5200f 10 all copies or substantial portions of the Software.
yueee_yt 4:1b6b021ee21d 11
yueee_yt 0:fdf9c2c5200f 12 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
yueee_yt 0:fdf9c2c5200f 13 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
yueee_yt 0:fdf9c2c5200f 14 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
yueee_yt 0:fdf9c2c5200f 15 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
yueee_yt 0:fdf9c2c5200f 16 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
yueee_yt 0:fdf9c2c5200f 17 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
yueee_yt 0:fdf9c2c5200f 18 THE SOFTWARE.
yueee_yt 0:fdf9c2c5200f 19 */
yueee_yt 5:b8f6a11c70db 20 //#define _DEBUG_FS_HANDLER
yueee_yt 0:fdf9c2c5200f 21
yueee_yt 0:fdf9c2c5200f 22 #include "FSHandler.h"
yueee_yt 0:fdf9c2c5200f 23
yueee_yt 0:fdf9c2c5200f 24 #define CHUNK_SIZE 128
yueee_yt 0:fdf9c2c5200f 25
yueee_yt 0:fdf9c2c5200f 26 #define DEFAULT_PAGE "/index.htm"
yueee_yt 0:fdf9c2c5200f 27
1050186 8:a9fb8fe9b8a3 28 Semaphore FSHandler::req_sem(1);
1050186 8:a9fb8fe9b8a3 29
1050186 8:a9fb8fe9b8a3 30
yueee_yt 0:fdf9c2c5200f 31 //*FSHandler::FSHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket), m_err404(false)
yueee_yt 0:fdf9c2c5200f 32 FSHandler::FSHandler(const char* rootPath, const char* path, TCPSocketConnection* pTCPSocketConnection) : HTTPRequestHandler(rootPath, path, pTCPSocketConnection), m_err404(false)
yueee_yt 0:fdf9c2c5200f 33 {}
yueee_yt 0:fdf9c2c5200f 34
yueee_yt 0:fdf9c2c5200f 35 FSHandler::~FSHandler()
yueee_yt 0:fdf9c2c5200f 36 {
yueee_yt 5:b8f6a11c70db 37 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 38 printf("\r\n+++FSHandler destroy\r\n");
yueee_yt 5:b8f6a11c70db 39 #endif
yueee_yt 5:b8f6a11c70db 40 if(m_fp){
yueee_yt 5:b8f6a11c70db 41 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 42 printf("\r\n+++FSHandler fclose start\r\n");
yueee_yt 5:b8f6a11c70db 43 #endif
yueee_yt 4:1b6b021ee21d 44 fclose(m_fp);
yueee_yt 4:1b6b021ee21d 45 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 46 printf("\r\n+++FSHandler fclose end\r\n");
yueee_yt 5:b8f6a11c70db 47 #endif
yueee_yt 5:b8f6a11c70db 48
yueee_yt 5:b8f6a11c70db 49 }
yueee_yt 5:b8f6a11c70db 50 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 51 printf("\r\nHandler destroyed\r\n");
yueee_yt 4:1b6b021ee21d 52 #endif
yueee_yt 0:fdf9c2c5200f 53 }
yueee_yt 0:fdf9c2c5200f 54
yueee_yt 0:fdf9c2c5200f 55 //static init
yueee_yt 0:fdf9c2c5200f 56 map<string,string> FSHandler::m_lFsPath = map<string,string>();
yueee_yt 0:fdf9c2c5200f 57
yueee_yt 0:fdf9c2c5200f 58 void FSHandler::mount(const string& fsPath, const string& rootPath)
yueee_yt 0:fdf9c2c5200f 59 {
yueee_yt 4:1b6b021ee21d 60 m_lFsPath[rootPath]=fsPath;
yueee_yt 0:fdf9c2c5200f 61 }
yueee_yt 0:fdf9c2c5200f 62
yueee_yt 0:fdf9c2c5200f 63 void FSHandler::doGet()
yueee_yt 0:fdf9c2c5200f 64 {
1050186 8:a9fb8fe9b8a3 65 req_sem.wait();
yueee_yt 4:1b6b021ee21d 66 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 67 printf("\r\nIn FSHandler::doGet() - rootPath=%s, path=%s\r\n", rootPath().c_str(), path().c_str());
yueee_yt 4:1b6b021ee21d 68 #endif
yueee_yt 4:1b6b021ee21d 69 //FIXME: Translate path to local/path
yueee_yt 4:1b6b021ee21d 70 string checkedRootPath = rootPath();
yueee_yt 4:1b6b021ee21d 71 if(checkedRootPath.empty())
yueee_yt 4:1b6b021ee21d 72 checkedRootPath="/";
yueee_yt 4:1b6b021ee21d 73 string filePath = m_lFsPath[checkedRootPath];
yueee_yt 4:1b6b021ee21d 74 if (path().size() > 1) {
yueee_yt 4:1b6b021ee21d 75 filePath += path();
yueee_yt 4:1b6b021ee21d 76 } else {
yueee_yt 4:1b6b021ee21d 77 filePath += DEFAULT_PAGE;
yueee_yt 4:1b6b021ee21d 78 }
yueee_yt 4:1b6b021ee21d 79 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 80 printf("Trying to open %s\n", filePath.c_str());
yueee_yt 4:1b6b021ee21d 81 #endif
yueee_yt 4:1b6b021ee21d 82 m_fp = fopen(filePath.c_str(), "r"); //FIXME: if null, error 404
yueee_yt 0:fdf9c2c5200f 83
yueee_yt 4:1b6b021ee21d 84 if(!m_fp) {
yueee_yt 4:1b6b021ee21d 85 m_err404 = true;
yueee_yt 4:1b6b021ee21d 86 setErrCode(404);
yueee_yt 4:1b6b021ee21d 87 const char* msg = "File not found.";
yueee_yt 4:1b6b021ee21d 88 setContentLen(strlen(msg));
yueee_yt 4:1b6b021ee21d 89 respHeaders()["Content-Type"] = "text/html";
yueee_yt 4:1b6b021ee21d 90 respHeaders()["Connection"] = "close";
yueee_yt 4:1b6b021ee21d 91 writeData(msg,strlen(msg)); //Only send header
yueee_yt 4:1b6b021ee21d 92 printf("\r\nExit FSHandler::doGet() w Error 404\r\n");
1050186 8:a9fb8fe9b8a3 93 req_sem.release();
yueee_yt 4:1b6b021ee21d 94 return;
yueee_yt 4:1b6b021ee21d 95 }
yueee_yt 4:1b6b021ee21d 96
yueee_yt 4:1b6b021ee21d 97 //Seek EOF to get length
yueee_yt 4:1b6b021ee21d 98 fseek(m_fp, 0, SEEK_END);
yueee_yt 4:1b6b021ee21d 99 setContentLen( ftell(m_fp) );
yueee_yt 4:1b6b021ee21d 100 fseek(m_fp, 0, SEEK_SET); //Goto SOF
yueee_yt 4:1b6b021ee21d 101
yueee_yt 0:fdf9c2c5200f 102 respHeaders()["Connection"] = "close";
yueee_yt 4:1b6b021ee21d 103 onWriteable();
yueee_yt 4:1b6b021ee21d 104 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 105 printf("\r\nExit SimpleHandler::doGet()\r\n");
yueee_yt 4:1b6b021ee21d 106 #endif
1050186 8:a9fb8fe9b8a3 107 req_sem.release();
yueee_yt 0:fdf9c2c5200f 108 }
yueee_yt 0:fdf9c2c5200f 109
yueee_yt 0:fdf9c2c5200f 110 void FSHandler::doPost()
yueee_yt 0:fdf9c2c5200f 111 {
yueee_yt 0:fdf9c2c5200f 112
yueee_yt 0:fdf9c2c5200f 113 }
yueee_yt 0:fdf9c2c5200f 114
yueee_yt 0:fdf9c2c5200f 115 void FSHandler::doHead()
yueee_yt 0:fdf9c2c5200f 116 {
yueee_yt 0:fdf9c2c5200f 117
yueee_yt 0:fdf9c2c5200f 118 }
yueee_yt 0:fdf9c2c5200f 119
yueee_yt 0:fdf9c2c5200f 120 void FSHandler::onReadable() //Data has been read
yueee_yt 0:fdf9c2c5200f 121 {
yueee_yt 0:fdf9c2c5200f 122
yueee_yt 0:fdf9c2c5200f 123 }
yueee_yt 0:fdf9c2c5200f 124
yueee_yt 0:fdf9c2c5200f 125 void FSHandler::onWriteable() //Data has been written & buf is free
yueee_yt 0:fdf9c2c5200f 126 {
yueee_yt 4:1b6b021ee21d 127 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 128 printf("\r\nFSHandler::onWriteable() event\r\n");
yueee_yt 4:1b6b021ee21d 129 #endif
yueee_yt 4:1b6b021ee21d 130 if(m_err404) {
yueee_yt 4:1b6b021ee21d 131 //Error has been served, now exit
yueee_yt 4:1b6b021ee21d 132 close();
yueee_yt 4:1b6b021ee21d 133 return;
yueee_yt 4:1b6b021ee21d 134 }
yueee_yt 4:1b6b021ee21d 135
yueee_yt 4:1b6b021ee21d 136 static char rBuf[CHUNK_SIZE];
yueee_yt 4:1b6b021ee21d 137 while(true) {
yueee_yt 4:1b6b021ee21d 138 int len = fread(rBuf, 1, CHUNK_SIZE, m_fp);
yueee_yt 4:1b6b021ee21d 139 if(len>0) {
yueee_yt 4:1b6b021ee21d 140 int writtenLen = writeData(rBuf, len);
yueee_yt 4:1b6b021ee21d 141 if(writtenLen < 0) { //Socket error
yueee_yt 4:1b6b021ee21d 142 #ifdef _DEBUG_FS_HANDLER
yueee_yt 4:1b6b021ee21d 143 printf("FSHandler: Socket error %d\n", writtenLen);
yueee_yt 4:1b6b021ee21d 144 #endif
yueee_yt 5:b8f6a11c70db 145 /** Not Work
yueee_yt 5:b8f6a11c70db 146 if(writtenLen == TCPSOCKET_MEM) {
yueee_yt 5:b8f6a11c70db 147 fseek(m_fp, -len, SEEK_CUR);
yueee_yt 5:b8f6a11c70db 148 return; //Wait for the queued TCP segments to be transmitted
yueee_yt 5:b8f6a11c70db 149 } else {
yueee_yt 5:b8f6a11c70db 150 //This is a critical error
yueee_yt 5:b8f6a11c70db 151 **/
yueee_yt 5:b8f6a11c70db 152 close();
yueee_yt 5:b8f6a11c70db 153 return;
yueee_yt 5:b8f6a11c70db 154 /**
yueee_yt 5:b8f6a11c70db 155 }
yueee_yt 5:b8f6a11c70db 156 **/
yueee_yt 4:1b6b021ee21d 157 } else if(writtenLen < len) { //Short write, socket's buffer is full
yueee_yt 4:1b6b021ee21d 158 fseek(m_fp, writtenLen - len, SEEK_CUR);
yueee_yt 4:1b6b021ee21d 159 return;
yueee_yt 4:1b6b021ee21d 160 }
yueee_yt 4:1b6b021ee21d 161 } else {
yueee_yt 4:1b6b021ee21d 162 close(); //Data written, we can close the connection
yueee_yt 4:1b6b021ee21d 163 return;
yueee_yt 0:fdf9c2c5200f 164 }
yueee_yt 0:fdf9c2c5200f 165 }
yueee_yt 0:fdf9c2c5200f 166 }
yueee_yt 0:fdf9c2c5200f 167
yueee_yt 0:fdf9c2c5200f 168 void FSHandler::onClose() //Connection is closing
yueee_yt 0:fdf9c2c5200f 169 {
yueee_yt 5:b8f6a11c70db 170 /**
yueee_yt 5:b8f6a11c70db 171 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 172 printf("FSHandler: onClose start \r\n");
yueee_yt 5:b8f6a11c70db 173 #endif
yueee_yt 5:b8f6a11c70db 174 if(m_fp){
yueee_yt 5:b8f6a11c70db 175 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 176 printf("FSHandler: fclose start \r\n");
yueee_yt 5:b8f6a11c70db 177 #endif
yueee_yt 5:b8f6a11c70db 178 fclose(m_fp);
yueee_yt 5:b8f6a11c70db 179 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 180 printf("FSHandler: fclose end \r\n");
yueee_yt 5:b8f6a11c70db 181 #endif
yueee_yt 0:fdf9c2c5200f 182 }
yueee_yt 5:b8f6a11c70db 183 #ifdef _DEBUG_FS_HANDLER
yueee_yt 5:b8f6a11c70db 184 printf("FSHandler: onClose end \r\n");
yueee_yt 5:b8f6a11c70db 185 #endif
yueee_yt 5:b8f6a11c70db 186 **/
yueee_yt 5:b8f6a11c70db 187 }