EthernetNetIf Compatibility.
Dependents: XBeeWiFi_SPI_example
Fork of NetServicesSource by
Diff: services/http/server/impl/FSHandler.cpp
- Revision:
- 12:8dc6b255af6c
- Parent:
- 11:da4498f591ee
--- a/services/http/server/impl/FSHandler.cpp Thu Aug 05 15:01:33 2010 +0000 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,160 +0,0 @@ - -/* -Copyright (c) 2010 Donatien Garnier (donatiengar [at] gmail [dot] com) - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in -all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN -THE SOFTWARE. -*/ - -#include "FSHandler.h" - -//#define __DEBUG -#include "dbg/dbg.h" - -#define CHUNK_SIZE 128 - -#define DEFAULT_PAGE "/index.htm" - -FSHandler::FSHandler(const char* rootPath, const char* path, TCPSocket* pTCPSocket) : HTTPRequestHandler(rootPath, path, pTCPSocket), m_err404(false) -{} - -FSHandler::~FSHandler() -{ - if(m_fp) - fclose(m_fp); - DBG("\r\nHandler destroyed\r\n"); -} - -//static init -map<string,string> FSHandler::m_lFsPath = map<string,string>(); - -void FSHandler::mount(const string& fsPath, const string& rootPath) -{ - m_lFsPath[rootPath]=fsPath; -} - -void FSHandler::doGet() -{ - DBG("\r\nIn FSHandler::doGet() - rootPath=%s, path=%s\r\n", rootPath().c_str(), path().c_str()); - //FIXME: Translate path to local/path - string checkedRootPath = rootPath(); - if(checkedRootPath.empty()) - checkedRootPath="/"; - string filePath = m_lFsPath[checkedRootPath]; - if (path().size() > 1) - { - filePath += path(); - } - else - { - filePath += DEFAULT_PAGE; - } - - DBG("Trying to open %s\n", filePath.c_str()); - - m_fp = fopen(filePath.c_str(), "r"); //FIXME: if null, error 404 - - if(!m_fp) - { - m_err404 = true; - setErrCode(404); - const char* msg = "File not found."; - setContentLen(strlen(msg)); - respHeaders()["Content-Type"] = "text/html"; - respHeaders()["Connection"] = "close"; - writeData(msg,strlen(msg)); //Only send header - DBG("\r\nExit FSHandler::doGet() w Error 404\r\n"); - return; - } - - //Seek EOF to get length - fseek(m_fp, 0, SEEK_END); - setContentLen( ftell(m_fp) ); - fseek(m_fp, 0, SEEK_SET); //Goto SOF - - respHeaders()["Connection"] = "close"; - onWriteable(); - DBG("\r\nExit SimpleHandler::doGet()\r\n"); -} - -void FSHandler::doPost() -{ - -} - -void FSHandler::doHead() -{ - -} - -void FSHandler::onReadable() //Data has been read -{ - -} - -void FSHandler::onWriteable() //Data has been written & buf is free -{ - DBG("\r\nFSHandler::onWriteable() event\r\n"); - if(m_err404) - { - //Error has been served, now exit - close(); - return; - } - - static char rBuf[CHUNK_SIZE]; - while(true) - { - int len = fread(rBuf, 1, CHUNK_SIZE, m_fp); - if(len>0) - { - int writtenLen = writeData(rBuf, len); - if(writtenLen < 0) //Socket error - { - DBG("FSHandler: Socket error %d\n", writtenLen); - if(writtenLen == TCPSOCKET_MEM) - { - fseek(m_fp, -len, SEEK_CUR); - return; //Wait for the queued TCP segments to be transmitted - } - else - { - //This is a critical error - close(); - return; - } - } - else if(writtenLen < len) //Short write, socket's buffer is full - { - fseek(m_fp, writtenLen - len, SEEK_CUR); - return; - } - } - else - { - close(); //Data written, we can close the connection - return; - } - } -} - -void FSHandler::onClose() //Connection is closing -{ - if(m_fp) - fclose(m_fp); -}