4 changed files with 4799 additions and 1389 deletions
@ -1,22 +0,0 @@
|
||||
The MIT License (MIT) |
||||
|
||||
Copyright (c) 2017 yhirose |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
||||
|
||||
@ -1,259 +0,0 @@
|
||||
cpp-httplib |
||||
=========== |
||||
|
||||
[](https://travis-ci.org/yhirose/cpp-httplib) |
||||
[](https://ci.appveyor.com/project/yhirose/cpp-httplib) |
||||
|
||||
A C++ header-only cross platform HTTP/HTTPS library. |
||||
|
||||
It's extremely easy to setup. Just include **httplib.h** file in your code! |
||||
|
||||
Inspired by [Sinatra](http://www.sinatrarb.com/) and [express](https://github.com/visionmedia/express). |
||||
|
||||
Server Example |
||||
-------------- |
||||
|
||||
```c++ |
||||
#include <httplib.h> |
||||
|
||||
int main(void) |
||||
{ |
||||
using namespace httplib; |
||||
|
||||
Server svr; |
||||
|
||||
svr.Get("/hi", [](const Request& req, Response& res) { |
||||
res.set_content("Hello World!", "text/plain"); |
||||
}); |
||||
|
||||
svr.Get(R"(/numbers/(\d+))", [&](const Request& req, Response& res) { |
||||
auto numbers = req.matches[1]; |
||||
res.set_content(numbers, "text/plain"); |
||||
}); |
||||
|
||||
svr.listen("localhost", 1234); |
||||
} |
||||
``` |
||||
|
||||
`Post`, `Put`, `Delete` and `Options` methods are also supported. |
||||
|
||||
### Bind a socket to multiple interfaces and any available port |
||||
|
||||
```cpp |
||||
int port = svr.bind_to_any_port("0.0.0.0"); |
||||
svr.listen_after_bind(); |
||||
``` |
||||
|
||||
### Method Chain |
||||
|
||||
```cpp |
||||
svr.Get("/get", [](const auto& req, auto& res) { |
||||
res.set_content("get", "text/plain"); |
||||
}) |
||||
.Post("/post", [](const auto& req, auto& res) { |
||||
res.set_content(req.body(), "text/plain"); |
||||
}) |
||||
.listen("localhost", 1234); |
||||
``` |
||||
|
||||
### Static File Server |
||||
|
||||
```cpp |
||||
svr.set_base_dir("./www"); |
||||
``` |
||||
|
||||
### Logging |
||||
|
||||
```cpp |
||||
svr.set_logger([](const auto& req, const auto& res) { |
||||
your_logger(req, res); |
||||
}); |
||||
``` |
||||
|
||||
### Error Handler |
||||
|
||||
```cpp |
||||
svr.set_error_handler([](const auto& req, auto& res) { |
||||
const char* fmt = "<p>Error Status: <span style='color:red;'>%d</span></p>"; |
||||
char buf[BUFSIZ]; |
||||
snprintf(buf, sizeof(buf), fmt, res.status); |
||||
res.set_content(buf, "text/html"); |
||||
}); |
||||
``` |
||||
|
||||
### 'multipart/form-data' POST data |
||||
|
||||
```cpp |
||||
svr.Post("/multipart", [&](const auto& req, auto& res) { |
||||
auto size = req.files.size(); |
||||
auto ret = req.has_file("name1")); |
||||
const auto& file = req.get_file_value("name1"); |
||||
// file.filename; |
||||
// file.content_type; |
||||
auto body = req.body.substr(file.offset, file.length)); |
||||
}) |
||||
``` |
||||
|
||||
Client Example |
||||
-------------- |
||||
|
||||
### GET |
||||
|
||||
```c++ |
||||
#include <httplib.h> |
||||
#include <iostream> |
||||
|
||||
int main(void) |
||||
{ |
||||
httplib::Client cli("localhost", 1234); |
||||
|
||||
auto res = cli.Get("/hi"); |
||||
if (res && res->status == 200) { |
||||
std::cout << res->body << std::endl; |
||||
} |
||||
} |
||||
``` |
||||
|
||||
### GET with Content Receiver |
||||
|
||||
```c++ |
||||
std::string body; |
||||
auto res = cli.Get("/large-data", [&](const char *data, size_t len) { |
||||
body.append(data, len); |
||||
}); |
||||
assert(res->body.empty()); |
||||
``` |
||||
|
||||
### POST |
||||
|
||||
```c++ |
||||
res = cli.Post("/post", "text", "text/plain"); |
||||
res = cli.Post("/person", "name=john1¬e=coder", "application/x-www-form-urlencoded"); |
||||
``` |
||||
|
||||
### POST with parameters |
||||
|
||||
```c++ |
||||
httplib::Params params; |
||||
params.emplace("name", "john"); |
||||
params.emplace("note", "coder"); |
||||
|
||||
auto res = cli.Post("/post", params); |
||||
``` |
||||
or |
||||
|
||||
```c++ |
||||
httplib::Params params{ |
||||
{ "name", "john" }, |
||||
{ "note", "coder" } |
||||
}; |
||||
|
||||
auto res = cli.Post("/post", params); |
||||
``` |
||||
|
||||
### PUT |
||||
|
||||
```c++ |
||||
res = cli.Put("/resource/foo", "text", "text/plain"); |
||||
``` |
||||
|
||||
### DELETE |
||||
|
||||
```c++ |
||||
res = cli.Delete("/resource/foo"); |
||||
``` |
||||
|
||||
### OPTIONS |
||||
|
||||
```c++ |
||||
res = cli.Options("*"); |
||||
res = cli.Options("/resource/foo"); |
||||
``` |
||||
|
||||
### Connection Timeout |
||||
|
||||
```c++ |
||||
httplib::Client cli("localhost", 8080, 5); // timeouts in 5 seconds |
||||
``` |
||||
### With Progress Callback |
||||
|
||||
```cpp |
||||
httplib::Client client(url, port); |
||||
|
||||
// prints: 0 / 000 bytes => 50% complete |
||||
std::shared_ptr<httplib::Response> res = |
||||
cli.Get("/", [](uint64_t len, uint64_t total) { |
||||
printf("%lld / %lld bytes => %d%% complete\n", |
||||
len, total, |
||||
(int)((len/total)*100)); |
||||
return true; // return 'false' if you want to cancel the request. |
||||
} |
||||
); |
||||
``` |
||||
|
||||
 |
||||
|
||||
This feature was contributed by [underscorediscovery](https://github.com/yhirose/cpp-httplib/pull/23). |
||||
|
||||
### Basic Authentication |
||||
|
||||
```cpp |
||||
httplib::Client cli("httplib.org"); |
||||
|
||||
auto res = cli.Get("/basic-auth/hello/world", { |
||||
httplib::make_basic_authentication_header("hello", "world") |
||||
}); |
||||
// res->status should be 200 |
||||
// res->body should be "{\n \"authenticated\": true, \n \"user\": \"hello\"\n}\n". |
||||
``` |
||||
|
||||
### Range |
||||
|
||||
```cpp |
||||
httplib::Client cli("httpbin.org"); |
||||
|
||||
auto res = cli.Get("/range/32", { |
||||
httplib::make_range_header(1, 10) // 'Range: bytes=1-10' |
||||
}); |
||||
// res->status should be 206. |
||||
// res->body should be "bcdefghijk". |
||||
``` |
||||
|
||||
OpenSSL Support |
||||
--------------- |
||||
|
||||
SSL support is available with `CPPHTTPLIB_OPENSSL_SUPPORT`. `libssl` and `libcrypto` should be linked. |
||||
|
||||
```c++ |
||||
#define CPPHTTPLIB_OPENSSL_SUPPORT |
||||
|
||||
SSLServer svr("./cert.pem", "./key.pem"); |
||||
|
||||
SSLClient cli("localhost", 8080); |
||||
cli.set_ca_cert_path("./ca-bundle.crt"); |
||||
cli.enable_server_certificate_verification(true); |
||||
``` |
||||
|
||||
Zlib Support |
||||
------------ |
||||
|
||||
'gzip' compression is available with `CPPHTTPLIB_ZLIB_SUPPORT`. |
||||
|
||||
The server applies gzip compression to the following MIME type contents: |
||||
|
||||
* all text types |
||||
* image/svg+xml |
||||
* application/javascript |
||||
* application/json |
||||
* application/xml |
||||
* application/xhtml+xml |
||||
|
||||
NOTE |
||||
---- |
||||
|
||||
g++ 4.8 cannot build this library since `<regex>` in g++4.8 is [broken](https://stackoverflow.com/questions/12530406/is-gcc-4-8-or-earlier-buggy-about-regular-expressions). |
||||
|
||||
License |
||||
------- |
||||
|
||||
MIT license (© 2019 Yuji Hirose) |
||||
Loading…
Reference in new issue