Michael Spencer / Mbed 2 deprecated LaOS

Dependencies:   mbed

Committer:
Michael J. Spencer
Date:
Wed Mar 05 06:14:02 2014 -0800
Revision:
1:f5ac63519541
Initial commit.

Who changed what in which revision?

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