Skip to content

Commit a04da7c

Browse files
committed
Merge pull request #82 from glynos/uri_build_with_query
Tried to address awkward API issue when append query parameters.
2 parents b0682dc + ad5e013 commit a04da7c

12 files changed

+150
-113
lines changed

Diff for: .travis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ script:
3131
- mkdir _builds
3232
- cd _builds
3333
# Note: clang not support libc++
34-
- cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} -DCPP-NETLIB_DISABLE_LIBCXX=YES ..
34+
- cmake -DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE} -DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS} -DUri_DISABLE_LIBCXX=YES -DUri_BUILD_TESTS=ON -DUri_BUILD_DOCS=OFF ..
3535
- make -j 8
3636
- make test
3737

Diff for: CMakeLists.txt

+42-20
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,11 @@
77
cmake_minimum_required(VERSION 2.8)
88
project(Uri)
99

10+
option(Uri_BUILD_TESTS "Build the URI tests." ON)
11+
option(Uri_BUILD_DOCS "Build the URI documentation." ON)
12+
option(Uri_FULL_WARNINGS "Build the library with all warnings turned on." ON)
13+
option(Uri_WARNINGS_AS_ERRORS "Treat warnings as errors." ON)
14+
1015
find_package(Threads REQUIRED)
1116

1217
set(CMAKE_VERBOSE_MAKEFILE true)
@@ -20,51 +25,68 @@ if (${CMAKE_CXX_COMPILER_ID} MATCHES GNU)
2025
else()
2126
message(FATAL_ERROR "No C++ 11 support (Compiler does not define -std=c++11).")
2227
endif()
28+
29+
if (Uri_FULL_WARNINGS)
30+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
31+
endif()
32+
33+
if (Uri_WARNINGS_AS_ERRORS)
34+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
35+
endif()
36+
2337
message("C++ Flags: ${CMAKE_CXX_FLAGS} link flags: ${CMAKE_CXX_LINK_FLAGS}")
2438
elseif(${CMAKE_CXX_COMPILER_ID} MATCHES Clang)
25-
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -ftemplate-depth=1024")
26-
if (NOT CPP-NETLIB_DISABLE_LIBCXX)
39+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11")
40+
41+
if (NOT Uri_DISABLE_LIBCXX)
2742
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
2843
endif()
44+
45+
if (Uri_FULL_WARNINGS)
46+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall")
47+
endif()
48+
49+
if (Uri_WARNINGS_AS_ERRORS)
50+
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Werror")
51+
endif()
52+
2953
message("C++ Flags: ${CMAKE_CXX_FLAGS} link flags: ${CMAKE_CXX_LINK_FLAGS}")
3054
endif()
3155

3256

3357
if (MSVC)
34-
add_definitions(-D_SCL_SECURE_NO_WARNINGS -D_VARIADIC_MAX=10)
35-
endif(MSVC)
36-
if (WIN32)
37-
add_definitions(-D_WIN32_WINNT=0x0501)
38-
endif(WIN32)
39-
40-
foreach(flag_var
41-
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
42-
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
43-
if(${flag_var} MATCHES "/MD")
58+
message(FATAL_ERROR "The current implementation uses features that aren't fully implemented on MSVC.")
59+
60+
foreach(flag_var
61+
CMAKE_CXX_FLAGS CMAKE_CXX_FLAGS_DEBUG CMAKE_CXX_FLAGS_RELEASE
62+
CMAKE_CXX_FLAGS_MINSIZEREL CMAKE_CXX_FLAGS_RELWITHDEBINFO)
63+
if(${flag_var} MATCHES "/MD")
4464
string(REGEX REPLACE "/MD" "/MT" ${flag_var} "${${flag_var}}")
45-
endif(${flag_var} MATCHES "/MD")
46-
endforeach(flag_var)
65+
endif(${flag_var} MATCHES "/MD")
66+
endforeach(flag_var)
67+
endif(MSVC)
4768

4869
include_directories(${Uri_SOURCE_DIR}/src ${Uri_SOURCE_DIR}/include)
4970

5071
add_subdirectory(src)
5172

5273
# Testing
53-
if (CMAKE_PROJECT_NAME STREQUAL "Uri" OR CPP-NETLIB_BUILD_TESTS)
74+
if (Uri_BUILD_TESTS)
75+
message(STATUS "Configuring tests")
5476
enable_testing()
5577
add_subdirectory(deps/googletest)
5678
add_subdirectory(test)
5779
endif()
5880

5981
# Documentation
60-
find_package(Doxygen)
61-
if (DOXYGEN_FOUND)
62-
if (NOT DEFINED CPP-NETLIB_GENERATE_DOCS)
82+
if (Uri_BUILD_DOCS)
83+
message("Configuring documentation")
84+
find_package(Doxygen)
85+
if (DOXYGEN_FOUND)
6386
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
6487
add_custom_target(doc
6588
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
6689
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
6790
COMMENT "Generating API documentation with Doxygen" VERBATIM)
68-
set(CPP-NETLIB_GENERATE_DOCS ON)
6991
endif()
70-
endif(DOXYGEN_FOUND)
92+
endif()

Diff for: include/network/string_view.hpp

+1
Original file line numberDiff line numberDiff line change
@@ -152,6 +152,7 @@ class basic_string_view {
152152
size_type copy(charT* s, size_type n, size_type pos = 0) const {
153153
size_type rlen = std::min(n, size() - pos);
154154
std::copy_n(begin() + pos, rlen, s);
155+
return rlen;
155156
}
156157

157158
constexpr basic_string_view substr(size_type pos = 0,

Diff for: include/network/uri/uri_builder.hpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -187,8 +187,8 @@ class uri_builder {
187187
* \returns \c *this
188188
*/
189189
template <typename Source>
190-
uri_builder &query(const Source &query) {
191-
set_query(detail::translate(query));
190+
uri_builder &append_query(const Source &query) {
191+
append_query(detail::translate(query));
192192
return *this;
193193
}
194194

@@ -205,7 +205,7 @@ class uri_builder {
205205
* \returns \c *this
206206
*/
207207
template <typename Key, typename Value>
208-
uri_builder &query(const Key &key, const Value &value) {
208+
uri_builder &append_query_key_value_pair(const Key &key, const Value &value) {
209209
if (!query_) {
210210
query_ = string_type();
211211
}
@@ -252,7 +252,7 @@ class uri_builder {
252252
void set_port(string_type port);
253253
void set_authority(string_type authority);
254254
void set_path(string_type path);
255-
void set_query(string_type query);
255+
void append_query(string_type query);
256256
void set_fragment(string_type fragment);
257257

258258
optional<string_type> scheme_, user_info_, host_, port_, path_, query_,

Diff for: src/CMakeLists.txt

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ set(Uri_SRCS
1717
add_library(network-uri ${Uri_SRCS})
1818
target_link_libraries(network-uri)
1919
if(${CMAKE_CXX_COMPILER_ID} MATCHES Clang)
20-
if (NOT CPP-NETLIB_DISABLE_LIBCXX)
20+
if (NOT Uri_DISABLE_LIBCXX)
2121
target_link_libraries(network-uri "c++")
2222
endif()
2323
endif()

Diff for: src/detail/uri_advance_parts.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ uri_part copy_part(const std::string &uri, string_view::const_iterator &it) {
2626

2727
void advance_parts(string_view &uri_view, uri_parts &parts,
2828
const uri_parts &existing_parts) {
29-
auto first = std::begin(uri_view), last = std::end(uri_view);
29+
auto first = std::begin(uri_view);
3030

3131
auto it = first;
3232
if (auto scheme = existing_parts.scheme) {

Diff for: src/detail/uri_percent_encode.hpp

-5
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,6 @@ Iter decode_encoded_unreserved_chars(Iter first, Iter last) {
5959
while (it != last) {
6060
if (*it == '%') {
6161
const auto sfirst = it;
62-
const auto slast = [&]() {
63-
auto slast = it;
64-
std::advance(slast, 3);
65-
return slast;
66-
}();
6762
const auto opt_char = percent_encode(sfirst);
6863
if (opt_char && is_unreserved(*opt_char)) {
6964
*it2 = *opt_char;

Diff for: src/uri.cpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,9 @@ inline optional<std::string> make_arg(optional<string_view> view) {
5757
}
5858
return nullopt;
5959
}
60+
61+
template <class T>
62+
inline void ignore(T) {}
6063
} // namespace
6164

6265
void uri::initialize(optional<string_type> scheme,
@@ -374,6 +377,7 @@ uri uri::normalize(uri_comparison_level level) const {
374377
// need to parse the parts again as the underlying string has changed
375378
const_iterator it = std::begin(normalized_view), last = std::end(normalized_view);
376379
bool is_valid = detail::parse(it, last, parts);
380+
ignore(is_valid);
377381
assert(is_valid);
378382

379383
if (parts.hier_part.path) {
@@ -448,7 +452,7 @@ uri uri::make_relative(const uri &other) const {
448452
result.initialize(optional<string_type>(), optional<string_type>(),
449453
optional<string_type>(), optional<string_type>(),
450454
other_path, query, fragment);
451-
return std::move(result);
455+
return result;
452456
}
453457

454458
uri uri::resolve(const uri &base) const {

Diff for: src/uri_builder.cpp

+10-5
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ uri_builder::uri_builder(const network::uri &base_uri) {
3232
}
3333

3434
if (base_uri.has_query()) {
35-
set_query(base_uri.query().to_string());
35+
append_query(base_uri.query().to_string());
3636
}
3737

3838
if (base_uri.has_fragment()) {
@@ -64,8 +64,8 @@ uri_builder &uri_builder::clear_user_info() {
6464

6565
void uri_builder::set_host(string_type host) {
6666
host_ = string_type();
67-
auto end = network::uri::encode_host(std::begin(host), std::end(host),
68-
std::back_inserter(*host_));
67+
network::uri::encode_host(std::begin(host), std::end(host),
68+
std::back_inserter(*host_));
6969
detail::transform(*host_, std::begin(*host_),
7070
[](char ch) { return std::tolower(ch, std::locale()); });
7171
}
@@ -111,8 +111,13 @@ uri_builder &uri_builder::clear_path() {
111111
return *this;
112112
}
113113

114-
void uri_builder::set_query(string_type query) {
115-
query_ = string_type();
114+
void uri_builder::append_query(string_type query) {
115+
if (!query_) {
116+
query_ = string_type();
117+
}
118+
else {
119+
query_->append("&");
120+
}
116121
network::uri::encode_query(std::begin(query), std::end(query),
117122
std::back_inserter(*query_));
118123
}

Diff for: test/optional_test.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ TEST(optional_test, value_constructor_string) {
4242

4343
TEST(optional_test, rvalue_ref_constructor) {
4444
int value = 42;
45-
network::optional<int> opt{std::move(42)};
45+
network::optional<int> opt{std::move(value)};
4646
ASSERT_TRUE(opt);
4747
ASSERT_EQ(*opt, 42);
4848
}

0 commit comments

Comments
 (0)