怎么做会员积分网站,做的网站客户拿去维违法,徐州网站建设找哪家好,怎么做网站宣传boost beast http client
boost http server
boost beast 是一个非常好用的库#xff0c;带上boost的协程#xff0c;好很多东西是比较好用的#xff0c;以下程序使用四个线程开启协程处理进入http协议处理。协议支持http get 和 http post
#include boost/beast/cor…boost beast http client
boost http server
boost beast 是一个非常好用的库带上boost的协程好很多东西是比较好用的以下程序使用四个线程开启协程处理进入http协议处理。协议支持http get 和 http post
#include boost/beast/core.hpp
#include boost/beast/http.hpp
#include boost/beast/version.hpp
#include boost/asio/ip/tcp.hpp
#include boost/asio/spawn.hpp
#include boost/config.hpp
#include algorithm
#include cstdlib
#include iostream
#include memory
#include string
#include thread
#include vectornamespace beast boost::beast; // from boost/beast.hpp
namespace http beast::http; // from boost/beast/http.hpp
namespace net boost::asio; // from boost/asio.hpp
using tcp boost::asio::ip::tcp; // from boost/asio/ip/tcp.hpp
#undef BOOST_BEAST_VERSION_STRING
#define BOOST_BEAST_VERSION_STRING qbversion1.1
// Return a reasonable mime type based on the extension of a file.
beast::string_view
mime_type(beast::string_view path)
{using beast::iequals;auto const ext [path]{auto const pos path.rfind(.);if(pos beast::string_view::npos)return beast::string_view{};return path.substr(pos);}();if(iequals(ext, .htm)) return text/html;if(iequals(ext, .html)) return text/html;if(iequals(ext, .php)) return text/html;if(iequals(ext, .css)) return text/css;if(iequals(ext, .txt)) return text/plain;if(iequals(ext, .js)) return application/javascript;if(iequals(ext, .json)) return application/json;if(iequals(ext, .xml)) return application/xml;if(iequals(ext, .swf)) return application/x-shockwave-flash;if(iequals(ext, .flv)) return video/x-flv;if(iequals(ext, .png)) return image/png;if(iequals(ext, .jpe)) return image/jpeg;if(iequals(ext, .jpeg)) return image/jpeg;if(iequals(ext, .jpg)) return image/jpeg;if(iequals(ext, .gif)) return image/gif;if(iequals(ext, .bmp)) return image/bmp;if(iequals(ext, .ico)) return image/vnd.microsoft.icon;if(iequals(ext, .tiff)) return image/tiff;if(iequals(ext, .tif)) return image/tiff;if(iequals(ext, .svg)) return image/svgxml;if(iequals(ext, .svgz)) return image/svgxml;return application/text;
}// Append an HTTP rel-path to a local filesystem path.
// The returned path is normalized for the platform.
std::string
path_cat(beast::string_view base,beast::string_view path)
{if(base.empty())return std::string(path);std::string result(base);
#ifdef BOOST_MSVCchar constexpr path_separator \\;if(result.back() path_separator)result.resize(result.size() - 1);result.append(path.data(), path.size());for(auto c : result)if(c /)c path_separator;
#elsechar constexpr path_separator /;if(result.back() path_separator)result.resize(result.size() - 1);result.append(path.data(), path.size());
#endifreturn result;
}// This function produces an HTTP response for the given
// request. The type of the response object depends on the
// contents of the request, so the interface requires the
// caller to pass a generic lambda for receiving the response.
templateclass Body, class Allocator,class Send
void
handle_request(beast::string_view doc_root,http::requestBody, http::basic_fieldsAllocator req,Send send)
{// Returns a bad request responseauto const bad_request [req](beast::string_view why){http::responsehttp::string_body res{http::status::bad_request, req.version()};res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, text/html);res.keep_alive(req.keep_alive());res.body() std::string(why);res.prepare_payload();return res;};// Returns a not found responseauto const not_found [req](beast::string_view target){http::responsehttp::string_body res{http::status::not_found, req.version()};res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, text/html);res.keep_alive(req.keep_alive());res.body() The resource std::string(target) was not found.;res.prepare_payload();return res;};// Returns a server error responseauto const server_error [req](beast::string_view what){http::responsehttp::string_body res{http::status::internal_server_error, req.version()};res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, text/html);res.keep_alive(req.keep_alive());res.body() An error occurred: std::string(what) ;res.prepare_payload();return res;};// Make sure we can handle the methodif (req.method() ! http::verb::get req.method() ! http::verb::head){if (req.method() http::verb::post){std::cout req.target() std::endl;/* string body req.body();std::cout the body is body std::endl;*/std::string lines req.body();std::cout lines std::endl;http::responsehttp::empty_body res{ http::status::ok, req.version() };res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, mime_type(./));res.content_length(0);res.keep_alive(req.keep_alive());return send(std::move(res));//return send(bad_request(Unknown HTTP-method));}else{std::cerr unknown http method\n;return send(bad_request(Unknown HTTP-method));}}// Request path must be absolute and not contain ...if( req.target().empty() ||req.target()[0] ! / ||req.target().find(..) ! beast::string_view::npos)return send(bad_request(Illegal request-target));// Build the path to the requested filestd::string path path_cat(doc_root, req.target());if(req.target().back() /)path.append(index.html);// Attempt to open the filebeast::error_code ec;http::file_body::value_type body;body.open(path.c_str(), beast::file_mode::scan, ec);// Handle the case where the file doesnt existif(ec beast::errc::no_such_file_or_directory)return send(not_found(req.target()));// Handle an unknown errorif(ec)return send(server_error(ec.message()));// Cache the size since we need it after the moveauto const size body.size();// Respond to HEAD requestif(req.method() http::verb::head){http::responsehttp::empty_body res{http::status::ok, req.version()};res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, mime_type(path));res.content_length(size);res.keep_alive(req.keep_alive());return send(std::move(res));}// Respond to GET requesthttp::responsehttp::file_body res{std::piecewise_construct,std::make_tuple(std::move(body)),std::make_tuple(http::status::ok, req.version())};res.set(http::field::server, BOOST_BEAST_VERSION_STRING);res.set(http::field::content_type, mime_type(path));res.content_length(size);res.keep_alive(req.keep_alive());return send(std::move(res));
}//------------------------------------------------------------------------------// Report a failure
void
fail(beast::error_code ec, char const* what)
{std::cerr what : ec.message() \n;
}// This is the C11 equivalent of a generic lambda.
// The function object is used to send an HTTP message.
struct send_lambda
{beast::tcp_stream stream_;bool close_;beast::error_code ec_;net::yield_context yield_;send_lambda(beast::tcp_stream stream,bool close,beast::error_code ec,net::yield_context yield): stream_(stream), close_(close), ec_(ec), yield_(yield){}templatebool isRequest, class Body, class Fieldsvoidoperator()(http::messageisRequest, Body, Fields msg) const{// Determine if we should close the connection afterclose_ msg.need_eof();// We need the serializer here because the serializer requires// a non-const file_body, and the message oriented version of// http::write only works with const messages.http::serializerisRequest, Body, Fields sr{msg};http::async_write(stream_, sr, yield_[ec_]);}
};// Handles an HTTP server connection
void
do_session(beast::tcp_stream stream,std::shared_ptrstd::string const const doc_root,net::yield_context yield)
{bool close false;beast::error_code ec;// This buffer is required to persist across readsbeast::flat_buffer buffer;// This lambda is used to send messagessend_lambda lambda{stream, close, ec, yield};for(;;){// Set the timeout.stream.expires_after(std::chrono::seconds(30));// Read a requesthttp::requesthttp::string_body req;http::async_read(stream, buffer, req, yield[ec]);if(ec http::error::end_of_stream)break;if(ec)return fail(ec, read);// Send the responsehandle_request(*doc_root, std::move(req), lambda);if(ec)return fail(ec, write);if(close){// This means we should close the connection, usually because// the response indicated the Connection: close semantic.break;}}// Send a TCP shutdownstream.socket().shutdown(tcp::socket::shutdown_send, ec);// At this point the connection is closed gracefully
}//------------------------------------------------------------------------------// Accepts incoming connections and launches the sessions
void
do_listen(net::io_context ioc,tcp::endpoint endpoint,std::shared_ptrstd::string const const doc_root,net::yield_context yield)
{beast::error_code ec;// Open the acceptortcp::acceptor acceptor(ioc);acceptor.open(endpoint.protocol(), ec);if(ec)return fail(ec, open);// Allow address reuseacceptor.set_option(net::socket_base::reuse_address(true), ec);if(ec)return fail(ec, set_option);// Bind to the server addressacceptor.bind(endpoint, ec);if(ec)return fail(ec, bind);// Start listening for connectionsacceptor.listen(net::socket_base::max_listen_connections, ec);if(ec)return fail(ec, listen);for(;;){tcp::socket socket(ioc);acceptor.async_accept(socket, yield[ec]);if(ec)fail(ec, accept);elsenet::spawn(acceptor.get_executor(),std::bind(do_session,beast::tcp_stream(std::move(socket)),doc_root,std::placeholders::_1));}
}int main(int argc, char* argv[])
{auto const address net::ip::make_address(0.0.0.0);auto const port static_castunsigned short(std::atoi(8080));auto const doc_root std::make_sharedstd::string(./);auto const threads std::maxint(1, std::atoi(4));// The io_context is required for all I/Onet::io_context ioc{threads};// Spawn a listening portnet::spawn(ioc,std::bind(do_listen,std::ref(ioc),tcp::endpoint{address, port},doc_root,std::placeholders::_1));// Run the I/O service on the requested number of threadsstd::vectorstd::thread v;v.reserve(threads - 1);for(auto i threads - 1; i 0; --i)v.emplace_back([ioc]{ioc.run();});ioc.run();return EXIT_SUCCESS;
}python post 测试
post 客户端 import json
import requests
import time
headers {Content-Type: application/json}
data {projectname:four screen,picnum:8,memo:test
}
try:r requests.post(http://127.0.0.1:8080/test, jsondata, headersheaders)print(r.text)
except requests.exceptions.ConnectionError:print(connectionError)
time.sleep(1)get
用浏览器就行,写一个http index.html
测试页面 this is a test
浏览器打开8080 端口
下载文件
直接可以下载文件比如放入一个rar压缩文件也就是完成了一个http file server也是可以接收post 数据后面可以自行扩展
websocket
可以看我另外一个文章boost bease websocket协议