Malloy
Toggle main menu visibility
Loading...
Searching...
No Matches
lib
malloy
core
http
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
13
namespace
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
}
malloy::http::request
Definition
request.hpp:19
malloy::http
Definition
cookie.hpp:8
malloy::http::method
boost::beast::http::verb method
Definition
types.hpp:18
Generated by
1.18.0