本文整理汇总了C++中HttpServer::start方法的典型用法代码示例。如果您正苦于以下问题:C++ HttpServer::start方法的具体用法?C++ HttpServer::start怎么用?C++ HttpServer::start使用的例子?那么, 这里精选的方法代码示例或许可以为您提供帮助。您也可以进一步了解该方法所在类HttpServer
的用法示例。
在下文中一共展示了HttpServer::start方法的6个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的C++代码示例。
示例1: main
int main(int, char**)
{
HttpServer server;
server.start();
server.setSink(&handler);
server.bind("localhost", {"server.crt", "server.key", "", "", "", ""}, "8080");
while (true)
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
示例2: GetTickCount
void CP2PServiceModule::OnCheckTimer( UINT uID, UINT uTime )
{
if ( !g_socketClientMgr.IsConnected())
{
CKLog::WriteLog( LOG_TYPE_DEBUG, "reconnect server.%d", GetTickCount());
g_server.stop();
g_socketClientMgr.Release();
if ( g_socketClientMgr.Connect())
g_server.start();
}
}
示例3: main
//.........这里部分代码省略.........
#ifdef HAVE_OPENSSL
// Uncomment the following lines to enable ETag
// {
// ifstream ifs(path.string(), ifstream::in | ios::binary);
// if(ifs) {
// auto hash = SimpleWeb::Crypto::to_hex_string(SimpleWeb::Crypto::md5(ifs));
// header.emplace("ETag", "\"" + hash + "\"");
// auto it = request->header.find("If-None-Match");
// if(it != request->header.end()) {
// if(!it->second.empty() && it->second.compare(1, hash.size(), hash) == 0) {
// response->write(SimpleWeb::StatusCode::redirection_not_modified, header);
// return;
// }
// }
// }
// else
// throw invalid_argument("could not read file");
// }
#endif
auto ifs = make_shared<ifstream>();
ifs->open(path.string(), ifstream::in | ios::binary | ios::ate);
if(*ifs) {
auto length = ifs->tellg();
ifs->seekg(0, ios::beg);
header.emplace("Content-Length", to_string(length));
response->write(header);
// Trick to define a recursive function within this scope (for example purposes)
class FileServer {
public:
static void read_and_send(const shared_ptr<HttpServer::Response> &response, const shared_ptr<ifstream> &ifs) {
// Read and send 128 KB at a time
static vector<char> buffer(131072); // Safe when server is running on one thread
streamsize read_length;
if((read_length = ifs->read(&buffer[0], static_cast<streamsize>(buffer.size())).gcount()) > 0) {
response->write(&buffer[0], read_length);
if(read_length == static_cast<streamsize>(buffer.size())) {
response->send([response, ifs](const SimpleWeb::error_code &ec) {
if(!ec)
read_and_send(response, ifs);
else
cerr << "Connection interrupted" << endl;
});
}
}
}
};
FileServer::read_and_send(response, ifs);
}
else
throw invalid_argument("could not read file");
}
catch(const exception &e) {
response->write(SimpleWeb::StatusCode::client_error_bad_request, "Could not open path " + request->path + ": " + e.what());
}
};
server.on_error = [](shared_ptr<HttpServer::Request> /*request*/, const SimpleWeb::error_code & /*ec*/) {
// Handle errors here
// Note that connection timeouts will also call this handle with ec set to SimpleWeb::errc::operation_canceled
};
thread server_thread([&server]() {
// Start server
server.start();
});
// Wait for server to start so that the client can connect
this_thread::sleep_for(chrono::seconds(1));
// Client examples
HttpClient client("localhost:8080");
string json_string = "{\"firstName\": \"John\",\"lastName\": \"Smith\",\"age\": 25}";
// Synchronous request examples
try {
auto r1 = client.request("GET", "/match/123");
cout << r1->content.rdbuf() << endl; // Alternatively, use the convenience function r1->content.string()
auto r2 = client.request("POST", "/string", json_string);
cout << r2->content.rdbuf() << endl;
}
catch(const SimpleWeb::system_error &e) {
cerr << "Client request error: " << e.what() << endl;
}
// Asynchronous request example
client.request("POST", "/json", json_string, [](shared_ptr<HttpClient::Response> response, const SimpleWeb::error_code &ec) {
if(!ec)
cout << response->content.rdbuf() << endl;
});
client.io_service->run();
server_thread.join();
}
示例4: test_http1_1_chunked_request
bool test_http1_1_chunked_request() {
Socket acceptSocket;
SocketError socketErr;
HttpServer server;
HttpError serverError;
std::mutex serverMutex;
std::condition_variable serverCond;
bool isShutdown = false;
bool gotExpectedPost = false;
HttpError postError = HttpError::Ok;
bool hadCorrectHeader = false;
std::tie(acceptSocket, socketErr) = ::getAcceptingSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, 0));
if (socketErr != SocketError::Ok) {
testf("Failed to bind socket for accept with: %d", socketErr);
return false;
}
uint16_t boundPort = acceptSocket.getLocalAddress().getPort();
StreamSourceSocket streamSource(std::move(acceptSocket));
server.addHandler("/formthingy", [&gotExpectedPost, &postError, &hadCorrectHeader](HttpRequest& request, HttpResponse& response) {
char readBuffer[1024];
HttpInputStream& httpInputStream = request.getInputStream();
HttpError readErr;
uint32_t readBytes;
uint32_t totalRead = 0;
do {
std::tie(readBytes, readErr) = httpInputStream.read(readBuffer + totalRead, 3); // Intentionally small reads
totalRead += readBytes;
} while (readErr == HttpError::Ok);
if (readErr != HttpError::Eof) {
postError = readErr;
return;
}
postError = httpInputStream.close();
const StringRef postData = "Some form post data";
if (totalRead != postData.length()) {
gotExpectedPost = false;
} else {
gotExpectedPost = std::memcmp(postData.data(), readBuffer, postData.length()) == 0;
}
StringRef transferEncodingHeader;
bool hasHeader;
std::tie(transferEncodingHeader, hasHeader) = request.getHeader("Transfer-Encoding");
if (!hasHeader) {
hadCorrectHeader = false;
} else {
hadCorrectHeader = transferEncodingHeader.equals("chunked");
}
response.setStatus(200, "OK");
});
Async::runAsync([&streamSource, &server, &serverError, &serverMutex, &serverCond, &isShutdown] {
HttpError err = server.start(&streamSource);
std::unique_lock<std::mutex> lock(serverMutex);
isShutdown = true;
serverError = err;
serverCond.notify_one();
});
StringRef request =
"POST /formthingy HTTP/1.1\r\n"
"Host: localhost\r\n"
"Transfer-Encoding: chunked\r\n"
"Connection: close\r\n"
"\r\n"
"5\r\n"
"Some \r\n"
"e\r\n"
"form post data\r\n"
"0\r\n"
"\r\n";
StringRef expectedResponse = "HTTP/1.1 200 OK\r\n\r\n";
char responseBuffer[1024];
Socket requestSocket;
std::tie(requestSocket, socketErr) = getConnectedSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, boundPort));
if (socketErr != SocketError::Ok) {
testf("Failed to connect to HTTP socket with: %d", socketErr);
return false;
}
socketErr = requestSocket.write(request.data(), request.length());
if (socketErr != SocketError::Ok) {
testf("Failed to write to HTTP socket with: %d", socketErr);
return false;
}
uint32_t totalBytesRead = 0;
std::tie(totalBytesRead, socketErr) = readFully(&requestSocket, responseBuffer, sizeof(responseBuffer));
if (socketErr != SocketError::Ok) {
testf("Failed to read from HTTP socket with: %d", socketErr);
return false;
//.........这里部分代码省略.........
示例5: test_http1_1_keepalive
bool test_http1_1_keepalive() {
Socket acceptSocket;
SocketError socketErr;
HttpServer server;
HttpError serverError;
std::mutex serverMutex;
std::condition_variable serverCond;
bool isShutdown = false;
std::tie(acceptSocket, socketErr) = getAcceptingSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, 0));
if (socketErr != SocketError::Ok) {
testf("Failed to bind socket for accept with: %d", socketErr);
return false;
}
uint16_t boundPort = acceptSocket.getLocalAddress().getPort();
StreamSourceSocket streamSource(std::move(acceptSocket));
server.addHandler("/index.html", [](HttpRequest& request, HttpResponse& response) {
response.setStatus(200, "OK");
response.addHeader("Content-Length", "11");
HttpOutputStream* outputStream;
std::tie(outputStream, std::ignore) = response.getOutputStream();
outputStream->write("Hello World", 11);
outputStream->close();
});
Async::runAsync([&streamSource, &server, &serverError, &serverMutex, &serverCond, &isShutdown] {
HttpError err = server.start(&streamSource);
std::unique_lock<std::mutex> lock(serverMutex);
isShutdown = true;
serverError = err;
serverCond.notify_one();
});
std::vector<StringRef> requests = {
"GET /index.html HTTP/1.1\r\n"
"Connection: keep-alive\r\n"
"Host: localhost\r\n"
"\r\n"
"GET /index.html HTTP/1.1\r\n"
"Host: localhost\r\n"
"\r\n"
"GET /index.html HTTP/1.1\r\n"
"Host: localhost\r\n"
"Connection: close\r\n"
"\r\n",
"GET /index.html HTTP/1.1\r\n"
"Host: localhost\r\n"
"Connection: close\r\n"
"\r\n"
"GET /index.html HTTP/1.1\r\n"
"Host: localhost\r\n"
"\r\n",
};
std::vector<StringRef> expectedResponses = {
"HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHello World"
"HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHello World"
"HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHello World",
"HTTP/1.1 200 OK\r\nContent-Length: 11\r\n\r\nHello World",
};
for (size_t i = 0; i < requests.size(); i++) {
StringRef request = requests[i];
StringRef expectedResponse = expectedResponses[i];
char responseBuffer[1024];
Socket requestSocket;
std::tie(requestSocket, socketErr) = getConnectedSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, boundPort));
if (socketErr != SocketError::Ok) {
testf("Failed to connect to HTTP socket with: %d", socketErr);
return false;
}
socketErr = requestSocket.write(request.data(), request.length());
if (socketErr != SocketError::Ok) {
testf("Failed to write to HTTP socket with: %d", socketErr);
return false;
}
uint32_t totalBytesRead = 0;
std::tie(totalBytesRead, socketErr) = readFully(&requestSocket, responseBuffer, sizeof(responseBuffer));
if (socketErr != SocketError::Ok) {
testf("Failed to read from HTTP socket with: %d", socketErr);
return false;
}
if (StringRef(responseBuffer, totalBytesRead) != expectedResponse) {
testf("Did not receive expected response. Got:\n%.*s", (size_t)totalBytesRead, responseBuffer);
return false;
}
}
server.shutdown();
// Wait for server shutdown and check its error
std::unique_lock<std::mutex> lock(serverMutex);
serverCond.wait(lock, [&isShutdown] {return isShutdown; });
//.........这里部分代码省略.........
示例6: test_http1_1_auto_chunked_response
// Tests that a chunked header is automatically added, and chunked mode is used,
// if neither Transfer-Encoding or Content-Length are specified.
bool test_http1_1_auto_chunked_response() {
Socket acceptSocket;
SocketError socketErr;
HttpServer server;
HttpError serverError = HttpError::Ok;
HttpError responseError = HttpError::Ok;
std::mutex serverMutex;
std::condition_variable serverCond;
bool isShutdown = false;
std::tie(acceptSocket, socketErr) = getAcceptingSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, 0));
if (socketErr != SocketError::Ok) {
testf("Failed to bind socket for accept with: %d", socketErr);
return false;
}
uint16_t boundPort = acceptSocket.getLocalAddress().getPort();
StreamSourceSocket streamSource(std::move(acceptSocket));
server.addHandler("/index.html", [&responseError](HttpRequest& request, HttpResponse& response) {
response.setStatus(200, "OK");
HttpOutputStream* outputStream;
std::tie(outputStream, responseError) = response.getOutputStream();
if (responseError != HttpError::Ok) {
return;
}
responseError = outputStream->write("0123456789", 10);
if (responseError != HttpError::Ok) {
return;
}
responseError = outputStream->write("abc", 3);
});
Async::runAsync([&streamSource, &server, &serverError, &serverMutex, &serverCond, &isShutdown] {
HttpError err = server.start(&streamSource);
std::unique_lock<std::mutex> lock(serverMutex);
isShutdown = true;
serverError = err;
serverCond.notify_one();
});
StringRef request =
"GET /index.html HTTP/1.1\r\n"
"Host: localhost\r\n"
"Connection: close\r\n"
"\r\n";
StringRef expectedResponse =
"HTTP/1.1 200 OK\r\n"
"Transfer-Encoding: chunked\r\n"
"\r\n"
"A\r\n"
"0123456789\r\n"
"3\r\n"
"abc\r\n"
"0\r\n"
"\r\n";
char responseBuffer[1024];
Socket requestSocket;
std::tie(requestSocket, socketErr) = getConnectedSocket(Addrinfo::getLoopback(INet::Protocol::Ipv6, boundPort));
if (socketErr != SocketError::Ok) {
testf("Failed to connect to HTTP socket with: %d", socketErr);
return false;
}
socketErr = requestSocket.write(request.data(), request.length());
if (socketErr != SocketError::Ok) {
testf("Failed to write to HTTP socket with: %d", socketErr);
return false;
}
uint32_t totalBytesRead = 0;
std::tie(totalBytesRead, socketErr) = readFully(&requestSocket, responseBuffer, sizeof(responseBuffer));
if (socketErr != SocketError::Ok) {
testf("Failed to read from HTTP socket with: %d", socketErr);
return false;
}
server.shutdown();
// Wait for server shutdown and check its error
std::unique_lock<std::mutex> lock(serverMutex);
serverCond.wait(lock, [&isShutdown] {return isShutdown; });
if (serverError != HttpError::Ok) {
testf("Failed to start HTTP server with: %d", serverError);
return false;
}
if (responseError != HttpError::Ok) {
testf("Error when generating response: %d", responseError);
return false;
}
if (StringRef(responseBuffer, totalBytesRead) != expectedResponse) {
testf("Did not receive expected response. Got:\n%.*s", (size_t)totalBytesRead, responseBuffer);
return false;
}
return true;
//.........这里部分代码省略.........