diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml index 22fd72e..531fd4d 100644 --- a/.github/workflows/test.yaml +++ b/.github/workflows/test.yaml @@ -3,39 +3,41 @@ name: test on: [push, pull_request] jobs: - build: - runs-on: ${{ matrix.os }} + ubuntu: + runs-on: ubuntu-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: install brotli + run: sudo apt-get update && sudo apt-get install -y libbrotli-dev + - name: build and run tests + run: cd test && make -j4 + - name: run fuzz test target + run: cd test && make fuzz_test - strategy: - matrix: - os: [macOS-latest, ubuntu-latest, windows-latest] + macos: + runs-on: macos-latest + steps: + - name: checkout + uses: actions/checkout@v4 + - name: build and run tests + run: | + cd test && make -j2 + windows: + runs-on: windows-latest steps: - name: prepare git for checkout on windows - if: matrix.os == 'windows-latest' run: | git config --global core.autocrlf false git config --global core.eol lf - name: checkout uses: actions/checkout@v4 - - name: install brotli library on ubuntu - if: matrix.os == 'ubuntu-latest' - run: sudo apt update && sudo apt-get install -y libbrotli-dev - - name: install brotli library on macOS - if: matrix.os == 'macOS-latest' - run: brew install brotli - - name: make - if: matrix.os != 'windows-latest' - run: cd test && make -j2 - - name: check fuzz test target - if: matrix.os == 'ubuntu-latest' - run: cd test && make fuzz_test - name: setup msbuild on windows - if: matrix.os == 'windows-latest' uses: microsoft/setup-msbuild@v2 - name: make-windows - if: matrix.os == 'windows-latest' run: | cd test msbuild.exe test.sln /verbosity:minimal /t:Build "/p:Configuration=Release;Platform=x64" x64\Release\test.exe + diff --git a/CMakeLists.txt b/CMakeLists.txt index 96d755a..e27481b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -194,6 +194,7 @@ if(HTTPLIB_COMPILE) PROPERTIES VERSION ${${PROJECT_NAME}_VERSION} SOVERSION "${${PROJECT_NAME}_VERSION_MAJOR}.${${PROJECT_NAME}_VERSION_MINOR}" + OUTPUT_NAME cpp-httplib ) else() # This is for header-only. diff --git a/httplib.h b/httplib.h index d12b190..062f66b 100644 --- a/httplib.h +++ b/httplib.h @@ -8,7 +8,7 @@ #ifndef CPPHTTPLIB_HTTPLIB_H #define CPPHTTPLIB_HTTPLIB_H -#define CPPHTTPLIB_VERSION "0.15.3" +#define CPPHTTPLIB_VERSION "0.16.0" /* * Configuration @@ -4938,7 +4938,7 @@ get_range_offset_and_length(Range r, size_t content_length) { assert(0 <= r.first && r.first < static_cast(content_length)); assert(r.first <= r.second && r.second < static_cast(content_length)); - + (void)(content_length); return std::make_pair(r.first, static_cast(r.second - r.first) + 1); } @@ -9229,7 +9229,7 @@ inline Client::Client(const std::string &scheme_host_port, const std::string &client_cert_path, const std::string &client_key_path) { const static std::regex re( - R"((?:([a-z]+):\/\/)?(?:\[([\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); + R"((?:([a-z]+):\/\/)?(?:\[([a-fA-F\d:]+)\]|([^:/?#]+))(?::(\d+))?)"); std::smatch m; if (std::regex_match(scheme_host_port, m, re)) { @@ -9266,6 +9266,8 @@ inline Client::Client(const std::string &scheme_host_port, client_key_path); } } else { + // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress) + // if port param below changes. cli_ = detail::make_unique(scheme_host_port, 80, client_cert_path, client_key_path); } diff --git a/test/Makefile b/test/Makefile index c4dc4f1..5468488 100644 --- a/test/Makefile +++ b/test/Makefile @@ -1,8 +1,7 @@ CXX = clang++ CXXFLAGS = -g -std=c++11 -I. -Wall -Wextra -Wtype-limits -Wconversion -Wshadow # -fno-exceptions -DCPPHTTPLIB_NO_EXCEPTIONS -fsanitize=address -PREFIX = /usr/local -#PREFIX = $(shell brew --prefix) +PREFIX ?= $(shell brew --prefix) OPENSSL_DIR = $(PREFIX)/opt/openssl@3 OPENSSL_SUPPORT = -DCPPHTTPLIB_OPENSSL_SUPPORT -I$(OPENSSL_DIR)/include -L$(OPENSSL_DIR)/lib -lssl -lcrypto diff --git a/test/test.cc b/test/test.cc index 2c81a48..7fe39ad 100644 --- a/test/test.cc +++ b/test/test.cc @@ -7431,3 +7431,18 @@ TEST(PathParamsTest, SequenceOfParams) { EXPECT_EQ(request.path_params, expected_params); } + +TEST(UniversalClientImplTest, Ipv6LiteralAddress) { + // If ipv6 regex working, regex match codepath is taken. + // else port will default to 80 in Client impl + int clientImplMagicPort = 80; + int port = 4321; + // above ports must be different to avoid false negative + EXPECT_NE(clientImplMagicPort, port); + + std::string ipV6TestURL = "http://[ff06::c3]"; + + Client cli(ipV6TestURL + ":" + std::to_string(port), CLIENT_CERT_FILE, + CLIENT_PRIVATE_KEY_FILE); + EXPECT_EQ(cli.port(), port); +}