00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #pragma once
00012 #include <iostream>
00013 #include <istream>
00014 #include <ostream>
00015 #include <string>
00016 #include <sstream>
00017 #include <boost/asio.hpp>
00018 #include <boost/bind.hpp>
00019
00020 namespace Moses
00021 {
00022 using boost::asio::ip::tcp;
00023
00024 std::string uri_encode(std::string const& in);
00025
00026 class http_client
00027 {
00028 std::ostringstream m_content;
00029 std::vector<std::string> m_header;
00030 std::string m_http_version;
00031 unsigned int m_status_code;
00032 std::string m_status_message;
00033 std::ostringstream m_error;
00034
00035 public:
00036 http_client(boost::asio::io_service& io_service, std::string url, std::ostream* log);
00037 http_client(boost::asio::io_service& io_service,
00038 std::string const& server,
00039 std::string const& port,
00040 std::string const& path);
00041 private:
00042
00043 void init(std::string const& server,
00044 std::string const& port,
00045 std::string const& path);
00046
00047 void handle_resolve(const boost::system::error_code& err,
00048 tcp::resolver::iterator endpoint_iterator);
00049 void handle_connect(const boost::system::error_code& err,
00050 tcp::resolver::iterator endpoint_iterator);
00051 void handle_write_request(const boost::system::error_code& err);
00052 void handle_read_status_line(const boost::system::error_code& err);
00053 void handle_read_headers(const boost::system::error_code& err);
00054 void handle_read_content(const boost::system::error_code& err);
00055 tcp::resolver resolver_;
00056 tcp::socket socket_;
00057 boost::asio::streambuf request_;
00058 boost::asio::streambuf response_;
00059 public:
00060 std::string content() const;
00061 std::string error_msg() const { return m_error.str(); }
00062 };
00063
00064 }