bool Client::initLocal( const int argc, char** argv ) { if( !_parseArguments( argc, argv )) return false; VolumeDataSource::loadPlugins(); //initLocal on render clients never returns addActiveLayout( "Simple" ); // prefer single GPU layout by default return eq::Client::initLocal( argc, argv ); }
bool _init( const int argc, char** argv, NodeFactory* nodeFactory ) { const char *env = getenv( "EQ_LOG_LEVEL" ); if( env ) lunchbox::Log::level = lunchbox::Log::getLogLevel( env ); env = getenv( "EQ_LOG_TOPICS" ); if( env ) lunchbox::Log::topics |= atoll( env ); lunchbox::Log::instance().setThreadName( "Main" ); if( ++_initialized > 1 ) // not first { LBINFO << "Equalizer client library initialized more than once" << std::endl; return true; } if( !_parseArguments( argc, argv )) return false; LBINFO << "Equalizer v" << Version::getString() << " initializing" << std::endl; #ifdef AGL GetCurrentEventQueue(); #endif #ifdef GLX ::XInitThreads(); #endif #ifdef EQ_USE_PARACOMP LBINFO << "Initializing Paracomp library" << std::endl; PCerr err = pcSystemInitialize( 0 ); if( err != PC_NO_ERROR ) { LBERROR << "Paracomp initialization failed: " << err << std::endl; return false; } #endif LBASSERT( nodeFactory ); Global::_nodeFactory = nodeFactory; const std::string& programName = Global::getProgramName(); if( programName.empty() && argc > 0 ) Global::setProgramName( argv[0] ); const std::string& workDir = Global::getWorkDir(); if( workDir.empty( )) { char cwd[MAXPATHLEN]; Global::setWorkDir( getcwd( cwd, MAXPATHLEN )); } _initPlugins(); return fabric::init( argc, argv ); }
bool Application::init( const int argc, char** argv ) { const eq::Strings& models = _parseArguments( argc, argv ); if( !seq::Application::init( argc, argv, 0 )) return false; _loadModel( models ); return true; }
bool _init( const int argc, char** argv, NodeFactory* nodeFactory ) { const char *env = getenv( "EQ_LOG_LEVEL" ); if( env ) lunchbox::Log::level = lunchbox::Log::getLogLevel( env ); env = getenv( "EQ_LOG_TOPICS" ); if( env ) lunchbox::Log::topics |= atoll( env ); lunchbox::Log::instance().setThreadName( "Main" ); if( ++_initialized > 1 ) // not first { LBERROR << "Equalizer client library initialized more than once" << std::endl; return true; } if( !_parseArguments( argc, argv )) return false; LBDEBUG << "Equalizer v" << Version::getString() << " initializing" << std::endl; #ifdef AGL GetCurrentEventQueue(); #endif #ifdef GLX ::XInitThreads(); #endif #ifdef EQUALIZER_USE_QT5WIDGETS if( QApplication::instance( )) _windowSystems.push_back( new qt::WindowSystem ); #endif LBASSERT( nodeFactory ); Global::_nodeFactory = nodeFactory; const std::string& programName = Global::getProgramName(); if( programName.empty() && argc > 0 ) Global::setProgramName( argv[0] ); const std::string& workDir = Global::getWorkDir(); if( workDir.empty( )) { char cwd[MAXPATHLEN]; Global::setWorkDir( getcwd( cwd, MAXPATHLEN )); } _initPlugins(); return fabric::init( argc, argv ); }
bool _init( const int argc, char** argv, NodeFactory* nodeFactory ) { const char *env = getenv( "EQ_LOG_LEVEL" ); if( env ) lunchbox::Log::level = lunchbox::Log::getLogLevel( env ); env = getenv( "EQ_LOG_TOPICS" ); if( env ) lunchbox::Log::topics |= atoll( env ); lunchbox::Log::instance().setThreadName( "Main" ); _parseArguments( argc, argv ); LBINFO << "Equalizer v" << Version::getString() << " initializing" << std::endl; if( ++_initialized > 1 ) // not first { LBINFO << "Equalizer client library initialized more than once" << std::endl; return true; } // _initErrors(); #ifdef AGL GetCurrentEventQueue(); #endif #ifdef EQ_USE_PARACOMP LBINFO << "Initializing Paracomp library" << std::endl; PCerr err = pcSystemInitialize( 0 ); if( err != PC_NO_ERROR ) { LBERROR << "Paracomp initialization failed: " << err << std::endl; return false; } #endif LBASSERT( nodeFactory ); Global::_nodeFactory = nodeFactory; _initPlugins(); return fabric::init( argc, argv ); }
bool ESP8266WebServer::_parseRequest(WiFiClient& client) { // Read the first line of HTTP request String req = client.readStringUntil('\r'); client.readStringUntil('\n'); //reset header value for (int i = 0; i < _headerKeysCount; ++i) { _currentHeaders[i].value =String(); } // First line of HTTP request looks like "GET /path HTTP/1.1" // Retrieve the "/path" part by finding the spaces int addr_start = req.indexOf(' '); int addr_end = req.indexOf(' ', addr_start + 1); if (addr_start == -1 || addr_end == -1) { #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Invalid request: "); DEBUG_OUTPUT.println(req); #endif return false; } String methodStr = req.substring(0, addr_start); String url = req.substring(addr_start + 1, addr_end); String versionEnd = req.substring(addr_end + 8); _currentVersion = atoi(versionEnd.c_str()); String searchStr = ""; int hasSearch = url.indexOf('?'); if (hasSearch != -1){ searchStr = urlDecode(url.substring(hasSearch + 1)); url = url.substring(0, hasSearch); } _currentUri = url; _chunked = false; HTTPMethod method = HTTP_GET; if (methodStr == "POST") { method = HTTP_POST; } else if (methodStr == "DELETE") { method = HTTP_DELETE; } else if (methodStr == "OPTIONS") { method = HTTP_OPTIONS; } else if (methodStr == "PUT") { method = HTTP_PUT; } else if (methodStr == "PATCH") { method = HTTP_PATCH; } _currentMethod = method; #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("method: "); DEBUG_OUTPUT.print(methodStr); DEBUG_OUTPUT.print(" url: "); DEBUG_OUTPUT.print(url); DEBUG_OUTPUT.print(" search: "); DEBUG_OUTPUT.println(searchStr); #endif //attach handler RequestHandler* handler; for (handler = _firstHandler; handler; handler = handler->next()) { if (handler->canHandle(_currentMethod, _currentUri)) break; } _currentHandler = handler; String formData; // below is needed only when POST type request if (method == HTTP_POST || method == HTTP_PUT || method == HTTP_PATCH || method == HTTP_DELETE){ String boundaryStr; String headerName; String headerValue; bool isForm = false; bool isEncoded = false; uint32_t contentLength = 0; //parse headers while(1){ req = client.readStringUntil('\r'); client.readStringUntil('\n'); if (req == "") break;//no moar headers int headerDiv = req.indexOf(':'); if (headerDiv == -1){ break; } headerName = req.substring(0, headerDiv); headerValue = req.substring(headerDiv + 1); headerValue.trim(); _collectHeader(headerName.c_str(),headerValue.c_str()); #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("headerName: "); DEBUG_OUTPUT.println(headerName); DEBUG_OUTPUT.print("headerValue: "); DEBUG_OUTPUT.println(headerValue); #endif if (headerName == "Content-Type"){ if (headerValue.startsWith("text/plain")){ isForm = false; } else if (headerValue.startsWith("application/x-www-form-urlencoded")){ isForm = false; isEncoded = true; } else if (headerValue.startsWith("multipart/")){ boundaryStr = headerValue.substring(headerValue.indexOf('=')+1); isForm = true; } } else if (headerName == "Content-Length"){ contentLength = headerValue.toInt(); } else if (headerName == "Host"){ _hostHeader = headerValue; } } if (!isForm){ size_t plainLength; char* plainBuf = readBytesWithTimeout(client, contentLength, plainLength, HTTP_MAX_POST_WAIT); if (plainLength < contentLength) { free(plainBuf); return false; } if (contentLength > 0) { if (searchStr != "") searchStr += '&'; if(isEncoded){ //url encoded form String decoded = urlDecode(plainBuf); size_t decodedLen = decoded.length(); memcpy(plainBuf, decoded.c_str(), decodedLen); plainBuf[decodedLen] = 0; searchStr += plainBuf; } _parseArguments(searchStr); if(!isEncoded){ //plain post json or other data RequestArgument& arg = _currentArgs[_currentArgCount++]; arg.key = "plain"; arg.value = String(plainBuf); } #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); #endif free(plainBuf); } } if (isForm){ _parseArguments(searchStr); if (!_parseForm(client, boundaryStr, contentLength)) { return false; } } } else { String headerName; String headerValue; //parse headers while(1){ req = client.readStringUntil('\r'); client.readStringUntil('\n'); if (req == "") break;//no moar headers int headerDiv = req.indexOf(':'); if (headerDiv == -1){ break; } headerName = req.substring(0, headerDiv); headerValue = req.substring(headerDiv + 2); _collectHeader(headerName.c_str(),headerValue.c_str()); #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("headerName: "); DEBUG_OUTPUT.println(headerName); DEBUG_OUTPUT.print("headerValue: "); DEBUG_OUTPUT.println(headerValue); #endif if (headerName == "Host"){ _hostHeader = headerValue; } } _parseArguments(searchStr); } client.flush(); #ifdef DEBUG_ESP_HTTP_SERVER DEBUG_OUTPUT.print("Request: "); DEBUG_OUTPUT.println(url); DEBUG_OUTPUT.print(" Arguments: "); DEBUG_OUTPUT.println(searchStr); #endif return true; }
void ESP8266WebServer::handleClient() { WiFiClient client = _server.available(); if (!client) { return; } #ifdef DEBUG Serial.println("New client"); #endif // Wait for data from client to become available while(client.connected() && !client.available()){ delay(1); } // Read the first line of HTTP request String req = client.readStringUntil('\r'); client.readStringUntil('\n'); HTTPMethod method = HTTP_GET; if (req.startsWith("POST")) { method = HTTP_POST; } // First line of HTTP request looks like "GET /path HTTP/1.1" // Retrieve the "/path" part by finding the spaces int addr_start = req.indexOf(' '); int addr_end = req.indexOf(' ', addr_start + 1); if (addr_start == -1 || addr_end == -1) { #ifdef DEBUG Serial.print("Invalid request: "); Serial.println(req); #endif return; } req = req.substring(addr_start + 1, addr_end); String formData; if (method == HTTP_POST) { int contentLength = -1; int headerCount = 0; while(headerCount < 1024) { // there shouldn't be that much really String line = client.readStringUntil('\r'); client.readStringUntil('\n'); if (line.length() > 0) { // this is a header ++headerCount; if (contentLength < 0 && line.startsWith("Content-Length")) { // get content length from the header int valuePos = line.indexOf(' ', 14); if (valuePos > 0) { String valueStr = line.substring(valuePos+1); contentLength = valueStr.toInt(); #ifdef DEBUG Serial.print("Content-Length: "); Serial.println(contentLength); #endif } } } else { break; } } #ifdef DEBUG Serial.print("headerCount="); Serial.println(headerCount); #endif if (contentLength >= 0) { formData = ""; int n = 0; // timeout counter while (formData.length() < contentLength && ++n < 3) formData += client.readString(); } else { formData = client.readStringUntil('\r'); // will return after timing out once } } else if (method == HTTP_GET) { int args_start = req.indexOf('?'); if (args_start != -1) { formData = req.substring(args_start + 1); req = req.substring(0, args_start); } } client.flush(); #ifdef DEBUG Serial.print("Request: "); Serial.println(req); Serial.print("Args: "); Serial.println(formData); #endif _parseArguments(formData); _handleRequest(client, req, method); }
bool ESP8266WebServer::_parseRequest(WiFiClient& client) { // Read the first line of HTTP request String req = client.readStringUntil('\r'); client.readStringUntil('\n'); // First line of HTTP request looks like "GET /path HTTP/1.1" // Retrieve the "/path" part by finding the spaces int addr_start = req.indexOf(' '); int addr_end = req.indexOf(' ', addr_start + 1); if (addr_start == -1 || addr_end == -1) { #ifdef DEBUG DEBUG_OUTPUT.print("Invalid request: "); DEBUG_OUTPUT.println(req); #endif return false; } String methodStr = req.substring(0, addr_start); String url = req.substring(addr_start + 1, addr_end); String searchStr = ""; int hasSearch = url.indexOf('?'); if (hasSearch != -1){ searchStr = url.substring(hasSearch + 1); url = url.substring(0, hasSearch); } _currentUri = url; HTTPMethod method = HTTP_GET; if (methodStr == "POST") { method = HTTP_POST; } else if (methodStr == "DELETE") { method = HTTP_DELETE; } else if (methodStr == "PUT") { method = HTTP_PUT; } else if (methodStr == "PATCH") { method = HTTP_PATCH; } _currentMethod = method; #ifdef DEBUG DEBUG_OUTPUT.print("method: "); DEBUG_OUTPUT.print(methodStr); DEBUG_OUTPUT.print(" url: "); DEBUG_OUTPUT.print(url); DEBUG_OUTPUT.print(" search: "); DEBUG_OUTPUT.println(searchStr); #endif String formData; // below is needed only when POST type request if (method == HTTP_POST || method == HTTP_PUT || method == HTTP_PATCH || method == HTTP_DELETE){ String boundaryStr; String headerName; String headerValue; bool isForm = false; uint32_t contentLength = 0; //parse headers while(1){ req = client.readStringUntil('\r'); client.readStringUntil('\n'); if (req == "") break;//no moar headers int headerDiv = req.indexOf(':'); if (headerDiv == -1){ break; } headerName = req.substring(0, headerDiv); headerValue = req.substring(headerDiv + 2); if (headerName == "Content-Type"){ if (headerValue.startsWith("text/plain")){ isForm = false; } else if (headerValue.startsWith("multipart/form-data")){ boundaryStr = headerValue.substring(headerValue.indexOf('=')+1); isForm = true; } } else if (headerName == "Content-Length"){ contentLength = headerValue.toInt(); } } if (!isForm){ if (searchStr != "") searchStr += '&'; //some clients send headers first and data after (like we do) //give them a chance int tries = 100;//100ms max wait while(!client.available() && tries--)delay(1); size_t plainLen = client.available(); char *plainBuf = (char*)malloc(plainLen+1); client.readBytes(plainBuf, plainLen); plainBuf[plainLen] = '\0'; #ifdef DEBUG DEBUG_OUTPUT.print("Plain: "); DEBUG_OUTPUT.println(plainBuf); #endif if(plainBuf[0] == '{' || plainBuf[0] == '[' || strstr(plainBuf, "=") == NULL){ //plain post json or other data searchStr += "plain="; searchStr += plainBuf; } else { searchStr += plainBuf; } free(plainBuf); } _parseArguments(searchStr); if (isForm){ _parseForm(client, boundaryStr, contentLength); } } else { _parseArguments(searchStr); } client.flush(); #ifdef DEBUG DEBUG_OUTPUT.print("Request: "); DEBUG_OUTPUT.println(url); DEBUG_OUTPUT.print(" Arguments: "); DEBUG_OUTPUT.println(searchStr); #endif return true; }