add promises example

This commit is contained in:
2019-07-02 04:11:48 +07:00
parent 84ebbe9928
commit 317cfe3bb9
2 changed files with 84 additions and 2 deletions

View File

@@ -150,7 +150,7 @@ if ( request.is_done() ) {
// Error message: Couldn't resolve host name // Error message: Couldn't resolve host name
``` ```
### Request Callback ### Request Callbacks
```cpp ```cpp
auto request = net::request_builder("http://www.httpbin.org/get") auto request = net::request_builder("http://www.httpbin.org/get")
@@ -223,6 +223,52 @@ net::request_builder()
.send().wait(); .send().wait();
``` ```
## Promised Requests
Also, you can easily integrate promises like a [promise.hpp](https://github.com/BlackMATov/promise.hpp).
```cpp
#include <curly.hpp/curly.hpp>
namespace net = curly_hpp;
#include <promise.hpp/promise.hpp>
namespace netex = promise_hpp;
netex::promise<net::content_t> download(std::string url) {
return netex::make_promise<net::content_t>([
url = std::move(url)
](auto resolve, auto reject){
net::request_builder(std::move(url))
.callback([resolve,reject](net::request request) mutable {
if ( !request.is_done() ) {
reject(net::exception("network error"));
return;
}
net::response response = request.get();
if ( response.is_http_error() ) {
reject(net::exception("server error"));
return;
}
resolve(std::move(response.content));
}).send();
});
}
auto promise = download("https://httpbin.org/image/png")
.then([](const net::content_t& content){
std::cout << content.size() << " bytes downloaded" << std::endl;
}).except([](std::exception_ptr e){
try {
std::rethrow_exception(e);
} catch (const std::exception& ee) {
std::cerr << "Failed to download: " << ee.what() << std::endl;
}
});
promise.wait();
// 8090 bytes downloaded
```
## API ## API
> coming soon! > coming soon!

View File

@@ -57,6 +57,26 @@ namespace
throw std::exception(); throw std::exception();
} }
}; };
netex::promise<net::content_t> download(std::string url) {
return netex::make_promise<net::content_t>([
url = std::move(url)
](auto resolve, auto reject){
net::request_builder(std::move(url))
.callback([resolve,reject](net::request request) mutable {
if ( !request.is_done() ) {
reject(net::exception("network error"));
return;
}
net::response response = request.get();
if ( response.is_http_error() ) {
reject(net::exception("server error"));
return;
}
resolve(std::move(response.content));
}).send();
});
}
} }
TEST_CASE("curly") { TEST_CASE("curly") {
@@ -706,7 +726,7 @@ TEST_CASE("curly_examples") {
// Error message: Couldn't resolve host name // Error message: Couldn't resolve host name
} }
SECTION("Request Callback") { SECTION("Request Callbacks") {
auto request = net::request_builder("http://www.httpbin.org/get") auto request = net::request_builder("http://www.httpbin.org/get")
.callback([](net::request request){ .callback([](net::request request){
if ( request.is_done() ) { if ( request.is_done() ) {
@@ -771,4 +791,20 @@ TEST_CASE("curly_examples") {
.send().get(); .send().get();
} }
} }
SECTION("Promised Requests") {
auto promise = download("https://httpbin.org/image/png")
.then([](const net::content_t& content){
std::cout << content.size() << " bytes downloaded" << std::endl;
}).except([](std::exception_ptr e){
try {
std::rethrow_exception(e);
} catch (const std::exception& ee) {
std::cerr << "Failed to download: " << ee.what() << std::endl;
}
});
promise.wait();
// 8090 bytes downloaded
}
} }