void handlePacket(TPacket *packet) { switch(packet->packetType) { case PACKET_TYPE_COMMAND: // Only we send command packets, so ignore break; case PACKET_TYPE_RESPONSE: handleResponse(packet); break; case PACKET_TYPE_ERROR: handleErrorResponse(packet); break; case PACKET_TYPE_MESSAGE: handleMessage(packet); break; } }
void FileSystemRoute::handleRequest(ServerEventArgs& evt) { Poco::Path dataFolder(ofToDataPath("", true)); Poco::Path documentRoot(ofToDataPath(getSettings().getDocumentRoot(), true)); std::string dataFolderString = dataFolder.toString(); std::string documentRootString = documentRoot.toString(); // Document root validity check. if (_settings.getRequireDocumentRootInDataFolder() && (documentRootString.length() < dataFolderString.length() || documentRootString.substr(0, dataFolderString.length()) != dataFolderString)) { ofLogError("FileSystemRoute::handleRequest") << "Document Root is not a sub directory of the data folder."; evt.getResponse() .setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); handleErrorResponse(evt); return; } // check path Poco::URI uri(evt.getRequest().getURI()); std::string path = uri.getPath(); // just get the path // make paths absolute if (path.empty()) { path = "/"; } Poco::Path requestPath = documentRoot.append(path).makeAbsolute(); // add the default index if no filename is requested if (requestPath.getFileName().empty()) { requestPath.append(getSettings().getDefaultIndex()).makeAbsolute(); } std::string requestPathString = requestPath.toString(); // double check path safety (not needed?) if ((requestPathString.length() < documentRootString.length() || requestPathString.substr(0, documentRootString.length()) != documentRootString)) { ofLogError("FileSystemRoute::handleRequest") << "Requested document not inside DocumentFolder."; evt.getResponse().setStatusAndReason(Poco::Net::HTTPResponse::HTTP_NOT_FOUND); handleErrorResponse(evt); return; } ofFile file(requestPathString); // use it to parse file name parts std::string mediaTypeString = MediaTypeMap::getDefault()->getMediaTypeForPath(file.path()).toString(); try { // TODO: this is where we would begin to work honoring /// Accept-Encoding:gzip, deflate, sdch evt.getResponse().sendFile(file.getAbsolutePath(), mediaTypeString); return; } catch (const Poco::FileNotFoundException& exc) { ofLogError("FileSystemRoute::handleRequest") << exc.displayText(); evt.getResponse().setStatusAndReason(Poco::Net::HTTPResponse::HTTP_NOT_FOUND); handleErrorResponse(evt); return; } catch (const Poco::OpenFileException& exc) { ofLogError("FileSystemRoute::handleRequest") << exc.displayText(); evt.getResponse().setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); handleErrorResponse(evt); return; } catch (const std::exception& exc) { ofLogError("FileSystemRoute::handleRequest") << "Unknown server error: " << exc.what(); evt.getResponse().setStatusAndReason(Poco::Net::HTTPResponse::HTTP_INTERNAL_SERVER_ERROR); handleErrorResponse(evt); return; } }