void CsvFile::write(const HeaderList& header, const DataMap& data) throw (FileException) { std::ofstream file(filename.c_str()); if (!file) throw FileException("Cannot open file", filename, __FUNCTION_NAME__); // Print raw of headers for (HeaderList::const_iterator it = header.begin(); it != header.end(); ++it) { file << separator << *it; } // End of line file << std::endl; // Print all data raws for (DataMap::const_iterator rawit = data.begin() ; rawit != data.end(); ++rawit) { file<< rawit->first; for (DataRaw::const_iterator it = rawit->second.begin(); it != rawit->second.end(); ++it) { if (*it > 0) file << separator << *it; else file << separator; } // End of line file << std::endl; } };
bool CHttpServer::receive_request(ByteVector &request) { if (verbose) RAWTRACE("Receiving request..."); ByteVector r; char buf[BUF_SIZE]; int attempts = 0; for(;;) { if (verbose) RAWTRACE("Read portion of data from socket..."); int n = recv(m_sock, &buf[0], sizeof(buf), 0); //RAWTRACE1("RECV: %d", n); if (n == -1) { int e = RHO_NET_ERROR_CODE; if (verbose) RAWTRACE1("RECV ERROR: %d", e); #if !defined(WINDOWS_PLATFORM) if (e == EINTR) continue; #else if (e == WSAEINTR) continue; #endif #if defined(OS_WP8) || (defined(RHODES_QT_PLATFORM) && defined(OS_WINDOWS_DESKTOP)) || defined(OS_WINCE) if (e == EAGAIN || e == WSAEWOULDBLOCK) { #else if (e == EAGAIN) { #endif if (!r.empty()) break; if(++attempts > (HTTP_EAGAIN_TIMEOUT*10)) { if (verbose) RAWLOG_ERROR("Error when receiving data from socket. Client does not send data for " HTTP_EAGAIN_TIMEOUT_STR " sec. Cancel recieve."); return false; } fd_set fds; FD_ZERO(&fds); FD_SET(m_sock, &fds); timeval tv = {0}; tv.tv_usec = 100000;//100 MS select(m_sock + 1, &fds, 0, 0, &tv); continue; } if (verbose) RAWLOG_ERROR1("Error when receiving data from socket: %d", e); return false; } if (n == 0) { if(!r.empty()) { if (verbose) RAWTRACE("Client closed connection gracefully"); break; } else { if (verbose) RAWLOG_ERROR("Connection gracefully closed before we receive any data"); return false; } } else { if (verbose) RAWTRACE1("Actually read %d bytes", n); r.insert(r.end(), &buf[0], &buf[0] + n); } } if (!r.empty()) { request.insert(request.end(), r.begin(), r.end()); if ( !rho_conf_getBool("log_skip_post") ) { String strRequest(request.begin(),request.end()); if (verbose) RAWTRACE1("Received request:\n%s", strRequest.c_str()); } } return true; } bool CHttpServer::send_response_impl(String const &data, bool continuation) { #ifdef OS_MACOSX if ( m_localResponseWriter != 0 ) { m_localResponseWriter->writeResponse( data ); return true; } #endif if (verbose) { if (continuation) if (verbose) RAWTRACE("Send continuation data..."); else if (verbose) RAWTRACE("Sending response..."); } // First of all, make socket blocking #if defined(WINDOWS_PLATFORM) unsigned long optval = 0; if(::ioctlsocket(m_sock, FIONBIO, &optval) == SOCKET_ERROR) { RAWLOG_ERROR1("Can not set blocking socket mode: %d", RHO_NET_ERROR_CODE); return false; } #else int flags = fcntl(m_sock, F_GETFL); if (flags == -1) { if (verbose) RAWLOG_ERROR1("Can not get current socket mode: %d", errno); return false; } if (fcntl(m_sock, F_SETFL, flags & ~O_NONBLOCK) == -1) { if (verbose) RAWLOG_ERROR1("Can not set blocking socket mode: %d", errno); return false; } #endif size_t pos = 0; for(; pos < data.size();) { int n = send(m_sock, data.c_str() + pos, data.size() - pos, 0); if (n == -1) { int e = RHO_NET_ERROR_CODE; #if !defined(WINDOWS_PLATFORM) if (e == EINTR) continue; #endif if (verbose) RAWLOG_ERROR1("Can not send response data: %d", e); return false; } if (n == 0) break; pos += n; } //String dbg_response = response.size() > 100 ? response.substr(0, 100) : response; //RAWTRACE2("Sent response:\n%s%s", dbg_response.c_str(), response.size() > 100 ? "..." : " "); if (continuation) { if (verbose) RAWTRACE1("Sent response body: %d bytes", data.size()); } else if ( !rho_conf_getBool("log_skip_post") ) { if (verbose) RAWTRACE1("Sent response (only headers displayed):\n%s", data.c_str()); } return true; } bool CHttpServer::send_response(String const &response, bool redirect) { #ifdef OS_ANDROID if (redirect) { CAutoPtr<IRhoThreadImpl> ptrThread = rho_get_RhoClassFactory()->createThreadImpl(); ptrThread->sleep(20); } #endif return send_response_impl(response, false); } String CHttpServer::create_response(String const &reason) { return create_response(reason, ""); } String CHttpServer::create_response(String const &reason, HeaderList const &headers) { return create_response(reason, headers, ""); } String CHttpServer::create_response(String const &reason, String const &body) { return create_response(reason, HeaderList(), body); } String CHttpServer::create_response(String const &reason, HeaderList const &hdrs, String const &body) { String response = "HTTP/1.1 "; response += reason; response += "\r\n"; char buf[50]; snprintf(buf, sizeof(buf), "%d", m_port); HeaderList headers; headers.push_back(Header("Host", String("127.0.0.1:") + buf)); headers.push_back(Header("Connection", "close")); headers.push_back(HttpHeader("Access-Control-Allow-Origin", "*")); std::copy(hdrs.begin(), hdrs.end(), std::back_inserter(headers)); for(HeaderList::const_iterator it = headers.begin(), lim = headers.end(); it != lim; ++it) { response += it->name; response += ": "; response += it->value; response += "\r\n"; } response += "\r\n"; response += body; return response; }
void CsvFile::read(HeaderList& header, DataMap& data) const throw (FileException, CustomException) { std::ifstream file(filename.c_str()); if (!file) throw FileException("Cannot open file", filename, __FUNCTION_NAME__); // a buffer to store the line read std::string line; if ( ! std::getline(file, line)) throw FileException("Cannot get the first line of file", filename, __FUNCTION_NAME__); unsigned int pointer = 0; unsigned int rawnb = 0; std::string word =""; int localHostColNumber = -1, tmp=0; bool uselocalhost=false; bool useotherthanlocalhost=false; // Parse the first line (header line) while(pointer < line.size()) { while( pointer < line.size() && line[pointer] != separator) { //remove white spaces if (line[pointer] != ' ') { word.push_back(line[pointer]); } pointer++; } if( !word.empty()) { // warning if id already in if (std::find(header.begin(), header.end(), word) != header.end() ) { // Was error before, now just a warning: may be convenient to have several time the same name in a header Msg::warning("Duplicate header element '"+ word+"' in file "+filename, __FUNCTION_NAME__); // throw FileException("Duplicate header elements'"+ word+"'",filename, __FUNCTION_NAME__); } header.push_back(word); tmp++; } // if we have "localhost" in csv file, note the column number. if(word == "localhost" || word == "Localhost" || word == "127.0.0.1") localHostColNumber = tmp; pointer++; word.clear(); } // Parse the lines while (std::getline(file, line)) { rawnb++; pointer = 0; bool firstWord = true; // Are we parsing the first column unsigned int column = 0; // Which column is being scanned? std::string id; while(line.size() > pointer) { // get word word.clear(); while(line.size() > pointer && line[pointer] != separator) { if (line[pointer] != ' ') word.push_back(line[pointer]); pointer++; } pointer++; if (firstWord) { // it's the map id if ( word.empty() ) break; // forget about this line and go to parse next line id = word; if(data.find(id) != data.end()) throw CustomException("Component : " + id + " is specified twice in CSV file.", __FUNCTION_NAME__ ); // init the raw of this id with zeros. data[id].insert(data[id].begin(), header.size(),0); firstWord = false; } else { if (!word.empty()) { // store data try{ data[id].at(column) = convertTo<int>(word); if (data[id].at(column) > 0)// one component instance at least mapped { if(column == localHostColNumber-1) // we are reading in a locahost column { // Remember that we have one component mapped on a localHost. uselocalhost=true; } else { // Remember that we have one component mapped on an host different from localHost. useotherthanlocalhost=true; } if(uselocalhost && useotherthanlocalhost) throw FileException("Host name 'localhost' is used in CSV file in conjunction with other host names or IP address. Replace 'localhost' by IP address or machine name to avoid problems", filename, __FUNCTION_NAME__); } }//end try catch(const BadConversion& e) { throw FileException("Raw="+toString<unsigned int>(rawnb+1)+", col="+toString<unsigned int>(column+2)+") contains non integer value="+word,filename, __FUNCTION_NAME__); // std::cerr << "ERROR: Csv File "<<fileName<<", element (raw="<<rawnb+1<<", col="<<column+2<<") contains non integer value="<<word<< std::endl; } catch(const std::out_of_range& e) { throw FileException("Element (raw="+toString<unsigned int>(rawnb+1)+", col="+toString<unsigned int>(column+2)+") out of column (value="+word+", ignored)",filename, __FUNCTION_NAME__); // std::cerr << "WARNING : Csv File "<<fileName<<", element (raw="<<rawnb+1<<", col="<<column+2<<") out of column (value="<<word<<", ignored)"<< std::endl; } } column++; } } } };
static ngx_int_t ngx_http_cxxmvc_handler(ngx_http_request_t *r) { using dragon::kHttp_Method_Get; using dragon::kResponseTypeRedirect; using dragon::HeaderList; using dragon::CookieList; using dragon::StringRef; using dragon::HttpRequest; using dragon::HttpResponse; ngx_buf_t *buf = NULL; ngx_chain_t out; unsigned uriLen = r->uri.len; if (r->args.len > 0) uriLen = r->uri.len + r->args.len + 1; struct sockaddr_in *sin; ngx_addr_t addr; addr.sockaddr = r->connection->sockaddr; addr.socklen = r->connection->socklen; sin = (struct sockaddr_in *)addr.sockaddr; char *ip = inet_ntoa(sin->sin_addr); StringRef IP(ip, strlen(ip)); StringRef routingUrl((const char *)r->uri.data, uriLen); StringRef userAgent; if (r->headers_in.user_agent) userAgent = StringRef((const char *)r->headers_in.user_agent->value.data, r->headers_in.user_agent->value.len); std::string userCookie = ngx_http_get_cookie(r); std::string lang = ngx_http_get_language(r); HttpRequest req; HttpResponse res; req.SetMethod(kHttp_Method_Get); req.SetUrl(routingUrl); req.SetIp(IP); //req.SetHost(StringRef(host, strlen(host))); req.SetUserAgent(userAgent); req.SetUserCookie(StringRef(userCookie.c_str(), userCookie.length())); req.SetAcceptLanguage(StringRef(lang.c_str(), lang.length())); req.ParseCookie(); DE.ResponseRequest(req, res); ngx_str_t k = ngx_string("X-Powered-By"); ngx_str_t v = ngx_string("cxxmvc/0.1");; ngx_http_add_header(r, &v, &k); if (res.GetResponseType() == kResponseTypeRedirect) { ngx_str_t k = ngx_string("location"); ngx_str_t v = {res.GetContent().length(), (u_char *)res.GetContent().c_str()}; ngx_http_add_header(r, &v, &k); } HeaderList headers = res.GetHeaders(); if (headers.size() > 0) { HeaderList::iterator iter; HeaderList::iterator end = headers.end(); for (iter = headers.begin(); iter != end; ++iter) { ngx_str_t k; ngx_str_t v; k.data = (u_char *)ngx_pcalloc(r->pool, iter->first.length()+1); k.len = iter->first.length(); strcpy((char *)k.data, (const char *)iter->first.c_str()); v.data = (u_char *)ngx_pcalloc(r->pool, iter->second.length()+1); v.len = iter->second.length(); strcpy((char *)v.data, (const char *)iter->second.c_str()); // std::cout << "key : "<< k.data << std::endl; // std::cout << "value : " << v.data << std::endl; ngx_http_add_header(r, &v, &k); } } CookieList cookies = res.GetCookies(); if (cookies.size() > 0) { CookieList::iterator iter; CookieList::iterator end = cookies.end(); for (iter = cookies.begin(); iter != end; ++iter) { ngx_str_t v; v.data = (u_char *)ngx_pcalloc(r->pool, iter->length()+1); v.len = iter->length(); strcpy((char *)v.data, (const char *)iter->c_str()); ngx_http_add_cookie(r, v); } } r->headers_out.status = res.GetStatusCode(); r->headers_out.content_type.len = res.GetContentType().length(); r->headers_out.content_type.data = (u_char *)res.GetContentType().c_str(); if (res.GetDetaRef().length() > 0) r->headers_out.content_length_n = res.GetDetaRef().length(); else r->headers_out.content_length_n = res.GetContent().length(); ngx_http_send_header(r); buf = (ngx_buf_t *)ngx_pcalloc(r->pool, sizeof(ngx_buf_t)); if (buf == NULL) { ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, "Failed to allocate response buffer."); return NGX_ERROR; } if (res.GetDetaRef().length() > 0) { buf->pos = (u_char *)res.GetDetaRef().data(); buf->last = buf->pos + res.GetDetaRef().length(); } else { buf->pos = (u_char *)res.GetContent().c_str(); buf->last = buf->pos + res.GetContent().length(); } buf->memory = 1; /* content is in read-only memory */ buf->last_buf = 1; /* there will be no more buffers in the request */ out.buf = buf; out.next = NULL; return ngx_http_output_filter(r, &out); }