From ab84af954f368178a8465e1a8f12cd8e0a64b5f8 Mon Sep 17 00:00:00 2001 From: Vinnie Falco Date: Wed, 27 Nov 2019 08:07:15 -0800 Subject: [PATCH] Port beast uri --- .appveyor.yml | 153 +++++++ .azure-pipelines.yml | 311 ++++++++++++++ .gitignore | 8 + .travis.yml | 260 ++++++++++++ CMakeLists.txt | 152 +++++++ Jamfile | 12 + LICENSE_1_0.txt | 23 + README.md | 24 +- build/Jamfile | 31 ++ doc/.gitignore | 4 + doc/Jamfile | 343 +++++++++++++++ doc/images/doc-logo.png | Bin 0 -> 114324 bytes doc/images/repo-logo.png | Bin 0 -> 114324 bytes doc/qbk/index.xml | 15 + doc/qbk/main.qbk | 78 ++++ doc/qbk/quickref.xml | 50 +++ doc/source.dox | 254 +++++++++++ doc/xsl/class_detail.xsl | 6 + doc/xsl/config.xsl | 6 + doc/xsl/includes.xsl | 15 + example/CMakeLists.txt | 8 + include/boost/uri.hpp | 15 + include/boost/uri/buffer.hpp | 373 ++++++++++++++++ include/boost/uri/config.hpp | 57 +++ include/boost/uri/detail/config.hpp | 242 +++++++++++ include/boost/uri/detail/rfc3986.hpp | 23 + include/boost/uri/detail/types.hpp | 25 ++ include/boost/uri/error.hpp | 45 ++ include/boost/uri/impl/error.hpp | 63 +++ include/boost/uri/impl/error.ipp | 93 ++++ include/boost/uri/impl/parse.ipp | 607 +++++++++++++++++++++++++++ include/boost/uri/impl/scheme.ipp | 167 ++++++++ include/boost/uri/impl/uri.ipp | 167 ++++++++ include/boost/uri/input.hpp | 176 ++++++++ include/boost/uri/make_shared.hpp | 178 ++++++++ include/boost/uri/parse.hpp | 106 +++++ include/boost/uri/parts.hpp | 88 ++++ include/boost/uri/scheme.hpp | 63 +++ include/boost/uri/src.hpp | 26 ++ include/boost/uri/uri.hpp | 115 +++++ include/boost/uri/view.hpp | 132 ++++++ src/src.cpp | 12 + test/CMakeLists.txt | 27 ++ test/Jamfile | 52 +++ test/error.cpp | 59 +++ test/main.cpp | 10 + tools/codecov.sh | 65 +++ 47 files changed, 4738 insertions(+), 1 deletion(-) create mode 100644 .appveyor.yml create mode 100644 .azure-pipelines.yml create mode 100644 .gitignore create mode 100644 .travis.yml create mode 100644 CMakeLists.txt create mode 100644 Jamfile create mode 100644 LICENSE_1_0.txt create mode 100644 build/Jamfile create mode 100644 doc/.gitignore create mode 100644 doc/Jamfile create mode 100644 doc/images/doc-logo.png create mode 100644 doc/images/repo-logo.png create mode 100644 doc/qbk/index.xml create mode 100644 doc/qbk/main.qbk create mode 100644 doc/qbk/quickref.xml create mode 100644 doc/source.dox create mode 100644 doc/xsl/class_detail.xsl create mode 100644 doc/xsl/config.xsl create mode 100644 doc/xsl/includes.xsl create mode 100644 example/CMakeLists.txt create mode 100644 include/boost/uri.hpp create mode 100644 include/boost/uri/buffer.hpp create mode 100644 include/boost/uri/config.hpp create mode 100644 include/boost/uri/detail/config.hpp create mode 100644 include/boost/uri/detail/rfc3986.hpp create mode 100644 include/boost/uri/detail/types.hpp create mode 100644 include/boost/uri/error.hpp create mode 100644 include/boost/uri/impl/error.hpp create mode 100644 include/boost/uri/impl/error.ipp create mode 100644 include/boost/uri/impl/parse.ipp create mode 100644 include/boost/uri/impl/scheme.ipp create mode 100644 include/boost/uri/impl/uri.ipp create mode 100644 include/boost/uri/input.hpp create mode 100644 include/boost/uri/make_shared.hpp create mode 100644 include/boost/uri/parse.hpp create mode 100644 include/boost/uri/parts.hpp create mode 100644 include/boost/uri/scheme.hpp create mode 100644 include/boost/uri/src.hpp create mode 100644 include/boost/uri/uri.hpp create mode 100644 include/boost/uri/view.hpp create mode 100644 src/src.cpp create mode 100644 test/CMakeLists.txt create mode 100644 test/Jamfile create mode 100644 test/error.cpp create mode 100644 test/main.cpp create mode 100644 tools/codecov.sh diff --git a/.appveyor.yml b/.appveyor.yml new file mode 100644 index 000000000..f2c73dfc0 --- /dev/null +++ b/.appveyor.yml @@ -0,0 +1,153 @@ +# Copyright 2016, 2017 Peter Dimov +# Copyright (C) 2017 - 2019 James E. King III +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +# +# Generic Appveyor build script for boostorg repositories +# See: https://github.com/boostorg/boost-ci/ +# +# Instructions for customizing this script for your library: +# +# 1. Customize the compilers and language levels you want. +# 2. If you have more than include/, src/, test/, example/, examples/, +# benchmark/ or tools/ directories, set the environment variable DEPINST. +# For example if your build uses code in "bench/" and "fog/" directories: +# - DEPINST: --include bench --include fog +# 3. Enable pull request builds in your boostorg/ account. +# +# That's it - the script will do everything else for you. +# + +version: 1.0.{build}-{branch} + +#clone_depth: 1 + +branches: + only: + - master + - develop + - /bugfix\/.*/ + - /feature\/.*/ + - /fix\/.*/ + - /pr\/.*/ + +matrix: + # Adding MAYFAIL to any matrix job allows it to fail but the build stays green: + allow_failures: + - MAYFAIL: true + +environment: + global: + # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties + # to use the default for a given environment, comment it out; recommend you build debug and release however: + # on Windows it is important to exercise all the possibilities, especially shared vs static, however most + # libraries that care about this exercise it in their Jamfiles... + # B2_ADDRESS_MODEL: address-model=64,32 + # B2_LINK: link=shared,static + # B2_THREADING: threading=multi,single + B2_VARIANT: variant=release + + matrix: + - FLAVOR: mingw32 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ARCH: i686 + B2_ADDRESS_MODEL: address-model=32 + B2_CXXSTD: 11 + SCRIPT: ci\appveyor\mingw.bat + B2_VARIANT: variant=debug + + - FLAVOR: cygwin (64-bit) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ADDPATH: C:\cygwin64\bin; + B2_ADDRESS_MODEL: address-model=64 + B2_CXXSTD: 11,17 + # https://github.com/boostorg/test/issues/144 + B2_DEFINES: define=_POSIX_C_SOURCE=200112L define=__USE_ISOC99 + B2_THREADING: threadapi=pthread + B2_TOOLSET: gcc + + - FLAVOR: Visual Studio 2019 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2019 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXFLAGS: cxxflags=-permissive- + B2_CXXSTD: latest # 2a + B2_TOOLSET: msvc-14.2 + + - FLAVOR: Visual Studio 2015 C++14 (Default) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2015 + B2_ADDRESS_MODEL: address-model=64,32 + B2_TOOLSET: msvc-14.0 + B2_VARIANT: variant=debug + + - FLAVOR: Visual Studio 2017 C++2a Strict + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXFLAGS: cxxflags=-permissive- + B2_CXXSTD: latest # 2a + B2_TOOLSET: msvc-14.1 + + - FLAVOR: Visual Studio 2017 C++17 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXSTD: 17 + B2_TOOLSET: msvc-14.1 + B2_VARIANT: variant=debug + + - FLAVOR: Visual Studio 2017 C++17 Standalone + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXSTD: 17 + B2_DEFINES: define=BOOST_JSON_STANDALONE + B2_TOOLSET: msvc-14.1 + B2_VARIANT: variant=debug + STANDALONE: 1 + + - FLAVOR: Visual Studio 2017 C++14 (Default) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_ADDRESS_MODEL: address-model=64,32 + B2_TOOLSET: msvc-14.1 + + - FLAVOR: clang-cl + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXSTD: 11 + B2_TOOLSET: clang-win + + - FLAVOR: cygwin (32-bit) + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ADDPATH: C:\cygwin\bin; + B2_ADDRESS_MODEL: address-model=32 + B2_CXXSTD: 11 + # https://github.com/boostorg/test/issues/144 + B2_DEFINES: define=_POSIX_C_SOURCE=200112L + B2_THREADING: threadapi=pthread + B2_TOOLSET: gcc + B2_VARIANT: variant=debug + + - FLAVOR: mingw64 + APPVEYOR_BUILD_WORKER_IMAGE: Visual Studio 2017 + ARCH: x86_64 + B2_ADDRESS_MODEL: address-model=64 + B2_CXXSTD: 11,17 + B2_DEFINES: define=__USE_ISOC99 + SCRIPT: ci\appveyor\mingw.bat + +install: + - git submodule update --init --recursive + - set SELF=%APPVEYOR_PROJECT_NAME:-=_% + - git clone https://github.com/boostorg/boost-ci.git C:\boost-ci + - xcopy /s /e /q /i C:\boost-ci\ci .\ci + - ci\appveyor\install.bat + +build: off + +test_script: + - set SELF=%APPVEYOR_PROJECT_NAME:-=_% + - PATH=%ADDPATH%%PATH% + # The definition of B2_TOOLCXX omits B2_CXXSTD= if it was not defined above + - IF NOT DEFINED B2_CXXSTD (SET B2_TOOLCXX=toolset=%B2_TOOLSET%) ELSE (SET B2_TOOLCXX=toolset=%B2_TOOLSET% cxxstd=%B2_CXXSTD%) + # Echo the complete build command to the build log + - IF NOT DEFINED SCRIPT (ECHO b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3) + # Now go build... + - IF DEFINED SCRIPT (call libs\%SELF%\%SCRIPT%) ELSE (b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3) diff --git a/.azure-pipelines.yml b/.azure-pipelines.yml new file mode 100644 index 000000000..3f0ea8a62 --- /dev/null +++ b/.azure-pipelines.yml @@ -0,0 +1,311 @@ +# Copyright 2015-2019 Rene Rivera. +# Copyright 2019 Mateusz Loskot +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +# +# Generic Azure Pipelines build script for boostorg repositories +# See: https://github.com/boostorg/boost-ci/ +# +# Instructions for customizing this script for your library: +# +# 1. Customize the compilers and language levels you want. +# 2. If you have more than include/, src/, test/, example/, examples/, +# benchmark/ or tools/ directories, set the environment variable DEPINST. +# For example if your build uses code in "bench/" and "fog/" directories: +# - DEPINST: --include bench --include fog +# 3. Enable pull request builds in your boostorg/ account. +# +# That's it - the script will do everything else for you. + +trigger: + branches: + include: + - develop + - master + - bugfix/* + - feature/* + - fix/* + - pr/* + +pr: + branches: + include: + - develop + +variables: + - name: B2_VARIANT + value: variant=release,debug + +stages: + +- stage: Test + jobs: + + - job: 'Linux' + pool: + vmImage: 'ubuntu-16.04' + strategy: + matrix: + GCC 8: + B2_TOOLSET: gcc + B2_CXXSTD: 14,17,2a + CXX: g++-8 + PACKAGES: g++-8 + GCC 7: + B2_TOOLSET: gcc + B2_CXXSTD: 11,14,17 + CXX: g++-7 + PACKAGES: g++-7 + GCC 6: + B2_TOOLSET: gcc + B2_CXXSTD: 11,14 + CXX: g++-6 + PACKAGES: g++-6 + GCC 5: + B2_TOOLSET: gcc + B2_CXXSTD: 11 + CXX: g++-5 + PACKAGES: g++-5 + GCC 4.9: + B2_TOOLSET: gcc + B2_CXXSTD: 11 + CXX: g++-4.9 + PACKAGES: g++-4.9 + GCC 4.8: + B2_TOOLSET: gcc + B2_CXXSTD: 11 + CXX: g++-4.8 + PACKAGES: g++-4.8 + Clang 8: + B2_TOOLSET: clang + B2_CXXSTD: 14,17,2a + CXX: clang++-8 + PACKAGES: clang-8 + LLVM_REPO: llvm-toolchain-xenial-8 + Clang 7: + B2_TOOLSET: clang + B2_CXXSTD: 14,17,2a + CXX: clang++-7 + PACKAGES: clang-7 + LLVM_REPO: llvm-toolchain-xenial-7 + Clang 6: + B2_TOOLSET: clang + B2_CXXSTD: 14,17,2a + CXX: clang++-6.0 + PACKAGES: clang-6.0 + LLVM_REPO: llvm-toolchain-xenial-6.0 + Clang 5: + B2_TOOLSET: clang + B2_CXXSTD: 11,14,17 + PACKAGES: clang-5.0 + CXX: clang++-5.0 + LLVM_REPO: llvm-toolchain-xenial-5.0 + Clang 4: + B2_TOOLSET: clang + B2_CXXSTD: 11,14,17 + CXX: clang++-4.0 + PACKAGES: clang-4.0 + LLVM_REPO: llvm-toolchain-xenial-4.0 + Clang 3.9: + B2_TOOLSET: clang + B2_CXXSTD: 11,14 + CXX: clang++-3.9 + PACKAGES: clang-3.9 + Clang 3.8: + B2_TOOLSET: clang + CXX: clang++-3.8 + B2_CXXSTD: 11,14 + PACKAGES: clang-3.8 + Clang 3.7: + B2_TOOLSET: clang + B2_CXXSTD: 11 + CXX: clang++-3.7 + PACKAGES: clang-3.7 + Clang 3.6: + B2_TOOLSET: clang + B2_CXXSTD: 11 + CXX: clang++-3.6 + PACKAGES: clang-3.6 + Clang 3.5: + B2_TOOLSET: clang + B2_CXXSTD: 11 + CXX: clang++-3.5 + PACKAGES: clang-3.5 + steps: + - checkout: self + submodules: true + - bash: | + set -e + uname -a + sudo -E apt-add-repository -y "ppa:ubuntu-toolchain-r/test" + if test -n "${LLVM_REPO}" ; then + wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | sudo apt-key add - + sudo -E apt-add-repository "deb http://apt.llvm.org/xenial/ ${LLVM_REPO} main" + fi + sudo -E apt-get update + sudo -E apt-get -yq --no-install-suggests --no-install-recommends install ${PACKAGES} + + git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci + cp -pr boost-ci/ci boost-ci/.codecov.yml . + rm -rf boost-ci + source ci/azure-pipelines/install.sh + + # AzP requires to run special task in order to export + # SELF and BOOST_ROOT as job-scoped variable from a script. + # NOTE: Disable set -x is necessary, see the troubleshooting guide + # on "Variables having ' (single quote) appended": + # https://docs.microsoft.com/en-us/azure/devops/pipelines/troubleshooting + set +x + echo "##vso[task.setvariable variable=SELF]"$SELF + echo "##vso[task.setvariable variable=BOOST_ROOT]"$BOOST_ROOT + set -x + displayName: 'Install' + - bash: | + set -e + echo "SELF=$SELF" + echo "BOOST_ROOT=$BOOST_ROOT" + + cd $BOOST_ROOT/libs/$SELF + ci/azure-pipelines/build.sh --debug-configuration + displayName: 'Build' + + - job: 'Windows' + strategy: + matrix: + VS 2019 C++2a Strict: + B2_TOOLSET: msvc-14.2 + B2_CXXSTD: latest # 2a + B2_CXXFLAGS: cxxflags=-permissive- + B2_ADDRESS_MODEL: address-model=64 + VM_IMAGE: 'windows-2019' + VS 2017 C++2a Strict: + B2_TOOLSET: msvc-14.1 + B2_CXXSTD: latest # 2a + B2_CXXFLAGS: cxxflags=-permissive- + B2_ADDRESS_MODEL: address-model=64 + VM_IMAGE: 'vs2017-win2016' + VS 2017 C++17: + B2_TOOLSET: msvc-14.1 + B2_CXXSTD: 17 + B2_ADDRESS_MODEL: address-model=64,32 + VM_IMAGE: 'vs2017-win2016' + VS 2017 C++14: + B2_TOOLSET: msvc-14.1 + #B2_CXXSTD: 14 # default + B2_ADDRESS_MODEL: address-model=64,32 + VM_IMAGE: 'vs2017-win2016' + VS 2015 C++14: + B2_TOOLSET: msvc-14.0 + #B2_CXXSTD: 14 # default + B2_ADDRESS_MODEL: address-model=64,32 + VM_IMAGE: 'vs2015-win2012r2' + + pool: + vmImage: $(VM_IMAGE) + steps: + - checkout: self + submodules: true + - script: | + set SELF=%BUILD_REPOSITORY_NAME:-=_% + for /f "tokens=2 delims=/" %%a in ("%SELF%") do set SELF=%%a + set BOOST_ROOT=%BUILD_SOURCESDIRECTORY%\boost-root + + git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci + xcopy /s /e /q /i boost-ci\ci .\ci + cmd /k ci\azure-pipelines\install.bat + + echo ##vso[task.setvariable variable=SELF]%SELF% + echo ##vso[task.setvariable variable=BOOST_ROOT]%BOOST_ROOT% + + displayName: 'Install' + - script: | + PATH=%ADDPATH%%PATH% + REM The definition of B2_TOOLCXX omits B2_CXXSTD= if it was not defined above + IF NOT DEFINED B2_CXXSTD (SET B2_TOOLCXX=toolset=%B2_TOOLSET%) ELSE (SET B2_TOOLCXX=toolset=%B2_TOOLSET% cxxstd=%B2_CXXSTD%) + cd %BOOST_ROOT% + ECHO b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3 + b2 libs/%SELF:\=/% %B2_TOOLCXX% %B2_CXXFLAGS% %B2_DEFINES% %B2_THREADING% %B2_ADDRESS_MODEL% %B2_LINK% %B2_THREADING% %B2_VARIANT% -j3 + displayName: 'Build' + + - job: 'macOS' + pool: + vmImage: 'macOS-10.13' + strategy: + matrix: + Xcode 10.1: + B2_TOOLSET: clang + B2_CXXSTD: 14,17,2a + XCODE_APP: /Applications/Xcode_10.1.app + Xcode 10.0: + B2_TOOLSET: clang + B2_CXXSTD: 14,17,2a + XCODE_APP: /Applications/Xcode_10.app + Xcode 9.4.1: + B2_TOOLSET: clang + B2_CXXSTD: 11,14,17 + XCODE_APP: /Applications/Xcode_9.4.1.app + Xcode 9.4: + B2_TOOLSET: clang + B2_CXXSTD: 11,14,17 + XCODE_APP: /Applications/Xcode_9.4.app + Xcode 9.3.1: + B2_TOOLSET: clang + B2_CXXSTD: 11,14,17 + XCODE_APP: /Applications/Xcode_9.3.1.app + Xcode 9.3: + B2_TOOLSET: clang + B2_CXXSTD: 11,14 + XCODE_APP: /Applications/Xcode_9.3.app + Xcode 9.2: + B2_TOOLSET: clang + B2_CXXSTD: 11,14 + XCODE_APP: /Applications/Xcode_9.2.app + Xcode 9.1: + B2_TOOLSET: clang + B2_CXXSTD: 11 + XCODE_APP: /Applications/Xcode_9.1.app + Xcode 9.0.1: + B2_TOOLSET: clang + B2_CXXSTD: 11 + XCODE_APP: /Applications/Xcode_9.0.1.app + Xcode 9.0: + B2_TOOLSET: clang + B2_CXXSTD: 11 + XCODE_APP: /Applications/Xcode_9.app + Xcode 8.3.3: + B2_TOOLSET: clang + B2_CXXSTD: 11 + XCODE_APP: /Applications/Xcode_8.3.3.app + steps: + - checkout: self + submodules: true + - bash: | + set -e + uname -a + sudo xcode-select -switch ${XCODE_APP} + which clang++ + + git clone --branch master https://github.com/boostorg/boost-ci.git boost-ci + cp -pr boost-ci/ci boost-ci/.codecov.yml . + rm -rf boost-ci + source ci/azure-pipelines/install.sh + + # AzP requires to run special task in order to export + # SELF and BOOST_ROOT as job-scoped variable from a script. + # NOTE: Disable set -x is necessary, see the troubleshooting guide + # on "Variables having ' (single quote) appended": + # https://docs.microsoft.com/en-us/azure/devops/pipelines/troubleshooting + set +x + echo "##vso[task.setvariable variable=SELF]"$SELF + echo "##vso[task.setvariable variable=BOOST_ROOT]"$BOOST_ROOT + set -x + displayName: Install + - bash: | + set -e + echo "SELF=$SELF" + echo "BOOST_ROOT=$BOOST_ROOT" + + cd $BOOST_ROOT/libs/$SELF + ci/azure-pipelines/build.sh --debug-configuration + displayName: 'Build' diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..4c0706d81 --- /dev/null +++ b/.gitignore @@ -0,0 +1,8 @@ +bin +bin64 +*.*# +temp + +# Because of CMake and VS2017 +Win32 +x64 diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 000000000..66ebc3345 --- /dev/null +++ b/.travis.yml @@ -0,0 +1,260 @@ +# Copyright 2016 Peter Dimov +# Copyright 2017 - 2019 James E. King III +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at http://boost.org/LICENSE_1_0.txt) + +# +# Generic Travis CI build script for boostorg repositories +# See: https://github.com/boostorg/boost-ci +# +# Instructions for customizing this script for your library: +# +# 1. Customize the compilers and language levels you want in the 'jobs'. +# 2. If you have more than include/, src/, test/, example/, examples/, or +# tools/ directories, modify your Travis CI project and add the environment +# variable DEPINST. For example if your build uses code in "bench/" and +# "fog/" directories, then set DEPINST to the following: +# --include bench --include fog +# 3. If you want to enable Coverity Scan, you need to provide the environment +# variables COVERITY_SCAN_TOKEN and COVERITY_SCAN_NOTIFICATION_EMAIL in +# your github settings. +# 4. If you want to enable a big-endian build, you need to uncomment the +# big-endian build job. +# 5. Enable pull request builds in your boostorg/ account. +# +# That's it - the scripts will do everything else for you. + +dist: xenial +language: cpp + +env: + global: + # see: http://www.boost.org/build/doc/html/bbv2/overview/invocation.html#bbv2.overview.invocation.properties + # - B2_ADDRESS_MODEL=address-model=64,32 + # - B2_LINK=link=shared,static + # - B2_THREADING=threading=multi,single + - B2_VARIANT=variant=release + +install: + - git clone https://github.com/boostorg/boost-ci.git boost-ci + - cp -pr boost-ci/ci boost-ci/.codecov.yml . + - source ci/travis/install.sh + +addons: + apt: + packages: + - binutils-gold + - gdb + - libc6-dbg + - qemu-user-static + +services: + - docker + +branches: + only: + - master + - develop + - /bugfix\/.*/ + - /feature\/.*/ + - /fix\/.*/ + - /pr\/.*/ + +script: + - cd $BOOST_ROOT/libs/$SELF + - ci/travis/build.sh + +# +# Default toolsets in Ubuntu +# +# trusty xenial bionic +# 14.04 16.04 18.04 +# ------ ------ ------ +# clang 3.4 3.8 6.0 +# gcc 4.8.2 5.3.1 7.3.0 +# + +anchors: + clang-38: &clang-38 { apt: { packages: [ "clang-3.8", + "libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-3.8", + "ubuntu-toolchain-r-test" ] } } + clang-4: &clang-4 { apt: { packages: [ "clang-4.0", + "libstdc++-6-dev" ], sources: [ "llvm-toolchain-xenial-4.0", + "ubuntu-toolchain-r-test" ] } } + clang-5: &clang-5 { apt: { packages: [ "clang-5.0", + "libstdc++-7-dev" ], sources: [ "llvm-toolchain-xenial-5.0", + "ubuntu-toolchain-r-test" ] } } + clang-6: &clang-6 { apt: { packages: [ "clang-6.0", + "libc6-dbg", + "libc++-dev", + "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-6.0", + "ubuntu-toolchain-r-test" ] } } + clang-7: &clang-7 { apt: { packages: [ "clang-7", + "libc6-dbg", + "libc++-dev", + "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-7", + "ubuntu-toolchain-r-test" ] } } + clang-8: &clang-8 { apt: { packages: [ "clang-8", + "libc6-dbg", + "libc++-dev", + "libstdc++-8-dev" ], sources: [ "llvm-toolchain-xenial-8", + "ubuntu-toolchain-r-test" ] } } + gcc-48: &gcc-48 { apt: { packages: [ "g++-4.8" ] } } + gcc-49: &gcc-49 { apt: { packages: [ "g++-4.9" ], sources: [ "ubuntu-toolchain-r-test" ] } } + gcc-5: &gcc-5 { apt: { packages: [ "g++-5" ] } } + gcc-6: &gcc-6 { apt: { packages: [ "g++-6" ], sources: [ "ubuntu-toolchain-r-test" ] } } + gcc-7: &gcc-7 { apt: { packages: [ "g++-7" ], sources: [ "ubuntu-toolchain-r-test" ] } } + gcc-8: &gcc-8 { apt: { packages: [ "g++-8" ], sources: [ "ubuntu-toolchain-r-test" ] } } + gcc-9: &gcc-9 { apt: { packages: [ "g++-9" ], sources: [ "ubuntu-toolchain-r-test" ] } } + +jobs: + allow_failures: + - env: + - COPY="all the environment settings from your job" + + include: + # coverage + - os: linux + env: + - COMMENT=codecov.io + - B2_CXXSTD=11 + #- B2_CXXFLAGS="inlining=off" + - B2_TOOLSET=gcc-8 + - B2_DEFINES="define=BOOST_DISABLE_ASSERTS define=BOOST_NO_STRESS_TEST=1" + addons: *gcc-8 + script: + - cd $BOOST_ROOT/libs/$SELF + - tools/codecov.sh + + - { os: "linux", env: [ "B2_TOOLSET=clang-8", "B2_CXXSTD=17,2a" ], addons: *clang-8 } + + - os: linux + env: + - COMMENT=valgrind + - B2_TOOLSET=clang-6.0 + - B2_CXXSTD=11,14 + - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" + - B2_VARIANT=variant=debug + - B2_TESTFLAGS=testing.launcher=valgrind + - VALGRIND_OPTS=--error-exitcode=1 + addons: *clang-6 + script: + - cd $BOOST_ROOT/libs/$SELF + - ci/travis/valgrind.sh + + - os: linux + env: + - COMMENT=asan + - B2_VARIANT=variant=debug + - B2_TOOLSET=gcc-8 + - B2_CXXSTD=11,14 + - B2_CXXFLAGS="address-sanitizer=norecover" + - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" + addons: *gcc-8 + + - os: linux + env: + - COMMENT=tsan + - B2_VARIANT=variant=debug + - B2_TOOLSET=gcc-8 + - B2_CXXSTD=11,14 + - B2_CXXFLAGS="thread-sanitizer=norecover" + - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" + addons: *gcc-8 + + - os: linux + env: + - COMMENT=ubsan + - B2_VARIANT=variant=debug + - B2_TOOLSET=gcc-8 + - B2_CXXSTD=11,14 + - B2_CXXFLAGS="undefined-sanitizer=norecover" + - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1 define=BOOST_JSON_HEADER_ONLY" + - B2_LINKFLAGS="linkflags=-fuse-ld=gold" + - UBSAN_OPTIONS=print_stacktrace=1 + addons: *gcc-8 + + # standalone + - os: "linux" + env: + - COMMENT=standalone + - STANDALONE=1 + - B2_VARIANT=variant=debug + - B2_TOOLSET=gcc-7 + - B2_CXXSTD=17 + - B2_DEFINES="define=BOOST_JSON_STANDALONE=1" + addons: *gcc-7 + + - os: "linux" + env: + - COMMENT=standalone + - STANDALONE=1 + - B2_VARIANT=variant=debug + - B2_TOOLSET=clang-7 + - B2_CXXSTD=17 + - B2_DEFINES="define=BOOST_JSON_STANDALONE=1" + addons: *clang-7 + + # libstdc++ + - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI + env: [ "B2_TOOLSET=gcc-4.8", "B2_CXXSTD=11" ], addons: *gcc-48 } + - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI + env: [ "B2_TOOLSET=gcc-4.9", "B2_CXXSTD=11" ], addons: *gcc-49 } + - { os: "linux", env: [ "B2_TOOLSET=gcc-5", "B2_CXXSTD=11" ], addons: *gcc-5 } + - { os: "linux", env: [ "B2_TOOLSET=gcc-6", "B2_CXXSTD=11,14" ], addons: *gcc-6 } + - { os: "linux", env: [ "B2_TOOLSET=gcc-7", "B2_CXXSTD=14,17" ], addons: *gcc-7 } + - { os: "linux", env: [ "B2_TOOLSET=gcc-8", "B2_CXXSTD=17,2a" ], addons: *gcc-8 } + - { os: "linux", env: [ "B2_TOOLSET=gcc-9", "B2_CXXSTD=17,2a" ], addons: *gcc-9 } + - { os: "linux", dist: "trusty", # xenial has libstdc++ from gcc 5.4.0 with newer ABI + env: [ "B2_TOOLSET=clang-3.8", "B2_CXXSTD=11" ], addons: *clang-38 } + - { os: "linux", env: [ "B2_TOOLSET=clang-4.0", "B2_CXXSTD=11,14" ], addons: *clang-4 } + - { os: "linux", env: [ "B2_TOOLSET=clang-5.0", "B2_CXXSTD=11,14" ], addons: *clang-5 } + - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=14,17" ], addons: *clang-6 } + - { os: "linux", env: [ "B2_TOOLSET=clang-7", "B2_CXXSTD=17,2a" ], addons: *clang-7 } +# - { os: "linux", env: [ "B2_TOOLSET=clang-8", "B2_CXXSTD=17,2a" ], addons: *clang-8 } + + # libc++ + - { os: "linux", env: [ "B2_TOOLSET=clang-6.0", "B2_CXXSTD=11,14", + "B2_CXXFLAGS=-stdlib=libc++" ], addons: *clang-6 } + - { os: "osx" , env: [ "B2_TOOLSET=clang", "B2_CXXSTD=11,17" ] } + + # to enable Intel ICC define INTEL_ICC_SERIAL_NUMBER and the following (under development): + # - { os: "linux", env: [ "B2_TOOLSET=intel-linux", "B2_CXXSTD=11,14,17" ], addons: *gcc-7, + # script: cd $BOOST_ROOT/libs/$SELF && ci/travis/intelicc.sh } + + # uncomment to enable a big-endian build job, just note that it is 5-10 times slower + # than a regular build and travis has a 50 minute time limit per job + # - os: linux + # env: + # - COMMENT=big-endian + # - B2_CXXSTD=03 + # - B2_TOOLSET=gcc + # - B2_DEFINES="define=BOOST_NO_STRESS_TEST=1" + # - BDDE_OS=red + # - BDDE_ARCH=ppc64 + # script: + # - cd $BOOST_ROOT/libs/$SELF + # - ci/travis/bdde.sh + + # - os: linux + # env: + # - COMMENT=cppcheck + # script: + # - cd $BOOST_ROOT/libs/$SELF + # - ci/travis/cppcheck.sh + + #################### Jobs to run on pushes to master, develop ################### + + # Coverity Scan + - os: linux + if: (env(COVERITY_SCAN_NOTIFICATION_EMAIL) IS present) AND (branch IN (develop, master)) AND (type IN (cron, push)) + env: + - COMMENT="Coverity Scan" + - B2_TOOLSET=clang + script: + - cd $BOOST_ROOT/libs/$SELF + - ci/travis/coverity.sh + +notifications: + email: + false diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 000000000..6043feb3d --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,152 @@ +# +# Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/uri +# + +cmake_minimum_required (VERSION 3.5.1) + +if (POLICY CMP0074) + cmake_policy (SET CMP0074 NEW) +endif() + +#------------------------------------------------------------------------------- + +function (DoGroupSources curdir rootdir folder) + file (GLOB children RELATIVE ${PROJECT_SOURCE_DIR}/${curdir} ${PROJECT_SOURCE_DIR}/${curdir}/*) + foreach (child ${children}) + if (IS_DIRECTORY ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + DoGroupSources (${curdir}/${child} ${rootdir} ${folder}) + elseif (${child} STREQUAL "CMakeLists.txt") + source_group("" FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + else() + string (REGEX REPLACE ^${rootdir} ${folder} groupname ${curdir}) + string (REPLACE "/" "\\" groupname ${groupname}) + source_group (${groupname} FILES ${PROJECT_SOURCE_DIR}/${curdir}/${child}) + endif() + endforeach() +endfunction() + +function (GroupSources curdir folder) + DoGroupSources (${curdir} ${curdir} ${folder}) +endfunction() + +#------------------------------------------------------------------------------- +# +# URI +# +#------------------------------------------------------------------------------- + +project (URI VERSION 1) + +set_property (GLOBAL PROPERTY USE_FOLDERS ON) + +if (MSVC) + set (CMAKE_VERBOSE_MAKEFILE FALSE) + + add_definitions ( + -D_WIN32_WINNT=0x0601 + -D_CRT_SECURE_NO_WARNINGS + ) + + add_compile_options( + /permissive- # strict C++ + /W4 # enable all warnings + /MP # Multi-processor compilation + ) + + add_link_options( + /INCREMENTAL:NO + ) + + set (Boost_USE_STATIC_LIBS ON) + set (Boost_USE_STATIC_RUNTIME ON) + + set (CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /MTd") + set (CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} /Ob2 /Oi /Ot /GL /MT") + set (CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_CXX_FLAGS_RELWITHDEBINFO} /Oi /Ot /MT") + + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /SAFESEH:NO") + set (CMAKE_EXE_LINKER_FLAGS_RELEASE "${CMAKE_EXE_LINKER_FLAGS_RELEASE} /LTCG") + + # for RelWithDebInfo builds, disable incremental linking + # since CMake sets it ON by default for that build type and it + # causes warnings + # + string (REPLACE "/INCREMENTAL" "/INCREMENTAL:NO" replacement_flags + ${CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO}) + set (CMAKE_EXE_LINKER_FLAGS_RELWITHDEBINFO ${replacement_flags}) + +else() + set (THREADS_PREFER_PTHREAD_FLAG ON) + find_package (Threads) + + set( CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -std=c++11 -Wall -Wextra -Wpedantic -Wno-unused-parameter") + + if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") + set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wrange-loop-analysis") + endif () +endif() + +# Must come before Boost includes, otherwise the +# IDE sees the wrong file due to boost/ symlinks. +include_directories (include) + +#------------------------------------------------------------------------------- +# +# Boost +# +#------------------------------------------------------------------------------- + +get_filename_component (BOOST_ROOT ../../ ABSOLUTE) + +# VFALCO I want static but "b2 stage" builds a minimal set which excludes static +add_definitions (-DBOOST_ALL_STATIC_LINK=1) + +include_directories (${BOOST_ROOT}) + +link_directories(${BOOST_ROOT}/stage/lib) + +#------------------------------------------------------------------------------- + +if ("${VARIANT}" STREQUAL "coverage") + if (MSVC) + else() + set (CMAKE_BUILD_TYPE DEBUG) + set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -msse4.2 --coverage") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} --coverage") + endif() + +elseif ("${VARIANT}" STREQUAL "ubasan") + if (MSVC) + else() + set (CMAKE_BUILD_TYPE RELWITHDEBINFO) + set (CMAKE_CXX_FLAGS + "${CMAKE_CXX_FLAGS} -msse4.2 -funsigned-char -fno-omit-frame-pointer -fsanitize=address,undefined -fno-sanitize-recover=address,undefined -fsanitize-blacklist=${PROJECT_SOURCE_DIR}/tools/blacklist.supp") + set (CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address,undefined -fno-sanitize-recover=address,undefined") + endif() + +elseif ("${VARIANT}" STREQUAL "debug") + set (CMAKE_BUILD_TYPE DEBUG) + +elseif ("${VARIANT}" STREQUAL "release") + set (CMAKE_BUILD_TYPE RELEASE) + +endif() + +#------------------------------------------------------------------------------- +# +# Tests and examples +# + +file (GLOB_RECURSE PROJECT_FILES + ${PROJECT_SOURCE_DIR}/include/boost/uri/*.hpp + ${PROJECT_SOURCE_DIR}/include/boost/uri/*.ipp +) + +add_subdirectory (example) +add_subdirectory (test) diff --git a/Jamfile b/Jamfile new file mode 100644 index 000000000..f603e4b34 --- /dev/null +++ b/Jamfile @@ -0,0 +1,12 @@ +# +# Copyright (c) 2013-2019 Vinnie Falco (vinnie dot falco at gmail dot com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/json +# + +path-constant LIB_DIR : . ; + +build-project test ; diff --git a/LICENSE_1_0.txt b/LICENSE_1_0.txt new file mode 100644 index 000000000..36b7cd93c --- /dev/null +++ b/LICENSE_1_0.txt @@ -0,0 +1,23 @@ +Boost Software License - Version 1.0 - August 17th, 2003 + +Permission is hereby granted, free of charge, to any person or organization +obtaining a copy of the software and accompanying documentation covered by +this license (the "Software") to use, reproduce, display, distribute, +execute, and transmit the Software, and to prepare derivative works of the +Software, and to permit third-parties to whom the Software is furnished to +do so, all subject to the following: + +The copyright notices in the Software and this entire statement, including +the above license grant, this restriction and the following disclaimer, +must be included in all copies of the Software, in whole or in part, and +all derivative works of the Software, unless such copies or derivative +works are solely in the form of machine-executable object code generated by +a source language processor. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT +SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE +FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER +DEALINGS IN THE SOFTWARE. diff --git a/README.md b/README.md index d72176a2b..017e969a2 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,24 @@ # uri -Boost.URI +Boost.URI Title + +Branch | Travis | Appveyor | Azure Pipelines | codecov.io | Docs | Matrix | +:-------------: | ------ | -------- | --------------- | ---------- | ---- | ------ | +[`master`](https://github.com/vinniefalco/uri/tree/master) | [![Build Status](https://travis-ci.org/vinniefalco/uri.svg?branch=master)](https://travis-ci.org/vinniefalco/uri) | [![Build status](https://ci.appveyor.com/api/projects/status/github/vinniefalco/uri?branch=master&svg=true)](https://ci.appveyor.com/project/vinniefalco/uri/branch/master) | [![Build Status](https://img.shields.io/azure-devops/build/vinniefalco/2571d415-8cc8-4120-a762-c03a8eda0659/1/master)](https://vinniefalco.visualstudio.com/uri/_build/latest?definitionId=1&branchName=master) | [![codecov](https://codecov.io/gh/vinniefalco/uri/branch/master/graph/badge.svg)](https://codecov.io/gh/vinniefalco/uri/branch/master) | [![Documentation](https://img.shields.io/badge/docs-master-brightgreen.svg)](http://vinniefalco.github.com/doc/uri/index.html) | [![Matrix](https://img.shields.io/badge/matrix-master-brightgreen.svg)](http://www.boost.org/development/tests/master/developer/uri.html) +[`develop`](https://github.com/vinniefalco/uri/tree/develop) | [![Build Status](https://travis-ci.org/vinniefalco/uri.svg?branch=develop)](https://travis-ci.org/vinniefalco/uri) | [![Build status](https://ci.appveyor.com/api/projects/status/github/vinniefalco/uri?branch=develop&svg=true)](https://ci.appveyor.com/project/vinniefalco/uri/branch/develop) | [![Build Status](https://img.shields.io/azure-devops/build/vinniefalco/2571d415-8cc8-4120-a762-c03a8eda0659/1/develop)](https://vinniefalco.visualstudio.com/uri/_build/latest?definitionId=1&branchName=develop) | [![codecov](https://codecov.io/gh/vinniefalco/uri/branch/develop/graph/badge.svg)](https://codecov.io/gh/vinniefalco/uri/branch/develop) | [![Documentation](https://img.shields.io/badge/docs-develop-brightgreen.svg)](http://vinniefalco.github.com/doc/uri/index.html) | [![Matrix](https://img.shields.io/badge/matrix-develop-brightgreen.svg)](http://www.boost.org/development/tests/develop/developer/uri.html) + +# Boost.URI + +## This is currently **NOT** an official Boost library. + +## Introduction + +## Motivation + +## Design Goals + +## License + +Distributed under the Boost Software License, Version 1.0. +(See accompanying file [LICENSE_1_0.txt](LICENSE_1_0.txt) or copy at +https://www.boost.org/LICENSE_1_0.txt) diff --git a/build/Jamfile b/build/Jamfile new file mode 100644 index 000000000..d8dd9c362 --- /dev/null +++ b/build/Jamfile @@ -0,0 +1,31 @@ +# +# Copyright (c) 2019 Vinnie Falco (vinnie dot falco at gmail dot com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/boostorg/json +# + +project boost/uri + : requirements + shared:BOOST_URI_DYN_LINK=1 + static:BOOST_URI_STATIC_LINK=1 + BOOST_JSON_SOURCE + : usage-requirements + shared:BOOST_URI_DYN_LINK=1 + static:BOOST_URI_STATIC_LINK=1 + : source-location ../src + ; + +alias uri_sources + : src.cpp + ; + +explicit uri_sources ; + +lib boost_uri + : uri_sources + ; + +boost-install boost_uri ; diff --git a/doc/.gitignore b/doc/.gitignore new file mode 100644 index 000000000..4aca2ca60 --- /dev/null +++ b/doc/.gitignore @@ -0,0 +1,4 @@ +html +temp +out.txt +qbk/reference.qbk diff --git a/doc/Jamfile b/doc/Jamfile new file mode 100644 index 000000000..3c40df80d --- /dev/null +++ b/doc/Jamfile @@ -0,0 +1,343 @@ +# +# Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/uri +# + +project uri/doc ; + +import os ; +import path ; +import boostbook ; +import quickbook ; +import xsltproc ; +import doxygen ; +import modules ; +import saxonhe ; + +local broot = [ os.environ BOOST_ROOT ] ; + +path-constant out : . ; + +#------------------------------------------------------------------------------- +# +# Build the list of header files that Doxygen will scan. We need +# this list to inform the build system of the dependencies so the +# docs can be rebuild if any of the header files change. +# + +local sources = [ path.glob-tree ../include/boost/uri : *.hpp *.ipp : detail impl ] ; + +# Get the configured paths to doxygen and xsltproc + +.doxygen = [ doxygen.name ] ; +.doxygen ?= doxygen ; + +.xsltproc = [ xsltproc.name ] ; +.xsltproc ?= xsltproc ; + +#------------------------------------------------------------------------------- +# +# Invoke Doxygen to process the header files and produce the XML +# containing the description of the C++ declarations and extracted +# Javadoc comments. +# +make index.xml + : + ./source.dox + : + @make_doxygen_xml + : + $(sources) + ; + +rule make_doxygen_xml ( targets * : sources * : properties * ) +{ +} + +if [ os.name ] = NT +{ + actions make_doxygen_xml + { + SET LIB_DIR=$(LIB_DIR) + SET XML_OUTPUT=$(1:D) + "$(.doxygen)" $(2) + } +} +else +{ + actions make_doxygen_xml + { + export LIB_DIR=$(LIB_DIR) + export XML_OUTPUT=$(1:D) + "$(.doxygen)" $(2) + } +} + +#------------------------------------------------------------------------------- +# +# Copy all the XSLT modules to the target directory. +# +# FIXME: Change this so we can just specify a directory, +# rather than every file individually. +# +# Also, somehow force dependencies in a general way +# such that the XSLT has to be executed again +# if any of the modules change. For example, +# if base-extract-xml-pages.xml changes, then +# an invocation of extract-xml-pages.xsl (which +# imports the former) must be run again. +# +make extract-xml-pages.xsl : docca/include/docca/extract-xml-pages.xsl : @copy_script ; +make base-extract-xml-pages.xsl : docca/include/docca/base-extract-xml-pages.xsl : @copy_script ; +make common.xsl : docca/include/docca/common.xsl : @copy_script ; +make stage1.xsl : docca/include/docca/stage1.xsl : @copy_script ; +make base-stage1.xsl : docca/include/docca/base-stage1.xsl : @copy_script ; +make stage2.xsl : docca/include/docca/stage2.xsl : @copy_script ; +make assemble-quickbook.xsl : docca/include/docca/assemble-quickbook.xsl : @copy_script ; +make emphasized-types.xsl : docca/include/docca/emphasized-types.xsl : @copy_script ; + +make config.xsl + : + docca/include/docca/config.xsl + xsl/config.xsl + xsl/class_detail.xsl + xsl/includes.xsl + : + @make_config + ; + +actions make_config +{ + cp $(2[1]) $(1) + sed -i -e "//{r $(2[2])" -e "d}" $(1) + sed -i -e "//{r $(2[4])" -e "d}" $(1) +} + +# Make a copy of the given file. +# +actions copy_script +{ + cp $(2[1]) $(1) +} + + +# This is to initially create the directory as a side effect; I'm sure there's a better way... +make xml-pages/directory/placeholder : index.xml : @null_action ; + +#------------------------------------------------------------------------------- +# +# Run index.xml through the first transformation stage +# (assembling and splitting the XML into page-specific files). +# +make xml-pages.xml + : + index.xml + extract-xml-pages.xsl + + # Make bjam aware of additional dependencies + base-extract-xml-pages.xsl + config.xsl + common.xsl + : + saxonhe.saxonhe + ; + +# This is just to make the directory eligible as a source +make xml-pages : index.xml : @null_action ; + +# Not ready for prime time until I figure out how to get the xslt-visualizer code in place +#make stage1/code-trace-enabled/stage1.xsl +# : +# stage1.xsl +# xslt-visualizer/xsl/trace-enable.xsl +# : +# saxonhe.saxonhe +# ; + +# This is to initially create the directory as a side effect; I'm sure there's a better way... +make stage1/results/directory/placeholder : xml-pages.xml : @null_action ; +make stage2/results/directory/placeholder : xml-pages.xml : @null_action ; + +# TODO: figure out why this (and the following stage) get built every time +make stage1/results + : + xml-pages + stage1.xsl + + # additional dependencies + xml-pages.xml + base-stage1.xsl + config.xsl + common.xsl + : + saxonhe.saxonhe + ; + +make stage2/results + : + stage1/results + stage2.xsl + : + saxonhe.saxonhe + ; + +make reference.qbk + : + xml-pages.xml + assemble-quickbook.xsl + + # TODO: make this input to the XSLT somehow + # rather than relying on it being hard-coded + # in the XSLT (which it is!) + stage2/results + : + saxonhe.saxonhe + ; + +actions make_dir +{ + mkdir $(1) +} + +make combine.xslt : index.xml : @null_action ; + +actions touch_file +{ + touch $(1) ; +} + +actions null_action +{ + touch -c $(1) ; +} + +make reference.xml + : + combine.xslt + index.xml + : + @call-xsltproc + ; + +actions call-xsltproc +{ + "$(.xsltproc)" $(2) > $(1) +} + +#------------------------------------------------------------------------------- +# +# Produce the reference.qbk file by running +# the reference xml through the transform. +# +#make reference.qbk +# : +# reference.xml +# transform.xsl +# : +# saxonhe.saxonhe +# ; + +# We have to make a copy of reference.qbk and put it +# in a place where the static .qbk files can find it +# +install qbk : reference.qbk ; + +#------------------------------------------------------------------------------- +# +# Produce the Boost.Book XML from the QuickBook +# + +# stylesheets and callouts are for +# out-of-tree docs on vinniefalco.github.io + +install stylesheets + : + $(broot)/doc/src/boostbook.css + : + $(out)/html + ; + +explicit stylesheets ; + +install callouts + : + [ glob $(broot)/doc/src/images/callouts/*.png ] + : + $(out)/html/images/callouts + ; + +explicit callout ; + +install treeimages + : + [ glob $(broot)/doc/src/images/*.png ] + images/doc-logo.png + : + $(out)/html/images + ; + +explicit treeimages ; + + + +install images + : + [ glob images/*.png ] + : + html/uri/images + ; + +explicit images ; + +xml uri_doc + : + qbk/main.qbk + : + qbk +# $(broot)/tools/boostbook/dtd + ; + +explicit uri_doc ; + +#------------------------------------------------------------------------------- +# +# HTML documentation for $(BOOST_ROOT)/doc/html +# +#------------------------------------------------------------------------------- + +boostbook uri + : + uri_doc + : + boost.image.src=images/doc-logo.png + boost.image.alt="Boost.URI Logo" + boost.image.w=880 + boost.image.h=80 + boost.graphics.root=images/ + html.stylesheet=boostbook.css + nav.layout=none + chapter.autolabel=0 + chunk.first.sections=1 # Chunk the first top-level section? + chunk.section.depth=8 # Depth to which sections should be chunked + generate.toc="chapter nop section nop" + : + stylesheets + treeimages + images + ; + +#------------------------------------------------------------------------------- +# +# These are used to inform the build system of the +# means to build the integrated and stand-alone docs. +# + +alias boostdoc ; +explicit boostdoc ; + +alias boostrelease : uri ; +explicit boostrelease ; diff --git a/doc/images/doc-logo.png b/doc/images/doc-logo.png new file mode 100644 index 0000000000000000000000000000000000000000..abf304c29a5f17f3fdf6c570ff195548937b3849 GIT binary patch literal 114324 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%0AQuqWsD?qTEqKr9GxRQ)=8=FuRk#QfK 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 + + + +
+ Index + +
diff --git a/doc/qbk/main.qbk b/doc/qbk/main.qbk new file mode 100644 index 000000000..01b026af5 --- /dev/null +++ b/doc/qbk/main.qbk @@ -0,0 +1,78 @@ +[/ + Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) + + Distributed under the Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) + + Official repository: https://github.com/vinniefalco/uri +] + +[library Boost.URI + [id uri] + [quickbook 1.6] + [copyright 2019 Vinnie Falco] + [purpose URI Library] + [license + Distributed under the Boost Software License, Version 1.0. + (See accompanying file LICENSE_1_0.txt or copy at + [@http://www.boost.org/LICENSE_1_0.txt]) + ] + [authors [Falco, Vinnie]] + [category template] + [category generic] +] + +[template mdash[] '''— '''] +[template indexterm1[term1] ''''''[term1]''''''] +[template indexterm2[term1 term2] ''''''[term1]''''''[term2]''''''] + +[template include_file[path][^<''''''[path]''''''>]] +[template issue[n] '''#'''[n]''''''] + +[/ Named Requirements ] + +[def __Allocator__ [@https://en.cppreference.com/w/cpp/named_req/Allocator ['Allocator]]] +[def __CopyAssignable__ [@https://en.cppreference.com/w/cpp/named_req/CopyAssignable ['CopyAssignable]]] +[def __CopyConstructible__ [@https://en.cppreference.com/w/cpp/named_req/CopyConstructible ['CopyConstructible]]] +[def __DefaultConstructible__ [@https://en.cppreference.com/w/cpp/named_req/DefaultConstructible ['DefaultConstructible]]] +[def __Hash__ [@https://en.cppreference.com/w/cpp/named_req/Hash ['Hash]]] +[def __InputIterator__ [@https://en.cppreference.com/w/cpp/named_req/InputIterator ['InputIterator]]] +[def __MoveAssignable__ [@https://en.cppreference.com/w/cpp/named_req/MoveAssignable ['MoveAssignable]]] +[def __MoveConstructible__ [@https://en.cppreference.com/w/cpp/named_req/MoveConstructible ['MoveConstructible]]] +[def __Swappable__ [@https://en.cppreference.com/w/cpp/named_req/Swappable ['Swappable]]] + +[def __Copyable__ [@https://en.cppreference.com/w/cpp/concepts/copyable ['Copyable]]] +[def __SemiRegular__ [@https://en.cppreference.com/w/cpp/concepts/semiregular ['SemiRegular]]] + +[/ Dingbats ] + +[def __good__ [role green \u2714]] +[def __bad__ [role red \u2718]] + +[/-----------------------------------------------------------------------------] + +[import ../../test/snippets.cpp] + +[/-----------------------------------------------------------------------------] + +[variablelist + [[ + [link uri.overview Overview] + ][ + A review of the requirements and features included in Boost.URI, + rationale and design information, answers to frequently + asked questions, and credits. + ]] + [[ + [link uri.ref Reference] + ][ + Detailed function and type reference. + ]] +] + +[section:ref Reference] +[xinclude quickref.xml] +[include reference.qbk] +[endsect] + +[xinclude index.xml] diff --git a/doc/qbk/quickref.xml b/doc/qbk/quickref.xml new file mode 100644 index 000000000..17c1ee6db --- /dev/null +++ b/doc/qbk/quickref.xml @@ -0,0 +1,50 @@ + + + + + + + + + + JSON + + + + Classes + + + + + Functions + + + Type Traits + + + + + Operators + + + + + Constants + + + + + Aliases + + + + + + diff --git a/doc/source.dox b/doc/source.dox new file mode 100644 index 000000000..308227140 --- /dev/null +++ b/doc/source.dox @@ -0,0 +1,254 @@ +#--------------------------------------------------------------------------- +# Configuration options related to the input files +#--------------------------------------------------------------------------- + +INPUT = \ + $(LIB_DIR)/include/boost/uri + + +ALIASES += esafe="@par Exception Safety" + +INPUT_ENCODING = UTF-8 +FILE_PATTERNS = +RECURSIVE = NO +EXCLUDE = +EXCLUDE_SYMLINKS = NO +EXCLUDE_PATTERNS = +EXCLUDE_SYMBOLS = +EXAMPLE_PATH = +EXAMPLE_PATTERNS = +EXAMPLE_RECURSIVE = NO +IMAGE_PATH = +INPUT_FILTER = +FILTER_PATTERNS = +FILTER_SOURCE_FILES = NO +FILTER_SOURCE_PATTERNS = +USE_MDFILE_AS_MAINPAGE = + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- +ENABLE_PREPROCESSING = YES +MACRO_EXPANSION = YES +EXPAND_ONLY_PREDEF = YES +SEARCH_INCLUDES = YES +INCLUDE_PATH = ../ +INCLUDE_FILE_PATTERNS = + +PREDEFINED = \ + GENERATING_DOCUMENTATION \ + BOOST_URI_DECL \ + BOOST_URI_PUBLIC \ + BOOST_URI_FORCEINLINE \ + "BOOST_URI_NODISCARD=[[nodiscard]]" \ + "BOOST_URI_INLINE_VARIABLE(v, t)=constexpr t v;" + +EXPAND_AS_DEFINED = +SKIP_FUNCTION_MACROS = YES + +#--------------------------------------------------------------------------- +# Project related configuration options +#--------------------------------------------------------------------------- +DOXYFILE_ENCODING = UTF-8 +PROJECT_NAME = "URI" +PROJECT_NUMBER = +PROJECT_BRIEF = URI Library +PROJECT_LOGO = +OUTPUT_DIRECTORY = +CREATE_SUBDIRS = NO +#####ALLOW_UNICODE_NAMES = NO +OUTPUT_LANGUAGE = English +BRIEF_MEMBER_DESC = YES +REPEAT_BRIEF = YES +ABBREVIATE_BRIEF = +ALWAYS_DETAILED_SEC = NO +INLINE_INHERITED_MEMB = YES +FULL_PATH_NAMES = YES +#STRIP_FROM_PATH = $(LIB_DIR)/include # Requires doxygen 1.8.7+ +STRIP_FROM_INC_PATH = +SHORT_NAMES = NO +JAVADOC_AUTOBRIEF = YES +QT_AUTOBRIEF = NO +MULTILINE_CPP_IS_BRIEF = NO +INHERIT_DOCS = YES +SEPARATE_MEMBER_PAGES = NO +TAB_SIZE = 4 +TCL_SUBST = +OPTIMIZE_OUTPUT_FOR_C = NO +OPTIMIZE_OUTPUT_JAVA = NO +OPTIMIZE_FOR_FORTRAN = NO +OPTIMIZE_OUTPUT_VHDL = NO +EXTENSION_MAPPING = +MARKDOWN_SUPPORT = YES +AUTOLINK_SUPPORT = YES +BUILTIN_STL_SUPPORT = NO +CPP_CLI_SUPPORT = NO +SIP_SUPPORT = NO +IDL_PROPERTY_SUPPORT = YES +DISTRIBUTE_GROUP_DOC = YES +#####GROUP_NESTED_COMPOUNDS = NO +SUBGROUPING = YES +INLINE_GROUPED_CLASSES = NO +INLINE_SIMPLE_STRUCTS = NO +TYPEDEF_HIDES_STRUCT = NO +LOOKUP_CACHE_SIZE = 0 + +#--------------------------------------------------------------------------- +# Build related configuration options +#--------------------------------------------------------------------------- +EXTRACT_ALL = YES +EXTRACT_PRIVATE = YES +EXTRACT_PACKAGE = NO +EXTRACT_STATIC = NO +EXTRACT_LOCAL_CLASSES = NO +EXTRACT_LOCAL_METHODS = NO +EXTRACT_ANON_NSPACES = NO +HIDE_UNDOC_MEMBERS = NO +HIDE_UNDOC_CLASSES = NO +HIDE_FRIEND_COMPOUNDS = NO +HIDE_IN_BODY_DOCS = NO +INTERNAL_DOCS = NO +CASE_SENSE_NAMES = YES +HIDE_SCOPE_NAMES = NO +#####HIDE_COMPOUND_REFERENCE= NO +SHOW_INCLUDE_FILES = NO +SHOW_GROUPED_MEMB_INC = NO +FORCE_LOCAL_INCLUDES = NO +INLINE_INFO = NO +SORT_MEMBER_DOCS = NO +SORT_BRIEF_DOCS = NO +SORT_MEMBERS_CTORS_1ST = YES +SORT_GROUP_NAMES = NO +SORT_BY_SCOPE_NAME = NO +STRICT_PROTO_MATCHING = NO +GENERATE_TODOLIST = NO +GENERATE_TESTLIST = NO +GENERATE_BUGLIST = NO +GENERATE_DEPRECATEDLIST= NO +ENABLED_SECTIONS = +MAX_INITIALIZER_LINES = 30 +SHOW_USED_FILES = NO +SHOW_FILES = NO +SHOW_NAMESPACES = NO +FILE_VERSION_FILTER = +LAYOUT_FILE = +CITE_BIB_FILES = + +#--------------------------------------------------------------------------- +# Configuration options related to warning and progress messages +#--------------------------------------------------------------------------- +QUIET = NO +WARNINGS = YES +WARN_IF_UNDOCUMENTED = YES +WARN_IF_DOC_ERROR = YES +WARN_NO_PARAMDOC = NO +#####WARN_AS_ERROR = NO +WARN_FORMAT = "$file:$line: $text" +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# Configuration options related to source browsing +#--------------------------------------------------------------------------- +SOURCE_BROWSER = NO +INLINE_SOURCES = NO +STRIP_CODE_COMMENTS = YES +REFERENCED_BY_RELATION = NO +REFERENCES_RELATION = NO +REFERENCES_LINK_SOURCE = YES +SOURCE_TOOLTIPS = YES +USE_HTAGS = NO +VERBATIM_HEADERS = YES +CLANG_ASSISTED_PARSING = NO +CLANG_OPTIONS = + +#--------------------------------------------------------------------------- +# Configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- +ALPHABETICAL_INDEX = YES +COLS_IN_ALPHA_INDEX = 5 +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# Configuration options related to the HTML output +#--------------------------------------------------------------------------- +GENERATE_HTML = NO +HTML_OUTPUT = dhtm +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +HTML_STYLESHEET = +HTML_EXTRA_STYLESHEET = +HTML_EXTRA_FILES = +HTML_COLORSTYLE_HUE = 220 +HTML_COLORSTYLE_SAT = 100 +HTML_COLORSTYLE_GAMMA = 80 +HTML_TIMESTAMP = NO +HTML_DYNAMIC_SECTIONS = NO +HTML_INDEX_NUM_ENTRIES = 100 +GENERATE_DOCSET = NO +DOCSET_FEEDNAME = "Doxygen generated docs" +DOCSET_BUNDLE_ID = org.doxygen.Project +DOCSET_PUBLISHER_ID = org.doxygen.Publisher +DOCSET_PUBLISHER_NAME = Publisher +GENERATE_HTMLHELP = NO +CHM_FILE = +HHC_LOCATION = +GENERATE_CHI = NO +CHM_INDEX_ENCODING = +BINARY_TOC = NO +TOC_EXPAND = NO +GENERATE_QHP = NO +QCH_FILE = +QHP_NAMESPACE = org.doxygen.Project +QHP_VIRTUAL_FOLDER = doc +QHP_CUST_FILTER_NAME = +QHP_CUST_FILTER_ATTRS = +QHP_SECT_FILTER_ATTRS = +QHG_LOCATION = +GENERATE_ECLIPSEHELP = NO +ECLIPSE_DOC_ID = org.doxygen.Project +DISABLE_INDEX = NO +GENERATE_TREEVIEW = NO +ENUM_VALUES_PER_LINE = 4 +TREEVIEW_WIDTH = 250 +EXT_LINKS_IN_WINDOW = NO +FORMULA_FONTSIZE = 10 +FORMULA_TRANSPARENT = YES +USE_MATHJAX = NO +MATHJAX_FORMAT = HTML-CSS +MATHJAX_RELPATH = http://cdn.mathjax.org/mathjax/latest +MATHJAX_EXTENSIONS = +MATHJAX_CODEFILE = +SEARCHENGINE = YES +SERVER_BASED_SEARCH = NO +EXTERNAL_SEARCH = NO +SEARCHENGINE_URL = +SEARCHDATA_FILE = searchdata.xml +EXTERNAL_SEARCH_ID = +EXTRA_SEARCH_MAPPINGS = + +GENERATE_LATEX = NO +GENERATE_RTF = NO +GENERATE_MAN = NO +GENERATE_DOCBOOK = NO +GENERATE_AUTOGEN_DEF = NO +GENERATE_PERLMOD = NO +CLASS_DIAGRAMS = NO +HAVE_DOT = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the XML output +#--------------------------------------------------------------------------- +GENERATE_XML = YES +XML_OUTPUT = $(XML_OUTPUT) +XML_PROGRAMLISTING = YES + +#--------------------------------------------------------------------------- +# Configuration options related to external references +#--------------------------------------------------------------------------- +TAGFILES = +GENERATE_TAGFILE = +ALLEXTERNALS = NO +EXTERNAL_GROUPS = YES +EXTERNAL_PAGES = YES +PERL_PATH = /usr/bin/perl diff --git a/doc/xsl/class_detail.xsl b/doc/xsl/class_detail.xsl new file mode 100644 index 000000000..a1c626bf6 --- /dev/null +++ b/doc/xsl/class_detail.xsl @@ -0,0 +1,6 @@ + +__Allocator__ +__InputIterator__ +__ConstBufferSequence__ +__MutableBufferSequence__ + diff --git a/doc/xsl/config.xsl b/doc/xsl/config.xsl new file mode 100644 index 000000000..94b4fa682 --- /dev/null +++ b/doc/xsl/config.xsl @@ -0,0 +1,6 @@ + + + + + + diff --git a/doc/xsl/includes.xsl b/doc/xsl/includes.xsl new file mode 100644 index 000000000..ea779b87d --- /dev/null +++ b/doc/xsl/includes.xsl @@ -0,0 +1,15 @@ + + + + + + + {$nl} + Convenience header [include_file boost/{$convenience-header}] + {$nl} + + + + json.hpp + + diff --git a/example/CMakeLists.txt b/example/CMakeLists.txt new file mode 100644 index 000000000..b63d76441 --- /dev/null +++ b/example/CMakeLists.txt @@ -0,0 +1,8 @@ +# +# Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/uri +# diff --git a/include/boost/uri.hpp b/include/boost/uri.hpp new file mode 100644 index 000000000..fbe79723b --- /dev/null +++ b/include/boost/uri.hpp @@ -0,0 +1,15 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/json +// + +#ifndef BOOST_JSON_HPP +#define BOOST_JSON_HPP + +#include + +#endif diff --git a/include/boost/uri/buffer.hpp b/include/boost/uri/buffer.hpp new file mode 100644 index 000000000..95a4de281 --- /dev/null +++ b/include/boost/uri/buffer.hpp @@ -0,0 +1,373 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_BUFFER_HPP +#define BOOST_URI_BUFFER_HPP + +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +class buffer : public view +{ +protected: + char* data_ = nullptr; + std::size_t capacity_ = 0; + + buffer() = default; + + buffer(char* data, std::size_t capacity) + : data_(data) + , capacity_(capacity) + { + BOOST_ASSERT(data != nullptr); + BOOST_ASSERT(capacity > 0); + this->p_.data = data_; + data_[0] = '\0'; + } + + void + reset(char* data, std::size_t capacity) + { + BOOST_ASSERT(data != nullptr); + BOOST_ASSERT(capacity > static_cast< + std::size_t>(this->p_.size)); + data_ = data; + capacity_ = capacity; + this->p_.data = data; + data_[this->p_.size] = '\0'; // null terminate + } + + virtual + void + grow(std::size_t at_least) = 0; + +public: + class const_iterator; + + buffer(buffer const&) = delete; + buffer& operator=(buffer const&) = delete; + virtual ~buffer() = default; + + /** Returns the maximum number of characters which may be stored. + + This does not include the null which terminates all + sequences. + */ + virtual + std::size_t + max_size() const = 0; + + /** Returns the total number of characters which may be stored without reallocating. + + This does not include the null which terminates all + sequences. + */ + std::size_t + capacity() const + { + return capacity_; + } + + /// Return an const_iterator to the beginning of the sequence + const_iterator + begin() noexcept; + + /** Return an const_iterator to one past the end of the sequence + + This does not include the null which terminates all + sequences. + */ + const_iterator + end() noexcept; + + parts& + parts() noexcept + { + return this->p_; + } + + void + clear() + { + this->p_ = {}; + if(capacity_ > 0) + { + this->p_.data = data_; + data_[0] = '\0'; + } + } + + parts::piece + piece_from(const_iterator const& it) const; + + void + append(char c) + { + if(this->p_.size + 1U >= capacity_) + grow(1); + data_[this->p_.size++] = c; + data_[this->p_.size] = '\0'; + } + + void + append(char const* s, unsigned short len) + { + if(static_cast( + this->p_.size + len) >= capacity_) + grow(len); + std::memcpy(&data_[this->p_.size], s, len); + this->p_.size += len; + data_[this->p_.size] = '\0'; + } + + char* + prepare(unsigned short len) + { + if(static_cast( + this->p_.size + len) >= capacity_) + grow(len); + auto s = &data_[this->p_.size]; + this->p_.size += len; + data_[this->p_.size] = '\0'; + return s; + } +}; + +//------------------------------------------------------------------------------ + +class buffer::const_iterator +{ + friend class buffer; + + buffer* b_ = nullptr; + unsigned short offset_ = 0; + + const_iterator(buffer& b, unsigned short offset) + : b_(&b) + , offset_(offset) + { + } + +public: + using value_type = char; + using pointer = char const*; + using reference = char const&; + using difference_type = std::ptrdiff_t; + using iterator_category = + std::random_access_iterator_tag; + + const_iterator() = default; + const_iterator(const_iterator const&) = default; + const_iterator& operator=(const_iterator const&) = default; + + value_type + operator*() + { + BOOST_ASSERT(b_); + return *(b_->data_ + offset_); + } + + const_iterator& + operator++() + { + BOOST_ASSERT(*this < b_->end()); + offset_++; + return *this; + } + + const_iterator + operator++(int) + { + auto tmp = *this; + ++(*this); + return tmp; + } + + const_iterator& + operator--() + { + BOOST_ASSERT(*this > b_->begin()); + offset_--; + return *this; + } + + const_iterator + operator--(int) + { + auto tmp = *this; + ++(*this); + return tmp; + } + + friend + bool + operator==( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ == rhs.offset_; + } + + friend + bool + operator!=( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ != rhs.offset_; + } + + friend + bool + operator<( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ < rhs.offset_; + } + + friend + bool + operator<=( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ <= rhs.offset_; + } + + friend + bool + operator>( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ > rhs.offset_; + } + + friend + bool + operator>=( + const_iterator const& lhs, + const_iterator const& rhs) + { + BOOST_ASSERT(lhs.b_ == rhs.b_); + return lhs.offset_ >= rhs.offset_; + } +}; + +//------------------------------------------------------------------------------ + +inline +auto +buffer:: +begin() noexcept -> + const_iterator +{ + return {*this, 0}; +} + +inline +auto +buffer:: +end() noexcept -> + const_iterator +{ + return {*this, p_.size}; +} + +inline +parts::piece +buffer:: +piece_from(const_iterator const& it) const +{ + BOOST_ASSERT(it.b_ == this); + parts::piece result; + result.offset = it.offset_; + result.size = static_cast( + this->p_.size - result.offset); + return result; +} + +//------------------------------------------------------------------------------ + +template +class static_buffer : public buffer +{ + char buf_[N + 1]; // room for null + + void + grow(std::size_t) override + { + BOOST_THROW_EXCEPTION(std::length_error{ + "static_buffer overflow"}); + } + +public: + static_buffer() + : buffer(buf_, N) + { + } + + std::size_t + max_size() const override + { + return N; + } +}; + +} // uri +} // beast +} // boost + +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +template +class dynamic_buffer : public buffer +{ + static_assert(std::is_same::value_type>::value, + "Allocator requirements not met"); + + void + grow(std::size_t at_least) override + { + boost::ignore_unused(at_least); + BOOST_THROW_EXCEPTION(std::length_error{ + "static_buffer overflow"}); + } + +public: + std::size_t + max_size() const override + { + return 0xffffffff; + } +}; + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/config.hpp b/include/boost/uri/config.hpp new file mode 100644 index 000000000..29078f17b --- /dev/null +++ b/include/boost/uri/config.hpp @@ -0,0 +1,57 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_CONFIG_HPP +#define BOOST_URI_CONFIG_HPP + +#include + +namespace boost { +namespace uri { + +#ifndef BOOST_URI_STANDALONE + +/// The type of string view used by the library. +using string_view = boost::string_view; + +/// The type of error code used by the library. +using error_code = boost::system::error_code; + +/// The type of system error thrown by the library. +using system_error = boost::system::system_error; + +/// The type of error category used by the library. +using error_category = boost::system::error_category; + +/// The type of error condition used by the library. +using error_condition = boost::system::error_condition; + +#ifdef GENERATING_DOCUMENTATION +/// Returns the generic error category used by the library. +error_category const& +generic_category(); +#else +using boost::system::generic_category; +#endif + +#else + +using error_code = std::error_code; +using error_category = std::error_category; +using error_condition = std::error_condition; +using string_view = std::string_view; +using system_error = std::system_error; +using std::generic_category; + +#endif + +} // uri +} // boost + +#endif diff --git a/include/boost/uri/detail/config.hpp b/include/boost/uri/detail/config.hpp new file mode 100644 index 000000000..c49b39fe6 --- /dev/null +++ b/include/boost/uri/detail/config.hpp @@ -0,0 +1,242 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_DETAIL_CONFIG_HPP +#define BOOST_URI_DETAIL_CONFIG_HPP + +#include +#ifndef BOOST_URI_STANDALONE +# include +# include +# include +# include +#else +# include +# include +# include +#endif +#include + +// detect 32/64 bit +#if UINTPTR_MAX == UINT64_MAX +# define BOOST_URI_ARCH 64 +#elif UINTPTR_MAX == UINT32_MAX +# define BOOST_URI_ARCH 32 +#else +# error Unknown or unsupported architecture, please open an issue +#endif + +// VFALCO Copied from +// This is a derivative work. +#ifdef __has_cpp_attribute +// clang-6 accepts [[nodiscard]] with -std=c++14, but warns about it -pedantic +# if __has_cpp_attribute(nodiscard) && !(defined(__clang__) && (__cplusplus < 201703L)) +# define BOOST_URI_NODISCARD [[nodiscard]] +# else +# define BOOST_URI_NODISCARD +# endif +#else +# define BOOST_URI_NODISCARD +#endif + +#ifndef BOOST_URI_FORCEINLINE +# ifdef _MSC_VER +# define BOOST_URI_FORCEINLINE __forceinline +# else +# define BOOST_URI_FORCEINLINE inline +# endif +#endif + +#ifndef BOOST_NO_EXCEPTIONS +# define BOOST_URI_THROW(x) throw(x) +#else +# define BOOST_URI_THROW(x) do{}while(0) +#endif + +#ifndef BOOST_URI_STANDALONE +# define BOOST_URI_ASSERT BOOST_ASSERT +#else +# define BOOST_URI_ASSERT assert +#endif + +#define BOOST_URI_STATIC_ASSERT( ... ) static_assert(__VA_ARGS__, #__VA_ARGS__) + +#ifndef BOOST_URI_NO_SSE2 +# if (defined(_M_IX86) && _M_IX86_FP == 2) || \ + defined(_M_X64) || defined(__SSE2__) +# define BOOST_URI_USE_SSE2 +# endif +#endif + +#ifndef BOOST_URI_STANDALONE +# if defined(GENERATING_DOCUMENTATION) +# define BOOST_URI_DECL +# elif defined(BOOST_URI_HEADER_ONLY) +# define BOOST_URI_DECL inline +# else +# if (defined(BOOST_URI_DYN_LINK) || defined(BOOST_ALL_DYN_LINK)) && !defined(BOOST_URI_STATIC_LINK) +# if defined(BOOST_URI_SOURCE) +# define BOOST_URI_DECL BOOST_SYMBOL_EXPORT +# define BOOST_URI_BUILD_DLL +# else +# define BOOST_URI_DECL BOOST_SYMBOL_IMPORT +# endif +# endif // shared lib +# ifndef BOOST_URI_DECL +# define BOOST_URI_DECL +# endif +# if !defined(BOOST_URI_SOURCE) && !defined(BOOST_ALL_NO_LIB) && !defined(BOOST_URI_NO_LIB) +# define BOOST_LIB_NAME boost_uri +# if defined(BOOST_ALL_DYN_LINK) || defined(BOOST_URI_DYN_LINK) +# define BOOST_DYN_LINK +# endif +//# include +# endif // auto-linking disabled +# endif +#else +# ifdef BOOST_URI_HEADER_ONLY +# define BOOST_URI_DECL inline +# else +# define BOOST_URI_DECL +# endif +#endif + +// These macros are private, for tests, do not change +// them or else previously built libraries won't match. +#ifndef BOOST_URI_MAX_OBJECT_SIZE +# define BOOST_URI_NO_MAX_OBJECT_SIZE +# define BOOST_URI_MAX_OBJECT_SIZE 0x7ffffffe +#endif +#ifndef BOOST_URI_MAX_ARRAY_SIZE +# define BOOST_URI_NO_MAX_ARRAY_SIZE +# define BOOST_URI_MAX_ARRAY_SIZE 0x7ffffffe +#endif +#ifndef BOOST_URI_MAX_STRING_SIZE +# define BOOST_URI_NO_MAX_STRING_SIZE +# define BOOST_URI_MAX_STRING_SIZE 0x7ffffffe +#endif +#ifndef BOOST_URI_MAX_STACK_SIZE +# define BOOST_URI_NO_MAX_STACK_SIZE +# define BOOST_URI_MAX_STACK_SIZE ((::size_t)(-1)) +#endif +#ifndef BOOST_URI_PARSER_BUFFER_SIZE +# define BOOST_URI_NO_PARSER_BUFFER_SIZE +# define BOOST_URI_PARSER_BUFFER_SIZE 2048 +#endif + +namespace boost { +namespace uri { +namespace detail { + +template +struct make_void +{ + using type =void; +}; + +template +using void_t = typename + make_void::type; + +template +struct remove_const +{ + using type = T; +}; + +template +struct remove_const +{ + using type = T; +}; + +template +struct remove_reference +{ + using type = T; +}; + +template +struct remove_reference +{ + using type = T; +}; + +template +constexpr +typename remove_reference::type&& +move(T&& t) noexcept +{ + return static_cast::type&&>(t); +} + +template +inline +T +exchange(T& t, U u) noexcept +{ + T v = move(t); + t = move(u); + return v; +} + +template +using is_string_viewish = typename std::enable_if< + std::is_convertible< + T const&, string_view>::value && + ! std::is_convertible< + T const&, char const*>::value + >::type; + +/* This is a derivative work, original copyright: + + Copyright Eric Niebler 2013-present + + Use, modification and distribution is subject to the + Boost Software License, Version 1.0. (See accompanying + file LICENSE_1_0.txt or copy at + http://www.boost.org/LICENSE_1_0.txt) + + Project home: https://github.com/ericniebler/range-v3 +*/ +template +struct static_const +{ + static constexpr T value {}; +}; +template +constexpr T static_const::value; + +#define BOOST_URI_INLINE_VARIABLE(name, type) \ + namespace \ + { \ + constexpr auto& name = \ + ::boost::uri::detail::static_const::value; \ + } + +struct primary_template +{ +}; + +template +using is_specialized = + std::integral_constant::value>; + +template +using remove_cr = + typename remove_const< + typename remove_reference::type>::type; + +} // detail +} // uri +} // boost + +#endif diff --git a/include/boost/uri/detail/rfc3986.hpp b/include/boost/uri/detail/rfc3986.hpp new file mode 100644 index 000000000..f3348d42f --- /dev/null +++ b/include/boost/uri/detail/rfc3986.hpp @@ -0,0 +1,23 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_DETAIL_RFC3986_HPP +#define BOOST_URI_DETAIL_RFC3986_HPP + +namespace boost { +namespace beast { +namespace uri { +namespace detail { + +} // detail +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/detail/types.hpp b/include/boost/uri/detail/types.hpp new file mode 100644 index 000000000..b0d55d36c --- /dev/null +++ b/include/boost/uri/detail/types.hpp @@ -0,0 +1,25 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_DETAIL_TYPES_HPP +#define BOOST_URI_DETAIL_TYPES_HPP + +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/error.hpp b/include/boost/uri/error.hpp new file mode 100644 index 000000000..92beceb24 --- /dev/null +++ b/include/boost/uri/error.hpp @@ -0,0 +1,45 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_ERROR_HPP +#define BOOST_URI_ERROR_HPP + +#include + +namespace boost { +namespace uri { + +/** Error codes returned by URI operations +*/ +enum class error +{ + /// An input did not match a structural element (soft error) + mismatch = 1, + + /// A syntax error occurred + syntax, + + /// The parser encountered an invalid input + invalid +}; + +enum class condition +{ + parse_error = 1 +}; + +} // uri +} // boost + +#include +#ifdef BOOST_URI_HEADER_ONLY +#include +#endif + +#endif diff --git a/include/boost/uri/impl/error.hpp b/include/boost/uri/impl/error.hpp new file mode 100644 index 000000000..c14ade99b --- /dev/null +++ b/include/boost/uri/impl/error.hpp @@ -0,0 +1,63 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_IMPL_ERROR_HPP +#define BOOST_URI_IMPL_ERROR_HPP + +#include + +#ifndef BOOST_URI_STANDALONE + +namespace boost { +namespace system { +template<> +struct is_error_code_enum<::boost::uri::error> +{ + static bool const value = true; +}; +template<> +struct is_error_condition_enum<::boost::uri::condition> +{ + static bool const value = true; +}; +} // system +} // boost + +#else + +namespace std { +template<> +struct is_error_code_enum<::boost::uri::error> +{ + static bool const value = true; +}; +template<> +struct is_error_condition_enum<::boost::uri::condition> +{ + static bool const value = true; +}; +} // std + +#endif + +namespace boost { +namespace uri { + +BOOST_URI_DECL +error_code +make_error_code(error e); + +BOOST_URI_DECL +error_condition +make_error_condition(condition c); + +} // uri +} // boost + +#endif diff --git a/include/boost/uri/impl/error.ipp b/include/boost/uri/impl/error.ipp new file mode 100644 index 000000000..9e6513c38 --- /dev/null +++ b/include/boost/uri/impl/error.ipp @@ -0,0 +1,93 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_IMPL_ERROR_IPP +#define BOOST_URI_IMPL_ERROR_IPP + +#include + +namespace boost { +namespace uri { + +error_code +make_error_code(error e) +{ + struct codes : error_category + { + const char* + name() const noexcept override + { + return "boost.uri"; + } + + std::string + message(int ev) const override + { + switch(static_cast(ev)) + { + default: + case error::mismatch: return "mismatch"; + case error::syntax: return "syntax"; + case error::invalid: return "invalid"; + } + } + + error_condition + default_error_condition( + int ev) const noexcept override + { + switch(static_cast(ev)) + { + default: + return {ev, *this}; + + case error::mismatch: + case error::syntax: + case error::invalid: + return condition::parse_error; + } + } + }; + + static codes const cat{}; + return error_code{static_cast< + std::underlying_type::type>(e), cat}; +} + +error_condition +make_error_condition(condition c) +{ + struct codes : error_category + { + const char* + name() const noexcept override + { + return "boost.uri"; + } + + std::string + message(int cv) const override + { + switch(static_cast(cv)) + { + default: + case condition::parse_error: + return "parsing error"; + } + } + }; + static codes const cat{}; + return error_condition{static_cast< + std::underlying_type::type>(c), cat}; +} + +} // uri +} // boost + +#endif diff --git a/include/boost/uri/impl/parse.ipp b/include/boost/uri/impl/parse.ipp new file mode 100644 index 000000000..a9c708ed2 --- /dev/null +++ b/include/boost/uri/impl/parse.ipp @@ -0,0 +1,607 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_IMPL_PARSE_IPP +#define BOOST_URI_IMPL_PARSE_IPP + +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +namespace detail { + +/* References: + + Uniform Resource Identifier (URI): Generic Syntax + https://tools.ietf.org/html/rfc3986 + + Hypertext Transfer Protocol (HTTP/1.1): Semantics and Content + https://tools.ietf.org/html/rfc7231 + + Internationalized Resource Identifiers (IRIs) + https://tools.ietf.org/html/rfc3987 + + URL Living Standard + https://url.spec.whatwg.org + + java.net Class URI + https://docs.oracle.com/javase/7/docs/api/java/net/URI.html + + + + Generic URI + + [scheme:]scheme-specific-part[#fragment] + + Hierarchical URI + + [scheme:][//authority][path][?query][#fragment] + + bool is_hierarchical() const + bool is_opaque() const +*/ + +template +struct parser_impl +{ + bool + is_alpha(char c) + { + unsigned constexpr a = 'a'; + return ((static_cast(c) | 32) - a) < 26U; + } + + bool + is_digit(char c) + { + unsigned constexpr zero = '0'; + return (static_cast(c) - zero) < 10; + } + + /* + unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + */ + bool + is_unreserved(char c) + { + return + (c >= 'A' && c <= 'Z') || + (c >= 'a' && c <= 'z') || + (c >= '0' && c <= '9') || + c == '-' || c == '.' || + c == '_' || c == '~' + ; + } + + /* + sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + / "*" / "+" / "," / ";" / "=" + */ + bool + is_sub_delim(char c) + { + return + c == '!' || c == '$' || c == '&' || c == '\'' || + c == '(' || c == ')' || c == '*' || c == '+' || + c == ',' || c == ';' || c == '=' + ; + } + + int + hex_val(char c) + { + if(c >= '0' && c <= '9') + return c - '0'; + if(c >= 'A' && c <= 'F') + return c - 'A' + 10; + if(c >= 'a' && c <= 'f') + return c - 'a' + 10; + return -1; + } + + char + hex_digit(int v) + { + if(v < 10) + return static_cast( + '0' + v); + return static_cast( + 'A' + v - 10); + } + + char + to_lower(char c) + { + if((static_cast(c) - 65U) < 26) + return c + ('a' - 'A'); + return c; + } + + //-------------------------------------------------------------------------- + + /* + pct-encoded = "%" HEXDIG HEXDIG + + Caller is responsible for consuming the '%' + */ + void + parse_pct_encoded( + char& c, + input& in, + error_code& ec) + { + if(in.remain() < 2) + { + // short input + ec = error::syntax; + return; + } + auto d1 = hex_val(in[0]); + if(d1 == -1) + { + // invalid hex digit + ec = error::syntax; + return; + } + auto d2 = hex_val(in[1]); + if(d2 == -1) + { + // invalid hex digit + ec = uri::error::invalid; + return; + } + c = static_cast( + 16 * d1 + d2); + in += 2; + } + + // append a percent encoded char to the + // current string. the hex digits are normalized + void + append_pct_encoded(buffer& out, char c) + { + auto it = out.prepare(3); + *it++ = '%'; + *it++ = hex_digit( + static_cast(c) / 16); + *it++ = hex_digit( + static_cast(c) % 16); + } + + //-------------------------------------------------------------------------- + + /* + pchar = unreserved / pct-encoded / sub-delims / ":" / "@" + */ + void + parse_pchar( + buffer& out, + input& in, + error_code& ec) + { + /* + unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + + sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + / "*" / "+" / "," / ";" / "=" + */ + auto const is_pchar = + [&](char c) + { + return + is_alpha(c) || + is_digit(c) || + c == '-' || c == '.' || c == '_' || c == '~' || + c == '!' || c == '$' || c == '&' || c == '\'' || + c == '(' || c == ')' || c == '*' || c == '+' || + c == ',' || c == ';' || c == '=' || + c == ':' || c == '@' + ; + }; + + if(is_pchar(*in)) + { + out.append(*in++); + return; + } + + if(*in != '%') + { + ec = error::mismatch; + return; + } + in++; + char c; + parse_pct_encoded(c, in, ec); + if(ec) + return; + if(is_unreserved(c)) + { + out.append(c); + return; + } + + /* VFALCO Small problem here + https://tools.ietf.org/html/rfc3986#section-2.2 + URI producing applications should percent-encode data octets that + correspond to characters in the reserved set unless these characters + are specifically allowed by the URI scheme to represent data in that + component. + + How do we know if the URI scheme considers `c` a delimiter? + Maybe we need to use CRTP or something as a customization point. + */ + append_pct_encoded(out, c); + } + + /* + qchar = unreserved / pct-encoded / sub-delims / ":" / "@" / '/' / "?" + */ + void + parse_qchar( + buffer& out, + input& in, + error_code& ec) + { + /* + unreserved = ALPHA / DIGIT / "-" / "." / "_" / "~" + + sub-delims = "!" / "$" / "&" / "'" / "(" / ")" + / "*" / "+" / "," / ";" / "=" + */ + auto const is_qchar = + [&](char c) + { + return + is_alpha(c) || + is_digit(c) || + c == '-' || c == '.' || c == '_' || c == '~' || + c == '!' || c == '$' || c == '&' || c == '\'' || + c == '(' || c == ')' || c == '*' || c == '+' || + c == ',' || c == ';' || c == '=' || + c == ':' || c == '@' || c == '/' || c == '?' + ; + }; + + if(is_qchar(*in)) + { + out.append(*in++); + return; + } + + if(*in != '%') + { + ec = error::mismatch; + return; + } + in++; + char c; + parse_pct_encoded(c, in, ec); + if(ec) + return; + if(is_unreserved(c)) + { + out.append(c); + return; + } + + /* VFALCO Small problem here + https://tools.ietf.org/html/rfc3986#section-2.2 + URI producing applications should percent-encode data octets that + correspond to characters in the reserved set unless these characters + are specifically allowed by the URI scheme to represent data in that + component. + + How do we know if the URI scheme considers `c` a delimiter? + Maybe we need to use CRTP or something as a customization point. + */ + append_pct_encoded(out, c); + } + + //-------------------------------------------------------------------------- + + /* + segment = *pchar + */ + void + parse_segment( + buffer& out, + input& in, + error_code& ec) + { + for(;;) + { + if(in.empty()) + break; + parse_pchar(out, in, ec); + if(ec) + { + if(ec != error::mismatch) + return; + ec.clear(); + break; + } + } + } + + //-------------------------------------------------------------------------- + + /* + https://tools.ietf.org/html/rfc3986#section-3.2 + The authority component is preceded by a double slash ("//") and is + terminated by the next slash ("/"), question mark ("?"), or number + sign ("#") character, or by the end of the URI. + */ + void + parse_authority( + buffer& out, + input& in, + error_code& ec) + { + boost::ignore_unused(ec); + auto start = out.end(); + while(! in.empty()) + { + if( *in == '/' || + *in == '?' || + *in == '#') + break; + out.append(*in++); + } + out.parts().authority = out.piece_from(start); + } + + /* + path-abempty = *( "/" segment ) + segment = *pchar + + */ + void + parse_path_abempty( + buffer& out, + input& in, + error_code& ec) + { + if(in.empty()) + { + auto start = out.end(); + // normalize: path is not empty + out.append('/'); + out.parts().path = out.piece_from(start); + return; + } + auto start = out.end(); + while(! in.empty() && *in == '/') + { + in++; + out.append('/'); + parse_segment(out, in, ec); + if(ec) + return; + } + out.parts().path = out.piece_from(start); + } + + //-------------------------------------------------------------------------- + + /* + scheme = ALPHA *( ALPHA / DIGIT / "+" / "-" / "." ) ":" + */ + void + parse_scheme( + buffer& out, + input& in, + error_code& ec) + { + if(in.empty()) + { + // bad scheme + ec = error::syntax; + return; + } + if(! is_alpha(*in)) + { + // bad scheme + ec = error::syntax; + return; + } + + auto start = out.end(); + for(;;) + { + out.append(to_lower(*in++)); + if(in.empty()) + { + // bad scheme + ec = error::syntax; + return; + } + if( ! is_alpha(*in) && + ! is_digit(*in) && + *in != '+' && + *in != '-' && + *in != '.') + break; + } + + out.parts().scheme = out.piece_from(start); + out.parts().scheme_value = string_to_scheme(out.scheme()); + } + + /* + hier-part = "//" authority path-abempty + / path-absolute + / path-rootless + / path-empty + */ + void + parse_hier_part( + buffer& out, + input& in, + error_code& ec) + { + if( in.remain() >= 2 && + in[0] == '/' && + in[1] == '/') + { + in += 2; + auto s = out.prepare(2); + s[0] = '/'; + s[1] = '/'; + parse_authority(out, in, ec); + if(ec) + return; + parse_path_abempty(out, in, ec); + if(ec) + return; + } + + } + + /* + query = *qchar + + qchar = pchar / "/" / "?" + */ + void + parse_query( + buffer& out, + input& in, + error_code& ec) + { + auto start = out.end(); + for(;;) + { + if(in.empty()) + break; + parse_qchar(out, in, ec); + if(ec) + { + if(ec != error::mismatch) + return; + ec.clear(); + break; + } + } + if(out.end() != start) + out.parts().query = out.piece_from(start); + } + + //-------------------------------------------------------------------------- + + /* + absolute-URI = scheme ":" hier-part [ "?" query ] + + https://tools.ietf.org/html/rfc3986#section-4.3 + + To allow for transition to absoluteURIs in all requests in future + versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI + form in requests, even though HTTP/1.1 clients will only generate + them in requests to proxies. + */ + void + parse_absolute_form( + buffer& out, + input& in, + error_code& ec) + { + // scheme + parse_scheme(out, in, ec); + if(ec) + return; + + // ":" + if(in.empty()) + { + ec = error::syntax; + return; + } + if(*in++ != ':') + { + ec = error::syntax; + return; + } + out.append(':'); + + // hier-part + parse_hier_part(out, in, ec); + if(ec) + return; + + // "?" + if(in.empty()) + return; + if(*in != '?') + { + ec = error::syntax; + return; + } + in++; + out.append('?'); + + // query + parse_query(out, in, ec); + if(ec) + return; + + if(! in.empty()) + { + // spurious characters + ec = error::syntax; + return; + } + } +}; + +using parser = parser_impl; + +} // detail + +//------------------------------------------------------------------------------ + +/* + absolute-URI = scheme ":" hier-part [ "?" query ] + + https://tools.ietf.org/html/rfc3986#section-4.3 + + To allow for transition to absoluteURIs in all requests in future + versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI + form in requests, even though HTTP/1.1 clients will only generate + them in requests to proxies. +*/ +inline +void +parse_absolute_form( + buffer& out, + string_view s, + error_code& ec) +{ + input in{s}; + out.clear(); + ec.assign(0, ec.category()); + try + { + detail::parser p; + p.parse_absolute_form(out, in, ec); + } + catch(std::length_error const&) + { + //ec = error::overflow + } +} + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/impl/scheme.ipp b/include/boost/uri/impl/scheme.ipp new file mode 100644 index 000000000..e9b180970 --- /dev/null +++ b/include/boost/uri/impl/scheme.ipp @@ -0,0 +1,167 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_IMPL_SCHEME_IPP +#define BOOST_URI_IMPL_SCHEME_IPP + +#include + +namespace boost { +namespace beast { +namespace uri { + +namespace detail { + +template +known_scheme +string_to_scheme(string_view s) +{ + switch(s.size()) + { + case 2: // ws + if( tolower(s[0]) == 'w' && + tolower(s[1]) == 's') + return known_scheme::ws; + break; + + case 3: + switch(tolower(s[0])) + { + case 'w': // wss + if( tolower(s[1]) == 's' && + tolower(s[2]) == 's') + return known_scheme::wss; + break; + + case 'f': // ftp + if( tolower(s[1]) == 't' && + tolower(s[2]) == 'p') + return known_scheme::ftp; + break; + + default: + break; + } + break; + + case 4: + switch(tolower(s[0])) + { + case 'f': // file + if( tolower(s[1]) == 'i' && + tolower(s[2]) == 'l' && + tolower(s[3]) == 'e') + return known_scheme::file; + break; + + case 'h': // http + if( tolower(s[1]) == 't' && + tolower(s[2]) == 't' && + tolower(s[3]) == 'p') + return known_scheme::http; + break; + + default: + break; + } + break; + + case 5: // https + if( tolower(s[0]) == 'h' && + tolower(s[1]) == 't' && + tolower(s[2]) == 't' && + tolower(s[3]) == 'p' && + tolower(s[4]) == 's') + return known_scheme::https; + break; + + case 6: + if( tolower(s[0]) == 'g' && + tolower(s[1]) == 'o' && + tolower(s[2]) == 'p' && + tolower(s[3]) == 'h' && + tolower(s[4]) == 'e' && + tolower(s[5]) == 'r') + return known_scheme::gopher; + break; + + default: + break; + } + return known_scheme::unknown; +} + +template +string_view +to_string(known_scheme s) +{ + switch(s) + { + case known_scheme::ftp: return "ftp"; + case known_scheme::file: return "file"; + case known_scheme::gopher: return "gopher"; + case known_scheme::http: return "http"; + case known_scheme::https: return "https"; + case known_scheme::ws: return "ws"; + case known_scheme::wss: return "wss"; + default: + break; + } + return ""; +} + +template +bool +is_special(known_scheme s) +{ + switch(s) + { + case known_scheme::ftp: + case known_scheme::file: + case known_scheme::gopher: + case known_scheme::http: + case known_scheme::https: + case known_scheme::ws: + case known_scheme::wss: + return true; + + default: + break; + } + return false; +} + +} // detail + +inline +known_scheme +string_to_scheme(string_view s) +{ + return detail::string_to_scheme(s); +} + +inline +string_view +to_string(known_scheme s) +{ + return detail::to_string(s); +} + +inline +bool +is_special(known_scheme s) +{ + return detail::is_special(s); +} + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/impl/uri.ipp b/include/boost/uri/impl/uri.ipp new file mode 100644 index 000000000..e9b180970 --- /dev/null +++ b/include/boost/uri/impl/uri.ipp @@ -0,0 +1,167 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_IMPL_SCHEME_IPP +#define BOOST_URI_IMPL_SCHEME_IPP + +#include + +namespace boost { +namespace beast { +namespace uri { + +namespace detail { + +template +known_scheme +string_to_scheme(string_view s) +{ + switch(s.size()) + { + case 2: // ws + if( tolower(s[0]) == 'w' && + tolower(s[1]) == 's') + return known_scheme::ws; + break; + + case 3: + switch(tolower(s[0])) + { + case 'w': // wss + if( tolower(s[1]) == 's' && + tolower(s[2]) == 's') + return known_scheme::wss; + break; + + case 'f': // ftp + if( tolower(s[1]) == 't' && + tolower(s[2]) == 'p') + return known_scheme::ftp; + break; + + default: + break; + } + break; + + case 4: + switch(tolower(s[0])) + { + case 'f': // file + if( tolower(s[1]) == 'i' && + tolower(s[2]) == 'l' && + tolower(s[3]) == 'e') + return known_scheme::file; + break; + + case 'h': // http + if( tolower(s[1]) == 't' && + tolower(s[2]) == 't' && + tolower(s[3]) == 'p') + return known_scheme::http; + break; + + default: + break; + } + break; + + case 5: // https + if( tolower(s[0]) == 'h' && + tolower(s[1]) == 't' && + tolower(s[2]) == 't' && + tolower(s[3]) == 'p' && + tolower(s[4]) == 's') + return known_scheme::https; + break; + + case 6: + if( tolower(s[0]) == 'g' && + tolower(s[1]) == 'o' && + tolower(s[2]) == 'p' && + tolower(s[3]) == 'h' && + tolower(s[4]) == 'e' && + tolower(s[5]) == 'r') + return known_scheme::gopher; + break; + + default: + break; + } + return known_scheme::unknown; +} + +template +string_view +to_string(known_scheme s) +{ + switch(s) + { + case known_scheme::ftp: return "ftp"; + case known_scheme::file: return "file"; + case known_scheme::gopher: return "gopher"; + case known_scheme::http: return "http"; + case known_scheme::https: return "https"; + case known_scheme::ws: return "ws"; + case known_scheme::wss: return "wss"; + default: + break; + } + return ""; +} + +template +bool +is_special(known_scheme s) +{ + switch(s) + { + case known_scheme::ftp: + case known_scheme::file: + case known_scheme::gopher: + case known_scheme::http: + case known_scheme::https: + case known_scheme::ws: + case known_scheme::wss: + return true; + + default: + break; + } + return false; +} + +} // detail + +inline +known_scheme +string_to_scheme(string_view s) +{ + return detail::string_to_scheme(s); +} + +inline +string_view +to_string(known_scheme s) +{ + return detail::to_string(s); +} + +inline +bool +is_special(known_scheme s) +{ + return detail::is_special(s); +} + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/input.hpp b/include/boost/uri/input.hpp new file mode 100644 index 000000000..74983d818 --- /dev/null +++ b/include/boost/uri/input.hpp @@ -0,0 +1,176 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_INPUT_HPP +#define BOOST_URI_INPUT_HPP + +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +/** Represents an input character sequence. +*/ +class input +{ + char const* it_ = nullptr; + char const* end_ = nullptr; + +public: + /** Allows input sequence modifications to be rolled back + */ + class guard; + + /// Constructor + input() = default; + + /// Constructor + input(input const&) = default; + + /// Assignment + input& operator=(input const&) = default; + + /// Constructor + explicit + input(string_view s) noexcept + : it_(s.data()) + , end_(s.data() + s.size()) + { + } + + /// Returns an iterator to the end of the input sequence + char const* + end() const noexcept + { + return end_; + } + + /// Returns `true` if no characters are remaining + bool + empty() const noexcept + { + return it_ >= end_; + } + + /// Return the number of characters remaining + std::size_t + remain() const noexcept + { + return static_cast(end_ - it_); + } + + /// Return an iterator to the current character + char const* + get() const noexcept + { + return it_; + } + + /// Return the current character + char const& + operator*() const noexcept + { + BOOST_ASSERT(it_ < end_); + return *it_; + } + + /// Return the character at a particular offset + char const& + operator[](int offset) const noexcept + { + BOOST_ASSERT(it_ + offset < end_); + return it_[offset]; + } + + /// Advance the current character + input& + operator++() noexcept + { + BOOST_ASSERT(it_ < end_); + ++it_; + return *this; + } + + /// Advance the current character + input + operator++(int) noexcept + { + auto temp = *this; + ++(*this); + return temp; + } + + input& + operator+=(int n) noexcept + { + it_ += n; + return *this; + } +}; + +//------------------------------------------------------------------------------ + +class input::guard +{ + char const*& it_; + char const* saved_; + bool revert_ = true; + +public: + guard() = delete; + guard(guard const&) = delete; + guard& operator=(guard const&) = delete; + + /// Constructor + explicit + guard(input& in) + : it_(in.it_) + , saved_(in.it_) + { + } + + /// Constructor + guard(guard&& other) + : it_(other.it_) + , saved_(other.saved_) + , revert_(other.revert_) + { + other.revert_ = false; + } + + /// Destructor + ~guard() + { + if(revert_) + it_ = saved_; + } + + /// Returns an iterator to the beginning of the guarded sequence + char const* + begin() const noexcept + { + return saved_; + } + + /// Commit to the current input iterator position + void + commit() + { + BOOST_ASSERT(revert_); + revert_ = false; + } +}; + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/make_shared.hpp b/include/boost/uri/make_shared.hpp new file mode 100644 index 000000000..162767e62 --- /dev/null +++ b/include/boost/uri/make_shared.hpp @@ -0,0 +1,178 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_MAKE_SHARED_HPP +#define BOOST_URI_MAKE_SHARED_HPP + +#include +#include +#include +#include +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +namespace detail { + +template +class extra_alloc + : private beast::detail::empty_base_optimization +{ + template + friend class extra_alloc; + + std::size_t extra_; + +public: + using is_always_equal = std::false_type; + using value_type = typename + beast::detail::allocator_traits::template rebind_alloc>::value_type; + using pointer = typename + beast::detail::allocator_traits::template rebind_alloc>::pointer; + using const_pointer = typename + beast::detail::allocator_traits::template rebind_alloc>::const_pointer; + using size_type = typename + beast::detail::allocator_traits::template rebind_alloc>::size_type; + using difference_type = typename + beast::detail::allocator_traits::template rebind_alloc>::difference_type; + + template + struct rebind + { + using other = extra_alloc; + }; + + extra_alloc( + std::size_t extra, + Allocator const& alloc) + : beast::detail::empty_base_optimization(alloc) + , extra_(extra) + { + } + + template + extra_alloc(extra_alloc const& other) noexcept + : beast::detail::empty_base_optimization(other.member()) + , extra_(other.extra_) + { + } + + pointer + allocate(size_type n) + { + BOOST_ASSERT(n == 1); + using U = typename boost::type_with_alignment< + alignof(value_type)>::type; + auto constexpr S = sizeof(U); + using A = typename beast::detail::allocator_traits< + Allocator>::template rebind_alloc; + A a{this->member()}; + return reinterpret_cast( + std::allocator_traits
::allocate(a, + (n * sizeof(value_type) + extra_ + S - 1) / S)); + } + + void + deallocate(pointer p, size_type n) + { + BOOST_ASSERT(n == 1); + using U = typename boost::type_with_alignment< + alignof(value_type)>::type; + auto constexpr S = sizeof(U); + using A = typename beast::detail::allocator_traits< + Allocator>::template rebind_alloc; + A a{this->member()}; + std::allocator_traits::deallocate(a, + reinterpret_cast(p), + (n * sizeof(value_type) + extra_ + S - 1) / S); + } + +#if defined(BOOST_LIBSTDCXX_VERSION) && BOOST_LIBSTDCXX_VERSION < 60000 + template + void + construct(U* ptr, Args&&... args) + { + ::new((void*)ptr) U(std::forward(args)...); + } + + template + void + destroy(U* ptr) + { + ptr->~U(); + } +#endif + + template + friend + bool + operator==( + extra_alloc const& lhs, + extra_alloc const& rhs) + { + return + lhs.member() == rhs.member() && + lhs.extra_ == rhs.extra_; + } + + template + friend + bool + operator!=( + extra_alloc const& lhs, + extra_alloc const& rhs) + { + return ! (lhs == rhs); + } +}; + +struct shared_view_impl : view +{ + shared_view_impl(view const& v) + : view(v.cparts(), + reinterpret_cast< + char const*>(this + 1)) + { + } +}; + +} // detail + +template< + class Allocator = std::allocator> +std::shared_ptr +make_shared( + view const& v, + Allocator const& alloc = Allocator{}) +{ + using T = detail::shared_view_impl; + auto p = std::allocate_shared( + detail::extra_alloc( + v.str().size(), alloc), v); + std::memcpy( + reinterpret_cast(p.get() + 1), + v.str().data(), + v.str().size()); + return p; +} + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/parse.hpp b/include/boost/uri/parse.hpp new file mode 100644 index 000000000..ab29fa144 --- /dev/null +++ b/include/boost/uri/parse.hpp @@ -0,0 +1,106 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_PARSE_HPP +#define BOOST_URI_PARSE_HPP + +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +/* + 5.3 Request Target + https://tools.ietf.org/html/rfc7230#section-5.3 + + request-target = origin-form + / absolute-form + / authority-form + / asterisk-form + + origin-form = absolute-path [ "?" query ] + + absolute-form = absolute-URI + + authority-form = authority + + asterisk-form = "*" +*/ + +/* Parse a URI in origin form. + + The origin form is used in direct requests to an + origin server, except for CONNECT or OPTIONS *. + + @par Example + + The request-target is this example HTTP request + uses origin form: + + @code + GET /index.html HTTP/1.1\r\n + @endcode + + @par BNF + + @code + origin-form = absolute-path [ "?" query ] + @endcode +*/ +void +parse_origin_form(error_code& ec); + +/** Parse a URI string in absolute form. + + Absolute form is used in HTTP requests to a proxy, + except for CONNECT or OPTIONS * + + absolute-URI = scheme ":" hier-part [ "?" query ] + + https://tools.ietf.org/html/rfc3986#section-4.3 + + To allow for transition to absoluteURIs in all requests in future + versions of HTTP, all HTTP/1.1 servers MUST accept the absoluteURI + form in requests, even though HTTP/1.1 clients will only generate + them in requests to proxies. +*/ +void +parse_absolute_form( + buffer& out, + string_view s, + error_code& ec); + +/* Used in CONNECT requests + + The authority-form of request-target is only used for CONNECT requests + https://tools.ietf.org/html/rfc7230#section-5.3.3 + + Although CONNECT must exclude userinfo and '@' we parse it anyway and + let the caller decide what to do with it. + + authority-form = authority +*/ +void +parse_authority_form(error_code& ec); + +/* Used for server-wide OPTIONS requests +*/ +void +parse_asterisk_form(error_code& ec); + +} // uri +} // beast +} // boost + +#include + +#endif diff --git a/include/boost/uri/parts.hpp b/include/boost/uri/parts.hpp new file mode 100644 index 000000000..cca5e1f25 --- /dev/null +++ b/include/boost/uri/parts.hpp @@ -0,0 +1,88 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_PARTS_HPP +#define BOOST_URI_PARTS_HPP + +#include +#include +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +/** Represents parts of a URI in linear, normalized form. +*/ +struct parts +{ + struct piece + { + unsigned short offset = 0; + unsigned short size = 0; + + piece() = default; + + piece( + char const* base, + char const* first, char const* last) + : offset(static_cast(first - base)) + , size(static_cast(last - first)) + { + BOOST_ASSERT(first - base < ( + std::numeric_limits::max)()); + BOOST_ASSERT(last - first < ( + std::numeric_limits::max)()); + } + + bool + empty() const + { + return size == 0; + } + + explicit + operator bool() const + { + return ! empty(); + } + + string_view + operator()(char const* base) const + { + return {base + offset, size}; + } + }; + + char const* data; + unsigned short size = 0; + known_scheme scheme_value = known_scheme::unknown; + piece scheme; + piece authority; + piece userinfo; + piece username; + piece password; + piece host; + piece port; + piece path; + piece query; + piece fragment; + + parts() + : data("") + { + } +}; + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/scheme.hpp b/include/boost/uri/scheme.hpp new file mode 100644 index 000000000..cb36917bd --- /dev/null +++ b/include/boost/uri/scheme.hpp @@ -0,0 +1,63 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_SCHEME_HPP +#define BOOST_URI_SCHEME_HPP + +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +/** Identifies a known URI scheme +*/ +enum class known_scheme : unsigned char +{ + unknown = 0, + + ftp, + file, + gopher, + http, + https, + ws, + wss +}; + +/** Return the scheme for a non-normalized string, if known +*/ +known_scheme +string_to_scheme(string_view s); + +/** Return the normalized string for a known scheme +*/ +string_view +to_string(known_scheme s); + +/** Return `true` if the known scheme is a special scheme + + The list of special schemes is as follows: + ftp, file, gopher, http, https, ws, wss. + + @param s The known-scheme constant to check + + @return `true` if the scheme is special +*/ +bool +is_special(known_scheme s); + +} // uri +} // beast +} // boost + +#include + +#endif diff --git a/include/boost/uri/src.hpp b/include/boost/uri/src.hpp new file mode 100644 index 000000000..07b2a6250 --- /dev/null +++ b/include/boost/uri/src.hpp @@ -0,0 +1,26 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_SRC_HPP +#define BOOST_URI_SRC_HPP + +/* + +This file is meant to be included once, +in a translation unit of the program. + +*/ + +#include + +#if defined(BOOST_URI_HEADER_ONLY) +# error Do not compile library source with the header only macro defined +#endif + +#endif diff --git a/include/boost/uri/uri.hpp b/include/boost/uri/uri.hpp new file mode 100644 index 000000000..1dcf2abca --- /dev/null +++ b/include/boost/uri/uri.hpp @@ -0,0 +1,115 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_URI_HPP +#define BOOST_URI_URI_HPP + +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +#if 0 +namespace detail { +template +class parser; +} // detail + +template +class basic_uri +{ + template + friend class detail::parser; + + detail::parts p_; + Buffer b_; + + explicit + basic_uri(detail::parts const& p) + : p_(p) + { + } + +public: + basic_uri() = default; + basic_uri(basic_uri&&) = default; + basic_uri(basic_uri const&) = default; + basic_uri& operator=(basic_uri&&) = default; + basic_uri& operator=(basic_uri const&) = default; + + template + explicit + basic_uri(Args&&... args) + : b_(std::forward(args)...) + { + } + + // + // Observers + // + + known_scheme + scheme_value() const + { + return p_.scheme_value; + } + + string_view + scheme() const + { + return p_.scheme(b_.data()); + } + + // + // Modifiers + // + + void + clear() + { + p_ = parse{}; + b_.clear(); + } +}; + +//------------------------------------------------------------------------------ + +template +class static_buffer +{ + char buf_[N]; + +public: + char* + data() + { + return buf_; + } + + char const* + data() const + { + return buf_; + } + + std::size_t + size() const + { + return N; + } +}; +#endif + +} // uri +} // beast +} // boost + +#endif diff --git a/include/boost/uri/view.hpp b/include/boost/uri/view.hpp new file mode 100644 index 000000000..18f4473e1 --- /dev/null +++ b/include/boost/uri/view.hpp @@ -0,0 +1,132 @@ +// +// Copyright (c) 2016-2017 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_VIEW_HPP +#define BOOST_URI_VIEW_HPP + +#include +#include + +namespace boost { +namespace beast { +namespace uri { + +struct view +{ + view() = default; + view(view const&) = default; + view& operator=(view const&) = default; + + view(parts const& p, char const* data) noexcept + : p_(p) + { + p_.data = data; + } + + string_view + str() const noexcept + { + return {p_.data, p_.size}; + } + + char const* + c_str() const noexcept + { + return p_.data; + } + + known_scheme + scheme_value() const noexcept + { + return p_.scheme_value; + } + + string_view + scheme() const noexcept + { + return p_.scheme(p_.data); + } + + string_view + authority() const noexcept + { + return p_.authority(p_.data); + } + + string_view + userinfo() const noexcept + { + return p_.userinfo(p_.data); + } + + string_view + username() const noexcept + { + return p_.username(p_.data); + } + + string_view + password() const noexcept + { + return p_.password(p_.data); + } + + string_view + host() const noexcept + { + return p_.host(p_.data); + } + + string_view + port() const noexcept + { + return p_.port(p_.data); + } + + string_view + path() const noexcept + { + return p_.path(p_.data); + } + + string_view + query() const noexcept + { + return p_.query(p_.data); + } + + string_view + fragment() const noexcept + { + return p_.fragment(p_.data); + } + + parts const& + cparts() const noexcept + { + return p_; + } + +protected: + parts p_; +}; + +inline +std::ostream& +operator<<(std::ostream& os, view const& v) +{ + os << v.str(); + return os; +} + +} // uri +} // beast +} // boost + +#endif diff --git a/src/src.cpp b/src/src.cpp new file mode 100644 index 000000000..58043f0a4 --- /dev/null +++ b/src/src.cpp @@ -0,0 +1,12 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +#ifndef BOOST_URI_HEADER_ONLY +#include +#endif diff --git a/test/CMakeLists.txt b/test/CMakeLists.txt new file mode 100644 index 000000000..3f81c6cc4 --- /dev/null +++ b/test/CMakeLists.txt @@ -0,0 +1,27 @@ +# +# Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/uri +# + +source_group (uri FILES ${PROJECT_SOURCE_DIR}/include/boost/uri.hpp) +source_group (TREE ${PROJECT_SOURCE_DIR}/include/boost/uri PREFIX uri FILES ${PROJECT_FILES}) + +GroupSources(test "/") + +add_definitions(-DBOOST_URI_HEADER_ONLY=1) + +add_executable (uri-tests + ${BEAST_FILES} + ${PROJECT_FILES} + ${PROJECT_SOURCE_DIR}/include/boost/uri.hpp + ${PROJECT_SOURCE_DIR}/src/src.cpp + Jamfile + main.cpp + error.cpp +) + +add_test(uri-tests uri-tests) diff --git a/test/Jamfile b/test/Jamfile new file mode 100644 index 000000000..c7fa5989b --- /dev/null +++ b/test/Jamfile @@ -0,0 +1,52 @@ +# +# Copyright (c) 2013-2019 Vinnie Falco (vinnie.falco@gmail.com) +# +# Distributed under the Boost Software License, Version 1.0. (See accompanying +# file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +# +# Official repository: https://github.com/vinniefalco/uri +# + +import testing ; +import ../../config/checks/config : requires ; + +import os ; +STANDALONE = [ os.environ STANDALONE ] ; +if $(STANDALONE) +{ + LIB = + BOOST_JSON_STANDALONE=1 + ../src/src.cpp + ; +} +else +{ + LIB = /boost/uri//boost_uri ; +} + +local SOURCES = + error.cpp + ; + +local LIMIT_SOURCES = + ; + +local RUN_TESTS ; + +for local f in $(SOURCES) +{ + RUN_TESTS += [ + run $(f) main.cpp : : : + $(LIB) + ] ; +} + +for local f in $(LIMIT_SOURCES) +{ + RUN_TESTS += [ + run $(f) main.cpp : : : + ../src/src.cpp + ] ; +} + +alias run-tests : $(RUN_TESTS) ; diff --git a/test/error.cpp b/test/error.cpp new file mode 100644 index 000000000..af4a63e83 --- /dev/null +++ b/test/error.cpp @@ -0,0 +1,59 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/uri +// + +// Test that header file is self-contained. +#include + +#include +#include + +namespace boost { +namespace uri { + +class error_test : public beast::unit_test::suite +{ +public: + void check(error e) + { + auto const ec = make_error_code(e); + BEAST_EXPECT(ec.category().name() != nullptr); + BEAST_EXPECT(! ec.message().empty()); + BEAST_EXPECT(ec.category().default_error_condition( + static_cast(e)).category() == ec.category()); + } + + void check(condition c, error e) + { + { + auto const ec = make_error_code(e); + BEAST_EXPECT(ec.category().name() != nullptr); + BEAST_EXPECT(! ec.message().empty()); + BEAST_EXPECT(ec == c); + } + { + auto ec = make_error_condition(c); + BEAST_EXPECT(ec.category().name() != nullptr); + BEAST_EXPECT(! ec.message().empty()); + BEAST_EXPECT(ec == c); + } + } + + void + run() override + { + check(condition::parse_error, error::mismatch); + check(condition::parse_error, error::syntax); + check(condition::parse_error, error::invalid); + } +}; + +BEAST_DEFINE_TESTSUITE(boost,uri,error); + +} // uri +} // boost diff --git a/test/main.cpp b/test/main.cpp new file mode 100644 index 000000000..cad92c740 --- /dev/null +++ b/test/main.cpp @@ -0,0 +1,10 @@ +// +// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com) +// +// Distributed under the Boost Software License, Version 1.0. (See accompanying +// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) +// +// Official repository: https://github.com/vinniefalco/json +// + +#include diff --git a/tools/codecov.sh b/tools/codecov.sh new file mode 100644 index 000000000..670c43473 --- /dev/null +++ b/tools/codecov.sh @@ -0,0 +1,65 @@ +#! /bin/bash +# +# Copyright 2017 - 2019 James E. King III +# Distributed under the Boost Software License, Version 1.0. +# (See accompanying file LICENSE_1_0.txt or copy at +# http://www.boost.org/LICENSE_1_0.txt) +# +# Bash script to run in travis to perform codecov.io integration +# + +# assumes cwd is the top level directory of the boost project +# assumes an environment variable $SELF is the boost project name + +set -ex + +. ci/travis/enforce.sh + +if [ -z "$GCOV" ]; then + if [ "${B2_TOOLSET%%-*}" == "gcc" ]; then + ver="${B2_TOOLSET#*-}" + GCOV=gcov-${ver} + else + GCOV=gcov-7 # default + fi +fi + +# lcov after 1.14 needs this +# sudo apt install --no-install-recommends -y libperlio-gzip-perl libjson-perl + +# install the latest lcov we know works +# some older .travis.yml files install the tip which may be unstable +rm -rf /tmp/lcov +pushd /tmp +git clone -b v1.14 https://github.com/linux-test-project/lcov.git +export PATH=/tmp/lcov/bin:$PATH +which lcov +lcov --version +popd + +B2_VARIANT=variant=debug +ci/travis/build.sh cxxflags=--coverage linkflags=--coverage +#cxxflags=-fprofile-arcs cxxflags=-ftest-coverage linkflags=-fprofile-arcs linkflags=-ftest-coverage + +# switch back to the original source code directory +cd $TRAVIS_BUILD_DIR + +# coverage files are in ../../b2 from this location +lcov --gcov-tool=$GCOV --rc lcov_branch_coverage=0 --base-directory "$BOOST_ROOT/libs/$SELF" --directory "$BOOST_ROOT" --capture --output-file all.info + +# all.info contains all the coverage info for all projects - limit to ours +# first we extract the interesting headers for our project then we use that list to extract the right things +for f in `for f in include/boost/*; do echo $f; done | cut -f2- -d/`; do echo "*/$f*"; done > /tmp/interesting +echo headers that matter: +cat /tmp/interesting +xargs -L 999999 -a /tmp/interesting lcov --gcov-tool=$GCOV --rc lcov_branch_coverage=1 --extract all.info {} "*/libs/$SELF/src/*" --output-file coverage.info + +# dump a summary on the console - helps us identify problems in pathing +lcov --gcov-tool=$GCOV --rc lcov_branch_coverage=1 --list coverage.info + +# +# upload to codecov.io +# +curl -s https://codecov.io/bash > .codecov +chmod +x .codecov +./.codecov -f coverage.info -X gcov -x "$GCOV" \ No newline at end of file