Esempio n. 1
0
const pair<unsigned int, string> UUID2Address::processResponse() {

    boost::asio::streambuf response;
    std::istream responseStream(&response);

    boost::asio::read_until(mSocket, response, "\r\n");

    std::string httpVersion;
    responseStream >> httpVersion;

    unsigned int statusCode;
    responseStream >> statusCode;

    std::string statusMessage;
    getline(responseStream, statusMessage);

    if (!responseStream || httpVersion.substr(0, 5) != "HTTP/") {
        throw ValueError(
            "UUID2Address::processResponse: "
                "Invalid response from the remote service");
    }

    switch (statusCode) {
        case 200: {
            boost::asio::read_until(mSocket, response, "\r\n\r\n");
            string header;
            while (getline(responseStream, header) && header != "\r") {}
            if (response.size() > 0) {
                string data(
                    (istreambuf_iterator<char>(&response)),
                    istreambuf_iterator<char>()
                );
                return make_pair(
                    statusCode,
                    data
                );

            } else {
                throw ValueError("UUID2Address::processResponse: "
                                     "Empty response body from the remote service");
            }
        }

        case 400:
        case 404:
        case 500: {
            return make_pair(
                statusCode,
                string()
            );
        }

        default: {
            throw IOError("UUID2Address::processResponse: "
                              "Unexpected response code");
        }
    }
}
Esempio n. 2
0
void SMTPClientSession::loginUsingLogin(const std::string& username, const std::string& password)
{
	std::string response;
	int status = sendCommand("AUTH LOGIN", response);
	if (!isPositiveIntermediate(status)) throw SMTPException("Cannot authenticate using LOGIN", response, status);
	
	std::ostringstream usernameBase64;
	Base64Encoder usernameEncoder(usernameBase64);
	usernameEncoder.rdbuf()->setLineLength(0);
	usernameEncoder << username;
	usernameEncoder.close();
	
	std::ostringstream passwordBase64;
	Base64Encoder passwordEncoder(passwordBase64);
	passwordEncoder.rdbuf()->setLineLength(0);
	passwordEncoder << password;
	passwordEncoder.close();
	
	//Server request for username/password not defined could be either
	//S: login:
	//C: user_login
	//S: password:
	//C: user_password
	//or
	//S: password:
	//C: user_password
	//S: login:
	//C: user_login
	
	std::string decodedResponse;
	std::istringstream responseStream(response.substr(4));
	Base64Decoder responseDecoder(responseStream);
	StreamCopier::copyToString(responseDecoder, decodedResponse);
	
	if (Poco::icompare(decodedResponse, 0, 8, "username") == 0) // username first (md5("Username:"******"Login using LOGIN username failed", response, status);
		
		status = sendCommand(passwordBase64.str(), response);
		if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN password failed", response, status);  
	}
	else if  (Poco::icompare(decodedResponse, 0, 8, "password") == 0) // password first (md5("Password:"******"Login using LOGIN password failed", response, status);  
		
		status = sendCommand(usernameBase64.str(), response);
		if (!isPositiveCompletion(status)) throw SMTPException("Login using LOGIN username failed", response, status);
	}
}
Esempio n. 3
0
    void GPUdb::submitRequestRaw(const std::string& endpoint, const std::vector<uint8_t>& request, GpudbResponse& response, const bool enableCompression) const
    {
        try
        {
            boost::asio::io_service ioService;
            boost::asio::ip::tcp::resolver resolver(ioService);
            boost::asio::ip::tcp::resolver::query query(host, service);
            boost::asio::ip::tcp::resolver::iterator iterator = resolver.resolve(query);
            boost::asio::ip::tcp::socket socket(ioService);
            boost::asio::connect(socket, iterator);
            boost::asio::streambuf requestStreamBuffer;
            std::ostream requestStream(&requestStreamBuffer);
            requestStream << "POST " << path << endpoint << " HTTP/1.0\r\n";

            if (!authorization.empty())
            {
                requestStream << "Authorization: Basic " << authorization << "\r\n";
            }

            if (enableCompression && useSnappy)
            {
                std::string compressedRequest;
                snappy::Compress((char*)&request[0], request.size(), &compressedRequest);
                requestStream << "Content-Type: application/x-snappy\r\n";
                requestStream << "Content-Length: " << compressedRequest.size() << "\r\n";
                requestStream << "\r\n";
                boost::asio::write(socket, requestStreamBuffer);
                boost::asio::write(socket, boost::asio::buffer(compressedRequest));
            }
            else
            {
                requestStream << "Content-Type: application/octet-stream\r\n";
                requestStream << "Content-Length: " << request.size() << "\r\n";
                requestStream << "\r\n";
                boost::asio::write(socket, requestStreamBuffer);
                boost::asio::write(socket, boost::asio::buffer(request));
            }

            boost::asio::streambuf responseStreamBuffer;
            boost::asio::read_until(socket, responseStreamBuffer, "\r\n\r\n");
            std::istream responseStream(&responseStreamBuffer);
            std::string header;
            std::getline(responseStream, header);

            if (!responseStream || header.substr(0, 5) != "HTTP/")
            {
                throw GPUdbException("Invalid response from server.");
            }

            do
            {
                std::getline(responseStream, header);
            }
            while (header != "\r");

            std::vector<uint8_t> responseBytes;
            boost::system::error_code error;

            do
            {
                boost::asio::streambuf::const_buffers_type data = responseStreamBuffer.data();
                size_t totalRead = 0;

                for (boost::asio::streambuf::const_buffers_type::const_iterator it = data.begin(); it != data.end(); ++it)
                {
                    const uint8_t* buffer = boost::asio::buffer_cast<const uint8_t*>(*it);
                    size_t read = boost::asio::buffer_size(*it);
                    responseBytes.insert(responseBytes.end(), buffer, buffer + read);
                    totalRead += read;
                }

                responseStreamBuffer.consume(totalRead);
            }
            while (boost::asio::read(socket, responseStreamBuffer, boost::asio::transfer_at_least(1), error));

            if (error != boost::asio::error::eof)
            {
                throw boost::system::system_error(error);
            }

            avro::decode(response, responseBytes);

            if (response.status == "ERROR")
            {
                throw GPUdbException(response.message);
            }
        }
        catch (const boost::system::system_error& ex)
        {
            throw GPUdbException(std::string(ex.what()));
        }
    }
Esempio n. 4
0
int main( int argc, char * argv[] )
{
    if( argc != 6 ){
        std::cerr << "Usage: " << argv[0] << " host file proxy_host proxt_port authorization" << std::endl;
        return 1;
    }

    std::string const host = argv[1];
    std::string const file = argv[2];
    std::string const proxyHost = argv[3];
    std::string const proxyPort = argv[4];
    std::string const authorization = argv[5];

    asio::io_service io_service;

    asio::ip::tcp::resolver resolver( io_service );
    asio::ip::tcp::resolver::query const query( proxyHost, proxyPort );
    asio::ip::tcp::resolver::iterator endpointIterator = resolver.resolve( query );

    asio::ip::tcp::socket socket( io_service );
    asio::connect( socket, endpointIterator );

    asio::streambuf requestBuffer;
    std::ostream requestStream( & requestBuffer );

    requestStream << "GET " << host << "/" << file << " HTTP/1.0\r\n";
    requestStream << "Host: " << host << "\r\n";
    requestStream << "Accept: */*\r\n";
    
    if( authorization != "" ){
        requestStream << "Proxy-Authorization: Basic " << authorization << "\n\r";
    }

    requestStream << "Connection: close\r\n\r\n";
    asio::write( socket, requestBuffer );

    asio::streambuf response_buffer;
    std::istream responseStream( & response_buffer );

    asio::read_until( socket, response_buffer, "\r\n");

    std::string httpVersion;
    responseStream >> httpVersion;

    unsigned status_code;
    responseStream >> status_code;

    std::string status_message;
    std::getline( responseStream, status_message );

    if( ! responseStream || httpVersion.substr( 0, 5 ) != "HTTP/" )
    {
        std::cerr << "Invalid response\n";
        return 2;
    }

    if( status_code != 200 )
    {
        std::cerr << "Response returned with status code " << status_code << "\n";
        return 3;
    }

    asio::read_until( socket, response_buffer, "\r\n\r\n" );

    std::string header;
    while( std::getline( responseStream, header ) && header != "\r" ){
        std::cout << "> " << header << "\n";
    }

    std::cout << std::endl;

    boost::system::error_code error;
    while( asio::read( socket, response_buffer, asio::transfer_at_least( 1 ), error ) ){
        std::cout << & response_buffer;
    }

    if( error != asio::error::eof ){
        std::cerr << boost::system::system_error( error ).what() << "\n";
        return 4;
    }

    return 0;
}