示例#1
0
void AudioManager::play_stream_playlist(StreamPlaylist *playlist, float volume)
{
	OggVorbisStream *stream;

	if (!playlist->started){
		stream = request_stream(&playlist->stream_idx);
		if (stream){
			playlist->it = playlist->files.begin();
			stream->open((*playlist->it).c_str());
			stream->set_volume(volume);
			stream->set_playback_volume(volume);
			stream->play(AUDIO_PLAYMODE_ONCE);
			playlist->it++;
			playlist->started = true;
		}
	}
	else {
		stream = get_audio_stream(playlist->stream_idx);
		if (stream && !stream->is_playing()){
			if (!(playlist->it == playlist->files.end())){
				stream->close();
				stream->open((*playlist->it).c_str());
				stream->set_volume(volume);
				stream->set_playback_volume(volume);
				stream->play(AUDIO_PLAYMODE_ONCE);
				playlist->it++;
			}
		}
	}

	if (playlist->loop && playlist->it == playlist->files.end())
		playlist->it = playlist->files.begin();
}
	void stratum_client::handle_connect(const boost::system::error_code& err)
	{
		if (!inited_)
			return;
		if (!err)
		{
			{
				std::cout << "Try to login..." << std::endl;
				std::ostream request_stream(&request_);
				request_stream << "{\"id\": 1, \"method\": \"login\", "
					"\"params\": { "
					"\"login\":\"" << login_ << "\","
					"\"pass\" : \"" << pwd_ << "\", "
					"\"agent\" : \"embedded_miner/1.0\""
					"}"
					"}\n";
			}

			boost::asio::async_write(socket_, request_,
				boost::bind(&stratum_client::handle_write_completed, this,
				boost::asio::placeholders::error));
		}
		else
		{
			ec_(err.value(), err.message(), this);
		}
	}
示例#3
0
/* Read the request from the socket, returning in a nice binary format.
 * The return value should be subject to NRVO, so it will be fast
 */
static Request read_request(int fd)
{
	Request retval;

	std::unique_ptr<char[]> client_request(new char[client_request_size+1]);
	int amount_read;
	/* Get the request from the socket. */
	if ((amount_read = read(fd,client_request.get(),client_request_size))==-1) {
		server_error(fd,500);
		throw; // TODO: choose a good exception to throw
	} else {
		client_request[amount_read]=0; // Make sure we have a valid C string
	}
	main_log << DEBUG << "Read Client Request:" << client_request.get();
	
	/* Parse the request header */
	std::stringstream request_stream(client_request.get());;
	request_stream >> retval.method;
	request_stream >> retval.URI;
	request_stream >> retval.http_version;
	if (request_stream.fail()) {
		main_log << WARNING << "Received a bad request:\n" << client_request.get();
		server_error(fd,400);
		throw; // TODO: throw a proper exception
	} else {
		main_log << DEBUG << "Method: " << retval.method << '\n';
		main_log << "Request URI: " << retval.URI << '\n';
		main_log << "HTTP Version: " << retval.http_version << '\n';
	}
	
	std::swap(retval.raw,client_request);
	
	return retval;
}
示例#4
0
bool Simloid::load_snapshot () throw ()
{
  if (!_initialized) return false;
#ifdef FOUND_boost
  std::ostream request_stream(&_request);
  request_stream << "(load)\n(done)\n";
  boost::asio::write(*_socket, _request);
#endif
  return true;
}
示例#5
0
void AudioManager::play_stream(const char *fname, float volume, AUDIO_PLAYMODE mode, int *stream_idx)
{
	OggVorbisStream *stream = request_stream(stream_idx);
	if (stream){
		stream->open(fname);
		stream->set_volume(volume);
		stream->set_playback_volume(volume);
		stream->play(mode);
	}
}
示例#6
0
void Detection::CheckIP()
{
    std::ofstream fout("text.txt", std::ofstream::ate|std::ofstream::app);
    fout << "\n**********************************************************************\n";
    fout << "2. Checkip" << std::endl;

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("jump.g1d.net", "http");
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end;

    // Try each endpoint until we successfully establish a connection.
    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);
    }
    if (error)
    {
        fout << "域名解析失败!" << std::endl;
    }

    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "GET " << "/checkip.jsp" << " HTTP/1.0\r\n";
    request_stream << "Host: " << "jump.g1d.net" << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Send the request.
    boost::asio::write(socket, request);

    // Read the response status line.
    boost::asio::streambuf response;
    boost::asio::read(socket, response, boost::asio::transfer_all(), error);

    std::istream response_stream(&response);
    std::string response_string;
    while (std::getline(response_stream, response_string))
    {
        if (response_string.find("用户来源IP") != std::string::npos || response_string.find("来源IP服务的ID:") != std::string::npos)
        {
            fout << response_string.substr(0, response_string.find('<')) << std::endl;
        }
    }
    fout.close();

    ++m_progress_pos_;
}
示例#7
0
void CLineServer::MessageHandler( const boost::system::error_code & p_error )
{
    if( !p_error )
    {
        boost::asio::streambuf request;
        std::istream request_stream( &request );
        std::string request_code, device, key, value;
        
        boost::asio::streambuf response;
        std::ostream response_stream( &response );
        
        bool quit = false;
        size_t bytes;
        
        try
        {
            while( !quit )
            {
                // receive the request stream and get the request type
                bytes = boost::asio::read_until( m_socket, request, "\r\n" );
                request_stream >> request_code;
                
                // handle different message types
                if( request_code == "GET" )
                {
                    // split the request stream
                    request_stream >> device >> key;
                    
                    std::cerr << "GET " << device << " " << key;
                    value = m_get(device,key);
                    std::cerr << " " << value << std::endl;
                    
                    // format the response stream
                    if( value.empty() )
                    {
                        response_stream << "404 ERROR NOTFOUND\r\n";
                    }
                    else
                    {
                        response_stream << "200 OK " << value << "\r\n";
                    }
                }
                else if( request_code == "SET" )
                {
                    // split the request stream
                    request_stream >> device >> key >> value;
                    
                    std::cerr << "SET " << device << " " << key << " " << value << std::endl;
                    m_set(device,key,value);
                    
                    // format the response stream
                    response_stream << "200 OK\r\n";
                }
示例#8
0
文件: irc.cpp 项目: chaoqing/qqbot
void IrcClient::send_data(const char* data,const size_t len)
{
    std::string msg;
    msg.append(data,len);

    std::ostream request_stream(&request_);
    request_stream << msg;

    boost::asio::async_write(socket_, request_,
        boost::bind(&IrcClient::handle_write_request, this,
        boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred));

}
示例#9
0
void kithleighSerial::compose_request(const std::string &buf)
{
//         std::cout<<"composed_"<<std::endl;
//   boost::asio::streambuf buff;
//   std::ostream request_stream(&buff);

    std::ostream request_stream(&request_);

    request_stream <<buf.c_str()<< "\r";
      std::cout<<"composed_"<<&request_<<std::endl;
    return;
  
}
void connection<tcpContext>::compose_request_stream(const std::string &buf)
{
    std::ostream request_stream(&request_);
    
    
    std::string port_name = this->server;
    std::string host_path = "/scpi_response.html?cmd=";
    
    request_stream << "GET " << host_path.c_str()<<buf.c_str()<< " HTTP/1.0\r\n";
    request_stream << "Host: " << this->server<< "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";
  
}
示例#11
0
 gcm_request& gcm_request::operator= (const gcm_request& other)
 {
     if (this != &other)
     {
         // TODO: dirty.. find a better way to copy data
         std::ostream request_stream(&request_);
         
         boost::asio::streambuf::const_buffers_type bufs = other.request_.data();
         std::string s(boost::asio::buffers_begin(bufs), boost::asio::buffers_begin(bufs) + other.request_.size());
         
         request_stream << s;            
         ident_ = other.ident_;
     }
     
     return *this;
 }
示例#12
0
xreturn::r<std::string> ActionImplement::Telnet(const std::string& host,int port,const std::string& wait,const std::string& send,const std::string& recv)
{
	//ASIO作成
	boost::asio::io_service io_service;

	 //名前解決
	boost::asio::ip::tcp::resolver resolver(io_service);
	boost::asio::ip::tcp::resolver::query query(host , num2str( port ));
	boost::asio::ip::tcp::endpoint endpoint(*resolver.resolve(query));

    boost::asio::ip::tcp::socket socket(io_service);

	//接続
	boost::system::error_code error ;
	socket.connect(endpoint,error);
    if (error)
	{
		return xreturn::error("ホストに接続できません host:" + host + " port:" + num2str(port) );
	}

	//まずは相手の言い分を聞きます.
	if (!wait.empty())
	{
		boost::asio::streambuf wait_body;
		boost::asio::read_until(socket, wait_body,wait ,error );
	}

	//送信
	if (!send.empty() )
	{
		boost::asio::streambuf request;
		std::ostream request_stream(&request);
		request_stream << send << std::flush;
		boost::asio::write(socket, request);
	}
	std::string ret;

	//最後に会いての言い分を聞いてから通信を切ります。
	if (!recv.empty())
	{
		//貴方の意見は?
		boost::asio::streambuf respons_body;
		boost::asio::read_until(socket, respons_body,recv ,error );
		ret = boost::asio::buffer_cast<const char*>(respons_body.data());
	}
	return ret;
}
示例#13
0
bool Simloid::reset () throw ()
{
  if (!_initialized) return false;
  _initialized = false;
#ifdef FOUND_boost
  std::ostream request_stream(&_request);
  request_stream << "(reset)\n";
  for (int i=1; i<20; i++) request_stream << "(pid " << i << " 512)\n";
  request_stream << "(done)\n";
  boost::asio::write(*_socket, _request);
#endif

  for (int i=0; i<19; i++) _target[i] = _hold ? 512 : -1;
  step();
  step();
  _initialized = true;
  return true;
}
示例#14
0
 gcm_request::gcm_request(const device& /*dev*/,
                          const std::string& api_key,
                          const std::string& payload,
                          const uint32_t& ident)
 : ident_(ident)
 {
     std::ostream request_stream(&request_);
     
     request_stream << "POST /gcm/send HTTP/1.1\r\n";
     request_stream << "User-Agent: push_service\r\n";
     request_stream << "Host: android.googleapis.com\r\n";
     request_stream << "Accept: */*\r\n";
     request_stream << "Content-Type: application/json\r\n";
     request_stream << "Authorization: key=" << api_key << "\r\n";
     request_stream << "Connection: Keep-Alive\r\n";
     request_stream << "Content-Length:" << payload.size() << "\r\n\r\n";
     request_stream << payload;
 }
	void stratum_client::handle_job_succeeded(const std::string& job_id, 
		uint32_t nonce, const binary& hash)
	{
		std::cout << "job [" << job_id << "] succeeded, " <<
			nonce << std::endl;
		{
			std::ostringstream oss;
			oss << "{\"method\": \"submit\", \"params\": "
				"{\"id\": \"" << rpc_id_ << "\", \"job_id\": \"" << job_id <<
				"\", \"nonce\": \"" << std::string(hex_string(nonce)) <<
				"\", \"result\": \"" << std::string(hex_string(hash)) <<
				"\"}, \"id\":1}\n";
			std::ostream request_stream(&request_);
			request_stream << oss.str();
		}

		boost::asio::async_write(socket_, request_,
			boost::bind(&stratum_client::handle_write_completed, this,
			boost::asio::placeholders::error));
	}
示例#16
0
bool Simloid::init () throw ()
{
#ifdef FOUND_boost

  _initialized = true;
  _io = new boost::asio::io_service();
  _socket = new tcp::socket(*_io);
  tcp::resolver resolver(*_io);
  tcp::resolver::query query("localhost", "7777");
  tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
  tcp::resolver::iterator end;

  boost::system::error_code error = boost::asio::error::host_not_found;
  while (error && endpoint_iterator != end) {
    _socket->close();
    _socket->connect(*endpoint_iterator++, error);
  }
  if (error) return false;

  for (int i=0; i<19; i++) _target[i] = _hold ? 512 : -1;

  std::ostream request_stream(&_request);
  for (int i=1; i<20; i++) request_stream << "(pid " << i << " 512)\n";
  request_stream << "(done)\n";
  boost::asio::write(*_socket, _request);
  step();
  return true;

#else

  _initialized = false;
  std::cout << "Error: cannot initialize Simloid interface without boost libraries." << std::endl;
  return false;

#endif
}
示例#17
0
HttpClient::HttpClient(boost::asio::io_service& io_service,
        const std::string& server, const std::string& path, HttpResponseHandler responseHandler)
: resolver_(io_service),
  socket_(io_service),
  responseStream(new std::stringstream)
{
    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    this->responseHandler = responseHandler;
    std::ostream request_stream(&request_);
    request_stream << "GET " << path << " HTTP/1.0\r\n";
    request_stream << "Host: " << server << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

   // Start an asynchronous resolve to translate the server and service names
    // into a list of endpoints.
    tcp::resolver::query query(server, "http");
    resolver_.async_resolve(query,
            boost::bind(&HttpClient::handle_resolve, this,
            boost::asio::placeholders::error,
            boost::asio::placeholders::iterator));
}
示例#18
0
void Detection::Test9KAPPPAC()
{
    std::ofstream fout("text.txt", std::ofstream::ate|std::ofstream::app);
    fout << "\n**********************************************************************\n";
    fout << "6. Test 9000 Port" << std::endl;

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("localhost", "9000");
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end;

    // Try each endpoint until we successfully establish a connection.
    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);
    }
    if (error)
    {
        fout << "域名解析失败!" << std::endl;
        return;
    }

    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    boost::asio::streambuf request;
    std::ostream request_stream(&request);

    request_stream << "GET " << "/application.pac" << " HTTP/1.1\r\n";
    request_stream << "Host: " << "localhost:9000" << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Send the request.
    boost::asio::write(socket, request);

    // Read the response status line.
    boost::asio::streambuf response;
    boost::asio::read(socket, response, boost::asio::transfer_all(), error);
    std::istream response_stream(&response);
    std::string response_string;

    bool successful = false;
    while (std::getline(response_stream, response_string))
    {
        if (response_string.find("FindProxyForURL") != std::string::npos)
        {
            successful = true;
            break;
        }
    }

    if (successful)
    {
        fout << "peer在监听9000端口" << std::endl;
    }
    else
    {
        fout << "peer没有监听9000端口" << std::endl;
    }

    ++m_progress_pos_;
}
示例#19
0
bool Simloid::step () throw ()
{
  if (!_initialized) return false;
  for (unsigned int i=0; i<20; i++)
    _velocity[i] = _position[i] = -1;

#ifdef FOUND_boost
  std::string line;
  std::vector< std::string > vec;
  boost::regex angle_expr(".*\\(angle ([\\d\\s]*)\\).*");
  boost::regex orient_expr(".*\\(imu ([\\d\\s\\.\\-]*)\\).*");
  boost::regex rate_expr(".*\\(rate ([\\d\\s\\.\\-]*)\\).*");
  boost::smatch match;

  std::ostream request_stream(&_request);
  for (int i=0; i<19; i++)
    if (_target[i] > -1)
      request_stream << "(pid " << (unsigned int)i+1 << " " << 1024-_target[i] << ")\n";
  boost::asio::write(*_socket, _request);

  for (int i=0; i<10; i++) {
    std::ostream request_stream(&_request);
    request_stream << "(done)\n";
    boost::asio::write(*_socket, _request);

    boost::asio::streambuf b;
    boost::asio::read_until(*_socket, b, angle_expr);
    std::istream is(&b);
    std::getline(is, line);
  }

  // get positions and calculate speed in case getting it fails
  if ((_got_pos = boost::regex_search(line, match, angle_expr))) {
    std::string test(match[1].str());
    boost::split(vec, test, boost::is_space(), boost::token_compress_on);
    for (unsigned int i=0; i<vec.size(); ++i) {
      _velocity[i+1] = -1 * _position[i+1];
      _position[i+1] = boost::lexical_cast<int>(vec[i]);
      _velocity[i+1] += _position[i+1];
    }
  }

  // get speed
  if (boost::regex_search(line, match, rate_expr)) {
    std::string test(match[1].str());
    boost::split(vec, test, boost::is_space(), boost::token_compress_on);
    for (unsigned int i=0; i<vec.size(); ++i)
      _velocity[i+1] = boost::lexical_cast<int>(vec[i]);
  }

  // get imu data
  if ((_got_imu = boost::regex_search(line, match, orient_expr))) {
    std::string test(match[1].str());
    boost::split(vec, test, boost::is_space(), boost::token_compress_on);
    for (unsigned int i=0; i<vec.size(); ++i)
      _imu[i] = boost::lexical_cast<float>(vec[i]);
  }
#endif

  return true;
}
示例#20
0
  RESULT cConnection::_PostRequest(const std::string& sRelativeURI, const std::map<std::string, std::string>& mValues)
  {
    boost::asio::io_service io_service;

    // Get a list of endpoints corresponding to the server name.
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query(HOST_NAME, "http");
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end;

    // Try each endpoint until we successfully establish a connection.
    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && (endpoint_iterator != end)) {
      socket.close();
      socket.connect(*endpoint_iterator++, error);
    }
    if (error) {
      return RESULT::ERROR_SERVER_COULD_NOT_BE_CONTACTED;
    }

    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    //std::ostringstream request_stream;


    std::string sRelativeURIWithAnyVariables = sRelativeURI;

    if (!mValues.empty()) {
      std::ostringstream oVariables;
      std::map<std::string, std::string>::const_iterator iter = mValues.begin();
      const std::map<std::string, std::string>::const_iterator iterEnd = mValues.end();
        // Write the first item so that we can safely add "&" between every other item
      if (iter != iterEnd) {
        oVariables<<Encode(iter->first)<<"="<<Encode(iter->second);
        iter++;
      }
      while (iter != iterEnd) {
        oVariables<<"&"<<Encode(iter->first)<<"="<<Encode(iter->second);
        iter++;
      }

      sRelativeURIWithAnyVariables += "?" + oVariables.str();
    }

    request_stream<<"GET "<<HOST_FINALTV_ROOT<<sRelativeURIWithAnyVariables<<" HTTP/1.1"<<STR_END;
    request_stream<<"Host: "<<HOST_NAME<<""<<STR_END;
    request_stream<<"User-Agent: Mozilla/4.0 (compatible; libfinaltv 1.0; Linux)"<<STR_END;
    request_stream<<"Accept: */*"<<STR_END;
    request_stream<<"Connection: close"<<STR_END;
    request_stream<<STR_END;


    //std::cout<<"Sending request: "<<std::endl;
    //std::cout<<request_stream.str()<<std::endl;

    // Send the request.
    boost::asio::write(socket, request);

    // Read the response status line.
    boost::asio::streambuf response;
    boost::asio::read_until(socket, response, "\r\n");

    // Check that response is OK.
    std::istream response_stream(&response);
    std::string http_version;
    response_stream >> http_version;
    unsigned int status_code;
    response_stream >> status_code;
    std::string status_message;
    std::getline(response_stream, status_message);
    if (!response_stream || (http_version.substr(0, 5) != "HTTP/")) {
      std::cout<<"Invalid response"<<std::endl;
      return RESULT::ERROR_SERVER_INVALID_RESPONSE;
    }
    if (status_code != 200) {
      std::cout<<"Response returned with status code "<<status_code<<std::endl;
      return RESULT::ERROR_SERVER_INVALID_RESPONSE;
    }

    // Read the response headers, which are terminated by a blank line.
    boost::asio::read_until(socket, response, "\r\n\r\n");

    // Process the response headers.
    std::string header;
    while (std::getline(response_stream, header) && (header != "\r")) {
      //std::cout<<header<<"\n";
    }
    //std::cout<<"\n";

    std::ostringstream o;

    // Process the content in this response if there is any
    if (response.size() > 0) {
      // Valid response
      o<<&response;
    }

    // Read until EOF, writing data to output as we go.
    while (boost::asio::read(socket, response, boost::asio::transfer_at_least(1), error)) {
      o<<&response;
    }
    if (error != boost::asio::error::eof) {
      std::cout<<"Error not at the end of the file "<<status_code<<std::endl;
    }

    std::istringstream buffer(o.str());

    std::string sLine;
    while (std::getline(buffer, sLine)) {
      if (sLine == "success") return RESULT::SUCCESS;
      else if (sLine == "error_wrong_version") return RESULT::ERROR_WRONG_VERSION;
      else if (sLine == "error_no_action") return RESULT::ERROR_NO_ACTION;
      else if (sLine == "error_username_or_password_incorrect") return RESULT::ERROR_USERNAME_OR_PASSWORD_INCORRECT;
      else if (sLine == "error_username_banned_24_hours") return RESULT::ERROR_USERNAME_BANNED_24_HOURS;
      else if (sLine == "error_username_banned_6_months") return RESULT::ERROR_USERNAME_BANNED_6_MONTHS;
      else if (sLine == "error_ip_banned_24_hours") return RESULT::ERROR_IP_BANNED_24_HOURS;
      else if (sLine == "error_ip_banned_6_months") return RESULT::ERROR_IP_BANNED_6_MONTHS;
      else if (sLine == "error_requests_too_frequent") return RESULT::ERROR_REQUESTS_TOO_FREQUENT;
    }

    return RESULT::ERROR_SERVER_INVALID_RESPONSE;
  }
示例#21
0
Request::Request(int client, struct sockaddr_storage client_addr) : handle(client), addr(client_addr) {
  std::string line;
  bool is_header = true;
  char buffer[BUFFER_SIZE];

  // receive data from client
  recv(client, buffer, BUFFER_SIZE, 0);

  // parse each line
  std::istringstream request_stream(buffer);
  while (std::getline(request_stream, line)) {
    // if method is undefined, assumie its first line
    if (method == Method::UNDEFINED) {
      // so parse header
      parse_header(line);
      continue;
    }

    // next lines are headers, strip them
    line.erase(line.find_last_not_of(" \n\r\t")+1);

    // if line is empty, then content should follow
    if (line.size() == 0) {
      is_header = false;
      break;
    }

    // extract name and value from header
    size_t colon;
    std::string name = line.substr(0, colon = line.find(":"));
    std::string value = line.substr(colon+1);
    value.erase(0, value.find_first_not_of(" \n\r\t"));

    headers.insert(std::make_pair(name, value));
  }

  // if has content
  if (!is_header) {
    // assume proper content length
    size_t content_length = header("Content-Length", 0);

    if (content_length == 0)
      content_length = header("Content-length", 0);

    raw.reserve(content_length);
    content.reserve(content_length);
    
    if (content_length > 0) {
      // read whats left in header
      length = std::min(content_length, (size_t)(BUFFER_SIZE - request_stream.tellg()));
      raw = std::string(buffer, BUFFER_SIZE).substr(request_stream.tellg(), length);
      content = "";

      // receive some more
      while (length < content_length) {
        memset(buffer, 0, BUFFER_SIZE);
        size_t buffer_length = recv(client, buffer, BUFFER_SIZE, 0);
        raw += std::string(buffer, buffer_length);
        content += std::string(buffer, buffer_length);
        length += buffer_length;
      }
    }
    //std::cout << "content o "<<content_length<<" == "<<length<<" == " <<raw.size()<<"\n";
  }

  // delete [] buffer;

  time = std::chrono::high_resolution_clock::now();

  // if has some content
  if (!raw.empty()) {
    // try to parse it
    auto ct = headers.find("Content-Type");

    if (ct == headers.end())
      ct = headers.find("Content-type");

    if (ct != headers.end()) {
      if (ct->second == "application/x-www-form-urlencoded") {
        parse_query_string(raw);
      } else
      if (ct->second == "application/json" || ct->second == "text/json") {
        Json::Reader json_reader;
        // data = std::make_shared<Json::Value>();
        json_reader.parse(raw, data, false);
      }
    }
  }
}
示例#22
0
auto print_url(boost::asio::io_service &io, std::string host, std::string url,
               Finished f) {

  // Holds values that must be across calls to the lambdas
  struct coroutine_variables_t {
    boost::asio::ip::tcp::resolver resolver;
    boost::asio::ip::tcp::socket socket;
    boost::asio::streambuf request;
    std::string current;
    explicit coroutine_variables_t(boost::asio::io_service &io)
        : resolver{io}, socket{io} {}
  };
  // Create the block for the coroutine
  static auto block = stackless_coroutine::make_block(

      // For the first lamda of the block, in addition to context, and
      // variables,
      // can take other parameters
      [](auto &context, auto &variables, const std::string &host,
         const std::string &path) {
        std::ostream request_stream(&variables.request);

        request_stream << "GET " << path << " HTTP/1.0\r\n";
        request_stream << "Host: " << host << "\r\n";
        request_stream << "Accept: */*\r\n";
        request_stream << "Connection: close\r\n\r\n";

        boost::asio::ip::tcp::resolver::query query{host, "http"};

        // Pass context in to any function that requires a callback
        variables.resolver.async_resolve(query, context);

        // Return do_async to signal that we have made an async call, and that
        // we should not go on the next
        // lamda upon return
        return context.do_async();
      },
      // In the next lambda after a do_async, in addition to context, and
      // variables,
      // also take the parameters
      // of the callback, in this case the error_code ec, and iterator
      [](auto &context, auto &variables, auto ec, auto iterator) {

        // We can throw exceptions, and the exception will exit the entire block
        if (ec) {
          throw boost::system::system_error{ec};
        } else {

          // Pass context as the callback
          boost::asio::async_connect(variables.socket, iterator, context);
          return context.do_async();
        }

      },
      // Take the parameters for the async_connect callback
      [](auto &context, auto &variables, auto &ec, auto iterator) {

        if (ec) {
          throw boost::system::system_error{ec};
        }

        // Send the request.
        boost::asio::async_write(variables.socket, variables.request, context);
        return context.do_async();
      },
      [](auto &context, auto &variables, auto &ec, auto n) {
        if (ec) {
          throw boost::system::system_error{ec};
        }

      },

      // make_while_true creates a loop, that always repeats, unless
      // context.do_break is called
      stackless_coroutine::make_while_true(
          [](auto &context, auto &variables) {
            variables.current.resize(20);
            variables.socket.async_read_some(
                boost::asio::buffer(&variables.current[0],
                                    variables.current.size()),
                context);
            return context.do_async();

          },
          [](auto &context, auto &variables, auto &ec, auto n) {
            if (ec) {
              if (ec != boost::asio::error::eof)
                std::cerr << ec.message();
              // context.do_break breaks out of the loop
              return context.do_break();
            } else {

              variables.current.resize(n);
              std::cout << variables.current;

              // context.do_continue continues the loop out of the loop
              // We could also return do_next() which will continue to the next
              // lamda
              // which in this case would result in re-entering the loop at the
              // top
              return context.do_continue();
            }

          }

          ));

  // pass the block, and the callback, along with any arguments for our
  // cororoutine_variables_t
  // constructor,
  // which in this case is io to make_coroutine
  auto co = stackless_coroutine::make_coroutine<coroutine_variables_t>(
      block, std::move(f), io);

  // call co with arguments corresponding to the parameters of the first lambda
  // after context and variables
  // which in this case is host, and url
  return co(host, url);
}
示例#23
0
void Detection::TestTinydrag()
{
    std::ofstream fout("text.txt", std::ofstream::ate|std::ofstream::app);
    fout << "\n**********************************************************************\n";
    fout << "3. Open Tinydrag Test Url" << std::endl;

    boost::asio::io_service io_service;
    boost::asio::ip::tcp::resolver resolver(io_service);
    boost::asio::ip::tcp::resolver::query query("tinydrag.synacast.com", "http");
    boost::asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
    boost::asio::ip::tcp::resolver::iterator end;

    // Try each endpoint until we successfully establish a connection.
    boost::asio::ip::tcp::socket socket(io_service);
    boost::system::error_code error = boost::asio::error::host_not_found;
    while (error && endpoint_iterator != end)
    {
      socket.close();
      socket.connect(*endpoint_iterator++, error);
    }
    if (error)
    {
        fout << "域名解析失败!" << std::endl;
    }

    // Form the request. We specify the "Connection: close" header so that the
    // server will close the socket after transmitting the response. This will
    // allow us to treat all data up until the EOF as the content.
    boost::asio::streambuf request;
    std::ostream request_stream(&request);
    request_stream << "GET " << "/0/B%2B%D5%EC%CC%BD%28%B8%DF%C7%E5%29_V1.mp40drag" << " HTTP/1.0\r\n";
    request_stream << "Host: " << "tinydrag.synacast.com" << "\r\n";
    request_stream << "Accept: */*\r\n";
    request_stream << "Connection: close\r\n\r\n";

    // Send the request.
    boost::asio::write(socket, request);

    // Read the response status line.
    boost::asio::streambuf response;
    boost::asio::read(socket, response, boost::asio::transfer_all(), error);

    std::istream response_stream(&response);
    std::string response_string;
    bool successful = false;
    while (std::getline(response_stream, response_string))
    {
        if (response_string.find("tinydrag") != std::string::npos)
        {
            successful = true;
            break;
        }
    }

    if (successful)
    {
        fout << "成功取得tinydrag" << std::endl;
    }
    else
    {
        fout << "取不到tinydrag" << std::endl;
    }

    fout.close();

    ++m_progress_pos_;
}
 bool HttpHelperImpl::PostDataToUrl(std::string host, std::string path, std::string data) {
     
     try
     {
         
         boost::asio::io_service io_service;
         
         // Get a list of endpoints corresponding to the server name.
         tcp::resolver resolver(io_service);
         
         // this needs to be the port string instead of "http" for Android
         // the http service isn't registered?
         tcp::resolver::query query(host, "80");
         
         tcp::resolver::iterator endpoint_iterator = resolver.resolve(query);
         
         // Try each endpoint until we successfully establish a connection.
         tcp::socket socket(io_service);
         boost::asio::connect(socket, endpoint_iterator);
         
         // Form the request. We specify the "Connection: close" header so that the
         // server will close the socket after transmitting the response. This will
         // allow us to treat all data up until the EOF as the content.
         boost::asio::streambuf request;
         std::ostream request_stream(&request);
         
         request_stream << "POST " << path << " HTTP/1.1\r\n";
         request_stream << "Host: " << host << "\r\n";
         request_stream << "Accept: */*\r\n";
         request_stream << "Connection: close\r\n";
         request_stream << "Content-Length: " << data.length() << "\r\n";
         request_stream << "\r\n"; // end of header
         request_stream << data;
         
         // Send the request.
         boost::asio::write(socket, request);
         
         // Don't read the response for the time being.
         
         /*
          // Read the response status line. The response streambuf will automatically
          // grow to accommodate the entire line. The growth may be limited by passing
          // a maximum size to the streambuf constructor.
          boost::asio::streambuf response;
          boost::asio::read_until(socket, response, "\r\n");
          
          // Check that response is OK.
          std::istream response_stream(&response);
          std::string http_version;
          response_stream >> http_version;
          unsigned int status_code;
          response_stream >> status_code;
          std::string status_message;
          std::getline(response_stream, status_message);
          if (!response_stream || http_version.substr(0, 5) != "HTTP/")
          {
          //std::cout << "Invalid response\n";
          }
          if (status_code != 200)
          {
          //std::cout << "Response returned with status code " << status_code << "\n";
          }
          
          // Read the response headers, which are terminated by a blank line.
          boost::asio::read_until(socket, response, "\r\n\r\n");
          
          // Process the response headers.
          std::string header;
          while (std::getline(response_stream, header) && header != "\r") {
          //std::cout << header << "\n";
          }
          //std::cout << "\n";
          
          // Write whatever content we already have to output.
          if (response.size() > 0){
          //std::cout << &response;
          }
          
          // Read until EOF, writing data to output as we go.
          boost::system::error_code error;
          while (boost::asio::read(socket, response,
          boost::asio::transfer_at_least(1), error)) {
          //std::cout << &response;
          }
          
          if (error != boost::asio::error::eof) {
          //throw boost::system::system_error(error);
          }
          */
         
     }
     catch (std::exception& e)
     {
         //std::cout << "Exception: " << e.what() << "\n";
         return false;
     }
     
     return true;
 }
示例#25
0
文件: http.hpp 项目: gitforks/restbed
            //Functionality
            static Response perform( const string& method, const Request& request )
            {
                asio::io_service io_service;
                asio::ip::tcp::resolver resolver( io_service );
                asio::ip::tcp::resolver::query query( request.host, ::to_string( request.port ) );
                asio::ip::tcp::resolver::iterator endpoint_iterator = resolver.resolve( query );
                asio::ip::tcp::resolver::iterator end;
                
                asio::ip::tcp::socket socket( io_service );
                asio::error_code error = asio::error::host_not_found;
                
                while ( error and endpoint_iterator not_eq end )
                {
                    socket.close( );
                    socket.connect( *endpoint_iterator++, error );
                }
                
                if ( error )
                {
                    throw asio::system_error( error );
                }
                
                asio::streambuf request_buffer;
                ostream request_stream( &request_buffer );
                
                request_stream << String::uppercase( method ) << " " << request.path << " HTTP/1.1\r\n";
                request_stream << "Host: " << request.host << "\r\n";
                request_stream << "Connection: close\r\n";
                
                for ( auto header : request.headers )
                {
                    request_stream << header.first << ": " << header.second << "\r\n";
                }
                
                request_stream << "\r\n";
                
                if ( not request.body.empty( ) )
                {
                    request_stream << request.body.data( );
                }
                
                asio::write( socket, request_buffer );
                
                asio::streambuf response_buffer;
                asio::read_until( socket, response_buffer, "\r\n", error );

                istream response_stream( &response_buffer );

                string status;
                getline( response_stream, status );
                auto status_line = String::split( status, ' ' );
                
                string http_version = status_line[ 0 ].substr( status_line[ 0 ].find_first_of( '/' ) + 1 );
                Response response;
                response.version = stod( http_version );

                response.status_code = stoi( status_line[ 1 ] );
                response.status_message = status_line[ 2 ].substr( 0, status_line[ 2 ].length( ) - 1 );
                
                asio::read_until( socket, response_buffer, "\r\n\r\n", error );

                string header = "";
                
                while ( getline( response_stream, header ) and header not_eq "\r" )
                {
                    auto name_value = String::split( header, ':' );
                    auto name = name_value[ 0 ];
                    auto value = name_value[ 1 ].substr( 1, name_value[ 1 ].find_last_not_of( "\r\n" ) );
                    response.headers.insert( make_pair( name, value ) );
                }
                
                while ( not error )
                {
                    auto body = Bytes( istreambuf_iterator< char >( &response_buffer ), istreambuf_iterator< char >( ) );
                    response_buffer.consume( body.size( ) );
                    response.body.insert( response.body.end( ), body.begin( ), body.end( ) );
                    
                    asio::read( socket, response_buffer, asio::transfer_all( ), error );
                }
                
                if ( error not_eq asio::error::eof )
                {
                    throw runtime_error( "failed to read response." );
                }
                
                return response;
            }