void ProxyServer::process_request(boost::asio::ip::tcp::socket * socket, std::string const & message) { vector<string>tokens; tokenizer(const_cast<string &>(message), tokens); if (tokens.size() > 0) { if (tokens[0] == "READ" && tokens.size() > 1) { std::cout << "Application Server - Message received from " << socket->remote_endpoint() << " - Message: " << message << std::endl; string res = readFunc(tokens[1]); socket->write_some(boost::asio::buffer(res)); } else if (tokens[0] == "WRITE" && tokens.size() > 2) { std::cout << "Application Server - Message received from " << socket->remote_endpoint() << " - Message: " << message << std::endl; bool res = writeFunc(tokens[1], tokens[2]); socket->write_some(boost::asio::buffer(res ? string("WRITE_OK") : string("WRITE_FAIL"))); } else { std::cout << "Application Server - Message received from " << socket->remote_endpoint() << " - Message: " << message << std::endl; socket->write_some(boost::asio::buffer(string("INVALID"))); } } }
static int tcp_readln(const s32 s, char *buf, const u16 max_length) { s32 res = -1; s32 ret; u64 start_time = gettime(); u16 c = 0; while (c < max_length) { if (ticks_to_millisecs(diff_ticks(start_time, gettime())) > HTTP_TIMEOUT) break; ret = readFunc(s, &buf[c], 1); if (ret == -EAGAIN) { usleep(20 * 1000); continue; } if (ret <= 0) break; if (c > 0 && buf[c - 1] == '\r' && buf[c] == '\n') { res = 0; buf[c-1] = 0; break; } c++; start_time = gettime(); usleep(100); } return res; //return c; }
static u32 tcp_read(const s32 s, u8 *buffer, const u32 length, int chunked) { char *p; u32 left, block, received, step=0; u64 t; s32 res; p = (char *)buffer; left = length; received = 0; char line[64]; int chunksize; t = gettime(); while (left || chunked) { if(chunked == 1){ tcp_readln(s, line, 64); sscanf(line,"%X",&chunksize); if(chunksize == 0) break; left = chunksize + 2; //Read the \r\n chunked = 2; t = gettime(); } if (ticks_to_millisecs(diff_ticks(t, gettime())) > TCP_BLOCK_RECV_TIMEOUT) { break; } block = left; if (block > TCP_RECV_SIZE) block = TCP_RECV_SIZE; res = readFunc(s, p, block); if (res == -EAGAIN) { usleep(20 * 1000); continue; } if(res<=0) break; received += res; left -= res; if(left == 0 && chunked == 2){ chunked = 1; p -= 2; received -= 2; } //Overwrite \r\n p += res; usleep(1000); if ((received / TCP_BLOCK_SIZE) > step) { t = gettime (); step++; } } return received; }