Malloy
Loading...
Searching...
No Matches
url.hpp
1#pragma once
2
3#include <boost/url/parse.hpp>
4#include <boost/url/url.hpp>
5
6#include "request.hpp"
7#include "types.hpp"
8
9#include <cstdint>
10#include <string>
11
12namespace malloy::http
13{
14
15 template<typename Body>
16 [[nodiscard]]
17 std::optional<request<Body>>
18 build_request(const method method_, const boost::urls::url& url)
19 {
20 // Decompose
21 std::string host;
22 std::uint16_t port = 0;
23 std::string target;
24 bool use_tls = true;
25 {
26 // Scheme
27 switch (url.scheme_id()) {
28 case boost::urls::scheme::http:
29 use_tls = false;
30 break;
31
32 case boost::urls::scheme::https:
33 use_tls = true;
34 break;
35
36 default: // ToDo: Handle more
37 return std::nullopt;
38 }
39
40 // Host
41 host = url.host();
42
43 // Port
44 port = url.port_number();
45 if (port == 0) {
46 switch (url.scheme_id()) {
47 case boost::urls::scheme::http:
48 port = 80;
49 break;
50
51 case boost::urls::scheme::https:
52 port = 443;
53 break;
54
55 default:
56 break;
57 }
58 }
59
60 // Target
61 target = url.encoded_target();
62 if (std::empty(target))
63 target = "/";
64 }
65
66 // ToDo: Does host need to stay alive?!
67
68 request<Body> req(method_, host, port, target);
69 req.use_tls(use_tls);
70
71 return req;
72 }
73
74 template<typename Body>
75 [[nodiscard]]
76 std::optional<request<Body>>
77 build_request(const method method_, const std::string_view& url)
78 {
79 // Parse URL
80 auto parsed_url = boost::urls::parse_uri(url);
81 if (!parsed_url)
82 return std::nullopt;
83
84 // Build request
85 return build_request<Body>(method_, *parsed_url);
86 }
87
88}
Definition: cookie.hpp:8
boost::beast::http::verb method
Definition: types.hpp:18