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