This repository was archived by the owner on Jun 14, 2024. It is now read-only.
forked from microsoft/cpprestsdk
-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathuri_builder.cpp
More file actions
138 lines (123 loc) · 3.82 KB
/
Copy pathuri_builder.cpp
File metadata and controls
138 lines (123 loc) · 3.82 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
/***
* Copyright (C) Microsoft. All rights reserved.
* Licensed under the MIT license. See LICENSE.txt file in the project root for full license information.
*
* =+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+
*
* Builder for constructing URIs.
*
* For the latest on this and related APIs, please see: https://github.com/Microsoft/cpprestsdk
*
* =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-
****/
#include "stdafx.h"
namespace web
{
uri_builder &uri_builder::append_path(const utility::string_t &path, bool is_encode)
{
if(path.empty() || path == _XPLATSTR("/"))
{
return *this;
}
auto encoded_path = is_encode ? uri::encode_uri(path, uri::components::path) : path;
auto thisPath = this->path();
if(thisPath.empty() || thisPath == _XPLATSTR("/"))
{
if(encoded_path.front() != _XPLATSTR('/'))
{
set_path(_XPLATSTR("/") + encoded_path);
}
else
{
set_path(encoded_path);
}
}
else if(thisPath.back() == _XPLATSTR('/') && encoded_path.front() == _XPLATSTR('/'))
{
thisPath.pop_back();
set_path(thisPath + encoded_path);
}
else if(thisPath.back() != _XPLATSTR('/') && encoded_path.front() != _XPLATSTR('/'))
{
set_path(thisPath + _XPLATSTR("/") + encoded_path);
}
else
{
// Only one slash.
set_path(thisPath + encoded_path);
}
return *this;
}
uri_builder &uri_builder::append_query(const utility::string_t &query, bool is_encode)
{
if(query.empty())
{
return *this;
}
auto encoded_query = is_encode ? uri::encode_uri(query, uri::components::query) : query;
auto thisQuery = this->query();
if (thisQuery.empty())
{
this->set_query(encoded_query);
}
else if(thisQuery.back() == _XPLATSTR('&') && encoded_query.front() == _XPLATSTR('&'))
{
thisQuery.pop_back();
this->set_query(thisQuery + encoded_query);
}
else if(thisQuery.back() != _XPLATSTR('&') && encoded_query.front() != _XPLATSTR('&'))
{
this->set_query(thisQuery + _XPLATSTR("&") + encoded_query);
}
else
{
// Only one ampersand.
this->set_query(thisQuery + encoded_query);
}
return *this;
}
uri_builder &uri_builder::set_port(const utility::string_t &port)
{
utility::istringstream_t portStream(port);
portStream.imbue(std::locale::classic());
int port_tmp;
portStream >> port_tmp;
if (portStream.fail() || portStream.bad())
{
throw std::invalid_argument("invalid port argument, must be non empty string containing integer value");
}
m_uri.m_port = port_tmp;
return *this;
}
uri_builder &uri_builder::append(const http::uri &relative_uri)
{
append_path(relative_uri.path());
append_query(relative_uri.query());
this->set_fragment(this->fragment() + relative_uri.fragment());
return *this;
}
utility::string_t uri_builder::to_string() const
{
return to_uri().to_string();
}
uri uri_builder::to_uri() const
{
return uri(m_uri);
}
bool uri_builder::is_valid()
{
return uri::validate(m_uri.join());
}
void uri_builder::append_query_encode_impl(const utility::string_t & name, const utf8string & value)
{
utility::string_t encodedQuery = uri::encode_query_impl(utility::conversions::to_utf8string(name));
encodedQuery.append(_XPLATSTR("="));
encodedQuery.append(uri::encode_query_impl(value));
// The query key value pair was already encoded by us or the user separately.
append_query(encodedQuery, false);
}
void uri_builder::append_query_no_encode_impl(const utility::string_t & name, const utility::string_t & value)
{
append_query(name + _XPLATSTR("=") + value, false);
}
} // namespace web