#include "HttpServer.hpp" HttpServer::HttpServer(const char *pDocDir) : Thread("Http") , m_docDir(pDocDir) { startThread(); } HttpServer::~HttpServer(void) { stopThread(10000); } void HttpServer::addListener(IHttpListener *pListener) { m_listeners.add(pListener); } const char* HttpServer::getDocName(char *buffer, int buflen) { static char docBuffer[1024]; char *pDocname; strcpy(docBuffer, m_docDir); pDocname = &docBuffer[strlen(docBuffer)]; *pDocname = '\\'; pDocname++; int i, off; if (!stricmp(buffer, "GET")) { return nullptr; } off = 0; while(buffer[3+off] == 0x20) off++; while(buffer[3+off] == '/') off++; i = 0; while(buffer[3+off+i] != 0x20) { pDocname[i] = buffer[3+off+i]; i++; } pDocname[i] = 0; return docBuffer; } void HttpServer::run() { char buffer[1024]; ScopedPointer listenSock = new StreamingSocket(); listenSock->bindToPort(5001); listenSock->createListener(5001); while(!threadShouldExit()) { const char *pDoc = nullptr; if (listenSock->waitUntilReady(true, 100) > 0) { ScopedPointer pSock = listenSock->waitForNextConnection(); int numRead = pSock->read(buffer, sizeof(buffer), false); if (numRead > 0) { pDoc = getDocName(buffer, numRead); if (!pDoc) { pSock->close(); continue; } } m_listeners.call(&IHttpListener::onUpdate, pDoc); ScopedPointer file = new juce::File(pDoc); if (!file) continue; ScopedPointer pFileStream = file->createInputStream(); if (!pFileStream) continue; int64 remain = pFileStream->getTotalLength(); int64 toRead; while(remain) { toRead = remain; if (toRead > sizeof(buffer)) { toRead = sizeof(buffer); } pFileStream->read(buffer, toRead); pSock->write(buffer, toRead); remain -= toRead; } pFileStream = nullptr; pSock = nullptr; file = nullptr; } } }