Files
boost_beast/example/ssl-http-client/ssl_http_client.cpp

60 lines
1.8 KiB
C++
Raw Normal View History

2016-10-02 16:33:42 -04:00
//
2017-02-06 20:07:03 -05:00
// Copyright (c) 2013-2017 Vinnie Falco (vinnie dot falco at gmail dot com)
2016-10-02 16:33:42 -04:00
//
// Distributed under the Boost Software License, Version 1.0. (See accompanying
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
//
2017-06-10 06:43:23 -07:00
#include <beast/core.hpp>
2016-10-02 16:33:42 -04:00
#include <beast/http.hpp>
#include <boost/asio.hpp>
#include <boost/asio/ssl.hpp>
#include <boost/lexical_cast.hpp>
2016-10-02 16:33:42 -04:00
#include <iostream>
#include <string>
int main()
{
using boost::asio::connect;
using socket = boost::asio::ip::tcp::socket;
using resolver = boost::asio::ip::tcp::resolver;
using io_service = boost::asio::io_service;
namespace ssl = boost::asio::ssl;
// Normal boost::asio setup
std::string const host = "github.com";
io_service ios;
resolver r{ios};
socket sock{ios};
connect(sock, r.resolve(resolver::query{host, "https"}));
// Perform SSL handshaking
ssl::context ctx{ssl::context::sslv23};
ssl::stream<socket&> stream{sock, ctx};
stream.set_verify_mode(ssl::verify_none);
stream.handshake(ssl::stream_base::client);
// Send HTTP request over SSL using Beast
beast::http::request<beast::http::string_body> req;
req.method(beast::http::verb::get);
req.target("/");
2016-10-02 16:33:42 -04:00
req.version = 11;
req.insert(beast::http::field::host, host + ":" +
boost::lexical_cast<std::string>(sock.remote_endpoint().port()));
req.insert(beast::http::field::user_agent, "Beast");
2017-06-05 21:11:33 -07:00
req.prepare();
2016-10-02 16:33:42 -04:00
beast::http::write(stream, req);
// Receive and print HTTP response using Beast
2017-06-10 06:43:23 -07:00
beast::flat_buffer b;
beast::http::response<beast::http::dynamic_body> resp;
beast::http::read(stream, b, resp);
2016-10-02 16:33:42 -04:00
std::cout << resp;
// Shut down SSL on the stream
boost::system::error_code ec;
stream.shutdown(ec);
if(ec && ec != boost::asio::error::eof)
std::cout << "error: " << ec.message();
}