From 45c22ffe99678b4bb9938c530b87293b22851cc8 Mon Sep 17 00:00:00 2001 From: OmniaX-Dev Date: Sun, 21 Jun 2026 06:33:48 +0200 Subject: [PATCH] Implemented get request + parsing for list.json --- CMakeLists.txt | 68 +- build | 42 +- extra/res/icons.png | Bin 0 -> 70651 bytes extra/res/loading.png | Bin 0 -> 360398 bytes extra/res/test.png | Bin 257325 -> 0 bytes extra/res/ttf/Courier Prime.ttf | Bin 98156 -> 0 bytes extra/res/ttf/MonospaceTypewriter.ttf | Bin 38748 -> 0 bytes extra/res/ttf/NK57 Monospace Cd Rg.otf | Bin 50500 -> 0 bytes extra/res/ttf/Roboto-Regular.ttf | Bin 158604 -> 0 bytes extra/res/ttf/Roboto-Thin.ttf | Bin 122512 -> 0 bytes extra/res/ttf/UbuntuMono-R.ttf | Bin 205748 -> 0 bytes extra/res/ttf/cmunorm.ttf | Bin 210868 -> 0 bytes extra/res/ttf/digital7mono.ttf | Bin 34404 -> 0 bytes extra/res/ttf/joystix monospace.otf | Bin 37268 -> 0 bytes extra/res/ttf/monofonto rg.otf | Bin 57320 -> 0 bytes extra/themes/DefaultThemeDark.oss | 424 + other/appIcon.ico | Bin 0 -> 9572 bytes other/appIcon.rc | 1 + other/build.nr | 2 +- other/deps.txt | 1 + src/Metadata.hpp | 100 + src/data.hpp | 51 + src/info.cpp | 52 - src/main.cpp | 335 +- src/utc.hpp | 61 + src/vendor/httplib.h | 20588 +++++++++++++++++++++++ 26 files changed, 21536 insertions(+), 189 deletions(-) create mode 100644 extra/res/icons.png create mode 100644 extra/res/loading.png delete mode 100644 extra/res/test.png delete mode 100644 extra/res/ttf/Courier Prime.ttf delete mode 100644 extra/res/ttf/MonospaceTypewriter.ttf delete mode 100644 extra/res/ttf/NK57 Monospace Cd Rg.otf delete mode 100644 extra/res/ttf/Roboto-Regular.ttf delete mode 100644 extra/res/ttf/Roboto-Thin.ttf delete mode 100644 extra/res/ttf/UbuntuMono-R.ttf delete mode 100644 extra/res/ttf/cmunorm.ttf delete mode 100644 extra/res/ttf/digital7mono.ttf delete mode 100644 extra/res/ttf/joystix monospace.otf delete mode 100644 extra/res/ttf/monofonto rg.otf create mode 100644 extra/themes/DefaultThemeDark.oss create mode 100644 other/appIcon.ico create mode 100644 other/appIcon.rc create mode 100644 other/deps.txt create mode 100644 src/Metadata.hpp create mode 100644 src/data.hpp delete mode 100644 src/info.cpp create mode 100644 src/utc.hpp create mode 100644 src/vendor/httplib.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 118dc1e..bd9d37f 100755 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -12,11 +12,11 @@ set(CMAKE_C_COMPILER "clang") set(CMAKE_EXPORT_COMPILE_COMMANDS ON) cmake_minimum_required(VERSION 3.18) project(${PROJ_NAME} LANGUAGES C CXX) -set(CMAKE_CXX_STANDARD 20) +set(CMAKE_CXX_STANDARD 23) file(STRINGS "./other/build.nr" BUILD_NUMBER) #----------------------------------------------------------------------------------------- -message(STATUS "Building ${PROJ_NAME} ${MAJOR_VER}.${MINOR_VER}.${BUILD_NUMBER}") +message("** Building ${PROJ_NAME} ${MAJOR_VER}.${MINOR_VER}.${BUILD_NUMBER}") if(CMAKE_BUILD_TYPE STREQUAL "Debug") message(STATUS "Debug Configuration") elseif(CMAKE_BUILD_TYPE STREQUAL "Release") @@ -35,26 +35,74 @@ list(APPEND SOURCE_FILES #Targets #----------------------------------------------------------------------------------------- -set(APP_TARGET pianolib) -add_executable(${APP_TARGET} ${SOURCE_FILES}) -target_include_directories(${APP_TARGET} PUBLIC ${INCLUDE_DIRS}) +set(MAIN_TARGET pianolib) +add_executable(${MAIN_TARGET} ${SOURCE_FILES}) +if(WIN32) + target_sources(${MAIN_TARGET} PUBLIC "${CMAKE_CURRENT_LIST_DIR}/other/appIcon.rc") +endif() +target_include_directories(${MAIN_TARGET} PUBLIC ${INCLUDE_DIRS}) + +target_compile_definitions(${MAIN_TARGET} PUBLIC BUILD_NR=${BUILD_NUMBER} MAJ_V=${MAJOR_VER} MIN_V=${MINOR_VER} VERSION_STR="${MAJOR_VER}.${MINOR_VER}.${BUILD_NUMBER}") + +if (WIN32) + set(MSYS2_UCRT64 "C:/msys64/ucrt64") + target_include_directories(${MAIN_TARGET} PRIVATE + "${MSYS2_UCRT64}/include" + "${MSYS2_UCRT64}/include/c++/13.2.0" + "${MSYS2_UCRT64}/include/c++/13.2.0/x86_64-w64-mingw32" + ) +endif() if(CMAKE_BUILD_TYPE STREQUAL "Debug") - add_compile_options(-O3 -MMD -MP -Wall -ggdb -fsanitize=address) - target_compile_definitions(${APP_TARGET} PUBLIC PIANOLIB_DEBUG_BUILD) + target_compile_definitions(${MAIN_TARGET} PUBLIC BUILD_CONFIG_DEBUG OX_DEBUG_BUILD) + add_compile_options(-MMD -MP -Wall -ggdb) elseif(CMAKE_BUILD_TYPE STREQUAL "Release") - add_compile_options(-MMD -MP -Wall) - target_compile_definitions(${APP_TARGET} PUBLIC PIANOLIB_RELEASE_BUILD) + target_compile_definitions(${MAIN_TARGET} PUBLIC BUILD_CONFIG_RELEASE OX_RELEASE_BUILD) + add_compile_options(-O3 -MMD -MP -Wall) +endif() + +if(WIN32 AND CMAKE_BUILD_TYPE STREQUAL "Release") + set_target_properties(${MAIN_TARGET} PROPERTIES + WIN32_EXECUTABLE TRUE + ) endif() #----------------------------------------------------------------------------------------- #Linking #----------------------------------------------------------------------------------------- -target_link_libraries(${APP_TARGET} PUBLIC ostd ogfx) +if (WIN32) + target_link_libraries(${MAIN_TARGET} mingw32 SDL3 SDL3_ttf SDL3_image) +endif (WIN32) if (APPLE) cmake_policy(SET CMP0167 OLD) + find_package(Boost REQUIRED COMPONENTS regex) + target_link_libraries(${MAIN_TARGET} Boost::regex) + find_package(PkgConfig REQUIRED) + pkg_check_modules(SDL3 REQUIRED sdl3) + pkg_check_modules(SDL3_IMAGE REQUIRED sdl3-image) + pkg_check_modules(SDL3_TTF REQUIRED sdl3-ttf) + target_include_directories(${MAIN_TARGET} PUBLIC + ${SDL3_INCLUDE_DIRS} + ${SDL3_IMAGE_INCLUDE_DIRS} + ${SDL3_TTF_INCLUDE_DIRS} + ) + target_link_directories(${MAIN_TARGET} PUBLIC + ${SDL3_LIBRARY_DIRS} + ${SDL3_IMAGE_LIBRARY_DIRS} + ${SDL3_TTF_LIBRARY_DIRS} + ) + target_link_libraries(${MAIN_TARGET} + ${SDL3_LIBRARIES} + ${SDL3_IMAGE_LIBRARIES} + ${SDL3_TTF_LIBRARIES} + ) elseif (UNIX) set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -Wl,-rpath,'$ORIGIN',-rpath,/usr/lib,-rpath,/usr/local/lib") + target_link_libraries(${MAIN_TARGET} xcb xcb-randr boost_regex SDL3 SDL3_image) endif () + +target_compile_definitions(${MAIN_TARGET} PUBLIC CPPHTTPLIB_MBEDTLS_SUPPORT) +target_link_libraries(${MAIN_TARGET} mbedtls mbedx509 mbedcrypto) +target_link_libraries(${MAIN_TARGET} ostd ogfx) #----------------------------------------------------------------------------------------- diff --git a/build b/build index 14583e9..c7bd301 100755 --- a/build +++ b/build @@ -22,18 +22,52 @@ if [[ "$1" == "debug" || "$1" == "release" ]]; then cmake -B bin -S ./ -G "$MAKEFILE_TYPE" -DCMAKE_BUILD_TYPE=$BUILD_TYPE $MAKE_COMMAND -C bin $NJOBS --no-print-directory cp -r extra/* bin/ - build_number=$(cat other/build.nr) - build_number=$((build_number + 1)) + typeset -i build_number=$(cat other/build.nr) + ((build_number++)) truncate -s 0 other/build.nr echo $build_number >> other/build.nr +# elif [[ "$1" == "windows_release" ]]; then +# cd other +# chmod +x build_windows_release.sh +# ./build_windows_release.sh +# cd ../bin/DragonV2_w64 +# cd ../.. +# elif [[ "$1" == "linux_release" ]]; then +# cd other +# chmod +x build_linux_release.sh +# ./build_linux_release.sh +# cd ../bin/DragonV2_linux64 +# cd ../.. +# elif [[ "$1" == "dependencies" ]]; then +# cd other +# chmod +x build_dependencies.sh +# ./build_dependencies.sh +# cd .. else cp -r extra/* bin/ printf "\n\033[0;32mBuilding Changes...\n\n\033[0m" $MAKE_COMMAND -C bin $NJOBS --no-print-directory if [[ "$1" == "run" ]]; then - printf "\n\033[0;32mRunning PianoLibrary...\n\n\033[0m" - cd bin + printf "\n\033[0;32mRunning Application...\n\n\033[0m" + cd bin ./pianolib cd .. + elif [[ "$1" == "gdb" ]]; then + printf "\n\033[0;32mDebugging Application...\n\n\033[0m" + cd bin + gdb -batch \ + -ex 'set pagination off' \ + -ex 'set print pretty on' \ + -ex 'set logging file gdb-last.log' \ + -ex 'set logging overwrite on' \ + -ex 'set logging on' \ + -ex 'handle SIGPIPE nostop noprint pass' \ + -ex run \ + -ex 'bt full' \ + -ex 'info locals' \ + -ex 'info args' \ + -ex quit \ + --args ./pianolib + cd .. fi fi diff --git a/extra/res/icons.png b/extra/res/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..43768d4ab3946dd17cba86042e8d3d899747595a GIT binary patch literal 70651 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

e%fXy%2n}_ zTSX4p9f5YeT&6yOay9W)yTGTcR|`^86eWH$(0PrMn{icn!<8Ct9$U`|!jFWyFdd+9 z`^MPSCsQe%KyMTHE}QEpPXI1h;I+sb;SHX+&){pqpTF5dO_;xMYxj$bQ)iJv4tP|8 z4>7k@1rwTI782^KAm6vWb|r#yvp3e(YnS#sQ@*RkOk59tb8b$Na$p*-2!(y1L(l!N zX@$I}|4pQMb*RJ$Byqn4mplN)8af z0zTlA1@gLC`Qr2M?isOzuA!B`-So3#x7Dt&{5KpvxWG$4oY8wjvRh()Wv{Z$)bzc~ z_konZ>&84?j-RE&l=>u2#f?R*(lak|BQ7e?DD}@^MuY^lXcZ%4JY~Wsmpq~usfK7w zEB%)KjJWW#C{`N#_$^HJEF4{veP7?}2HwX^dY2EPXs`W!E$J4Wc9(uGbTBFINvPOE z_msyiaqu9PZIgv#PRa5FS^7AdwLb@sjx>AK*-y)b{SkDp)>BoNmz0#I?A>2AI)DDX z{9I+7O!_{|!?nqg%77wW+%#{Q;d+tr3PPBKLaRz59NO^!UAv`A)+=t1!kWPMgiiVoAL@n3{3VdF&U z`!PqqZ}SqXq? z%qO(q9l;HJcm`{xO(qkueC<{1dVba%;<@1WlFs!Ual(+5Bl~&mX568Xn;o8I;}&^z za%gL6*(7i_2yVFdCRODfKJA-;vRh)u!^laqxG7K^KnO-u?t(m(O z&mgX$b>~-R{-Fn$g^1d#9jF)o=Frc~cu%*|7hdgk64uU*Y^K12FBI>>>8Z_7cuwM(taj zfaC0L;^FmO0`rC2@`WQVufmu1x_6ki@+x@PZ6gz>!o;|m(Ur<%$B+1B?AeMSXXG|j zPjs(;X3{{k8d7S%2DE{j``hzfGSBxU7V1XQ`wEk!^RMg1Qk`HHPN5r67raw!3iM3UUf4iUrj*xG6=o6es*1FHX4Y18GoonUq|s8o5PE1)eC36{c9`|b#`zIXNm^@I=sve>-YyDra5Ac{uR7r*A4l@ zXKt!uwKFGA^e*l(hrC>R?y-Apk@?_(ZSOAM;wZ_logUb;Bg?K9H6Ik4BGnu#4|UL? ziBYJ~t8>`qngme0`^4oOk+J5ac$IZvE{eEDqi)ZzICt& z)*hOcuv6H;OB-|@*MdacXNBNCA;$Pj)9KtXQB#o6E=$OgPW6~LPOvIMt_LJDmhCyl z!n?JZH!&*{=)0K~OZVembqA7V=SDo*pYqVZr_L;QFJ4@Bg41D+z*J;!p(Cu1{+A17 z(rZk@q|51_WcZPdQ3y52g-*fwnwK#ESFqa8kS!B0hCwvO| zEdvc-rle0g{21oiTjHM7qg6B%2hgqs4-Od1wdiq5yfWJdHe{tyi2N7a-u#wy%4f$y zHK(#nFzMlgE^mY`AN{oxi-At{*==^7mEr_AkrWp)u>7!(%6O;E)WySnUp^O{>8YBYhoIG&Wvk@igOWvQjlx>`%Dtw8nbR|w6kByfl4DW90d z#^=i`H>hz}5}g?}hM206Y5WphF`&l!*+0^Kp!d52?Oa5gzP?3?aO)C_k>~Z0L-N`B zG#Hhi9TJ)00cN%#%@IB(inlr??MimD!X)9-stRKtzMDCjHU&_pjN-hZPYewE2CTO0 znTy*XtwM=j|GvYN$0SkrMCB~bE^+4SLD@=6kze-ZKsX_U@QCMHm~iV$opYo3LIm;E z2FRQ_Dg@87m>5*u9zF?-w*+0*ImwjVV6i&eUFcx3e;K(Cz1jqSu9}qzuH!GrxTNVb zFgoj&;S;dhv~=&>(2r8#Ju-r5Ju;4eG{X{i#%~iI7Q95b;Lk6p#~s}D9t*gZ6&~OJ z_bIo?(Qo^=bY}ftR$%`or+L0-ZlqYmZVyMfkSXmVdw`W^qL`<-#4vLFz}kX4YZ-bJ z+!-s^*s6avwQj|8JWLa&LwA4+BRAu<2%#cJRj<)0ZmX<5uUcJk6W6yO7Ig+l4!LlO zv1-Ea%ksi)gQT670t|K@pcP;DKy_KmKJ>LZZV?$!om zm!BVtOc2d;ep%!0ft8?5CeinstaPW)Yf$6T4}9hMHFF$pg_|+qO5083Scn;G_0p^_ z)~tM&OwrHg%UFVt*3r8;S;HT!m9uLTD?h9hO7p*Yk60iH1`m1Ahq-E$LT&L z>Jq*t!1LDhtLyh4@#ojqCPmuASnw5T(3Z5Uq%BBBS(^Sad2-mLc53s8%hO7546kWX zcm1u}fd{nCiZ9sPR8Q%VZNH=Pu7PcPo^7FQ}4!iWk_9+JD63QN-gHxn4W3hb%Ke#=DD z@gJuk-%R@AFng0m$oMx|z2P@&Q@al5#iXJwU?rIqy8l@*Yv3*DC(M8_FF1ehInw+* zAAEJS&wI<8GRRoJJ)xIfijw+vFe|1G_MRS5?!vPKzf^=cWB4^o=pbM=PVP4GmBaL& zb+#F}-!R^B*i^jawXFej$Ww7RFMijeNWy{6Yn52aU^CPQNO0lJnmVv7RVpw6wna{?M=K0z0g#BDkJ+8Mz9=Wu1Tzld0M`kB9kyB5iH z|CO47E-a^|srUq{MkZlBKMHNbcbZJ6$j1>pVtFH?6};*J=$4>M|ONM>UxZc`wHvuX_MKi{DjH#m3+nDg(AiCgEVcNK7cA=4+{?mDS?r#VMY5j zaU*mxxnqS7dbbvWsxt`tGTxAB?*Ed&6g)| zOlRI9#M6tYPYQe5auLn{GfxnS%LSu&0exJ%2Wh#>nce@(3MvsBJZVyvpLdU{mfm6q zg`SjLx1C@u5CX!l8*UAdT4YVB!2)mS8kQjjtXJrJXpvenJL9#^{yBtkxu55SHhU zs{@1$q&eN`%drV;7~{wus$71(gn+I@>Zl;r54iq!BNrPg^mEn2zG2087i!Q?I^;~`n&l6%gnYaP1AmAZdTRL1e&;oq8iki%_zl0=FN2Rgr+9?@bK{)%sD?E2B=v8TQC zy>*Zfxf)RjmXcX@74g3ghZ^XTCRv-4`AKaW#FF)Fr%_3Bco!;(P4JUpHVdm1N?UQ3@mn+h#O2h? zAUfP4;%|ruD4#wS-?IlUXCg$eexui}(KUitC!6?xIqtJ7s~<-6dOegld3>gqg>Xmq zR73ZEib>SjlVXU4LcCoM=dmjSqu;hk2`Y(?t}5?-UJD3yKF#EeXVkDPm*R(p%Cu&6zvmy)NzZ`_Jf)W#Aqx1WG zRUQ5RaYZ=9yur726SK2CV(b81$fV^<;D#A*ju#OC5V zw@MJL%m}~p$1laNR%>L&S92fZ6bKHa-L!O~X_SQ+=&V<*1Zu4V7U)GjA>c`p>iJXV zrw50t-V}2!#Av8$ro7hgGf&Zfew1ojpgIKZ*C&0c|HQ#)a2**f%{A_BpH%2FBn)5Q zQOZ(n<55@aSULVz@Zku;Unm=CjNr2aW4TUupLYBsrQq#*vbNgn0~`8YPiupZ%z-F$KpS<9w}|?l?+2#{|51=JRPKX?&>|- zQ_3RiH*^08H5jsWNf8+e6^;t+JTYB?QMg*8{m*O^Jl-T8DdOC|fj!zLV1e0(6o(vd zos{fLD`!#~x6KEV^iy}CUaS$rB7rc|xAqyH{c1b^;I>*P%^E_V(I@tBE)CA;7Fk66 z9HEynAaVTSVd=$B&oHXzI2J1Ag0Hy0+7~%Zt`)^P5ku8`+$x%fM=`wy)^r(sL3OciFZTeWRF{fN~f z+484rN!VMGyN>#=9Y>z?x}rz|@*enZi&&GszYs{r#UJXFJ#38i{Lbuj_wcR(r^BiR zq#h{=D?jF0;IRX`QHKy0H_U?>ecGaF{;}$%H`)2dWsi1+C z6-nB~Tq0gD@MUpgG3Ds}#P%c{_nb-^w0zL9`%(BK^U>uE;O>faWnGuwPy2A8x9?Qr z1b+=m zJ!EhA1!#oDSK9i84RK58jS$IO2NSOhxuiW-{BxB6(`dWezf8+N2vren1(Jjy6lhjDtFsfWSKHA za_IQ!vp18w7^)r2gbtK4FSTr(VA2%bceQhI)zsa^ViD$!uNe24iR>#C3Z|1i0YVC_ z@@HajTPkM|^J+{y=#w6BF0%Ep^RX?2JsKcOknKC{6!waMw6n zz&cPh?ZN9KwhGF+Tk2SD^uXwG>n`&w3ttDv1hxveiyWjMgO@mpzt?5{SFID~AdM6r zV-}VhcO4y(_J6xa&i?Vl=UlK(zQVPtkUjqJ<*Q-{XN7TQL@_gVNs@J#^Qr2dTHL|k z2HXp_uE)nL%CA@jWV4kaS>sUxr(UzO6m0JGD zFh8qxJNv!Ytig>glmrcBeYQH>KL&qO>#s#ht1UaaKO0{5UM4rk+}I{CE#?N(&#;ex z*@Dp0;|18vS9G_uvJ9h$*$B3Y`z;|KHz8fU4Wx6Aq`mx_hd9f_&1F3i4vCHSDV#!R z^_I%9K5qn>wzm%1fY^D{1pfFELQwCEt}84BgrISZo8J0|`5q>b3wg>C)LC57j__HM z)K97Uk9FtfrX9qHu$HUUNp58DjU1bWIQLws_hh?U=VJz zBM@g4=&5z8ZyEM(n=$+@0#}}QJ2T3S5d=>IcQzzvB?Dq_G(8JjD*4XY$-JKa#BKR& z73LH`Cng}VvIA0^;sy%lUqPX{jWhwVJ zx9Iim(j2|$OHX!id`0k%^G&QkeZOBQiQPdeTXy~E&$JoJNf)#YQ*1q#7j8e^{R_bI zokYc$Et$i7DqRF}*!30mxrZZX-v?>{p$YGzO&mmhEdZ77{dDi!V8?5Lw?(w*F?P9| z9eA-%v~}a3w&+fnf(C&Y$;dp!)6hqHS6I5V5&gr}gszVy5bFOXcJ zS8%N4bl1+%sbN~0=AN(xaVtXLE1=i}KlvZHTyWjj?#wYbpaVxHA5QXjuY!HXnZt9B zb=ARi_dyJwOWM}iuca)zC$RD&M!98 zwZ!X4wiQ-vs;l1mV>^H={QN1?hKVX}TPbKCV7u9+ zZa9((BX#?O4Jzyrr@3SK=Adx-b1ST)&nHi!8N%ua$Fjwrkt&n~x#^7$6+#4~9^tPg zEJq^`A!N@P*dSPTaM4sq(r|YW7f}CP=yM^yK-sOG$1eqF&-$VXqMFzDrLs%SWzJ?Bm4_#lpJFEuILCDAq#Ov?UH7&)MY)+FOnaedAN$i)0y@Tt+@aa1lNd7YJJ2shce*1FCX5p{CY%R2xkBHK z_a$Jxx2s`sg^k+}BVVR%q8Vd8B6Hmf&H!83Axw&@^?_dV9W)yzGvnl{fPjPhLV(}! z)wk|en_F8k-A}pqx>WkW1EHl$=SCq`+16S<$Jqg)e}7U$5F$N=7*{sp?M-CWFXr?c z{=2NrZ5|(n-;})BbPAB=P%sk8ZrK7C6#8I8(w|=7K4EzCZ^Kn2!^@}OHzn-F3@NDS z#-7R>y0C>8_;BurWJ{2h3OF)xVd6=)!g1cvd`gY#`cV?5p6$3#=hZwT5d*g4f2Qx6 zQujFgxU}`O^rP#z9Xk(~fLb9jgr-s%;F}Qh8Ie)|?bcVD`l94toRxAu@%}dV!?LM~ zRS&tAZ9|&m7cei@ox_~QlsRM8VS_Ex=2^a3pG!N$W3*t-y<^tgapkD2qFqu^T1AXO zp!#zLzco*zG5N{ye5}7bW#972zk%nv3!nW;Y+c@cNf~eDyLivV z#s_gEGrM7X-=^qL8arJl|5+GUb#JbkCD4@2pudk(W2INZ&ItD9(H}ICA{KYS4k1J2 zxDdy-m#GO8IdRz7v@>ap>0K6`D?g*Y5ac&{8!VRz#eZNVv?Svn{HOp=TokKm7~yjG z;kA1mpIwCuYWa<^!md{Dt)rz0Zh{M`tTi9HbK?-EXJqH`R(Q-lI8fe=3)ZSa){10| zYKw>=HfClK%$%(L2JHgOoWYp5NPbA=RGP&HUrv2nz0m*;a`mAMeaCpU63$WS`a)oK zLLAZM2IP_pi#rBFw4YO-yBeJ)lrPjKuyW(KB;mW+0y2T?XBnD)@=vg;prpj(|OIOIM03y zQp3y*f_UM^=;8yfc3{55C{QorY%)^2bL4Q}!}g+OEl!2(=RtoA-Xk8yGIPbVi7bd? zg!I4M&3G`-Nhh8S;2Y01_9j@%#BQti%;FTPxWX&jJ^f?-Hoou#vQtf6JK+pTy zaHE}GsPZ=K2#vyJYLC`5=SJ{#=EzI5?H0V9-;bLW;VOg8W_1HM@CW{`HV8^ZA3Mpu zQ&28H*7;I;!fgf&yDEscstz32XW#|A5o_$D9z->f4UBf(%#``q{9zaG8#n%RKNZ{X zpJvq#A4|Kut^J!ZZhpGqfK)0ESF%C#H@ona+3n*lA0dp0w-ZC+X*BZ6W&WY9v24-f z%Ls!)zslKqCE_4Qk~xS!j-gTnO!v2*`XD;2KL@!A%d*1!*>eXFnt~ZD&F@#d975%R zWDXcM_GktFm>NqJB*S{*_O9H z$w$GUBr3SjYwFt}$5VOLA~JDvvR0WxkKSuUtR9Qmhu}YQ7TH}<@V{Y)q#CST<`E!{ z@+Wkfs||g6_iD$dg-Nn2s;P+f@hE;e#q}6#KA2KicFX^*t;+*24Ew8E)R*VjoBJvv z_D#M7tL)%TdvW*9IfkoH)8Sk27a=LIgJ1SnwI!DU8)8ap?A~v&8+jT6quo!NihrpX z6XBy_X5Zth2Dn*%?*oPHh~^%7g>+OQXY&sp=h81~bn?H0#CtK+E2c;vt-7ySwju@^ z{I$v^J9qSFV}4=W1+;G@zUMP7zOPc<(~2Z;`^*kI`LJ95ueYg~I5S~T37$4f<)iZU zfIP=iARUijP0exf8&lz2*w1g1-I810`f)L5&FUY7j!d10xdIg9P*8?^dN6~&FXH`Q zn*edqTv1)7UNB?*fPJ|07y71~Sw>)Q8M`;ju~g#1K*MqyAxGQiCIdr&Iz(^L!jo9z zUf%pri{kbEeLEVSQG;b=<ZIhknBQNcF0Ls9P(qg|M>9syVHp5 z`L^k@$&XyyzCy1}7^rdMCv;*rU2*4+Mh`zf?4EpY=5YS#Y^O6r>M)p=&tdploz}jn ze$F@2ZL*TZYpOY}F4N{LoEM)+^7aKut5J0}8Gc3YKgV2%_A8G~$#6DYTPpq8Gi%o| zB5Co4^dQNvhhm#_CmPrmM9LMam&D;75Y3h88ipc2**`Z$s=I0(P?;sYWVBnKrunui zFSN&i8xb;%vdvP^Qjcx3w*C#nlfiw5TgIPG2WQJm|_O^7*+5fHMyRi zyBR%}(G)rUz{3t{-}C48JLYp6#{B!n&xKbIgy$l^jyHZ*3ZIuk93&oP+qv14qO`?A zb!jU86Xd@!F((a@10FFvPAp~e{-O9@S=Wxot3%v8uQhBgWLDB zai=!978M8=L>}!(@OX$GMil^fV~Tg;R^ui;tZpEtrTGv-nlA!LLZ6k~`pqp|xM;471c#<| zcORDZC+B{ulDV*7zq*KJ2-3YLLi3@Qq!!U?yD8tYHvf8VA4ypiAd_?IIzDnxW4F7Z74{+ufL+ncQf*|3;z|5L__ z;LAd4&oM>AeR(`jeiJM^#K>BTo)cHlTtuyt$yGAlJ z^v=^swChih&J@Zp{7d>K=_Zg(*pCh+}dfjDlHq-D?8a)##S8RYB> zN~L=qQyGR^WPC^R6%U%5>J18J{Wd;n&4~TfT6?|~GJnu3val2#Kw7XEv!|BO%st0a zwWk3CwFdHdOV(X55ku^{HsC2T z{AC1L4yM|A&J!p$Sb1sZbbNn@ui%EW)AJ>6fTRj@va*Z<;&MHwFxO?bQa>3tv>?DM9C+3>Qv zGR(B}gY`?2KSyQk$G!iOD9|Cr)5QJYfB|y({>M{xPN8$6>bIG)LlL4Is|EPnQkPbR z?*8Kz-Ah|_DVHo6PW|8mymaoeaMC!0H=w~6wJpgqA=@;p;=ns)HZ=o6T&NNS{ z&v07~KoesA)r^F-7aXnmDNM)w>;}aRdY}sz_#N=w5df(BryFCl>Z4rKkrYckzV09Db=cxL_c1|5fULer8#DHYc6R7B?`;tG2l8F%}r{& z_?`G0$0`|^^yXkjC{Suh0EZtQD?EDsMJ3Qmh{omSdgWf+X{vb1%Ve-pUsTxtv)|*g zVjleDD*oLNztp_i%LAZ}Rd5eww5DL!g!u&CZ|WrP&?c?`Htd zcY(DHojmo=3>0=yOoFo{@WG=Q@{*mo%8P*wvYWHHmbJO~=?|cWAQUwA_CVV9aLr;d z^X2ggVFH*p7CNyO>B#J*>#rvyV!V1u<$!Guvb+!|^2DV**{EBQDdeyT$Q$>*f8O^+ zDmI41h6TJmg`f+)RZg~+S(C}bKR0_t*U#CjdNJPI>+AOFj(yC>+U%&W!G3*G-GOXL zfLI6Iso=D6O_jxw7uwccc{yW%?CKRhpKNo8a#ifwQs^)dYcyv6ASjzDK9Op8y|Ex? z^TV^u)-)D_-jZnt;q?2a`<_-Zek|}Q& zQY`1WY2>g$)(bLmz33zR3$bTi^xyl6(UL_H<~O%O;@*!{V0gN7P-K(o`_^rmXj!s!D>U|Kk@31t zR>r-z%v;UNb;sZ%C65k9Og1{hApT|WLVHdFOGe^^41Zm346@jjEX0F@-;up?kdj6@ zokYs!Fi<&(8_d9x+P(S{+<)q}jzH;>!N1)9r4;Y&FFSgCE@w`AJDgMVjI=V{0+}8k zJ5j+(>$u;F10BO?PA2ce>)nt_#P!aZJ^ThH?8~5t72GbL25<_43$j* z{sm*Ws*`LLt@=HNpG;%Obk{30Y+nY$ji%iS?J<62Sb#=4Ko93!t_ZqGS(*4jQw_#8 z?m*%`deaGICztF0KJI^C0$s*ajp`M)?YR+c%I11@F4Ql0l<=ajI@HT*Ud+;j0T8Dh zUB~%*=y_(+-UmaI#RWlGtV?4ZSEC`#zA4MMP$iV)Tv58>J)VIdCsfe9;73#w?W zd9j^iyJ+}Xs(3&=38P-uJ>l~_-sD7dS@AAUy0Od#Hyj#|%VTWTo8RTHT`RX-D01KvD%?xN_y4!kiqNW1!{ zz|js+Idc)WYCJ|=Atn~-#W?YN7c~R0GA0O zM)z$v9>LUFN3oO+c~xcL7o7_Ry_`Y+1{e(X^qiBR{BmaumsS3w0Ii29w-N)sxyPbD z=Q0JnPLSOU369j@gHoTD$up(@>>Xs3kWWRdziJYO3LYn<=Kyo1*QLywCE~6{g=^P5519 z8P`|IX+^mOvt|8P#hF?Yk*7A=cTq2dG_q>>0pOFJ2kO;QdQ+)QYmUhn2>ng=tNDq2 z-#3!1|JcUiDs6b+au9k0aGf?zbqCHxAIN4k^Rt&3^D0G%v=ZiWEqT|soUsDW=RfJo z*)hgKx=DkskInOObiuMpaXL2;e@n+`Ul{j)e15xmhN!s%BsrK;9QJ^5*c$P_*WSWR zg`est4IUGEEgoi+WqE5d%YhIB5oL*ry)k6>mZ$4j}&CNZPr*Y2Ksj4yVKmcV#dWUIgz3 zc%-?ol6&Zm^l`H{-RbyCsBAR*-Ck0i@GsHqV6A~&cjs3Ps=b+Khp;=^>aK4Jz)Fj3 zPSz)g3JEFF0b6a6G`7oQP@GCmeMY^3`3?RnW@$_%$ZBU$_8F*^Eic!@u_#K#@%Ky! zc@2>h8EFeckMI;1D~dHVcOeBpTe&0B#)aGFKmf&=9&{7`i%EfRY~{dZ{OCx;&T?9t z7hUi4{uuD+=J$4eh4-CmWr4Hiou|Qxoh};OSZ4irnjUgHDZoc&*?W≪#Wm9g3CV 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

a?9$#3Gr|jRifCApy%nuW37k`X8vYRl%m3 z`*N0RyQw~)O8c?ovB#%uj1f~h0cWss0~9z+Bnv(6-7o^@fP=^NBXgk+EH1}&a;U+K zQlJ38a(H=X z=FQ&ub2>Q(?^1>ztmfLWK;|GHtmt>fUYXkNpW#zEg0F`Ij}ALM+9!6eUgaQFMT7sw zKqU6zzWDsH*AJeJ(4cR^Rx+J$$NI2>`)aT5XzAO;tNF4>*?a#J3V7uFr_tLtz<#$u zVkaa2=s^$FeN)Znr)TTuF9Z_$aQO^Ev~xw609}fpz=X?>g~w5uzYgYONI-a@yAMKQ_8Nv@i3p9?jDa-@%n2I5 zmm3UbtM2aZnR@y!UhnC9sgU#N2HnM|dyMEYu)+l`*UPoPp-2Chr|sw!SYh&DpC_v@ z5TazC`1*?WEum|-z|~`$$#c74Vp4W%UaiqtplqEe9e%ZV*AlqgLZTb7yci(Fj8wWd z(vsy+;Y=j8wUIxTW8+@0=&Z4J8bc9amxp!OV2N6ig3%Xd-(~{irLvYzB@Uv}P06~Q z(gn$uy)zbOXDb#CchQYcz%}*7WtXQ3(dyc5#!1(`wXX!6R z>ql!WaT;kn0wntTom0(#>|a;s&(jOG>7kmL`g#A>eeH?&ICM9vF!z#p^CC8lqI=0N~eHWmpL1CtFJ$@O)f`Y+3dQ49$~ymMi6q+=PPKcDAf(Wvi? zRKW?J0Nt1v?Nh9bvd`XMj=Pz}g$>PdkB$Zt)kw@<2Ln64H^qOuv;7nE#peT>i>})a zFPHhxp={%GtbMI#iQfCkL2yV?5*#wOM+7b;Md}WYti92qnm09lr1*Ea(4OYPzU;H%9lP3}KTC zzKd_-lje6M(V;k!8rZYf$%z#Ey=+;HjgDI20pYR9`;4qduQS#run1wdRV$|Oc3X#7#$U@Xbzbr0a4K>X1{|#BonF4U~jY@P;`)KIDkceWBwIb#h>Za;UjE|BAW14|IYX`+F4j&x{yYS7{N%&F{9P)+Mmht*!Pi> zlxDI4vI@v`Fo3E9{Xr9^MIjhXW?3Kkvk)jm5M!I$_WLw0A^GZAj-rV9sX{s(leP&3 z;5<9&*ny%ujj)x%?`5x8=bKx;&1P9qJyaiR=l7MCO;DLLj0^c(*eNkuAB4MAonp$( z3s`I65GmZBE1pq|NYO7j2uLlmLtzT+?RGsaog z>mEGQJ;KILGDBZau%Oll?-KQe`f*5?paEvjNI-*Ah@}6t48}b9#O~%FAB0I~0kfjw*fVUZo;b}KGrs~M=Ckl+Mu$lxmXB&usmzequx~j> zT6)UOqzoOo%d54@0gRVs-uvseL2YAh0Sc*lTv#45dgWNvuzIJ0eoy}8bZhaKcWojI zCU|O-P*Qz0m~9wg2=ReJHUE;}jN1#iq4yVa_RY3$4lZq-KcoqpFB4+dbjm=}hi;fX z9mQw+l~|5HjB3Clry$ahg#uPy@jIhe!VtzG6DSn&Jf*Lc0nz&p-?EEqgpN;5ihv7w zhb^tmm@n!|#PMq4P9wxd!6W3WIP#`rP{E_AzKC^M^?Ths+v1QeX5~2GZV0v0RL7g4 z8;!H`12tz&Za98@W#npC)meCFlVucE=DyV;z+lKkayiQ#)*GIxPmBSnQ7^fq%%7)y zk)j9xA{5)fQ=2Chf371~_WCx_N(pALIP>)|!O07dm7#^PbG@D8hbmAwz@;yp7A8Q_ zMX&7On)Xkl_H2>r>p9lun5gc!!Uk?=QvK>&XW4TFUUQ9blX4LuX=V0_EmRzdbe}Wj zf{4gv&x<5>E{>b8H*Fl?Z>RbppEpK6--8&om;u`xz{ulaxq@Wdl>o~eUY3bUC)-0W2hW?WOQ|N7Fh-m)yQ{mW< zWTio~Q8tl1mtS02?O#{a1>`!H-RXtz04-)R>(-4twgXz`Kdz%HU<8OL^561ih8WbRai%a&mOU)hf^<9`V_zk{t*kQP zgk7=0->e2%Uk_WoMIzDIs(P4z`Bh}qS0RD zKcGS@{{i%M0cvz&uACIDT^{mbRolHi0VooW+JCFm#?&gqNUuvHT!0|Mq|Wt!Q(T&9 zH;B(J;!R$vu8_;sp|5eKjx&1&E(YiFQ*~=T?GUoB>J5N|?h6oS(N|6Nbets_v%jY?1v%n-zUnnO`bAT(}ux8RLQRB(|oJBU_ia4ayy#t@Q zU#(oqnSFW#!1wiw*pbXS!am2a!Y31A_M)pIs@NKxwO=!h4vvigrNH5|$5nbX(xclY zWa$&VKov`qN9NY>77*}EPWIXHJ-_}Rz9bUZk-G#`!Ejr|5NbD2Q&bc7lA64kcOb83 zb@gbPhDphmTm>(Jt|`{yTZnOZA0@A^ib8~(zEYyV*6KZCbT;W}uIw&Ss`z@p&9^6x z3N(`DR=rh2_vs-uz&Ks+t%7@cz;0vx1|XWfeJ70bWDVyeEhD*bZbHX%^&Ix_yG^hy z+y?FY9_F+;P({K`d3%QIcHyRucpKU3H2K>qkl}TZ@7CX@)Rp>E7r$}`0Tzd`wto}C zu;f5WkRuD(Nt~?R-JE1>xnMO_dE7bn;@GwYfI3+*YE$Lh&Bp)Wh&PCW0QYNd%s&;n-O{wWZ7!&40BSZe?`L{>ryl?Bjv*^Sc zc{BTEOFi97kQ#+)A@31_N7~}TvPaCab7`!DKl#Xj?+WD@pdKzTcShRjxBkK0@{6ev z``5sEQ02L1Dw&x^ zVu#lNkrVOCPT*DHb8~w+k6Zkb?oai`q3Sdd$!_Hy9+%cNZ!KQ-F`4tEbehk_jP@GT zwogdt0t?s^SAp+L==fPZL|Xf19#`v|j3su0?_2Cq8nY5Uvlk}mx8{L-+F{~D^f}?b z$|xw>X5W{g$>UyP1QAEp#f0WWiT#@shKA*1F6M-nsKz^Q$F4VaE=l&nfxA&jsL+gF z_-wj=zV*h7a?ZmjWfr7jD*zZxl2~4OF$?x?{)@CST=-L+d{RpR&>HjU`XZk}VW3_& z_L#a}fZjeDbNn-=Mjr7a1Js7v+ZxzIzl~gPb)$Zrm6NRKk2-Aov(Dwa9!Qrom7q=>hh3#py?F=E1V*NL!?6i=(Wx%;- zR%{Whva?5<6GA{}9G&eJ25D^G$f~&Fv+eUtw{5O+wHKxXxTPV(r-k&;0R$}i!1e=y z;F(EXuswtv#CNPshKpG#%By@}pGyKKpW4)BF6;Wl%krmFYXh6122lwahzfH=JMTb>JUG|yQUv=0yV*J zbK9^txPb9_EP5&y=7;1^>PKgZtQr5XnWbg&>m?pR++SX6hjK`@l?n4(Ds}ddqksmZ z04ldb%eZ^`zQ+5@0bP3!)}04A=m8c1C!*mj;d1^B(WpObr54P6$(E^Y9>yAi_KhkGl^GM6k9i+g#06vY6i8fPgp{M~Z1R4;0^kh5e1s`$% zUxSYNdWz|tj?D*jR4QKeUULU|{IEyVAV*UILZ6qqkM42;Vtd^f;v~v(U=Lt(ew;`J z#&iFI${f2u7Yp+5=%VChFK{DwvBj>J9JY@NlY{nws)D|fS#+ibEb&U>n0^~k1NQIO zk-N-^0|H1`4bAO2EA?GKgvB|;7a@~6wsqFRUF}jXy(ow&1_mQy?J_b75K)|88 z5KJ7xx(Im?boc_OG174G-jYtpg{Tm4}F57L&{E2Qd&5S_H%| z6fOT7bR;;vue2bMV)x#G` z4L0%=PEqifiz-QgOKSV7<=k6HrBA}W1 zY_?|59%6| z&!tNojT`Rn@lk^vfxOX^IyR7oAg%>}@3X@EjC>)lFMX;nzsj6}2_JF(v8-LRnDWH2 zm}_gU3v&D>cTfpP?0Rb~$CgV+f7acqfsW=#AKRfW^M$|NgS~G{ z!9MzT*36#O5X)8cnhsNThx%7xZ%sbg9j}MXF|(38Tbd9mal}AYC^tC=RJqCf=`O7a zw|(jff0|7^1LPkpF32IpwP@8kuJePG!k+-a4dEdxsnG~`T3xgIlr07DU~Z3)tt)p` zx73i)YJD&mrzf38>2_3x3Gvym8iGc3P4eua_t-zOIO01ay6566Xqp9)9z<__Ct3Q? zfT(fSKE)Lf?%0#`{ZQN5fbe(?{&i;)(PLWgZn zytK-DEDz{l$@SgX&2Fnhf07#mvl1vSMmK&6*g95mjGZonov6fHTc22=`fi=DTl&+k zHs}wS*?p(YOS^~p2_b9K-cFT7>Qs(kAtBm1Za0GVv`hW#q##PfqR_Jk9fz+pL{v(TzEAXxviJVV z;gHkM**Z@Za+~g>;boK`De!67uc;*rG*;hd?XnPT>rNCnrAwMA@NvX#%C`09F%J8C zK)*Rkc8xRaL=254N(k2ji0KpOrK_+$_kF6rF>)cZx+}IDOqhNi5iH$8e-%A)U1k8g z9h?<%m?7rEDtN(lcL%%32Ta0!N({=2t*#a%m0(t_)U19ik&4TaZA;@!t;2V5qcaq@2THEqg^#fB&!PUKUC7HBm zOeEHr0n$w4MKpYw4L#}dkF!t1omr4mqgLc&u-br68DFJ-t;tW9iR>P%eptPl1s%#s zdO2rj4H?II+;(?i#{`Boo_>8tQLi#P_R|N$dm93}LXY+%6Ykm^t2(3SUcs6XbEH7J12zIsJHVqM& z#RqdP5!fqH??(y8@?s*Y(2ZAak^>2!&PQ(&X-Hn`2WggIEQH9b2fubiqSd{=+#FpS z7_9g{_lz3j9#g}m-u|mtrV7iKm|`tlTz`LoS~l-cHMvtzXiZY%`SVuHB#KogS_4)M z3Rk9k&YV=HV_Mg%a>2iBfS6cgzN%0ik-^FtV>5N0r6hupn*HbWa4FF}{em{0Y%abw zb`f1R6D%U|+zz$U2lke3I8iE;VO+NR;Pw$P?qzFdJ)d;b;t~xHcDPuUY-h(%STH)C z7&Y_}gd>$u?jO>uXA~~K9(0?b?d2SYX0Pn0TKk`0$2uQF2dB_4Gc+gMrsqo5m%SzS zQBDhI0TqxQAjtl_k;OV)Y^G{d|5$T!Qf1PcKeTniWG>IfgO4%ic`IcQ2#1Ui~)qyzS2HK&fq+6*?BfnyQ7qy8vs*ci_2jVOFb^3* zjT7SO>13b1Z$@v%7m##6?g{6NO_*0tkIytk_C!Zl%&|}G52j;8GdlJa>)}(Y2lC(@ zM6a~6NW^0I1Gytg~)+y8JtG=*caro=`6X*RZ=S~ph-`AepJUa9&cpEnf3LB%R?Rja$z5yl%U1A6E-KXUIJBE?@e_ zr;J;U!8G$=4_TB!B<>o@O{dDIGL7SGNfkx*7kb(>hyHB&xfkPXzG-kt9J+LyLBx&Z0f#722x^!c9Vv>H zMiq()SD6V9E;G%R56eH&e#=_&gl-noMS!JfvV;c!)duM?sQ#Yhm^LZ==Zej=`&4`; zb-YcMe z_Zi#Q(vT&MIp2NRrSW6FUOa>QhrsfQ-Q#1oV!L#%#MMT=I1D{)lCZ(mCImP*(vV|( zKl{Fhan(PYG2|}aJ?&~)eUVI|QID83>TnAqwKpZ3Sg1YpX4TF|N~DwL-2T8v;Bqhd znn+BjQSUT6@UtxXDY$8${+q}eQe>-o5XO?)W^ODwBh#GmL<%snS28IZ|73JB$`1eY z`pGEY2VC3F>bXeVK+9p``8VI)okXNpbZ{%`-df8Brm?s5jIP`Dj!;9&a^d&!Lp0=j zwK&r0AnNk<&q9+RvYkB6f~2J37>#u2L4F3~?JRl?ydA52N5adujI^p!w2iV2SAW3j zeIbv0cEjjNL1uG2)|rK@GPnDv;~y&8zl0z49q0=bzr<+5lYEO+CfQVUOP<$_duZN~ zjSsdsHeV1@P9fO5h7HE@DnkBluQ_{c`b$y&&eYBY3O$na&t+ech7JLzB93-5L#dR* zg3z7D6&pFoLpY=3`QKHMzWUMkN+#do@#$-v#fO8L&Ci@&i%Ua4OtQrFlfnXZmk4hK zpi?X|gqx`Fdnkx0>g5=Eg&X91$)Ah65$FTyivxjK9(lIU^VWURkU1mpwP6kLE?W94 zEQ8=jT5TVB+E$lQjnX4>BDS{=jKES!xAH`k2(xojZ$7SWN1H~T=sXp-b~t69n7>IJ zP@y``X|{ia6eRY85++IVB?M(=+CZ9$n*)DCie@Ew_Qs9|fHi-+b7Y|MAofM>RYi&1 zA|qw&_g@uY)EZaYuo8X{yAm?*yTJj%F(ep4HaVXnVJ^KW%`^#Kprub?S7DB9}f;Z z*=9Qlhax=~XnA1M`P_5?tIWM6f^E=pecq&V(23b`4i6o(%}Lp|8GCRI!78gTX^~Fm z3-F(GT5$Wy-mwk^vht9dm)#ek5|c-)DkjfQr@(PBW+`1D5|JW^`T<5pKT9AdC&T09 zn-&mdgtg(E4LH?np$QAoCjGTS z$fQZ1`mo5@(QyJ=@11U)OK6Rm;yQf97M&L_Ok;Pt?2q`#0bkqWD`F*iUu=>CuXs%U zk`x=G^2?}mY_q%F3K)R}tJ=SzT-;C07MQ|}LHir3d4zLzY$;@~-?&<-j1H++C*u^M zP3Jaj`Ey35obY z0$JYVYFE|(8g?`X*5PpQ=2G##ZfCR5HHSyvFHU^?28^ci)Wd!~{MzI66hc0fy0$Z*_BP(0j2*pEx zFZTRhVq?w5hZqQfU*1fclRyPq!?6e^LF+7{v2 zSN5!;9Agf>XZ$7@F(+paC7?FC!@nEc*?65|E^h=Oium-M_h-SupWF1+J>pW_YXUVn z(Xc@kD{5)^S}^sBryNv10=L21Q7@$ieQ zzksIHj8V{{jhYHE90#xw^y!{I9dr#a5k6VyBmOQ{XxJP44WooD1 zvJ0%*S@yKmuD&b0?>Y*5Wre#w6LLB5rNs;kzay>&f`SvGcK+DNM^2U6I3xENam30Lc%;9Ez@mP=t+)+->w`d9ZP3aO9k*-)>@hFA;CeM4lvEdo^1s zMOhUCZR;b!!!A!*m*1Js2(&@*jKCpbn4vH}sp5Ngf)D*F1>s3nXI2m5&%Rp-OzhBI zHcs(D7)idSCS@p~seTdum@)!CTKpMuTi4{$r1sz41_e#-oSj$48+J4zZwtg4RB2ta zp!%>2xz@u+c7CaDIZ4>z=TlkcF&J;*6mQFhc$PC>To3jDY&xHD(h1QUhx`nV?;eaqk-q(+h-9LZP|fsYv)IH-Po$yirl{KzNM$*@{Owu9krc(_ z5oEP2sd50Z%ETc}8q>D%>zgy)iR3+g7sWn}->*v5hn793`^2ev*chCIUVq%6hQ zTXy!jd*_ZVMKaXGEvoQ~MYz(h=UUoYWG9td^so&lK)|8^lX7(Rvk`!g{+?w2f|1BE zH7AvL2<)qnF_GvBU$jaOeR~Ka@pvHkbI#@#m+i6J9n`JQLI{zm->{`Y#9UznIS;iUPD&mhv+{J2*KUX|)_ZsG`>kpn#7dnFf>#AeEXfQRSF zVJC2HjO6Feb)iN8Dta=zL$SR3ar_ZzelPs=F|jq3tsJf1kvM-MR@f!pC*hUIMbE13 zxF*3Adh- zTAS3-qzg7Uj(gZHScq1cDp}nNQuCEVP{+=L=86+(>KDFS#@K%q@LJ11X z)^q)=i_@edwE7ey6mjC+L)dSMT6*XD>;BcJ4e87F(Z5N zdji=myMdWjnr_+*_-6 ze|^|MHyZL5#_th^r6F;PBnpp|za^gh9nou7#`bhM`lxL?SMu(M=o}y3@(b+xl(2hi6|;@ad=tCPcc1BQ zDQu6Et_|^|DLBytn0M$RfM`MOnj)xP6}ZI02C!EmV&65bBV+utlg=VsCeMB4sb97F zVB0Yo@ypQ~p48@3W$Tu$o}|ihOmlX;rv_NIpn*=WHr)_Mg{KW2kDEsPyB3TX=E!`(mI#?nQgAEOGK5bEw~kUuc9p#RM#Jvlg3ywIARXxntk;AHFXj{ z_glIDcSz7;Ly*dGub(WT$XHM2baaN9b~kmLLxd8N)Z1LyFz;jG`8*~Ye)B!jyH^F) zE@^f)XuUl`;GUgN{1d2rCmnwHm@tjTK%c4HZgl0LG{=z{{sEHLsir?ANH?|TZ(`|I z)00J^kj4{C-x!tOo!AlY0JkRCfY6cEy$iuWlHx3@X5@ELE^y$+5rZ2Q9-UX*Y`;mX zV47vj!S5n`z>3yevweRAMm%n63W(5NdaL(B>1?%;DF}I-l$f?fvs=nI zKs{Z)`jWNoXAa@!(z0X^L2g~4{VnHq_SWipVxTPou>-_ay{#N%O4_Kic7QHvwywmMhjdpR3d-Rm7NAneQY^83q4yCh4e3e{~@+7#&D}J`Ll-$@DwdTCwP}@LS-7*5R zkN4$lY18r>yM;-5v5N!7p6z~~A9F84Gf|t!mup%Wv+UNFdGlel8%NSnvaR%!Q@W## zI^(r*Gek_obfur;m#&Y*W0(|YLAlhuZXFF4vU&{4HShF>?1OKnyr2X0V7Pg<(4qZT zsP7g67)XC7a??ngV2}~#XVG`|`i$z5?mfnSuFS3%HoF3E6O<9YE@FF%=d3TsHdj6F zmK|LcZ|wurLq;i#wTXQ^Qv+<#0rn4T2?+w`tJLLd3y%Yh|CZy|SaYUhp<{fTv!pg(f|u*^-P+Lfkvxp43Zp-+Rg0m6QYDnXl69)8TNv z2q6*%&^44p~`_c4}np|x+#Qr~r}ustJq@w5^VC=<~c zYV8|q>3iy4>jJ$aDgkkhJ$6ymroFzK)!y$r;cmqzzxdjq97fuTof_6tdL=Xm(kGHTW#iAUm z_OcS?`)FV7*7p8GX!55m5TZQ{I9}}#P=D9GpNhM>iPa@M_hCdkv1DUi?1L(KKsuwP z_W>=nJ3O?|Ld(^33(^yW-N&7O9J`mS0yE0MN*$Mf#4|3M2k3t3CXK6}+dtOB==v?h z`!}~J9=)dfHn%ct2bM>XyhqnKb#9CPvE?x6KK{W^7U>pCpvIghN?_61f;h|rTzG~J z7&_hwL8>E0j^E6qX0A`vgx<~p1tJ>r4`I5x&vr^HGU=$-Y();woixcIC5b)oSDM}) zEHng~GWtp-CUj0%rF929x`}+BX*H!+(i!LSj5if^Q`a$=y3E{um>C_KgMtD*=;+z_ zoe;Ife*Jwr+->!FR&(p@*S(iXs9SIMd@ED(-7`pZ09jgTsDNYRl5dXgT^@bX0n1*L zbKlfO)SS%NsYEG?b6m-zR6zz^-M)1K&sNmkhn`6#{d}RmE1+hjiJ`8z(UbJj4i(^WpP9ro0}?22GLUVn>ZDmuUCiSdYsqJZ+ed6& zXzPmmsZY7vIW->}i?)O8;Ey*KFsxf4GRRE90fTfrF2R{VzNaF72<31;O)qYEWp}(% zBlCHHFT){N!E6?`QA@h6xbm{V{=xdDdNn>(H03wNr%x)^vwn zWxf`CR+h>-an$;;yFy0C26|3z^>aOv`Wpxc4=UTg86|-n^?nju zcCsm)ofH)Oo}P_n1~j$m4F;T`y!;T9Y6DD1U`j0>N)B{)<(LbIi0Rc6nJ6Ufz?w@0 z;rHQ#tv3jQ?10Y(w|&rDOK!{3c{t1M%d|odY|wfSr|?F@B;*z%h0R;(SLv?4$le}W`_XYy~3 zt44W}B<5*pWiV&j%pM%c)hoeRAPB_>nS?q;BU0SMn-I^Vz$-j}BJ%3Le3qZ%>61Ss zOG6G*KD+CGj=ZDb2|Jz1Oo?MqgIW5et|g+PZv9B38)6)LHhcaey!^>evx*XHrLAq!AMIJl+|f+x@;1 zJeME1q9oCO^7$7rF{E3JS^;W2`7cp>$lBp}0)@wDNii7{pcuXXQj?}|7uw^zzymIY zxVuI5Mn3}8C*gCgW>FSW12qQ|kpO+)tufGND+CGE(~;iV@_v}552ohfvm#KmASL*J~u2RM+r7h*>dn$3+&)Zgcg z{2>B_a4RAbm{D_YJrP4%>E0(uyW~39zIgXRGcpG^nbgq{X#{x_Q`eF_p17)(sNSuf zh<D;OLte-CnqR_OXb?zv()gFfr5la?mWJYkS(`9q^Q1Qhe{uH|&6eEv z;ITXRVTFB|-|TTM_8xQZKEETnU%8UtgbPqCFhBhv0v%iK+O#j>4IdFf15fx+6mVgv zjMPPw5x^Zs?eW1xjGhc7hE9a*gcx79*X#{ySD;W9E3*$iJX6=}P&>G0AA5lpLgo?m zGwoq$ITg&dPG3E1pgW4hZ$YD#urHCz*nfVMc+!#JVBB=e9OQgoPeUw!uixJ&ZrbH` z(!7rupgjhw_5U8PhZ~8OxdDql?nYCpUN8=SzG|oD8B*qwv9t3Qn&6nhrhFZFo>d9D zGdJb$B0sn*`sK~FuO4{R<%o#GhGTYX1`-&^b&5b~P$=PeZRGxIlE#PnP679JcWJoOLol7#C&YM&$XgmI7>I$@)+m4gk^ zh5QY$ydvae@}^DYQ`I$!f8jcDNL#H(x~sAx6-nq^DnUt*@ZEyyE)u%GjKTwB#|>+l zt>Z_+{qKiWoeJi&E!I6AS3zdp6f%Yhy(2IaH>fJ(dv9BPcU1kT@~X;6GpooG$w!Fm zb5P+;t*4xkFHgkMA}tK3DFYSX>*v`Y&H23AekvK}co``=eqak5EfNHNxN)VhP8+otWQ7BN4 zEOFw7M8)lCMKZbgU%t-UGsz0{$&4Df5RA5HtY~&hy4AeZhONJK=M@*LL92=OmFBc$ z`8C}D6r?{2s}n-lhp2BGV0%36(N(YE{R~!>(84cufv{nx-VN zhK23=&x_Zd)Xfo{&CL2yp(4Ly*xy?{K7KicnN&v`p~siK|3><~@#_kN!wU}XI&`hO zW#LzNJK#9Q;`IGHd2r8t+kwr#?)MfT>F zaKwobr9&-gv1?3Pkvjbf8{6j8jztb>dVf8gXgT2J1U4;OU^yS zTePOgx$~t~$37smJrM!kxC0zn*;hMo;Jqg*q<{X4Q`F|`i?t}SD!7A|`-0h4<;EJM zvo~jdKY0{0i4cG8{>z~Np~BdO zI}JzsSzI%jpf9jVTxgv_7aA;yY!KrGluW$)#No8Ub$`KWOMZuqz8hd!(NZ`zj-?*9 zt-hdX_w;2ya6ty@h4q9qj>{om2)JGAqib(ZQrScgb52?!%X3WY?eLz*SetmORu=P$ z%}JEuJf`2cXQB7}H89b}$vNpuWp|hpnikjV)wNRX=hbdA^5virb`XNL1fW1djXL>N zl^5Q{hdk}xK)3=7N65Rt>~+tgS*(um6}EI+Q^i?u-J`!%Pl3#4+Xb7l%Sz9*)Qky((mq!F)dX{Y^FW$H*L+FZUf8^`7mUS^;qJ5xlLyF|*Y1V2(291oF` zQbroS7@|p+#SMn@OHP>lRLQ?EkMu|6=sf3M1Q9>;8NlDrr2`H!OiCoRw!XPi_FD1} zpEDvYNdG8~rTUZki$OGST@>o2nrPt7`BXl6_>lSo~RR4 zlXS784E?GVkJy5x`E!{=kEo%)8%Q7xaXp=XW(ee1$taHorehK|>Bb~m3nB5G>WAea zOyCIZ<=!v);N1F1gETOF#TI~_mF&T#NgDdjJ&az3L%-h1;FI|_2ceiewW}*R4d4JtJhq^doJPR1VRwzG|^l2*HNT~#j zXL0@QWM@0=r3&c!_ud~u7ciUSBys5YGlGa)S+5OfIJUoh%O&-0ngz8b`sUMgc%)OC z^%ATEj)JU|eFioe+qz-1Z_Bj2K$%idyr2B3`6fyOlc?9C4)pl1cx+zqd8z?cCQshe0F+ag_60Ek$47LF6S9lGvjhb3 zf86XrUE3j&fB7oU{ z_3C|~%{q~F^=z9$#i2s@ZU1T~8n|0f554RA#x(~k9H$}M9r=AXR`R&4RgDrWa45$P z3oJ#ZU)P>K4Bd3ZxX2e>mR!kY6~%Ja1tR~oLn2_#2%Uf4m~0;R#&YWM^{#nv=iM%- zn&`V%J5mzML<-5wnv*+0IhQUIWlV|*#`YRr!j7J#ae0bIwsd`&|LA2u+Jsr5zzh(t z=+T?;Jo!$rEky^oD*dX6Mg|UTbu}`qTG>}kIS2mQT!RknC)sjC77wO5~G~?6hQMkH|S0$yUmaWA9ORIM46){r%gu@4xdn6S! z(;|pm#PoQv;VKeQhR=)8Z7GvnKL1b9BWP2-x|TQBHe}Q%>;ZaG7k=3T$RCjHdUXY2 z`XjLV5qQI*6n76){&7jcW^)2AW-35m9)i5=yW#ZoB5(sTI(30`+2$0+UNFM9=MaV^ z8HG*Jgk+hS#YqD}ozqfIioV%Reu`l9>EW4XFJfI&%?Dr4w}GEEdW6CXF%)@#bq6m( zSWn&8eOZ>GN1}5 z{~-<@XsO6(0Y6ZwMnl$KW5O{k8Tl<0%{nRQYc$>h$s%3%!KCt^2M;sPt ze)C=983}25c}4B@f`CxY_hPE761FATKO-8DFu+dCrIKOTQN};aC^n?2jzBV_;nkD( z16R*@S7xW&+QJ*D>F74!dgz%Eb^hVUqiUk+to%?Nz%*>bTHFw8Plx4E!yOly*}W+mL>Z-MJdhqH7Iv z_=vk+FF&(;rF+IVu6XUNdwzko{Tpsv7!m(h%n)y zso0BL!XK09($`nfp!U+4d#6_-*zChB1qdh#<1lT{B2Y04$Jjldci1W)GaQ)`J2y?t z8L@f-a5ReJJZ>G7w7Gre1-h}BKy}`26umD^UFD_@gc82uK(+^+Du(AaaZ~QfO@A#H zwc}k7t+oQqY`nWzXQZn3z~DaxR3CEQh@jg{s^@eTi0yj3EJ?Ne+M0bdy>pL|EdLLo zbtPQ>6!iHq9WYu6Eh`T_$#DWU!JlxT_>?1t9A1Xd^&_uinJ?Wh&NR5j$d-%7MMs+& z06UAv5T}xripp`nuEhN%Xts>tUa}Y}l0nFn1QtrWF$yj2!w);bL%(+wG;Mb7QR*sN zFB9J2_5|LFT#3Hp9JjsLB)mja)3!QzqOG5Oam)W&Wn=obrthn{(gQ44hX7hWscmWo z?H63u3o2JV2g6?*GP2|>S!IU`+6h!i@~bDdO^Km8lIBzU>u<1oRtPx;czqGwF!b$^ zN#@!khf|*idTkr`X-zIs^-JEu5R~6v?xDEs+{d&W9lKIJ+M3rDxx=eXtN&J&{cdvL zisNBqM4x)}t2iG>JWLUk1wFRzC^(MnUpP%V`xzML?q4Mx9V-xbvJ zxMsh8)1r2C>AtneR#q;c7lp}h2Jgr7P&WVOsdT^InT6kA3k)o5>@8YXW|`?^()ggE z9N1!hBRwE%@Jhq0D=jT7gq%K*GeS4ef;G6F8hQeAq@Ka>=%?i+k;{8rvaBbhX~LOE z4{13-nOs@_%qA8KYDZke0v~wYrX0(WS!2V=3SkJ%H~{5|AN_tkdvJz(;`%vS*8fVG z0Xz+vY=cDd!*kIFU;GJ1*f&a3tNo4uc956h_s*X2=3jZ+k19_d*SiocsQKDk!4dSh z^eH9fV|=)8gW|_&pqo~OK}nJG$&;oRRhRV&VDnHheH|4~77N7?_E2XS$;XGhEJ$JA zvkqJ&QIKXezOGI<#5c%O#tSyogcr;_<1VLl&)5o?Kc`w9-vld|HCjT%%BVNvH%FuO z<{x3s|Q;SFXK0ioz^Pe>3qKmhBad5+jhs-H>YR1y&tn?8dA$#%h69gX27V(O+ z&GX2Qz|GC!(`L)n7i`3>tvgUnz1+rdC%C$oi1{(=e5+tK+aX_)NR zWeaB;VO=%n^9+BEcWHhKdZyJ8Lg_iPRg&86IU92Pz0q4&h9gCfeQNAbgxpEf?-xNQ zRVjWL;%1X_|K$ko9TUD=ccAicL-yZ^$G7{%KQy-5!Iv&s} zq;$W7(|J4XNRrE@&JmzTgeS1o zR6Ba-ltv-5Bm&_x{o$;D$(x@;p53xSM2f7cS%gm{v78&eGEuYcE0D+{^hZI^1PzYJ zVXBi;P{pU#tT8Ph35hWvDOfm*sDp6@+qUn!Ro0g4{`vR+&f2q)mK8c8j|xY3`^2yT zs@2^)0hAlrMQMJU{|E&a?K8(pNP0A7nISfn9}nV`a37gBK#C*Bl>s+;A#)x-$Eq6o zlsJ~H?{s$jp82(g2?RE;r%y_aOa6R+_Mce7Ko`i~wqPuyAuQdD-nmG1oK^^heR1N{ z;szr7ZE#5nEbjbM!UEF+5gi>VAy8ZoaoI^t2_az?B|w0|c!U#aZ#_!z6wM?S079FL+orwJ?-Cr@{~zG7xsu-bb2viAIt|hV-B}gPM8g zth`M15?(-6>4?wIAAu5i4|SqHSBWC!-z%@T`HyANIs$z<&_TU{%vxXj9v<=_oa4Mw z#c{Trjt@6KNad6WF6?iZt!GRmC zF^}8IqTP^mrLC!=ZNneUpu&|UXqT*>o%bg=Auxm~qnU?kauccS)M8O|D%hX8s`ca@ z*V(UA#QV-AW>@=7u;py`xuEhOAdEg+;_iF|c#KQ9nKmnn>sk4V6@u6J)?aIziJJWX zKO3>Q*9(MUEO1IeRa;X{Ymv);M&(jH3DdXS$JUxJjn;1$Fc5hBjE`T4HXum>`WRY} zm^OLxf(_NI*34}{Kf6>$p|RyW@nzecUr;J+cjZsi8aoHh7ynX&&*kT-Jg#qlAEhBN zVW*m(zbeQvpk>wia@HVGFnh3`n%xS~6INl+N zn7&UuvO%Az?Yzk~W}piSWM`tYBz4}JtaK5lv%l%#e}@4=t6)dp6+u%|<+ps+w{jT< zt-aq~Or$k^_#MfR{(d4T?w97W*K&fL87>?}x^q@QJMal>1fhOaSIq**Rnn8P#5GjP z%8^f`AlGS2Rq4HBIUbgVIaiClabc~`MZ%QMvA^x1ms7hy%Zf6})Q-OME(1nu3Bo+& z_Hk@~p(_DwF&%M@!g(}OoNasM3a;wowgx^9J=M|Aj@iHcpvG$}*sO8Jn-15z668lo za!@oC;?%Aft%}*T{bF!&5yi5!=@g4=ui??AWo24@R=z;gu?xN8e>Kb`??@EO8@8wK z6T7yDXtP9gMgsYf;-kU_G-m2=gTaWic`-{;gT3P!&a|`Et*5Ukf3esbK-d>hf^FQR zS`Bhm@F*^qTN^Bwox$?Dj8r>iQpPu+ytUPjioq>Y@d zzw)F!|8_sFdgLppJ|)=3#gTa7^oM8P**eehIw9JL9HU!}1Nh>5@t2>c0{JE?a81jV z_5{6-$u$;j(+hy?_IOtLe}_K%v6H(ID<7(?<6*uMcQzcM1$vZu$C;sf~Ki`!YTw zeB+JvwQ7{1DR7iSyMekURoejdPi%0ynsPGv!qwAJJOqJIZ;%GZ}Wl83we#8Uj;&|9inFI9Y)N77Z$NEmqNYU*7J%4ciFjLz)p3|I_xZt$L#{Wk*OTrF~E2OWlHyHjFt*Cs7t~EkcSqW za9tEJ#y0W2_xy=62RKu7Ksp3Kws*AU^#@E}endTq>7X#HgHDS0rMiz1v!#dO?I+qK zKat&7xKJqm#HnT=II<3holMjqGTKB(oiyixW1{+6~Ga8GMVKkU@szX`I#g)uHLb~$7q4iPa|EdmhJHo4-j6}qYNNTqILRC-6*CNS& zGCN0b8ibsGglKv})}A5=S50Ls`hh1-=DYUONU#6EBVQnfMiIk+tj%lkn9=svco(9E3`WsZb=n zD!shf)yvpEP560wpn4==MaAPp4C->}jqpcP4RUOk(6NT=SyXa5^{RIoRu>NjBz5sc z5FR`~iMGra%g)g*{)_bKo(9_}!u3)_SUSs#I@29nENOquOvs$A3}N!R-k4Z;%%*Yi zP7x>tq)0yysiwsVT+2@VpjLawMY|SDNHas7Xydm)an%uDn*zh+KmUm2uOD90a+5Z@ z-ldIjy|m+4>%{%NrXfno*|^58EhGCyZ~7K5iYDz1Bz-%?uM??JvM50h(Il1z6UncB zpPKw?4+{;>Xf^Oj)i)aKG#(Z_twRLpi#{RveMp9-R6hQbY@ zMw~YjGOE;_kqV0*9=)GpntN3li-g<*yjXiVox})_Q@B=R@=Sj%g{8>N0bVUDmh!Ljl5m6*E z`bG1Amci+ZAN@E$M3^QxVtr}Tr!yO5v#{nScCLS5>t2rC%Z{`ZG%p=$%rZGmcwfU> zQ~_|Wbf~Xr!`?K??(a=m&03|V)xD@q$0HCR1=i$uq-P=Ss+oO5yDUkM?s@6oMr+QZ z!E`Y3m~~c8agxD02P{s;8MRe6&TpY4)#-3$g?EmCj+y|2 zL_Kos87*5W-&7`C*3z|Zzrk@zB^*Q4G1?6{Pt(l~c;Dr~LFmtzLUX?`gINd`ccQ?j zw8@WV;_#hc2xk~JD?;178fXX(XTMcQ4T@@FqrOue>eD=9_Q;WzU=%gL^7mdS@~lL>4(KbUpyf#5pv;EE~j zJF6E@ElZWpL-sdfqv+#zs!K-ja!fit2Q2}WW~j|P{LK3yn&>-U zXAn7xwJSC5yBQLv(GpyvgwlVE(;bi!T>ZJe_=c+GIj=F6svP;nhcTr-p<`GLvM+Mz z{f9EFrq5RHr^(LD3P_kV_%3RCxAu=IE$edwD^*AZvKAqn|KHyf&d{rFZ2Ebh`|C=< z{=F1-_g9R^koL|fwr)?kD#Hsx26it!GlW!-hl9jm$}4_=lKYcabJ4kv|2vZ`7atp`lHZ? z=;88wPB;?LH&Hztxry@J@!tuP*UMr4(YvF*pyB*~qNO9&**WU6_=^#g*TH zm1gTgxn8|^Wd8sT<31M!DsEqcV!8@u7U8=d1w0J5k;gb{oJRk4K>4mvktDqwUG{Gp z;D~5Pz86;Rf)uxh#w0=Jrce*<5o&3R#c9W1Tz|J?taq4y`e4`8ya?gBtkn`XtT!(+ zcxo-p2w3Yp+XJ|fF?Uf|+E6u#mUyuwL^AXT)Nndwm$qrNYL=l3W51#dGwWL#(Zh}Q9o0DvM4qc8Gq|{J_ z&zbgP*}BhiZJ(p_J!VL8IigZ^iw86~fw7tHI~^1&uTLmGx-%+tZBy#k zAbmuD!%xe+BMco_*yQ&NN}g8^=XM%bTAG)x8++X12h?7`>yL|?3y?de3wGJM-%da# z!b*5Q61xESe2ctJ50V91Mo5k!sqq6YLuE+qe|b!%m+ zvQ2%v?oA5KT+Y95f5`ZtFS_|X5Khv>Faz^agoPcoe#r=H|JCI??$m=s%To}~IXjyf zf;w{q8bmXp2dJ_k=_bnTUv!j#LaK;praM^sbNGZ;tJ%m*U{ToEw9I<{e}@sy&d=Ha z^Y;pBo)q00dnVFx&72KHem-rShY1)e0IoClJ_F@LLPAHx3uNx@r%Hw|EZ@ z4`pZ>N{o!d0lV;DTIanCOWGDr@S;>c&|iqQEQx&U+lAcPBP5n0R4oaM8~%vTIeuqF8zso2SMvgLzI^h|C=aS) zn;5)_G1Ue!q}u9;JCbaoHMc}uO2^0L_*pXP#mk(kIqkmEkIt5Zc%k1iUNWBAn*7Nv zB9EZMZO>HbHQMV5X%o6Ch=l=l{6|aLVVb6|?PBW4r;!J@+X|6KHXJ(q37~KNvvxF> zWdnfn+qas))lAo%+Hq^FX_Gie+yeHZ#ZC2IpcZVP0{KX@VE?GoZRwnoX3bOp=201f zcVgf?^wLRVS-;ZK>Ty=ltikIlBr#&ef0n}gDC7mIIRlGcFae>q|J3_)i!|OG42K6l z{c-G;Qbm5OGFZKXu^Yfas(=mk==Kl3cO7q1 zseO`LSt_w^-+4S#Y{6y}N(y zf#;pp`eoLs2M({6nB__R24|{Z-**vvAyFit!*Osb-Sn0sLI34}y7|nYR(q$FoYa|N zQIv2S>nxbNqh4_<k9}Vqa;V%qtv@0c08|g`4PEYh*Ig*a_e@DUc`a2m0(fCfc7%$2;9hg3Y>^U62 zb1p_ZS_&|Lf;(mjWUj!tEV_P0$Fl@kH>{M-Qs5qQ8_+AkUrLquyWUj`aN$e?n~b0w z=E(wsgNvSq?p@0n%d+_ehyvISjyhvb$8^ zO7efNtt|tU(bX!DiuM&=JgN)TPYFtL=S81l>{7ds8`f76*JtoG+}O2X5}n)ir!?^P zE39CSHr)DqGe6hl_i+UjiD%)6FJnq>JRqktT-Q4S{ChtT+suq&(W=HSbCDr<8g^8l zhRZ7!-)pl=W8qe}ctN+%XsyjTHiDmZeu{?)oNQIPxG{etgk{}}n;bXIW+q|9tSa*0 zEgdKZB>SZ?3lLDF3E)`XAD-S@HK~hHobZks2jVMwcC#ivm5B=W2XT-rHPhrm@HV>C zhex+L$dRDQd)RJ}uulT`WYk3l($v7mG>qWNNsePnm^J6enqa$Z?-R>(q#7`KC*|?j z?Z24WVLnV-C2G!qqzQUK9MwON!WfMPIWn~0@EdtmBfF~lE&^> zOUEx`mEU|Z;?=FCekLtcG0O{(Pk}m|+I&F*AXvd5#03f>=>;{s{J_H`xl2_42q!WQ zx_u~G?MmO%_c8*?5jiImoFhX5)O|y}a(seOnIIVoC+=au0%l~5&EmY5qHFSC$JwQ(Bv3vWW3j!W|Q^0k5 zfoF$sHPzYyR4QBm3DAJk(tG-etVcTjRZz5Uojw;Mmq39! zpXpKXQw5zqbxQv~xsrOxMeDB$Taf$E`&2C3rr6dq+qfJ1r&!Vju3IXE~l6{dr z(U1B{HtXC4K_Awylr)>^Hy6c~O6eyU`*lVs{ik>pKS)7M)vL$@<|q#;CiRUQ^ZS?8 z=bQB6!d_rP!F4V$@O6w%x=cdHGIhRxctYwY>_*T&ue7B$3G_$6eW%P>EddyN$8%?e z?`q&5N+Q(aKW;Heod+{*L4Szab>}1nyP+oGa0bi;nf!bN8=+(G;Ei=&UmQ2MZYm?9 zqKYm5G`oOWqAu2-d@aFV#~vawixkIw7$h86=;-~IAjj=EJ#mGKTQI?R7zgb{y62&> z;_%ABW)Z7TRX9vGw4;sA$gQp6vbr(vYG5bY;Vow4`a`#ol?SC#Q*rHMekPCI!|7iH z#&100E!jFiXyP>&Er^S}V0!`ncNI_KF!k0WOO$`ambY1-G9r#T-AZXzcy6bC^U1ag z|LU@k*n8Wlbc?=Lb-m{Q9cFIOog6rSIM)$@Ql)VAD~gKODr@wF7@EsBu&TL?W*2r> z@A$Eiq@PyuKsr9u<}ZDv%dU=R#-niFh)KAs?^XXV3=F_f&y~tU!OmUn!F51BnnCEV!OHKAK^LG5 z0>^AWOO8SDE5dl79trw}JJd(5BRFMa0T zY1_5gYyCcJX2|~y+XiCt<>B9Hwr*x?I3hvIs!}Ow(;jUbOr2TAPpDdXXqubX&L2uAXzN-E={< zIi#Kqy@{iy0rgE`g5SDZpzNX2_pg9^wV+LVt8~GBH?7F;{>MW zx#%FV7nMmaxfvsP%e*DK_4-0V(cQC0zj6cB<#hT!+O^}9IAugwu7lEFthSj-yN(z> z2G?~>0rnqZgy}*`6l8O?mH1tQ&|mKe?@O7~*1{G09^Fs~!G)3bwIEqbwme*t3s`sC zxv}3|f53VY({~Bq-bYLKLVF~ZYBk>|5t;W5>7?tr_(J+Z9((Rj$Vy79rzZP6exdoY zZEEG&-j0sZB+V0>urT{q9ln3hv}cti74O^>D#Glnvvq4RlA+;CKi{}wl%Lx}Y{|DT=J45p33?mIrE^+^@+_Klry7$BM<)-zc3r|SiL^4tWJ z^8&L@k9?KXlTQDYdutKsY{B zuVnJ^9*PvRzs)x`W`u7yu9}6?!Q9!<>SyP~))kEu1q0H}Ktj?~e*QNY^CzKrEDF}x zKTjvemZqikSJM8~>h<@}nw+w_7=t*8!g>+4qe-a3#C@kCydPvSjjqmh(EBH*Idn`2 z@vCUqAim%qLRdA$MlSh*9;tsotHCIBl>53lrWsa$M1`*@iGEqojFX;@;`#VuVIRveUon< z>ggXvUaM2ZFCH9g1&>9;woNo2}_ugSG1O^p)L}H{c&n2&WqYM7?5Bgo0V&1jkT+Ss9^v| zrECYt`Rj9leL5c0{TPQgCM{259>D@fe}qQDjV+&TwdlCa`e=%A%;rLg-Z~Akl>|ajV9m_+CdhULef~bLm z62H%)gZ$A_`fp3b7fhc6x+n~Waq6ulKk^7elHJ9R+~w6klw}ZnDQWkgJ}hwb$UeKL zw@{g!`eq$D(ZZ2{T6lG!Z)VGqb5!$#N^{NI%#83SrJJ6RgAvO$d_F7+B<}@Ao z4F5-rTuFBGAc6(4f2pIJ$upY)9Tb(_tejfr%WIUP>Yz_QFaU{yE(kXvLr}+))s<5F z%t`xJDFUgm7Bye^r*xzqJnu)9^Q zLcnE!WO+A4 z6bmp4I1AOxBM%u}EuoUSdtNMaQvE@f4B=Rclk21-dj@{{2P&5lS5iO)^|TY8KdC!z z3Itwe{%&5B(pbl~oCQnnO+~r{YQ}!X)2+S%uP^1LOw3+qu}hx)lr)QEA9AT-2GyT? zL+rwzJe|$W2)z7JB;kHN3shb6pF3^4c6H_<`F%i`p7D5E!3ZYZ!tnZ?$T(!Oj#(O_ z%t^y$N!a~W@BY%p&;uAiu4e&Dc0d>OYOzfN@O z7-by5>lQ&jJ@}c+sa~v!NoRW7Ya;P82Y* zSOXsp3~;Y0Ds5_8v_`T5K0oJCWm-iQC#?4K;B>z5w6D$_lt1aV%2~N+{%WM?XFzZ> zuO2kvIZm=LsN0Bw=C#ny4~jtjLAlR39!l4W2eovK?O)`2itlFCLL0$b$=rvFfnGxF z_9qrrCc`yn2aNaF_ zfqYmC83^VXnYs6=q2oib0#5eKdySf}3sZp_ZHy#`qU#Fh#K$A@sMy+#9xvg`5cy7g zXhnyUIXDvOpPVEzN;%m}r^@cowixQJlv_Fi({^}R`jvaV2u*%n%-9UP&FvJ zVC(y3_Q~(}7VS+tA?s(5Lw0vA-GbVwWxoVt%i+|?9OQ%wc#hOCz*_*w!@!pQ0z*02 zv4j?U)&7KL`tKdh4RUg(H-uGzeoE(^hum0>muAI@urG_mQ`sKJuFW#0q+a{N2L#|> zCuxR)vfzvOLi@GuJp7^R(C2(eS1aDkAC1Fd=kj`$m=_1iowJAM?J6Mah5Ak+>Y>^; zr4y{s6x($1mOR~ALNdB2jVHkF%$WIs3cX#?RepvY>AkFgE&L$0a)T*K=})@XbYs`5 zswh{S26w#h&0(FrG3M;^i-0v5Rz_3L|5ZXDQp2FFCcrHt5Wx z#AFVfd&Z{*iGGTBdN-BvlK|p;rTY=V1_;wG9bcGq;9qU#9&K3#-~765OZGPMXu+XB z1Zw92EYDuFP5n4bv$oc7$(kO$ioOqJP$wvfb$OAa=%B`ajW6^i1L`s}f!Nuc#sW7G zAs$YkSS1IuhCRk%@!Pp_#wRUTPu=4BP8n3k{ThDvq;iZzPikKgNgbeFGI3_6FR`}V zLV~e~vVJ@wDSvH+2Lt-0tthXX?xjuLQ*SSkeOhiM->BZ4wS2!m&J28{mO@$hPTq}& zx#{^tDKgBxaanEmqkPCB+H*q6b1InQ8y?z#Sdos|aQXZb6*(6W3M z(=7__U%862SM&Wh=Kj*NG>HKz?!>oLXRDsqH#fq9njN<(^r)lOUB6Srmr3TbaxC&p zWDdv?(DULvKEBCf-#UKK&+^Tfd3e9K)bY`61$QV4s4Cv6rvRry>hMWkxd_BP6=$=51r**OOpqV|AJR<*1@WAOo zf0Qytmqb?`>sM=rGE~6qm_4WrE!srSPyTzQ%Y-Xo8A*MBSYJS~*xSG=#%#rrJ&t8xeoR-2k5a8~0d_s{2LVtxF9bN&Qq;5r#J>eEi_2Rvg zA9asjG&gZj9lohg*Lq+**8eB-v+gXCpPb9Ped^@Hyi?IoEt8c?!#9Ni^<0Oh1Q8Ls zisJ9ir>9>(_I-cbM%tkWmku&+?Zt z-{~yYGXwTv1N9H2%Lr8p-?k+Pmum=DKf7Q3%s~nTndmiN>=8|fYR~e{-4Y89JwlC^ z0jeFlh(bizHHLJAy{PR6nvfPG$D5n(6IF?S9`;ae2!Ar4urkS2D41Q%8(Y`Cg$hi0 ze73Mi-{m-IF+E>j^1MxnsSzOTLt6wqyt8oD3{6LFL0Rg2@j`6;!ObcAoii0O-e$q3 zzHi~kDZwAs+x#CgHvz@lzlXNO5o(c?I_QTM_4!7DOC^-`kEdmcvL zX2xdt1l}2?zt+*K7$j1wdEH5`bu=>;(rmm`_;xPk;txv8PR&Q3BTfgsJo7st@x~-G zn6U1JuLo;jf}gF~y8DLx!@7(mgW~_T2Vji}r@Z1;vTIh9y^B&*9**(FVtFWQf%sD^ zzH)jV*b$r+XFl3;dFt#VwY&A5yZDYlL~n?4z^8G7`h-ElUQR?8@=OuLPmMT)y{k%b zy~=S`JzomIA`Cf-D{8uwhT4xf%-PKFkVz{VRw{~!8my1q=%8#Tyr4yilps-WtV$YZ5N_K<8eU64)LO1?-7qty;Pv4vJ|=oJGdqEpmG-VBCCurs8?#B@qOVtv zx(#Vl!gFkq@X`4f=~0kpq@~n?>X`TV=b8lGpYnsm87?9n`E ztqx`h2Q;wK>9N8~>u}0jliogBEc{(Grj3!tkJ_Ci+}OAFn>kKSz4b^ctjWf8=3rAu zeOcxEf7U+RtGdpZwEde;e!Y9<7aM$XwI+mHXNR`GOyJ(RC^LUOizH^R| z^qZfL%}@maJnhK=XV1})s$fJ3A&Av)V?c1?fp{{w8Cx2&-9H5VpU9uJ4ED5)hG|7& z%~+{Y!)#~OXX*0^oI?yJ#>0zvt#1l?BQ4NdX!cIWMU>~8$<6q79?pqSAFsKYOp5PN z0L|)a)-J1$rEQLFu_%q*QBOXaPxG!TGjPcr>fkgXYr?wx(c<7&o|g%R*g1t|Ee{UD zCaUBtN!fxrp1i5{MJjup&w^q9b43A|bKt;Ti%s_{!C7+mHCF6LFe+524r`rzy!*oH z?F|koezRlXn@jJZ*-wxyMIU;2TpDSSkmA)_9-ey>Oq!3>ZKV)9mk{=+Pb_{-;G?)5 z0ogrFH%bkS*uwoVA6jq9pp>y5Z_fw&MN$N)*-5mhroF{Zhswg(-(Dyxa*x%4u7_jog?P0A3Lmo<0ep1HYE ztmqGQ#}1>iSX`qcDx`Bdv<_=?|3FN|^`xJ*5)Jvfv!CWg?)bdn?dYU0W`zOC)ijM% zaE%J*BBSTTU5;U*s0L%T6k+(joFT`R*Y2OZN@ITCKTwV!e3U22&*p(G-;9!zNv#35 z8CgVgXAd^06bZFKh~fH!12KYtPiE017mOqHa5%zZXo}<}F&t^BU*kq>C zM=hapuc}A~Q@r;_a+8yrxh`9goukdeHOos;SG%i>$BwqtNF2|P0@;2!{_Fdj zzJDs>&L!^heGtR+v=>Nap`JqKGcU;k&g_>Te0=fa91)gN%C74ta~eY4zkKOP6F62h z>vwA@Ox-KCOTzf zHuxSA^^5W-fueY$+PZU{SccCJRJ|mAV0l5-Cjo8M;^+O@VrYlE3e@R{lLfQ#Uq{TM z7Ru9#YFYXoZq3k*-6%um^t~)%=~uU{6ERQ8iPskjJlXDloC^aSYi1% z^WT!FEw@2LJm|7bu5wgd-f04S3#=q!+U)dA=oCog+&=ZBEs_biv;Ay&Ea5S8Qq}5+ zf_-QrLyY|Nn*D=J7cIi2u-SgFBf3S!A}l3llVH!%^AE4%3-NhCPIb4nVmR%?THmO& zVI9r>>z|y*+w}mNk5NiyA^fD9SFUzyfc}yXYvR^li&+@HQWpiQA_6(f_aYOK^+6=a zOWwKX9awZQ=Sonzg3y9|+ffvj7RTx>XS1Ga)kis6PGQ&6$&~9Yg<%?}4 zCt!8;<}njYa2GwE-RORHCzOIwe#w8=-6CImu#`YA$Us%zd;4?7_UqqOW}zpsY@o<@ z%yZit;giqt)@*mCrz3Xs>uVQ+C_ADt`Pje5nbZIuztZ6Ts z?#|$wVIXP*6lwmjOm*8bV%DLsciSkMdUA?b>GK^fB7G|{h*VXRR6FhLDwL2k=HVs? z5{teZEQ{Zaj{V|pBlgSOt6;$ryKmG+u(?a@Cv{{IkB~DDk?HM=EF6!j4nj~%E>IqE zq^_Hy)z!Inp+X!`l@d~y>tpmjvwU{020Z0h(^ zhG&UK=Q;F{V64H!AH5RWxR^B+`sW-rLFSeBQ@_@GsJd^V!C_2uvURIlpXkeLe_yH( zcj8E}Ro7nOmwJhwbxA;JxIC9)D93By3yZ44sqGBIebXOPpX|LI5{B<(dvy02-4qL< z0-9?a0JozC$cB$xVEXn|n$5A=!YjYaV91^ zdP2{9Cg^VbV|W1NNKC*MRcft}lNzf18Yg6SJClqi~WN_FS&C-zgi{TQo_#Vutar<;4nDl?|o z4D>y6iedO_DKcXPPfyn#DZT zX|1c${i%C9AvZ)ekm3q&hwN@Mvq>~TgmFK^7hcH_l>hq3>ifyN5jSFD{j7stQj$>O z)IXcI@q|gz5Rcov`g-UuM*tUf&Y3pJ&?acrR^Qua**ot+{#Qbl!rRWAF-xNRWXAu$ zJd57Rf^N9*lv^F9S&ST~q4W}~9QY(M5PuuVnw@|QkUwrQGRbtSV5c+aU)cTQq;9zM zHVO44${s}u<-;(^Cy3|mw@4}@^=8eT$V}rD_&Ucz%MO$zAKH3><5M}B^KS^oW%P3# znSL5oMkD+9IHE`szvTC_i3jQ^i>Q&E#*28H?2WNOf~k=i`!}@mZW%)|ivI`Q++G;p zn}TpPhoUmcoit+?F24M|!$qYiGxXzH)?#E?j{K9i^k0jVonAHMd1>kAo!uKF-#ab4 z=2wJ#zd$Q4n0_Gs@|&N0_6JQpHPY%I@254enKVF!#uHyZ07?&gDWf#x_j6Puh8k5= z83MjcYG05WXp)>dlk6Oy7+uc{@#2FS({Di^f6ysoG+Pe39h+=H?d`qVk&4{OoxjR& z3C2F3$ECwo9E8c5Mci>MjC!^rmuXa7=qu0a^{1TJ2KAQQ3dzsNdg*SDJH)f|0 zmNnB5ZR`j?%woQwknr5m>=aULq=z2Hk>P%_k7J;`0Q+(o z1@*)R^TSQ2)XIe3iJK#IClCAt1b73HsG56q8~wiKz_#$!(oOtvvH3SzU!_QwKx}{3h2o}Sd{VlI(xzXV7CrIANXHjD!=Qqw_Dh; zkAH%A-F=DZgMIGRjK%$5UMsxJ)HA73TgaOFj*7%(B}>d_tO;^3WAn#yR`@9Npk@;67%`%}DUt(ite-b?JQv#oaL z8TAzYgL5;LpVV^ATG0LnuK_tMPO&d2K~Lk}6~9G%7{y2nglKJ7ZHLMEU1b)Vj z(N#W0m^mTH)>&q@a5>C7+0!2wn zHybz6T+W=?o9AdnsDTCD&(4~Cmi*wp>WA4U(L2}TPU%vNd6&l=1o$85?|;4s{Y7cW4sXh;;%qNoxrfoYSwvcM4uZYvvAVr~#ic<@v@^D$^R7iNt*HPM7 z{5Up6B_-pow9d~PI&i{w?0=JqF|x2Amq!rXI5?#v2;bn)n0w0Z-U&sx9ON7R=*#&B znGU2u9ykm#q@U))2+i8Oq-dYI{m{&R|7@FkITOwgQVHO?qAK_%lwPz_+xB(>1)!-X zdqrpzMxKHR=aOe>9iz0r@b5zL884BRoz;1_Q9Bv({SiC)4b`$&jjmyhW@xKxYkQJ( z_LJ+hWi|CJPjS3Ahty{A;gdl(qKT4jKxO;m#MuC?)shOjl;mT6o3Fk-h2f5Ck<6rxzm=D2&ufgg*tFPI2SO{KfAU{)2>@nQX;Zp5zho(MPAoEW~w)M&V}>q|F(~*VXcd^Eo2K(Xa&1tu6xHssDS5+iWLO1+WY-9 zFU!-BC8Wbf{m((eoX`TQ`yT~xBeVK4yqo2lA(!ST-Rgt6v(@6CGrHg9U(a|gh6X!- zU~5LepY3kf0Q=C1aQn(gi)0(kd-m$sE`(Vo=g&vAI%AU?Yt|LYoRZfvF>3+_8yMGD z?BrFLMLVGbf`kB?iF7b>nr|Xp@d?J~VH%~XM)I?jdkj8eEGU(?2--=iJi5R|LvV8a zI9(Bx81v7ze`JxrjS!j@b4KLLHlh@_tPNIQQ0B<{h~Vl;cV&L_e-6oA@6RkF>Ajyn zs=*?3Huuqk2p3=r+)Q%y1YXX%u^r(2kh;?bT_eGDEn$0Z=Z*eKx1-A*X-2 z-1|7!fGic&dfz6IvcrY>=b7H_BB{G>BNkKFX=fUfPYH_O?*AA6_hvJ0eKFzw&#UXJ zf_F6`yzqzRENdO(K=8`iJ+${3Hy7-!^TM5=vwqC!! zKA*jg_v?H<_hi8@>oIosC$QC+U;9k)7DilMKAg_wq>`8Q_!Dx1=k$QCDHLDdwNOA% z+Fv3eluOYMuw(^hT=n1CbMfelQ&+Biv~q6+yx)r-p&tZoP+%+y;wR!rO-x_(on5I& z$jm(ZQ-R2WHP+hB>NzLhZ)5i;0tjA-znl)mgVa*P96^T{p$CbVSPdYE zS8OUn7vs1nB(SEmjm>iEP7m5^$w>$L@|?ybKY?ghYaAy(fLwJ?DAjnj780ss%lQ1@ zk~u|h+3S9v^3b120@ZHcQXwQMOVGraAz%~-Vt)f(;rI_&V#Wi}a*5Xah4<5rX^Q>W zMGRNgMF%o3(l&4TWJYYpW4Lqe}d$xejT(**&3Huj=H2+#Rc!Qf|RSGazq2I2LQ==v+V~@dS76nr+@g2 z9_Pc>iw!4V_roLzM*)YAXWi9nt6JcOsB_&(ZHRqL4S3+dx>sCi(b#_+4sZ`3KaoG7(p|_O8gUsO$r0=%L^2j2WO5wavz%( zHbc&DxPjc4_UEFab7KY*A(NmHk>x=nQUgiSPKfelXows@^g!@0_?t`qJtC58?}&QI zb*tQK#h|wIf%;0yZL1u6g>@{ z_5pLs`Hv@c*6$9&bleFl2AgY#eI*kly>wC0-+ccLeG@=Fq)l|ynAOBz|3eB6%AiUJ*S^>y{lI@Fg?CVcbZAfwt>WGN{q~-PfBPFG{t<%F<*?4 zo^{qb)92afO8h|&t=|M*55W{h_bQD_Em6YqCWt{BGh~K=>#sI@%!;TM9k^ixdwm{o z{zD9_0+%#6LCt%8NII@4{pw^=V;xZ|AHSth7yV+}#D-ZC*?}uIZwON+aeb^Z80ZI| zRS%VMJO_kZIlsLHb`f_C(T*)`3Ce2`dGYjW=uU)M+5r$mHr0*;r_2MA&EQy|V)-zx z<2TOR4pQ)b0p2^z<|(c?SIkhD^!4uFC0~Q8Vreo9yN$=uV(nu+o2@yh@`pf!hq>|< z?!2!GrGJnOPBbx@0VEp!pJ|_YnRV3FNftWFYfrRlb)fz&QvZ9p!oz<-%iG81h<~ zR_8W~ILk~jm>?m1Y8^w?X}-O{oDgSiu}!RjmZb_fFOY5Pfy0nzdAk?Xy*jq&OAExB zZQ5J>Z_H@ua{ z+}v}CvJhlQzqtK<2-ot6))X9W?!tFP5_Hbz)R}bc++Exkp0w(3%YYuI^QS!We}q{e`SE8#F|a`G1ncs3&Pf<9FFh#$(IbrS<2B@v8x=gwOMZ(rH4Mo^=#Jrp80&fH)&QLGYFY-z}jv~>W)eh%=+e1FZ7{-UWEMnjT2ATq~%RF10`V~Kn= z#}c9XEWP1^NFIH{RTKX5Z=Va5g_?9q+}>#ReEm9l(iE3X@8mlwKO(EW6WUA;9o+@g zQUSg9OjAYGRkB=|>ESKB7(YzE$&Pqqvfc?MLf?zYe-d{s`AVp_Rc$ruCdg8_HgWuc zk0(m7dJW92Oc-=EKE4^Q^1LnJAn&4@A>+1J4{c7)xS`oA(s{YWf>WgU31p~fw`+bRTb+|V!R-P{UkZG2xj?RH z)&sm6yrLHcw~yVjIrov1f3txoy39iH;h%uy8V`f`O;#{r6(Ik{>N6rNBrHEqx$4;X zDPHfmnBgf{GWxR+w@LsYQ49R;;Q8pF8gaJVlqBbSv17I^J11mi6 zUxgq{-})W*9}CDJw?b5ws{=p=GW4r>j7}wkRFJbTvBWHXK3@}qFcA=1lHO=ozHxMI z^OQdIl+i?1+7b(w3$7vVgc5LvjU+v9^5EeR?*ahz%={pT9``fhZW!!{63=`Q`ZYn! za7c)(w$5&=`_z#k0HVi!fXDcnFK7AjZkpLp$*=8}HW;1KU&71=D_LSB6%GVNJ)Gq5 zybL$C!-OFK-)%_qdkBSj>>|(i{rs@IPhtD6!t%PJzc>Nc&5?Pu;6-v^Sh$zG#%2UR z-W=2rhm7PwsmUaX>Yva_Anj0hBd18$joEgN2|&@h;Dn1>AEQ77G{971A*k+QGe_-J zXTlZHMc|ukP(YrU%$S~Ub2=!J?h;){9ncfg0q{I{p&}Hqu6xN{gA)|;A;?u@OKVaSE>=sduRzZTA^a+&)eXe4{6+?nXW4)caAgAjBTbM~Jr_so!T<)FGwI*{ z#$z&0q5AdkVIhX9Y+X@;fY!S{(uf!teAA=$~O86~K!Pj?3!$9-yM^52<91v^-kWViweuO4H zL$67>Ab?3>iNH@TnhYL>TkhIrreRZXwW&` z2;pv4HZ1PoSvXphMEtZ%j`am*K(x|K~0c4wHNJSYRoMJb3m=-=Ur52Q}yPm$O#D)Q)rkI7+99aKFJX zy6vy=7qh_MM@t|(^?2mNuA`0JKR@+_gqF@>@mteZK+R~7)a^N*41x-RgsP!nT0sMA zUl2qe$22IGHr|@>kbpygLmb7Vz5NWd8dK~ut?xh)Din;RQi0sRWO<~Md0lc622tXf5H6i?8<8 zd>ug9Z^-1IrUaXjWcdyA4&2C{LOcdjAoT)MH%i#bOtAzJIPd~?q`KN;vtUB5%O`T~_8uQ; zhi>8vcD2rVIYaR+b8paPu^LlFD%RsGHwqyq=%KTnsK=S;K%<}#o%2%z!l-L_j`1UVilYrjLT=9{XbE^71r_(yl%{6DU`10VU*@!CiMnyLd%i!#8@hM6aAO?P6tKH9ON#JVw+2@aGz#2E@sVv-j<+(b`{!D z+pX*PC?B`OIQ1#$iU|G>TEsj%Jq~jnP<*@ANSATZtZD=cO?m{Pa@C%;)@SDWemDGJ4Q48J8aU!W_sH#X)zo1cC#P}X)AvcJ{kirA$aBuRlJkN5nDZ8 z4<1T3=sdc?$c3EFjIoNu(5w0IpkAT!GK;q#5KvQY#k1yg`)$Y}Qn%;K$fj3Dss0}^ zA6;6OB%~ay2q-*cVy#YN*wNo+85SXO>kIe2w7+?hnl=DiKj??QsATSca&%}hRJ0z3 zHQ1ZW8o<=}w0c+cy3FxblQ=l6Qf4IO>=azX4tmH($9%fn?kql7;i~o&?HDg)yUFjy z#T1nC?Z1p8Z&7~|9In3>?1n=tZOZS76gyBcS{^8b>p}MnpGKU6q9LmS$O5t1OAh!rh$5J|h2DsufSj|}?HfpdYl+ zx?b=E8waEC_(`|E9U_0Z0h;Ztc~9Az81wxjm{s|DVEX|Z zaSxbOaq9F?Vbqzl{$ed5}HI63@4TRY9C%c7i zonuaNJ@ayhUic;r=>iQbP>;_;+K@^D{jF=jiYRGr6U3Uf1}|nt(Y1t3d15MNT@*YucQAGi$lq^Ks<(yA|8=R>eOSKbPBz`cJ$QC zA@aTyQ>a7DZKjgcLr!tcaDU>E+$pf?7WzS^REOUXU|gg#=QQYuM|4pzL9;=bTBmiv zmpSK@_jBhhL@h5KF}W?NG_6+JlXHNngnv9pF&VC1i^q)O<<4xm`6$d&g}@t6Ti|~u z1j`2&S%6kG_4fk;B0{Zj9bjNZurM#1ZN*}7wt1yX#nf`LwJ@x~s8C-Wf3%v+!^>6B z)NwlsM;?mzQI@xAl;%G=0xex>g^dV!IlN3;-T{OdK5Zdwe$6=Yt93^7yPlu;pm?-H zS0DDpN=E6fusSn3rvs2O6mfg;_u6SUwGBHZ39RuM1cZApInNtM`2bN{-f1D|nYY;* z1wl>p>=COkR7O`UJ^ow=Wc^hs>x#z(Z+`$e$bFNpwd$fdxtUHTtb;)hwTNn6b+3YSOc60Oih?!A+fA4GJ~^^2eSCj z^wL4$N*O{-w1`s;TswyblR;Sfyq=;kVPMQ~7SS(fWzHfU@#R2FrMR$>Xfh{BHjKWV_~e2v4I!K=}1;Qw(DmYIu%GnndN_ z=plwoa-{Ouh2f_0i-z|V{XY{+KEWvaJcAZKPp#;HZH3O=P&xpq5KQWx$7O%uq-O^4 zhlt$4Dw)UMkJ9&`PW}etV`;S3y&zJKo-bTl5V}PPT#%e*G?; z%m+A(eBH6E0{9kKu5zkijBR*7+7P6-<^H=(TfmpOYoafBj0y_<+WDNq4ly7-tB9ff z^ieInjd}=5(Qg$7 zD?PivRF}e!iL^k2wU^V#s*U_UHG%rn%y|I?+l$S3TkC(TFWXxTol#mjgeAna)4~Y@`rZBor5;o5Jo5E)hryrrTZ?X5g{vziqtm#UyxpMiHf8|5WP!+) z(B5$YK2s*oF@TWY%9ZDaPjueG^(|FT4DKRsEdnR057VEs;vOafRU5HufTV>I6px_` zOn%(@bIZ-=GSYMQa-=u@boI*%FyTM6&&|b<7yLCZ7*|_{f#=)>*`i7^8Y|@OwY0n% zMi}Aelp){ursI_r(54}b`UH;@Q>b@-cV|pZ~kWM>N$7v@x%yHe)x@0N@wxQ&}qW|+8h&RhJe7aZVk)(vS5_(gSAqwpF%zcxB?y5~0jU-sZ4dJeCHl6KowLgRRqhWE`x z5x^FWI0kiLq9imd*n_50sBm+Uk~%F~>2jBjdLcrNcz!76X@1%lmitYZ1v>DWz_{2~ zPU3!W{j!~urLRsgth3?ca+y~X@F}2N75*>u$6e45T-Os2&5B?(hPfr?CF2~wB{ep+ zwK#zbg?Ab1Zt1RD_np|m<&ph!kiBVV`Kva(RewS;E9^!rxX^%#K5LK4y>EVSq+SqK zZ+NWq{)27ul3Dpry{v6$nm{A(p?UTgr5DZHD7hTGss&_w)DDy6n;KT?m(v7c=M_z0;Ku30xnE5K5DsK9rE!mO* z$V*Cf4k8p2gF<@@)82C0%v(4ceTS~l0xi`8<1RROC|;SS)?D(!6XPmPx_NOWVFX0U zCu2+N>8bB~fNfPzS`4Z(ERL)QK`L^6c27rw213+9dHRT>3pg4QRf;2aU_DJYxoaFJ z3On6o=cUP~zcz0k@<)3Z*D{#_SF>#xT!Hm8}a z{ag^H`>UU0;*q=C5 z^Vo18>qkA%hfN;0PBR}ol8TCO6Kd~S*^~3V2`YYF!pQdTCV^?&v~}xa3*TDKA1jAR z?UIhoZRiXRWJOe#%tuvIF~Bi!#pT?WN%0Z`YjtqildJVC{OK&n66lv44Z>*TWEu(1 zm=2?&k#+2c;LI>x1Q(ivD0ExI1s`da3afS=C00ao60^No*E82@0pCt{l7ms0!VSM2 zb}J!REW6-Q)ngWKFy~+u&B6Jq0lDRc^!t)>%cfjL_C=(_BgH=+i5ZCMKM_|Bi=#tjrFo#RDNTilWGq<24UB7m+zA z5?Jm}o@0gCpx*CA=ku?wY-803d{PsA9pXmTF^)y^m_KT|gVkZDJm+V;Wf{-alw0zH z#48l?BEzp#Z$!+@PTrI;x3Ku7IJX`7Q9~dIL0V;mhcd`0Qr%^4;lQKF}05Y8f75W&Mw^{R!&QG*4q*O%Kpk&rZv?YWEz^j`z<7;l7j~ILm0{Hwov)Of0^k-jB?Dq_LSSI>%B&>BvD0{GM6U<-! zA;RPu)g$`uN4hq_1$6Ax@!B&d5H}BYC>2>1=$=2GZ41uNf)EL|Vcrb>B1lWqvM!Y@ zL~;kzAxYzVlV!xZl6o(!yBga_`y7s9K-)mAHY zG<-elE5|y9_Iab7#Sd^^S6N{FA4dRiBWMyn3h(PDPJo$zBP!T4qp!+=A-G%J!^?G z)HLbUn`vuBy|QT@9}l5#xncnF8}`iN_y``yw#dzI&ZR$sms?9KeTi5#>|p;oMhd`| zksh^X3X~IZ1wro;>w)+sXZN+SNVDC=14T(>YExVP=68l)jd|x`zXR2GE;(LYBiCk< zqaMoBT%J7`ix?DCEpk27|8ua3aWQxLhfG*P<71R9%xD-wDV$z$uhlLt34M0y>h*@f zz;A_*OL-1tg`M0LOBJwmll{JWh_d}VqkhmHLt~7DT*fdHZ|1tcc5PKd{Nk(zPXc+X znsWOfC!ydL5e>S-C--E%7o5%XFe~KPO!v9lW1(-0#3s|+#>h9fI2qS-cbO;Ujnwrv zzNloMtz>&?;&h_ViI%1 zxvUphp4TxFN&`yMqeI-&ZT)40qqF=m*|Nh1OZ34&Ex907uP8sDOtc^`OOJ+EU5zYQf{Nt-K z`_y112AyP7zV{bdH)99w*f)Ob@*W67`GueLU(?{8p~dRX2utekSR-=rTef?-Wsh9f zRIH{+|4LmE(fTP%duTVhXdB>C=n|NbxV6`E28l6v{{WP>=tx+-pO}S0#k#`FF51yx zK-h>LiWQ=NmWwa;((+QwDj&FT+5S(o2Axq-KI|DWd{6N6RlRfSA-bgB72tqatO((b0t8E)j)Y=BG#*2Vuc&R*hoc0wCoy6n{jXJe)E7f)z@}0oB$LwXNK+X zKjdj$hi;`C{33Hf8QKKSFq34DMj$2Bi8oabB>kK)0iM1O&L{-LNu~k=i&x zYpJmdxTjIQEX}WiGw4A$88Z;c}TS182PVF`B=PyvsyjdHS`aLWxb4U9RDrk0t~G z?AV1?la3YK0kG@I+x)xMK6B)1_2%d6ewEdJ_<=n;6LacV0w(MdmnQNuvLlC&)SUqC zQW#;O<2Kem`|>^og)4SMeU~G$>5z69{r9gsy4Q6ey)OIxJonbG#63_KP2dnz89}&242hG(y2@Gq{PZnT`Dq2raeNx_zXpE zztO#+or99>Zn7u@ps84z&9<_FTLeRoAh0to-fuGLjOc9wRMt3A1opKZnHXa5jSWy1 z8~J!iLmBV?W)CTbhRbU$sqiKrujCJ>N2E@bht5qWpqYQyT0`VD{`1ddgiTHas(H6| z)2VeF~(cBXj?yCM?l`zO33jNb25CPp$EDhZP4v-K{#gUzcAFo z5i|g!h=S+ON|+)_RqO$8HP!qNx0H8F{*9VLZ76OGst;4lY=NA+)pPxF1$Ll9qvlR5a2=YL_KYZorX457Gl&(;0IxRM}SIgF-x?bN;9CN`#^RhLRLO zUWke-oKQN>%o51mY`b5G_S*0Dsm-HRWkg!T2z6kDxA@KvNL!>C8&-F{5qmB|fjJFN zS_gTMTP@T(e%yNg{KlfEsXUYq)AhGha4hH6ync`Uwv^kG~$`{Or*7 z(k6IC@C%R3?j+t4!Fk&su2`0F5>I}V#dc$u5>VA1DIS`2k$=I2kRnXwZ?ywEK<#Ev zwgMHp;xa8dzUT(I1&J&)?l$!q5`~;DI~^naH|7)jade?QOJvHPj#1CPtX)3Ph`rhz zm>JC}zL2!KuoJIXBv`>E{OUEu7m=yGv2g?l-u665djAcqiOEHVyT!Zf&b)IVUyuGt z{B|yD#DhI8I>|Q0&=I}NCiVT18d#1PY3aNPA#CAp_S559g`Zy)-f!{pRIavsMrWQQ z3^ET@PW^`c6?XXDM{Fq@;FwlrhlIK1&G{EvhAH-uxmdDo1dh}R!RYM1&3$@6R(O%V zh9dsU+#d9E#QIMue%Q%#BJU3Ib59=H&>$uD!FlseI-AnghB5JGi+lF9& zQ=iBrU4;`mrh5g3R8&qHd*w}d-ow-6z4U*nFFp2%$bIZpxD*20Ij%e80o5wK{}ORQ zX~SQ&TQqz#`iWrmwp9pA49QV^O{W#I7-$TzIk%YnBeFU1fd#rvqcBn%sx(?8H`_Tn z2*bP?&MYi8faAToLBi&-Qe?Y1g&RTDkxymlih0Y+g{cD06{ih57)Kc!I8>}} zh;=zwZowgB5TU-2D+h5Q{5SHzC@>taZ(z|Iv?k2UaDO>kZj^{L?T9e zxFdKpDVfAM6*5gUVrpVPC`X)~QG8O*&)c|&Ig5rL%G4g+viFlEMF{0t@c7ijV@u9u z4mRwPyP9?tGP72S)Ns`=>h&1t(Y>UZ0rly~>$u?7^{L(bMb?xIKkL-uWZ~n%mZ81G zWT5@}tu^(llDyDXxqd#3oHgyp3Ftltk&Pq4zjXMgx9H|4LIe>rdSWi)4yZ~Ef=V%&#!L!}=W zsF1FjJ?Doxd*j)*6mE1jw@j2Uj66GcH)y}%Ks;$o*ma3}>9qsam&btb%a2)~5RI<_ zJ0di81*@<4xBwMrg*P;Xp*^GY8LQ}M0#_!@XI zw+OcEmz!%&72I)%0@hq=!fL)cMC$%cFAh$Of2`yeJFbvn+ty+b-SntFSgu57x*$4J z-?W>^&&yRs-_ou+HAFqoA_^*`g=@&2ZSwjUVrtq5U$A#))Qmle`m%MQWl1GBvw6l= zxmBb+t)Dk(TaCbcQ4{@eOk8gMP)GtE3?t$#To{)`3NP_-+b@7b>Cdh~S*WedN zAxvx}(RH}va~1(e)L4oBbR7T#w!+BXr1Xh2byenNHi#0j(7p98Vy1ewTd)7&a$2Or z^$QzJ8^ZJ=i1D~}`8&Vo;M`Qf~toA9pzGi_C7sclbXAUUak5&2SbF&ZxRc1 z@sjVY8V5`vlsSiDucDR9T4Zwm;wu2A*l^5@INa+rlOA=_Qt|Wf?!Mws!*WGKk2|9R z;b?~}E*3#;RM%7WF8s`5j0UcA7;pve>Ldu)0;aHI=5<7Qlj?Ngo$+0R-DIhy2MJU9 zzO}%gBT9VrxfZk5hq#>|HFaRlWMfuRC(!;y?84Us%rB5U`hL&@c73*ozd^?bG%T2@ zZ-681#H1B^NAQbmvPT^<-vk7uyp7yXP`(%N$FC?d?l#iNbSki91ujyLMSG5HBG%+i z^tt8qNEeSD^Jln6{$526b452*lHW}dIYx!bfA(cjea#%OUlidIU$~<~8{o&rtzj$M zJ=0PiB17}$nav^}@4!@^>nVK8DUZ*JO&KI4fK_2>mjT*=W{Xdp(H-PR6*FuGSSD? z<1IsH(Q~biL_>f2N#JU_Ev%X7R36==6xBIAdo>VQP?Ap_4}Y3v!67`B4VtM_6&yPC zBXOA}#qm${l6yDTu=ck2{baT-daLEu*UtWq&2m8h&$KaJi zz@Hu`n6vJV^|78PO{wzq;eFO#qql06`d|}#Npf0+Zavxy3M8%7C)o!Js{^q-@@2cl z-XXePgpR}4G+e1F>6KR+e0q_`_+BdN2E;GA<-cZkI8CS&=|-fwvS{;+T8>=w7uny*-r10#cZ0eoB0DmylFS&_cOnQ^S9WGzn4`(C#EK?f=bk8UUm zEo(!p?)JH;yAt1JAv2XPdIFWEs{4GIruYm%UtPQA0GMds8&EyR#&tpGD+}1)c_WWR zhRr?k+wbN5u$FyHDllm@Fva!$`ci^DNSHZoWTdLdy>S_XZ@6dj9cm;LHbRf_R+cQLZoTq2frzrl}5%NsU2rE}lm~mB3t>+&(~#zK23h%Mb1+>&|1KT?xWfSzlF%R;h#Q zb;9j%H5XVWYHF2%tsGPVJoyuf%PAjZ)nYSe7EG9@GUZ7z(__w`o|ceTR1OYpHvSw) zJZZH-hJCbby%SmsTaL=S%=Jv{Xecc4#uyg9eOOAx<96t~l%QXUqaT~HA{1JNsA)yF z(}tPy^%2=TlU=(YLUx!ScGt@sbvqlaN%DTwGB?tLsPrr}u zXow@ZzRni`G$tD+fLp~=PA0^$>6YOOP@dEctH$;k%CfZj>%IFG;WFWuj@vt|_sPAB zFJf2EYHOTZA$wk1VIY%Nu-5_s{}_+*d9I_Li_3yh54`bE!eP^NjAlyC31zp`l4#*J zqMAmyez@tfV6#b{B(R=Af6CpZ1MU!j4ucLhfuMVodL@jRroT{C9Y3zd-$x-Rwj z!O7itfyS|rZ~{}opZZf{qwx_y3%@hIIQFX{+cUC9vEnS2;yL z99)Lt_T64E^g5`}peb8Mob%n=%tR(!gpglCK)6{De?x#mh5n_V%lz_q@Vw!=&}t;8 z(+3$0H%ilnG+-KnKivmxtKMNrOXiqZmy@GGpqR5%9B;<)G=_(+lt>BJMjhsztF56> ziqTX5pXVqlwAZqjp_5Ftyu_)Fhg;IOxDgAd(+kfia866nbR9J7a|OqtNoBtKCsblz z;7G#^w>w6OFNEt}NCa0828`RK9k0}cNh;F)|y>xYb* z`W?7+;>Dv4+m*(~Bl7y9?q=d%LuSCGa)ZrmZ}irl^PC*IWw$2dGE*ELdCGS0xV*R~ zl8$^t3U%4`l*Za9tw=;@7NHrMFYOLYC+aS&u3}Dj6O9uopUnM`E!lO3-F>DQ*K7>A zmCdKSlnxS5E*caz_Edr+Rg#`E~E?EMXAL2j(U5wy#Av@a8x){zeDhh7k?kzKl)<{pb^Q`#Lv>umV^!8^- zgf!tY;n>u?kC{GJ;YdqSx3i@W2PxB_2I0Pz$%4$Av zDU3&5SpPg99Zm?kDvZow^0+Goqm{+BSR>KcQ+7mcaI|(g<_3=f(U0LgdZz+wa2o`yfj3ZF`!>Y0fbZyC< z#3{usq#U__GmH-vvS?KLe6@tfA|wK}DGwnpkmW8N1U&zlhQ-fSO~{T3+EHV(PxRY} zM)=_nF@qhQ84$#9`A~Z!`EMik0gkxy`EkjZ>bG6}+odwIrEC*j6!}VbO#`L#Wp3t< z=gq~953w>%GG@yCMx-fTQf*2VpB&`v2UtVc&G@^rFAhlY1!H`q;&H_03vrJn=8qfk zg+z4J-zVSr?#r6=DR{8|`9^{Yh_Y=!jBT{PTk_YQ%24nNeS@jTUm9R5jjYm7{~PvK z+5C`#%DG@J70E??+PBPq{?to}{m?Z0lZeQCv!&~eVtL3ohCXk76MQGhtO3scRmLxp zeul!9(0J{KL6L0>el($7I!<+_uSaxF7Q&CX!Zq6ax$jY>Apwzvv{%OWC8Z)kK+8vS z9e&qhYYxnrf6V~_1zUkcBM1RbEzuV`$h}5>qg*L*|6u1eTGP-jw>WRs6$>2cOFeABka9yk@tbTfnQPdDM_kdzez|wk z%R&D(K?Cb$*{OPLLZLVF<&3Jnz2W;)v=O>+`wC5bL$kTk7irft91*Vf-&*vepf_i{ zZtE~T7YZJ%&&N(I$~TI9v5m;BWm#a@83xw$|LUbTxM#c{lUYnPIlo zWK#K5`stP#1>tpncXOGO7mpyHA%jYw#qjFY4L#W}QbR^yc|lIaMA9DRl#5R->Q ze-LVq5B4(NX)m>;3Em3RyNyceD*J<* zeaMPY;LoYjS&P~Wo>18%C48iu>?mT7I6LQVNf#9Hf;gcj@XCMuTClvKioolXI#jk) ziwzV3$Ot|2h%?>h97!TMu`)|ud+!4HsYG%Fnu|U5}nwddq$8{yuK_ z*S?iA6T1RD1rb+E*(k0Rybg@rAhJ3~Gb@EI!jJELI)p#T3327Bnr#xO%w`MJ-8=LG zwkJ|&0!So0J+-?9JP?QELWTr)XonB}As;aw+b>fDc~HNTHG(XO9x2xB> zK|GmZ?E8=i?1SR1oln=BM~Yox1J#!N0N00meV1pV<+vX#bGhzE3J__Rc-!U9yu&7A z+R{ss!kafJvx$>JsEn-Ok*D$x(w3qFel)j>#Ots-5QkSn=winY{H3M>r#WRj-?qJv z-Hi)K*kcSFN8N@@(Dt+9j|^lHV0_7D(~gY&+&g+O7+po(sX9}9jQ?l(jT>Wogq-B~ zsuOr|heVa-Ep3=&M9tGj7Kzzwl1K`)D;LJUa626k#s2EysPF^;|*Mc zA6tRs-Rjv_3k-@z!7}h;~QV9 zk`5+EY4{-4=ANj*r$zg0IdOHi=AKzt=S=|~7k%qZ0Zyi64@3i@!e_+o+Gx>=cx@V0 z=@1^i%4F(!N&lc#BZ=1!KUo7zvbvt3NnR467dHowPV61}AA4{959RyCkI!x_Gsc$P zShE#c?8}U$EEQTrMO2DH6jE7c24!inv}nOlDj|DFF=Oe47NgBtW-Ns)Gs4U;%l*0E z-^cgA_$uN#&UMatKA+b)$mNFfOok0!+t;0Sghoif9!)i8%@pR}-T&~D-Kiyb<;va4#m;T>M6s{Q`-ZLisfb+UDEb|4acyK4O^4;!GHG@E&bW`vZd=!d!^LXO=o4B zIw(jiN;k%7Z%|BZEp?ks-_Ti`8AYVSe=of(d?c@Jv7K-~eeGJc+F! z6;e1kH533pybNfb%#D@=nSj}70ZlWc>IZ;*y?(ru73@=#Mk*8@>zDx8z9NC6xcbyO zqzGvMH4I_n=^0jUin8ny9)K-h)%M|?wafvIeG^H1MDIJ-Y2U_hvyoBAS5?=$7V~;9 z<>o(4YyuA2-F>WhCQEp2>)%5bkB_`y-a9Ru;Ncy?^wYY?Vwi{`0a_N1Y@eJoNjuK= zd^qh{tT(|^)uMi>^@$h9qZJVvyL0E9xIi%Lr>#%oK1bLm4TpyFC74mueVb=3xsRiU zZyLaEG=`}wlqC{&*HfB}j@azWrzAI;O?wki_!CJ;x$&_Q# zyWQ_)p6@vxQ*##o+2%p&E5;q!Dbr*@VYjBS^!9ek!xbC#t!_eX($=~2H_SR zvtg1v8mylemVMe4!lV&BIs4RR-@0XyE&oc{lpIO4ik??Xnv@H)%1pT4`e4JOnOgZ* zFw2{J#;nosL@EA)j4O-+ulQlVMAeT2WDoZl)_Rv5REs?R9NXipX6BS;$ufy24*Q1Q zU+??Ddh9nVv(kg>1Z1w|?CM@`P08_xmB5Ldf5}_UMIW3O25rIl9jrl+rG>wHbsl!4 zUcys=M1E35|DtGH%Wq(ti5S>n1t@6<-=^%JwF(bsCCi9K7^mtCZpwQ<#>2h;sjI1R z<@@RC7l}SE+pLUra$R#jS0Lb4e{>L^s=P{#`;l@BE%Xn^{XK;ci#KHe))gCzk%5*2 z4&0ByI=IVJlcm2!m(LUpC_H+5!q3_KMA%`acf0!IzI>Ku-6u)^9Q t$*h)&e`En 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≷u7wAtB@Wf3ne8)zB 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�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 diff --git a/extra/res/ttf/MonospaceTypewriter.ttf b/extra/res/ttf/MonospaceTypewriter.ttf deleted file mode 100644 index 29e9a6795d2b66abc6ff32b2addd1002cc1eaa5d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 38748 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ⅆ~oO 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

v%Q*Qgy;tdJj4ZONjTx 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

sDMz7$^SDZV4x`K*fov0l~+M89O^^Om^v{t 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 diff --git a/extra/res/ttf/Roboto-Thin.ttf b/extra/res/ttf/Roboto-Thin.ttf deleted file mode 100644 index 861d63adb6dee256c5d63879c323d27b5b0b047b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 122512 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 diff --git a/extra/res/ttf/UbuntuMono-R.ttf b/extra/res/ttf/UbuntuMono-R.ttf deleted file mode 100644 index fdd309d716629f4e5339d5e5508225ed857a3ede..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 205748 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ăESk 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 G(fmJpf?fdt diff --git a/extra/res/ttf/cmunorm.ttf b/extra/res/ttf/cmunorm.ttf deleted file mode 100644 index 72cfd4221c09a64748969d5852486f062e427ec4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 210868 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 z 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 Ttz>dm*FbJmlFADz1_A#IZy!O{ diff --git a/extra/res/ttf/digital7mono.ttf b/extra/res/ttf/digital7mono.ttf deleted file mode 100644 index a481b97b4f84fd4199360c511517a5cf22d2a664..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 34404 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 KWdi<#z5fSo7^(aK diff --git a/extra/res/ttf/monofonto rg.otf b/extra/res/ttf/monofonto rg.otf deleted file mode 100644 index bca1ad6a4d19b0354f182792c9112ee2b0416e31..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 57320 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 z zPTKqkU^xu@u`r>?LYkM$(=#zG9a!b!(X}4fzxe02(u(C0FDBnl5Eu{H zop%~fciwEC?z~@ly7M0BDHzz(oj0(jU|>&o-UB_|c|Z1a=l$5z!27DFV0=%5K*hit z+|$4t+|$4t+|wYCHV8D00$af~JO$VA6kNm8D6};4Ugl}Ebl|;f zuRzRK5YSf;&{q)9S0L>xkoFY>6ats05V$=31uFgm6@Q_nzon(XRtRdI0Rr0qp+kVs zAwXa&1U%0Gp?jckEl@B(pdeBpFOnfh7+A1CC0J+~EQlK{h#M>nS_qV02EL`2;9y?8 zu}Fqs-Xj5FVuoP82_Q_&5NyP30pZAM22F~qD2unBA(*!xAb}rmKR6Tk z1ql3jYeJ>KFF@cIAn@aD3)cjG0Ro2rfkPl(_6)&+!iWL|4!jpYrNALj;1DQ`i1!J& zCU6K8I0OnK3KTd53L^>>MieOU3l#VT3H*WtenA4iAi-2Y0>2=EUy#5rNElI&z%NMP z7bNft68HrP{CNK~1P2NHf&_lS0>5B^AMd+{VBU8D3H*Wue*BUTl>$HBui;GK7cB4# z7Wf4V{DOt?@jeeN1%4p{zYxP%-qA|=Bd_8RVLTz2zR?}WS=bm1tF$ROX=0X8hsnbw zOv&iZheSYFH-IoRKzMLQcTb^`k1bf2$CBF$qj)F7EQ#j)#Gx+yTFqv{oK;iuM>z0#=xrK0}nqCa{fW;r~b<-2FlG0OBFd?Hm zPuA$plLdw5nR1hg5(^88;O3wZHeK_L3_>G=FYK*OPfW;ybYOZ;dSPjK{kLhqGFyVtaob@g=r6;7CEG-3=!gTTy zrjr*RzKvdiM!sbh@3CHdq=rhLtlY`)RLM^^FFrOyr9g#`#zrqbssa**&xbIhx8U&J zg2Q|BcZo)CexU}$tJIsn`!ag-cVB>bn%3EM-lp zsb16oY7CV^6;K-?!+DJQo~oxBXb~-^ZD?1z2kk}op@-7L=tMe$E}$pT^XY|Q6eWtOknLNn*r3>^*r%vg98+9Z+*LeOJX4qz zAFW6$TPsJaj#ix^$LD1=$ZD)rrd6TUbgM5Qv$w{o0h=xb;}b+NE0;Sx>c|YrW8Vne{sBZPvRWXLri_N9)_x53QeAzd-eNy}KAVvEjj@rI<*V<~wV->|Qx^dDKg-OfC zI&!Lr!M!}s4o31@)!V+^q+`{CHJnJYT!Wl~o^v`*7v#=4Y5Qqd^p&}z`dsA@Z|}q* zk&%g)>*^{mpVJ|cgtPbID6TWt`4J~U_Q?JblAzA0vk#&;dmY=E;k?~6T&N^>+SHt! zl~c>hSFPHyW9q709XG&3!wrObhm$odIqO+hwXgrX_Vhh{^^nI=q# z+j>QdzUP$ORVk-@8i=fs^6^ci)Us-B4vIi|NY3S<5HtrV8zoKYW(m!zk<-bGsH2V( z(@q)LF)v%F8IceGKlH%O44ucPjeptKj#828jXrMZOdSQP4)U8{$uH3q9 z`wCOOb}`pmol};dl{0zs?pA0 zn^jx^C;gq<=)y_S4H!BnZPe48#;m8fE=}o3YVJ!T@5a6qvZh&ymxld23OQ>y!UGYM zGmS)C5OQYNj*ysV<4tQ0=r|?a?W=2}k<<~{o%`|8S=0W6?YhLRBiF`lmZhwpwQ{|~ z<`tWcYuTk5&gq6b(y``=s9ue%#-8TLunDCZxmtF&DRzC7BeLOsQ^)7znvxvHkHm)J@vaFbFz>iRQM2qitc_wrI4C;#BnO#(C6B`Y0NCgd0iy zO20ABqgeF^x*Li{ETi<%fZ>xGod=>l1GqiOW@n0POW$isr{2(4(TU643FT}V-Wy$MFpN&@*Y9NFvu7tO?`f6l z#y+6z`?T2?l+2>ChONA9g1|Pc`sT!wVWpEln>|^38|m(I3Eb=-r7OQ#xnjNJ)^(H8 zQYTHyFPyTfe6}t$jT*LLZ}ut2JI62H*RfTaeJI*?&m@iNhj@)j#&Vs9^yGB9r5bks zmn+t7aon(aTK?p@Wz&mvoIN*#LZ-SN^i8CoR&QIjeYXRgl9MvA(lYKp5yN-6t; zEA3y9HDN;fuICjD%h}OeQ@_qjcL<+W0#kBK+N6=wb+cAcTvytK^Q2zU4}Pz40gv-V zYU&8R;j1OfHao6gJZGwoT@VNQ;FM^tlv~mGmNE}TO71fnePezLS`#7WDw6*N4eV%6 z-{?n~{Wv=?teq6;&3;s)AC#17rO8SrR(WUFtnE|Rf=|&~bG|Olb6~*-HzFy!W7Vqi@|9C_*y4ut5;i7n z-FqBZIo;_P989NcP#U{2Nb_xFB2uIxjqMSb>tRT&f_0;z1S0Xpy^nBvm3?@8X^d9I z#>B6?h%0<9rb2&}J+yo4q+wMys6Vu~=(9hvq7Lp^x_O)KlC&TxXI7GjoXW7~8`X?zAo^kOnmY2gYC0uAqImp421y zA#$O%A6Zd(z~RA|(}TjI$9ZY*EL87Y2XxjHX6Kd_x=* zG`MkYZ*CHWI?&3tp$shNgMmIwX(>yhw4cT7%o2w6zAde*lybvvsqZ3hiu0B#XU1w+ zUbG4gJ9CkS-FTK^YZ+M9hiTXh&1FW_cMqdF#TJ{pzhiS(PTRhH#me&X=_~W{rcHyO z&GkiFkQ*w2rJLp)xg3h+k`ejp9lG>xMhWnBxc%_9nB7?1u)TydPc>`QhC2{R#!N(3 z37nOl8)F#oY`|aKnD02NgUAZOm1lQk?962vHdb>zNyFxAlrS}wTm;u0Mf}X5v8X#Y zmNkz?F#2ugx7cUR5Q89O!Q|*$Y_6OL_Z_+$Ct)b(G;HHM2*fitL)Fk4ZYUb!#|`0z z`k|q$Ik_QS&DnHf*kVm%7?);b5z1iPxO!JqPk~z5L=87!7xZ&LvnkG&_TzdEL_Ki{ zskwO&1ea2%Ef{LxeQqGd(%*lZ-fv*$#Nj$saa7*k!+0^|?3dk-K(r&$K6rw3I_1d! zsE1Wj^Rym0BT@AE0p&W>7A&Y7z~B)VqxVRTIv^$a7}+5wWG6-$ZP9({n(bSbY;mmK zl;20kqJ(1fs)Sr_E>ffE+;M6NjmpsR;YYY&ZZ}@N>oOpE?gPK z&ef3Y0S(g73&4bmv1d49$i$NTe27>lz`u*lDu_;5%y2Z4bA}Z<=&~jsR%aROP&i|H zjuv!a1!{Y9=q&rQW}(L1UxFMV8f2j%YOWdX7n{)_>Z!DG1ZSdpNzEg;e2U$%de!#w zRS@Y?neU5PSinyqO2a-!PSZ5(_7`gN2$WC#0$q@aGD=Z1H;8NILMZkvDx;ieBbPy; z3k6UjvWgVkQ1?K%wt3|?3CLn#mMi%+iPrNBrIkgV081XXYA)12nx3m z2^VaU`YNM(Z-ync69Y;%ptQzYKeOhWYCXehdq+{(B_&x%uer2p*S_-(%3|}p686x# zoyQ(IAiLn(TwBh5$N+qsvjC}Js7fG>vPxKFr_zUM*rO{~oH?dFe|mS-Er)kuHC$V8 zkBBYq3_C!hgd1H&f3so$f8?aJvV=q_HDXkSWh{nB$ku6W*~P_0Ul%yCQ>W(Um91iL z`=jJS!MPCvm>ujCmjkv`!{U=HD$hZOhl8F~mc4=EN$uEu!>H0-a% z4R*jK9U`Hc^Wi4`Fz&{0aBo_Hw)J1<&#i^Nt}l@*8=b%J5I<4vmS2Zu-;qUqVQu$e zkRRMK!Sc$6mu4guXu0Vq2HA0KDx_@UmePug4#-XVw4&m;R#}IJqxSvp+M)w@RM*i* z_8}r~UA#{smn--0ip^q}L*VVU>_iwJM;1fW!BG^YAXL5bu!q{qMiC98-)u zi`g3*6w6Bai40ys9!GYdVAKvK)qu7ziS{CCW0%HxQufHU6$ig{s13f%Im5Dq??=pU z(Kfg%Qc6`%@9m^+N>wlV5Od!nJHNNHa!ZO1CbCah; zbg_AN39If%d$I7W$gm}s;bw`gK|`Ly9V5gc#d-ce3#*7L-HE$PJ*3$S=GW@RFtZiR zGIr(#4ZHm7)yvj7u3t7i7vvkaYTBNw4j@X%P|j`!D;+#FZTwVl$|1$(FbIY4aM1&v zE!dpwh=?6oKf)qVUBXH{q~`gkj(Q?xZNEiqIdWYLeokNCnbxmQMq;Rr<*XiCBCDkF zm3hAT6-;kCq-TFbDjiFbpAiH}!zM~X?n9IjM1Y2zPZ04U_%#Xm;vP0#;;-sw6YzyT zeC!S>BVq*s-_#Q`2uL0gYYF&Lbw;U|x>u(Od^N|5K} z#3_QPCCHyt#191dOiY}|zobLH6vGcmkgxH#`|v{suso(Jc!&yiU5ewTh$C?FZZ&9jEeQAv z8AaX}Ng+MAUi33;dkhkf7EctL#HHe|#RtTK3~3E zz5%x1)i4C(%ov$|u*vRgW;JtwImSF;KEU=l6>OLbV<)iXY!!Qo{Yw$9NKlk2zEG@( z4Q~4sClu!tm#o~a23l>kI$%|4bzAAATx3mK53-(M)6-^v%{MmYHkvlxZ6>vu-R5YU z$8FxWX|$Ev8g2b-18rk%H`vyw+Nc6lvsJI`NISKio84f$6uVh=SMB~*w^4Uh4^$_q zbJerdOVm~Bk8SPS_GlZ_c68hPw#(aIviGx(v`?|0ZokETzy06sT-x<*7uhbc-DmA8 z+TCbBs(nuT;`Y6+b(D3~bqwe@zGHsJ z1s%&fp6?{<)UVTsPFbBMcUs=5qSJX7D;F0RKbK)HNiL->XIy*2_wsSB(_PoQe(U<9 z>+{a?&Ye3C>YUPfe&=&>E~JCxy|#O=UvZ_UiMz2y|TU5du{Y?=iSje*SpO7g7?qf z$S2&Vz~@fNZSmXV zcgF9g-|v0f_4Vx=+;>yo>b@uXUhRwe(fzFZ`ScsxFSptE6T?SO;< zhX$M-*k)kofrAG|4m1rc8@P1f>4A3!zVm1OyZR6DPxN2lU+MoMKprqEpfcb?pfpeu zm=Sn3NF3BYsAtgNp!A>xLA!!(1aZN-;K1N>A)*kMknoVHA&Wy!gghVQG-%SG$%FO} zdNo)&SUWg;@YKOa2mcl79vT^%8+s)4TIkau?n7n_`DVzLAt#1B9cmaFHnd>q;-TLS zeK@os%qFZ?*pRTSu+p%lVMoI1!rAbi;e)~_gy)1$5C0;3ZFp7qweV-*e@BEwjE^Xe zSRQdY;$B30~kHvH%a1llBPAmpMtY7MG%|DKtdXlm9vN9XvN@_lRNttPQ8`ibqt--KM?Hx8E$TzGC|VZn z7F`s5F#2}1d6dnl?xVa$4Iedn)S^)jMn{aU9Q|rcuQ4HGa>pzi^Zl5IW2Ixej*T3< zW$eS49x%+c!2WHb3_B*rl->Vt2)!ioF(F8~fWhA$NkLTjpIBi^)xUq4GaTRfgEnI6pssb$)q%RsMzitNC~H>+}CGiA=0XWpXk3 znnFzprpcxyrk$p}rmLpArst-Q1+oHtLEnP#g4BZ2g82pC6znKCRdBK3Sph1vEp#sQ zEDVIrT=3g(g>wrR7j7&(Sv0e_d$C9Hu;Rqx`NeCB_ZIIj{-O9m@%s{SNxKqnNu%KYcp;7wDZ%RO>aAW$n>!3;hY;hHTL;n&UsX}u_ePAyLF+Eux;Hc$ht>%t<;G$(z8<;Nqw$ci=waTdu0rFf z0rUiJJk^Un2<85C0+jpHlRT+=bUNoo1>oXszV3-p7N)6AvfwK zy&jSavD_?mH+nbf1}SQ#U-91_CAQVbZdXk;ypE8gcB&6(udDi{6v?m2@$`I#+fkZB)R@#gr{`)pmR`ciP7i)FP1ZxIoN^<*7~TJAFuo_B zQerzBZpv!_RE`8nZLk@rQ3Vm`FLZFIMz!(Ovc`~s8c?;uSlrb#A(LVWY2Fb#Ov%?&M6z_<~($ zkF7s?c(1O-f@nM#@KlQdmE54>zrTWKtZb-#*YJbdlj}Qy>(BLf;09E4{p-1Y+PlZ8 zK%`GW0jQ$`a@mIhZ$cXJQ@^k`;yVpX)i*h(y<8yY;=pxGXft-`RXV6I0D}qs?tACN^E@odfcTtZn(#n|! zm}}~p4A-Uj??`aQ84Wwt2D(xEF_L;lEB{~`l*c$_)jel1wBQqq>FyH8+)O3wb*5t!q@{0VJ0y7a*niOGJ|3e8>wa#b_>W zM)n@gb)APF@9!+!w&l3vg-vNAlV+q&O4D&=jr}Nd8%WoL(vZDcOl?25`qXI$#0Ea% z?BR)xnbLFpMh#4%Za{bp@ZJphD{~3jruH_E;aq8MdgDlVRfE3ay1|o5w>l};2$?*1 z`L~JUHc6E;G{_Hf+?|lp_6H`(npm#^Bk>6qiCU8&w48HtfP zRoSO!X4Q&^LlEVNI^1~)`AC<*2b?Tx{M@2E-AXi&LJL8gKzY_XbfAR%7I+6?!BS9x z8np|4OGeO24b)_Ml1}~B@!_t>14vEMr#PS>=wGH}p4D8J@ zgSL!5ny!m2%7`*JaE^C8kRIvpJVB1nGS0+q(jNVG%gJjFhzWeiIcgibO3qYF2nx=a z04%G2x=~SmMu(0`PV7nw56?;(GbZc6#f!TRoY3Leb>TP2(TF|`@mup!$a7xvL*lh- z7k;%)%lUIxD0pjwx}Xizv8TH)K6OAH2K>V5IZa<9=b%M)3)R;us$humg9c~B1HY=P zTIE|XMR#Phg)wwd#iP6CGPMh%+Q?m!%w*;vg9a35x#-?<@f6pdE5JVOq#=)Llqk6d zb*v%H*(kY+F-M|;D&f*898ipA6CxoB%BMj3&Jjs>gWaE^IiRYaG)0pl<8-RaV-riq z4|XU)(pA!Wjq28^re1hrK#~N>>ru!PM87B3Bj#*9qU*(IcLS~Ff_(aNUOMiglneUR z2N|>|1-v$$4jQ%(Np$Fp^u^)IUmxwB5UCw2-By&hJk!x9bzrAXdjsqC?pRsAPM7uw zHAqq05qG&x+LPS(>WZCtVPV;(jEvH4moBc`UIEGu(vav)TW1Dlkp$&DM9J@MAwz;( zkcy)b4WNRRF%c!GpXQwywjHAN@%>w>?>Hc3#4S#t<#HiUGJ#gTN1d)*fef+A3@>4> ztNUc+jn)oB$tURV_fGcFsXnaaPO3w)CPrvOQO-sBT6sdK4$qS&;SJ4IjcN>9)KD;( zQ6)jvS+z2T(W;huGs>|VoUTD#v73)GFBqgzF6hUQSK;&s4h-lAnDK)Vs}Y-Hzl2K4 z52MUtNRvjKqrpQ2{%9Hu5qSdt<3NNTP+LPo{n#Ier-ta&D*)MAw34tnz1zvuWM}4vR7SEr0TkP zB*&^%bv+wi)2iz)YPiUc3sEGkY*|ZOxqj+ru$KHCNg1G4=zAJPc73I)JI%$aQRLqX zxkx|Uw+SfJ^`w<%-(qwRLi$$?_G+}YJ?aT2bB{F7=d9F?^ZS|S zLl6AQ0IfEk?yDKb9A{L=^cq#!3Pw5eB6Iu}qbfrhW_;Y#%uFp>%_+e+Or=zHEOYD8 z($kJeUG*30uH%lrRPWndQC{hIVp|-1Qy&J_24C7U+hKj)(d65W4^(&+=}7aA}iGe10(}EkNXhS>>2P9*=@W})X^+h;URB^Y0+)5FV<$N=yxo$U?WNGR ztEN%%7>ZC(ZrsGE?)KKG4#jCycb{rfG$gzq7dwNnat7UimvXjP_pdlr~_VU)X)i;mK`TeZJ*~RORYE@5n;Mst0+n#ISrp@nTWDSkEoXXCdGmrIUYOc58oYrqN|#T#8(`y zEZhGRFxc?6gbtp$|B6oa?#ePGsd9Lda2Rs$sOmw<16$R=P3Z6vMu~53;jzegn?VuW zI5lMDv*9hmOcbV$-;{FfSUIxO@DCtYH5^-`dVvn(2an%Yp1HIPQ8LwaSWjY@)7w(w zwD3Ai^BD8+?gVIC5(L0IvPmWfNB>>*D=x z)2gSdlU5|fIpoeOm|m#u#VO4LVRjYKt9LKlxxwMPS^K8%gRxo{e|sMtyuY`Eyj6$7 z>%`EAQ}3IzZ`w}n>(?XCd3#g4auV0YImRYV%F5F9u8WL(-G!QwJvS}IA^Ds1HWie zv@mmD*ZfjrW+4KbvtPs5JbpnQHC%fsax=3O=SF*SD?HE&it9lmw??RO@IxNGI1f0w zA-mWA;TGHfXM5zsh(BQc69s>8Msn5C8E_-9Qhj#n zcgg#;;}3_e8@)@GxMli=Zymndx*1fujW|@EKTh`nHfDVh^&`hRa+2U6j*eNHz9CPi z+C{`>=0*oP3|f~|nXau$IZ{|%Bs-qJwg8?B^YSKYRT)I2Y15IpI*y<@<+2}!BP&P5 zT)B^w2WD4H*`ZVIm~psb>kmIWaH~?(Nn2(B+x;6hSAM14Fm=cDtVloC_c zTy5ssw3QhfWJ>c*)RR2-UL!_r?`zPUGR@2j2yW^Z|A5+Duw8rM)`dH0^sw`)reF=1 z8m_Kby=JRc^>N+W8Tnu8F433gWb7L57@C$IsN+1PfqT-g{7|v$@?vcmo&Uw;8KsV< zvNdo6hH~mp-+uYSwFl&HkCFXTF}h;TQ=6t{mS#BSnO5#D->|W2`}WzhR_UJproK1! zM6bb7d86{QcQU9AD>kp#?YL)4S(+|gx@1bul2pfD6JiF3RmRqx+P!|u8eM9QbZ&&2 zJM4)L!@SiqX#GrB@}!&xf)ImL8gmJk%U5_pg(p-f&laQoaC@t%5u3C3sLfUf(T6mwHu=Ga0rsMziG^|ZV-l(fieH`UyRx_N{%jWD8EIb2{q4Z#2d`l)IF=C zf6*RkJX_OH{;a9Irr{lTg7%CZ=>`VcetfV+zs&)pbLLr~pJ%z1PGW1u&9@ye4fz4Akg+OO^(;iEgS8&4wu|d@VwH?KvIc@dO zyP&Dca&_l9BtB=0h`XrmU6pnzTpQo?1Yd(2`nia`1y3#^kRd={!nhBar?-Wr!4^gQ ziR4aDZwtG5?W8WS)etFY)ugpZM*T^v4#B%&@cQYJo^-WYLLH-(sm%5grqxqaTgy{a zd;ApTil3rfykXl@TGJd~2A-UL0Byj-6R(gL=yB71SN?(OQ?*&#O9LxtOjB3k0=(zO z&9Ppdq75z0@r~j+^2Obm88V z{1)ot8=(*)RFKh!%MS}urfUVu-wH0D-$6}$72}1Hnf(WuLy}BYzxD4XbI$LMMAR!( zaRPDZLMuIweOKWG;x3AadWOi z(D;>`ra&l8uk>tzq1MQN9+qlK4Jmui&NJJ$L`__80c-R^58e*D=@@W?*iQF=|A|ns zXN8aX@KC?5h0k&@LSabE=lL=n|CX5VnqA~p_JdrJivMFQ-ZaxPQxPl>zF_Wj1#1Wv z*bOZ3G<<+@;fsJX!t_GXLCO%&-qM+-ofobojcSZbmhv%9`GH8|c3uE~{2csorIs&P zO)L1~`A-2Rgs{1VvR!&BnsU$VAKSS3sL?-LLz&}7fvloQc_iD8;D$7I5sy+&uzCl< z>V>YxA;3a3_U~Vhefd=qEhFVVq?~}1&b>wCzO1eVJl+$D=i?&r!ojXGAecq$aEv(G z?Gw9*S1=C1L)5^c0CdE(pQoJ2Qx>&jcQj(7i@1a%#dxw|{21{;y1gxsZhQ-*bBScJ zdCnc=sCU31wR`eD*LB&SFW-^f3)3T-cTO6)VaMpx=KD#PFFX?I7vC$j{60?q-e5K6X#+hrM5o95(dZgUs=k((e^n>Q+I@xYTq?^XvUR;!*>o?6_55i)3$O)9Pm)q0f9zGiL0~V)A5$M&z#IQ@ z2u3`nGvI5tfUiB%9B6N5hh?E&F8f438S6_0g5LwIxyX@k6s}BdK}8JAEWzzw~1l(-pgr&h_JOBr* zA+3#`JA1ViP}ETUjLmZrwtM`Za`mzWyfI7;T)`fL`TCAO#{5rGoV?}#_H`%aB8F$M zoP(9Xb6@^P?wU4F#i@!oSmtNYJ~Ed3Abaxh`A4Fv?2%$F7^)>AZ-yzgIu5<2v;;+K zf&^gnbdW#T(?+GLq{?(4WT37FO~@1fUQz`@RxS|wyXGGvRUHCj1IcP!A{NpNyvT;^ z?Y)AEK$K9a98fA6EDTi0$^1-CEOZh7%K82vQpiEYU2`%9SF=doU{H;tMH4Ox8DFrA z{>WdW<=joh#Awm9m!B--`N`taf(_~+QhAxmL+Y!9b`_a7$K*)@Yr;tlH(?X$^i)HL zV@17s`N}LJFHkxOlrV&vJeR{?RPwgloJe{X3uz`%;PN8v`L^nWzq zQsu(KWZcIP3p;iaO}^9mK`=awlQb(hNwW-sVaUzYje*nVI!>E1SXX>waFOyb3`}(h z18QKuJ9R_$h3)=Rc5ROsw<8rVq0)>iQhQO$&u{lIRPLEAOgSu)neBwYIx45lukzqf+8MSz%ymA*Pl>e9fy?(s zL%x?dP&TMQFvuT;^;xq10iJ?!XUSb z6RoD{!%0-qU>0VpESXL~R0uMO^f?-dSFn;^Den10K$Fdo|HAqzJYtJ~AfOLGqOwKsF7m97d4 zqvuDj_n>;Up0Hx9RGmt!KC@o-qT*96HF{w6j8-;D*H_0Ky=1I&6Gx0aq7A$K4 zb;0H`&=(Aggu-9}R#!36HHloR09alZ@bRL^{w(rGoFkEtw?2z(Bx9pBrNLe@ln({8 z-wN_K2On9Yr~_BFb#6 zH%;}Clau{T_c2dNlyZ7!Gq+l-4F9*c*GU`HSei8r1aFB3w$V$Lx;u%9JQif*iKYaWDwSxYGSU>qm`V0fy9=N zfqkuS`XqD;cnzqOCVUd1y~!$6DA@)pV^tkbUI0W2KZx%_6<19-9}6*!BlSeXOPg$p zALR2rnWJ!1mCv&a%Oz!w!Ssc>*yadlLEv1SCLfn!vgC>b$<*+hddif_wqR)-mjOkG zEFZ6pChr(9iEI@fLwChlW}c@E9S1jfos#pbd~c;vAob^L9T)rq$y|>oJKh!2|50M{ zHBqZ@IY>Y@U8@L60xfMrO-q0`23{9d&mRQ`Bd>59@^oeTJg#tsYGGt3I1U>CiwXIs$1T*JrfyvXux0DLHdxy?!g-pSrG$AZ)p3G*VyG;89#YTOktd5lRkusI7#5?j5 z3ko*XRD9B8DykLD=@=B9jtue0kd6%Qp?NcK(eQI27nr!bJpmIJ zaKj&RG-jCZ(0epEKNL)=AHPC4si{(@H0UqfAm8!L+qt37qssL#ROq$safw{MD2~Fk-nN_^fjNC1RNAHyg>DJbLCoM6yUnU8? z$L+sjHLCm$HiBK%H?A?yb02b!=N-L|k}?yooCmKn-uHUl5rf0KjkoL$57^z;{8P`S ztQ%`{wB_9sNlD4;tr}wl4gG4^g-+=)%74mfvbTU~vR{9C*Y5Q&8MHjuEuqL#(7veR z3$Fa+6V8IBfR+=lfhOcypKV*Q!J+lp_6o<|3zh!BuF8Q>hi5Q(LtV-@a!ER5sD}L& zZ!4*8yQmO?JnM~}p^gZb7pb+Jr*d7T+p;Z3 zwauslrv5K6FqC?Pku%N-JDd|4N(tnxw4mS=p#wP-NJd-&edvIc!z}m(4cu*+1v0A_ zS=j;Xo&#L#Cf8c>;D$TL;R?C`% z5wa9tE*$6sX-fSSqUk~gr?Oxa2sUW9Dn02IVelRr+`r$5 zgiMRF0*CQB1M|4vnha4{;6mg)#2`cu?G=arQclBM{m~uU&))Q)t6V#3_%F^7iri|Q z8-Y^1G$B(e^<@#wwe%;{+NM&JNfl|=q52n-};5>S&d|~0uuipBp%&!?zaaFsTrY0MB zk5kSi&?a>mr?Nv@F|fkbLJA2-{1`ZY?*#W5gTa1nz6Nlw|C zeCkBf=vsHhT7jec;OR$|qQD{Q1aiu#qdPcXA1XN#&4RUQ2&69|tPPt5X3HTj05_q^ zxpey?hdfatqL{q5CNabpC@nV9JEd^Yp_?3um5o4GbCO+jaE*JNI|)OtYlD z@)dl>?znL~Y1?V5>EQVo{{dFuD5>~N?`zBv63aG~%XHY<>qMZnTS!o!1|BL(VJI%& z{}BNJg`ZrHx#S4%PQ!d?fmJa-7umF@c`QtK{Vg?qYY$8cdFB_@`%DPz-Nb`AT!ASm z30Kp|Au}Mg^JWWq<~egCHP$6RK}t{Da^ghdgsxpjkMGlGbX+=cmTf{QBv9T6eFt@d zt-VSMnBG9`0PGxhJz>g(^NF&0(+gJVH+}v%G{^Mj7v^$6cy|yNtMap<&>IDAPR(*t zGuupp>~pudSO?g=YfCGzdSUw6V;7Jm{?<3aC)@tv`lUv-=$;jM7A z!-W@bN3FCrth7TL;v&%oKdlWA+Mo?D!1LSz&+`I2kK=WvDwp1TrQZsK*zZ}ye@nt? zGGE}7fZ&Fn3a~ym4(Yo`M<_u8eDBo_IdpQjfmYMKzQe~1tnR^lnF~t)2pxcr}nTv-Nx-tr}LGTWM5&)#dpEvk=Q!uZsy#)M%oh+yfp_8eS=t z$s6}r;7P;rHM{p5Gap_T=)c@bcB%STVvl|keMg|KtIVEFY3_9wM(_sm2Gapd620V@ zo-inkt2~CR17dXU*XGCiKaHvvXnj9YAHRCf<`nbI#)$V0o^@n-)s$`se9Vt8}SzK{o}&@Lpqsz zj*H!!yk%{g_4Ti<+k+gY51^Bu^L6-j5vE`fPKt--_|6Dfm$p<^|0+J50#^=z z@6>_sq=sY<`DhOjV1YU!@Knkwe(gfP%`aVh^5H^yRcZqCb4jqGu-4W1&I$51`8#yk zck1cF`X&^fB8vhMbQ1-79X~YBQP-t=9xHh0s8{>Nw`9C!cZQ#8t=+%`EB8|?= z0t=?JyFhKxWM2+ga#7kzdxYHMC*G*eYplKD^Cb#!k6Gw4o25!7H0AhLB{>%p{ky{~ zm=7bHRYlagJwZ9OS^dgdLGm#lx6%j*oFWO&Tgs*(N!5l z)l}xNn&P@*mp_9GJL%(IQE3SsJ?AMq<1TaupX|letM1scW#ZJ-_mmC!ju3@uf)6C* zMSWCZpQbYN)Fcm-!{asdCkj&978bG^g|yJBOr~ng3miSast4kI3Fths!XY@Hs1}ey zEZ+iN3C94y1}GoC9+0=K`Z8G=H6GLiZg!<*LDo~`jJ$s8>%C-SC8Xm?fwiryvca_f zlWf|t1yD;?0&H$SiV#dmpJfod(1;X{*GV$&#E6|$S`CAUnvGD)aW5D*S3YhWjH-l| z{HLIIg0fD^vXzD742>WN1gxzu@S^+3kVM6k$lz8QZb_tm1N(}Hla3ub+(#S;Pdfj} zJ=O&U{sf9M+}i?&uhM*FiuBGlg+ogJStS6qoC8$qKzj?K`4Mw6z(vGS;7@FzAq|RP z1I?m+2blCbFs@`PqcX8L)i~MDak)CW0UW6pP1jQp@&Kb$%cf_wn4*VQC?g9IjL9-} z#SvNAz$}x8*JH&!nnUQkuO3+@!9uw>>{2W-`<_y9kGlpcKKv=OY_PmF%w?mb!_%Wj zwfAUF)np(a&q?eY{V3lxTv@aG$Qp}UDD{$9FDg#Gz7|1#aQfhf9H87CZS|2sd-AnH zb-rg~nZ)zCeh$2g{@WzK!X#&4l3#tBUxQ|6GR_H$P#u&Uxh`U&+XX%-zWKHVC2-!}aI7^^9x=GYNcD|xVrk0HKQov-Pr z{7e6vy;3ZuB=4)NM9gK6&FeOug3ZpMxM=~v>50O#sJ17V-n@dng+I4W4I2&b1b=Q9 zA3oZ5@hpHhxUw*y_Cs)({2=E23|uQznW$Z`KcEtK)XDH8E30qo71Ftp2NRA}pw5#l z$L6e_8FpBPPNehd>M>TY*nosv9$8zDr#-ijFQw=;f^niY2{s%{qW#{R@{grqQ0yBHwyS za7h-#wK?v>MK*#pv_*4;P7dX~V>ysqIf-o^%C39RrJC3xM)EdgDwA@hX(0APqgHLS zQa+aPEknmi<43^x)7~%(y#SiohfIbrny2^QaV+eVIW2DUmRPIl$b{&)={wAc0*9;8 z->S!%))cP4Jux`GvAI9Y;e=HyqoNjB$q}wbz=8cBDmAlVL89aLY9*`&k!p}&dPA|? zj>N4+OC~ki-Zy2k)%3x4(vbFbJ(%H6Evh@sa(M3AUqcSdf2hN|!CF2xXzw+T%>6sh zSk`Ax5lk<9C+@v)DK7c^@vRdIUC6cFUE2(xwCff0)R|l$(QO4PC@fc+2*j(_)89ZB zor2Q`KV~?lVW!EM?G!rh8F|-o9-1y-g)iVRgkY3f6O?={Xo2)N{%ZQEz4C>Q+ zL|{VlM0id5EU{9};b*0i)rLEgrW-~l9-e;4OeGKEICZ0T_5TDiTjg80Elc5Qg3b^$ zQRN0@0qT-2WA!$hYAxs|Uq;c@*IO&Zj5+Yq<6Uy9<{Qsa;2W>587oLf$&jXQ!VvaT ztuyMQck>jJ1ZQ7ht)ZZ`XXROi$55{R08}m4%fb@rWaN?1eO4SY?MtTZ_i55(m`}HE z!!BfH?Z1!)#R;y<7!Kp^1_AXUNRNyLLGa%0mBslf?UC*3_dMvClcT(ca-4?xsuK0@{*UfWU z_Jl2i_DKLkPp-TPrB|Z$o6mmJoNW>ONQPM!@Ybt<2PNGV65SdGtB7o_ z{YoWIoJU*%c3wRZ>#}1SK0wnGs~yIc5kJUva1`A@zc1h*^kjd0RTKY9-Wi1BSQDTW z4ps&-UFN4JTdFt}zWml00Of=6lKQ0MYzJ|=MP`dZlS1$H)$0(gIto!3mqMtbdF4kg zbB8d3ipiOrIfH{6*t2LRG~+q9oiu2iU(Y^)iP@H?R1Ftywflzbq{I^z(+;RFAIlUL zrhEG&=0kR_{aZ}iG^dVnB*Z+A85aq!6CiioV2ved1Nkp}>KKFT*C0^Q zORr&MSH0_V=4y?iFoFH$uu@2kA5yQ;gpob0pb6(=->txY2qRAsMORQ~uY7*MN5%Pp z&6$b{LUF8Y&{dtANRaiYS$S8!%PoPGGDcf*>YeM|SJT4YbW!W`)Fq zD!>HADpLh!HDE|`|7m2CEar0OF9O@j{*o?n3m1$$H-W*Bt7XDL(0sCs`}Bg`+LN8> z3sn4SsmTod6-66NwxRIJa$lIl4u>)Gl-iL!riD(K;TXW81#GozQXEN}$bZpO#}~F= zSao5^y2Tq719Hr%sG-^R^BvyGFkOVM?uSz%z+R$n^|X!LhUPocNb7n@5nTfvY7f+KQcz zW6z$9J8&v1uBe_{+n{cnE2bz$IKKmnFnDA~>m-4R${YUH3Nr1sy4c!0XBDlJP+mb% zm`n{w)<$v0^fEU!gIc38lfx=h0o;CqAX$P~jN|-GNngccO<6UF)~eMrXi~U|A7#_t zToJ6LMV|lp_*;@cn|9GXaLkH<{9Q$zZmu>qROoQkkXxh(o<#fDh}1>sIO^b|r~4A`SW`H4ucKohXeFOF1896)XUhY{ZlfmnkF_3N zvT;+a<*VMDEz1zhR4kX`J_1yURbnc$hxb^cqNF~&h}O}TGbNe-Jl%SyhbU$J<5!A;Ut zVKVC+R&Q#L$dTcZ<7YdLWxw)$w^-VEcLO;syY86HHp1PYO2er8?N4pLQOqeB^b*KH zdP45@b3}dX__TrKZl+Qcn5pa z#h$XM9_!bG+wov9?ALMoEgfZYlFb+Q)Kwu~%;w~W+JvuGf_P(uk)Uq_@`aHgM$L}W zVI&y*nWMqeVI+v1*cVgT8CrYPulOzlpREp$_7fvrW{nKDR#mmKd7b=Xr;FUz6>f1` z4SvDfOa|jQ(KYd+JPzYW4t&eELIPRc@&cU7@`^frrr}|_W0=YsXf|b{aeWQDP$5*! zIOmOubJ)N3yfP>LqxeMm=@!*p;P^_+}}=!+6nQklaQ-3HtfGo@8IVkCG-5J4C&^BFl3 znYB#sMG$W@CAFBs1O=sIXB7GC!)p*`AczM^)J^C(efY@k=0Sm*HceMWS-WlpWtyql zBeG&OriJi7f@%BabVrzm3VC+;*Xxa4ve^ z&NJpiNud+gaxvWFz@L*Em|4|^npfvXK+sgnytV!5F7DO&m+67O3^I2czUR_(D>u@_ zk*}D-;Fa$4y-)UZ0}T%lrm@bG>xK7l964j!lt42x7(OH($lPGvaCaR!Exqoz9iPjmo0v%Qehqg=^IQW+-1M!;|4EZ5^uYte_6f3Z@jj3#T+nkTI-~n5} z=?lxztDwLg23}%iIenpX*esmbIAO@ZiDCV$6Zv-Is6OmT)AeW3NGAn6->X<5N zc;!Z9_tkJ$^(eO)0Io^~%qw~F6fWcg#YBNGy6DO{+0(JK`TjebL;Y3j=E`&yQe3D4 zI7wow$Zq%bI?m4G3OlQ&Yo4R3MQ-qY-lHTnr$C5&@kn)T$HH2B-C)fj*LCE05KdkE zi5B6S_cyel4W~p_#P);!t-ONY^L+3A_)sN5KBG|%Vt<1V{dfwl(OHcCPdSDk49xG- z>oBNMG_4OE=3a8oO|Mlt&YBfB2SBN3CzRoX#S_ zgE!z!j_TsimDc12a(5$h#JKjUgUK+blu6kXq-EMSeMd6i5mRv9l z+cA3K7zbr8C)=Vc8kj^II*NDrC}488W5>LQexO$Lg8S!YHP{_J-QhD1cc|FKBd{4pFvC-uX+N$rN4dZT z9p*X>WO5q?8p)=#;CASO>C4Nnlv1mL=_$Mb3Qlh%UB(msQFyrWbeN+4BG;F^%>9A0 z1#@NQajqtno@FT<(tY7u{Et{4#vVDp;-e$(91d+%z#AZ|GGF6YKLGdpy&Lz^H(@F} z&ANH?_v3qM)yd@e>z;eu|3|OxknCVRPs&lsa+AY8GzrVO7;KxMD`Q@89=f&`t%ZI; zpxRt4S&VDuCt*A%p(~IfRmo9$VBxCbjz0a6)dg3W0v{YM!Z&ZXxYY2(=tbpN6--_g zoO{}WS4wNky}Y3Y&5srTESO=%Q(fQ?L^h)evGNnXwE0|UbgnC~DxA(8sgm}bB(}BY zE*4p~uoFMNWPjZ)1=pnOHdKmh68GsB^**)XKE+|&SJ)*ZJ!VI}Qn_2)Roc0rQqgTn zQnq3FwyjGxn~x=qZ)DXtA1tG~=}bR1c<$^V3vJ{Mg0X)^5W8B|pj>-JUvhKcqR9~+ z!PBM(jUT%r2EN>NhRJa!XYDmV*tz|Ba@3LO@m9VJJ3^!-ihz4@I)o-*Qd_)}4+-1+ z7KTT9j18YY=3luVChfSkH!^ngN$Y&9PEjmeof_xygXSRtm-uEMp@|3q2U2Jhi7QS| zyymOXwqAP~^_iTmf@&|KOQN09ui^8+4X_>DfRn1s!!Ftb6J%pje=_UTcB1- zT${Wh#e8M=2=C?Ah3%v^5##%JH2VY|%9za^EpR-9+6WFxQYte20FYto!@^U0v5FeR zH3m7G6X11Rq-}($4)z?kjrq5nt%yS}e^t)*GvsXkfxRqs6ff!duB6n|U68XiWj`A@ z0sTJb9VZjML%{#%m=Ct<4*mT0pTq6fPv|mzOlj*18is3!bFy<3U4`c_QERG`5IJO_=iGoS_Hr620fTjZ(SuPi7-9JkD7%&Nn zg76UWqUk*-O1{iqzxwPEnmg%CHdpTaDaapMBN+Gd|>QAkRiO zm}_Es48~iW?~No+><80C%?XETUY-14=zRReyYN{+ z#!VcrYBUWj^jy#s$mW4SHqU5k%R(})^}&Sg%(b?}HkJ zC0J2H4U~||HrukQprX%(embxK+~$$zJhW!YS6>~bS*)L`g+jttXs>Yzd9Fu`rYsfl z%3pn@w&HtqqD|(CDE|0&6$|)ph~i@YT7!lFo41-gS3{v%382ml8qiGD8gsZVDqF90 z{~~1WJ0Nqv2#}r|8vsS1TJ}8IR{Cp2{|5ir%JEld^%)T*m5k!eb~jD@Cvt4wMcXHJ zv_Hd-0|$@6o`t!iF}}crjQ}Rh7nrbltWSQFHYew0?u!dUuoOZ;cz-eVEr5760y?W7 zAYQY6{d>5URKs{hkmnp+;QfHoYFuA7^#e+4*5ZQF(6T~6tN%t=iLeRzkJY?Sfz)aM zq1hxAtThYpY_0}`a7I8lZalDpg$_4r;csv6X4f@yH&X) zP?;wezyi4XTx=R`g{1Ma-iR6dS*;*M^_^pych(lD)_b?PNOfe>K$u)KT`ihsutDmu zz*^%2Wu!n-IaqOu=l8)e~GI=qj?mGf0&#(+x6xaXNY^@hr#_WUq%S5Q584M z&h@{|cWJ$ML1lF=xZ>U}+4R22LuuIu!nHl9wxO223uO7cNw$oYcLu>Tl2%Tjvp#Cw@V&^aSIv3$Bp-0XZO2ovWxWO zqp*+fvY%zuERnAaX8^(wH%IM+X~x&-+YHlq+0>UC*)?i`as*yZWaPuY$76bfWXL|o zVc`hPV1E54V8xfUvF{>sTN{i&%x(7YyyJLY=Z$QTa==UGbKs@a!5jq1V;&>MN;85r z_YcTUGYSXs|B-((jaMf_4Ks1*EKUIXlO#8KI0u4;l94oTuGnovSce(bOG3=z_+gp~hagxc{;=8yMc3NPHVs`(EO!36-4{dz4 z&TUuMXAQF7r!G7r*rE6+)iyRU>=gY^2T-L zjjL49IGx=`nvA*s=aS&U<5lFj3LO$6AvqNzx#$#MksV{ejj2pgc3)RWb9Jt{O(q5d zb{!B)sDsg$@7YFt&k9Ql>WgfVztw?XlTVw9g+?}$j_@nVr{K1_+aDH-+{h+GQC<9) z=2fz7!b*dx{O~Gnd%Xr2j%RkrQ_7BY`r?a`b&JHvma?lN&yaCukUtU>TIhIGR(Ohn zGX-VrQV$9ggR^2c&Wh*D^1A^5F-uPN0}z+nUsjM!4h09qKhxjF8Sz{hquPA`D?L9L zw8S_VP&hPE{A?(tG{xEAfwSTHN;TUI8Ak){&V_+IKNFsifBqDBF+$d8brT~i_VIK2 z+m^33>d>KYT`6o_5$s@{CoClS{>3nACO%wQ!#D7F%_!Xz^=&|x{A)m+3wk+2+roWi zjO!DzEJp3@CD~LPymBScR2f5By9%sD@sitVsIOs1Qk&IQ58s0K+GV2}claao5^7d> z+Y~xg8i7pi+^LdjUj7+%>hEf77#7M3PC$*t8#YCI6C_eyc+e`x6G!3E7;*PAu4_k{ z+I9=R48l}aw&N|sWc%^S-bLc+2cjSGM976iH1YdH*JULYvwWHL&L0H~N@uxXX0OZl zF`JiZw`!{1S>_X{#zCla;j-LWoxEB~D@OS;uRIgS;TqgjM#FP%Dvkn|mQhPQRi-A4 zuOb)Zy~mt=z0Ng^=aund51>3rJo`W#K_U;cwP{Hq*mLQ;@6n!{mH_T~Y6-$@Ik#9u z&v;p7ut=O+RN;+Cj|waBaG*v5iALm~yj@a4{IYeMtqW(&pE1KjZOit^e*{&7)Ir1c zBFaw2r1X*dEvB><-(n)QeJl(eHfHKDv*`@KOfN)El;PVzYFCI*1-88)HW=#rUAZZ3 zj9t7u#yZ=8uu*Dgu>G(u_OVlYHqs8GJj0H?D%@jVA+#iJA^+H2Uevug5 zD7$=P}!=5*gKa!Yw2 z4gsk3Y$OV)ZN~!h=6t_#2lG@Y>hJ?`sJgrVQ5MpVR1SZi{;a5a>d2%!%K`FzPyq7H zf~icJN@|}KY3+Bh%K!#x&b-;K~`HOv`YPL}@mf7?UD|`LAg-h32J4b{D{)%EI!)sd` z*>qcNRl&0M`?{O{3uHEy5O32gT7_X4PktaHrMjwAptj0a zuGcz01%03Vt?N_J^I5f2riQyw49iS~uY>~A292kJX+s${7n9SCudIUmPV=>hOKrw? zcis}QkTKyV>2=ve{;mqWV%?+b#b{5sm z0-UURp_4e%6E^Eh_X3A;Eco`N+qzi}EtPq<4YqmABB|eu%19th4=G*$0$`SZ9j03B zeCJ1485K$gAoXjT*H=no>mJ9BgnwN%tzzcc8if>O{ls%Vj0a?u=YGMR5Ualm3rN-q zcoI8;JLtVSPCCohJ<&=7OmjGumX+aaW!rF7l-?nW2I2{@S!%GYfpBj;P>r_5L02>~ zRDs0`L_x+A?6jA&P^hn7(+GWt;<)gS-UJ^oP`Hy zoE0%``plIH7E{<0$gKBEYzNHsPYSdHc(28_HqyB%DZV`?X>lG=QsMxy}jCwZkdRDALJ=4{CLS{vThtEI~qtZB(?xCX}3962Q zAF#6YlD+BP*H|&!S(Rdjk{dq7T9FJnlNJPLw;BXTb!BD8u}<(|)e5McR?MRMu-dJ< ztm30ZpTlS_AhM0%0ZPn;U^2bl9X)dQ>2I4__hWH$}azH;9_n%Ce;a16Yf z&uTlC3U3+n)PLQ-xWj`mJtS9|I~zAr_Dc$Uxr2(i0+G=MIx;={k-k@|0-)TS(pj4t z@C^8X1p<%OxCSjlj5WO26C1xXDQw$FfV4)2jSYmuyFHMs!j+k*M6Crg6D6a3ovZ}< zp!|oKxi_e47zwiCpbYy(CMA?^BS2D#ya{_C>wS1nR(f55Wlv8;rmCdAt$scCK9ZBW zk~>9KdWI6r5?nFA!=Bk^)l@s@LS%|0BjI!_HSIFHg z{=2XCn`N_F=uGxqjN-D;y#6SvHW}WfRM1q2`-@;1b+D z$o&{eFWvwqQIH3oknNu#OLo=cus?P8VD5ckbzT)&US^$vD`~R_nR`d=Day`C;S z7{AW-$y@Sx3-NCq<-PRh@Pl>w`iF;1w3t#7tJ%uEC8$>KZC$r{>wa_6#wk6mY&lHR zr($C05GH07{I)3-{)^wXC^(Fxq(seO+|)lHqrz>^{l(#hNR_nVpNi3^5*Yod-wi%F z{UWa_7<@b+cn7Yc$9uq^p-Wd&3m^_9d7kAte8Az`EYZ^ ze!W_@N$L4IZP&(l_~@B7{C9(K=I^ghy?&yjN3Q@2rJtk)tLLv;<3UoZYn98i_J-Ri z1p(Y*%_9DVZIwZxN$t-m{zYgY@Vc}`br<>p?^hP+*DmtBs#?^eoT zJ)EQA(r4X z=~mmfpKoLW&tdHJm^pWBKcQu?+0>%yUi!Jjp?+^x}c}zJ0omlAH)aUl{QCp z8U91gvm82yia$ZN7sAfzgM>lUV*rBa1_|TnoF3lfw&7_PuN%Vhy85PGzYA;NMeDf` zPe16d2wU;}nXm@mU*t3vRy@<+%JD(C17sU(Yc8#6rw6EfK9!&sR6@7p)ArZfUT=p| z`wK@7bTLqQ-!t47b{pH1Ps;EoLdxdxeXPvKz>2|1DeGcjuP+Rm z7qc{$T)xy8}PcVe~=u=ux5cr?oh&Xz=I)DPk>zBxF zm1?_3YBsmz?UVuyb8&pkLhc8Wc2``d%q^52N8nV%neN%sXtk0h6X0B4c^_fnp zIwX7CEVul5OL!YJ>TI0ihM=^Dh1uAyyBEmCTQw8=D>80tv zMMmO~xj|+jazR9dMNaWk#w zXS_6FsNOVYS3tk@oy=Y2fy;)k39xjjh|sg^S{{VBJ$p?1FELsQJl#b`H zVZy_Uz{uwG6qdy<-n`Z0W6K*1=rruiqGbG}nnMREv$-L4Q3$__QXPRlIPegM3UC`p zRh^t3LU|Oce3B4;^2D#nQSk)!aj1+R~P1Pi`Y3n#_=_NI_hl=v3r0Ie2WSAf!l@st&GPpTucARK&7+Q)q@}K zzv0Hl8yX`3wWHxdDtv2x{mMF18$&_V=Vay-WN1GcVV?&8=)?1K%Z$r`01Ltrh2xJW zsU{yl02_h(y&ApiaI^(ZOvy1-Pty!X!q@n>^C)g1t_~jV< z6pH5G9s$E#^Y#OPO)52c3UvW%&J^G&8sbxr+@1>FnuO(8TTFH^gN^A4E&=01?@6y-#|7OLLg?046RlQ@sD_&mJ_uaB6i@A|e}< zxk|P6vRYTkY}hh+<>u_(l=Y%Y}HSmF>dM@bHDNXE&(bJ%j{{BR#>lZ)u&JF z8`srLJ#5>hy$OT5b_*UfVnlFCT6#jtUh5r)THTs@dZsnY&Q81c{(ZOm@N>Tz(H~#w zvffg=zwF_Q1Lu^_P?pGKzeS--f~~*InK*aCJV!6Xt|dE{C9XKw{O$nKPucT_dz01O z;{pyjQnj1Ef#&x8qJrU0cq@JbUK(?r0D zmFCj!HT^nvnBH%c-}GabFReM2Y&GRXK6a=-tRAX!*kAw2AFH7t-jw%sA@TswI< z9NTsarG+PTuP#xMv#-wB(*&+s>eu@kTX=~UUJ+=~NkB4(Fvk(t2OZg|v(!pB%!LW`6)31%CM(Cvb@gUJEGWGxm3^DG=T*FA z=mvfB@q@>=Hjf^+WKF158SJn+cI(na^Y*yek+D`bl_4MwH-l@38#x{KA-4!WTvDl& z7l7@R&XxkDxRkYHh>bAgQpdlj{;SUC-`~hSedVs}Zx5-&<4%vBKQzT|q$PYo9hoRi z2oIV(#yoDqn(gs1vHQ1fojG%j_3;bo_JE^xJN6picf94+82yIT8&_{P@7z2s&>Co1 zF*RgqfVs}lft|YS9hh|j5uevu1MV8qnVn?XJ;Zy+$S#3veuehs){j^{W}V~sHM3W&@mRNf z?M@4txNTKr=tAoQ;livTJAN{ASlC-2!4!z-C|=P|GL6^El=CIAQ&k;+)}Z-&v+K+Nb0Zp z7Z%|S*HqSyX61B*FnGucE#nYm%#cyXI@IBKmHTs~s;C0ach{;_BrjQ?ZwDeVc?jt9 z$l+|ah4T)kpX{hq6w>c0vr|i-ifZ9@Q=?`2!qZDo?-W)*_vF-3$@nM^7Ro6pt`-t^gUPvq$W z@&-w^N$W+V`5WR+n`rD-KV?|dj8 zV8rSNJ5dU)(=Ru$6p9(rk&0AB6Z(dJMxIY7|FCjFI@U$ce1v1?1|0@%5ul%Gpn5DY z<#6Bgdg>zd?R;b)K;ePBgt`=6Z6qp~O?i&|yrc4kprmOXq!2f`YwR$W$`Rm!Rhh-HO4?-A1} z0yYIB*eq)kK)D|_V!|G4wBM*@qs*(DNV|{D3{A2w8n_Of!%Y>*(xqq71b8!#0^^!xo6_Xu-$k;%6rl;~A4ILH^E7Y3 zQ=KxB)sddEBL--L6o!wUjy$!s5@?jIGs6e-lc7fa$vDU@?DKdK_~Lo-lC5}tJa^E{ ze<01Sy&~CQgUl^B7Qc|1z&@4LZ}Lfa&VJSZA<#ewYv8el+P3F24WAKI^m6 z24;TGAf=!ZIiw@AMLE{ecGOU#ZOeuY+T4DDpO}#Tzvn&t-Ia!@K`ovj+FohtWZd>+ zaCEZrnXn)-YW_@f#X$obTJwh)dXEq4XE8mAsw@1qYSsMZ=D!Z5Jc7)`3Q2^CJRqD= zh5?QWSxr}X{n?|6;vj|Eg9%d8xbQSf5Y zC;*EkNcmaHs)9ksc5NzPpkSuCxe17shOE4vm2L7G1R@*B=@=Ipsi&=3EL3HgKT7LH=6;F_8EgpSc zne#IhTbM2;gKlKl#~{prEkqfvgc#T~Zd_2CEt4>ImEm8$vY!3TZWz>wC*`d!F55m% z=_lFxWyAOV7l>4Dh>>DmV~Ep${L|Z04qR0--LRfzt@-fYp66glUba5TLRA3yH7=lH zd0dpJChR*`%-?MAn>i)W!fJv&t_R;5`%Znb=Iz75`8-?4Bd9C$vat|?LrXg(cb5?Y z`wrC?5nP@8!LH_4zoTSO0217n^AN0qp3f5V9cce&k)BT%X&ZDrnbF0}5J#Y;hplH_cWO)Z&?K`p_X zv|h?za0lWy9+;kor#Bey$O~oiP}_Q2$#`VTz`uxxW-z|gUho{Z^XgE_a|0X6x?KR7 zQ9|TZk-r!7$G^7FJ9!HX#v^J6c_#Jcq5L|x@z|zg-K5&&VGF&jTtologv$BDX#Y7G zqo?dxjKNTfkWo}Spmf6TVM>wbEG5s$@TlZ@G^8atnA=fFgh<~UVFC4 zYemuMC7*>*)Xw{dS=cSU!Aqo6pU>2WHAVc^GYs!zJ}5}8jxVNxFbzle?0p^1L-hE9 zY@1i|>xi%sJQ2-VFJtCd0HT<)efbCp{g3YAjXBTh`yQX?lbV9nfC>D*p;|Y0i{B;^ zgImzzf{xjW!LysIQWMu7qN&5K(To{$h7y^Tk;x0Ht_tar^v zU*5I&ACjO4htR`=y7~Kg7atw4FC3RQqHSHzdXO@7 zGnAI11_K?JXtMyng#~o&&uX=eBzi|<7(SptR)kUtp0=O}iKYW2iVvPvhZ$i#N$E-< zHhl1)nigze5l7142VWvC`y#{cCV;4h^StR?ZGMtb9^&^#F}JeJo?QX{V2BOZ0_r2rie z{B4e+xzHxDxq!{j#qBT`ZFSF}PZ_$HtCV%kK0*G;;YEgb<;p)bty#0x{kLy#WxlW) z-#qO1aKppx_-_NgxkhJo$()fHpP7JvyPWHiWjeNhrxGRoCYp{HYesF1+SSNzcqSILPGeOaUs*E2V0Om7SE9^d?J$lDSpzj$)8b7 z_{2Ze>?l??9UmV9PB%gy2kEC;L zL6pc{T0{TwLzf#QBWj{qO_`{)O|t(BDa#!3{VV6l>Cc}Aqjf zb>klHYp?6g;QXX!n_8~ zo+N1*4K@?@)HR#Pt_d`eK1%JGUHi}dMrAR#rp$CS;BxNOaz}Q0liMRIjaK{+svw3R zuC2Bb3~PJ9-m-hG4pg3nAu>+rQy=V=t|YQ9PtLKjfIwBIIeKH-(MQ)|E9*?fj_OvW zoF|6^95^~QBsqCQe4>S_m*mezPQtU8kUi=%#1KuCZl_(k zA8QTTsP7aqcuXI2pTRpWhFF6_^-W{bI^H%LZ<9f5UJc#m*J|Tl^0u{*SdCVm01*$q zRUUHsYPUYpU>elwJ*$T5$4H|mhoJiS#H82+R39A3tLM)~PQtU81XPb_YV|FR3Fx@V@or(S*Vg6raKM2_Hp0I<06CRjxN=z$1P!T;Hsbv zdi5!J=~M`^*Xa5Zq>FWNu@H*{3OgxjMzRo zF7=GN-@aZwCdP!U30hL>e($D+F>^v9CQRyk+MQ~(kZzpq+@eMIF0EVlICtmHne#WS z#`B@iE+~U9>Q1J8P9q_mn>+W1cA@r<%&F|nIe3cP&e(_gA0w{BDCAR=cMx> zr&@n7ou!k*y^HM{Ht5v8S@TX;9zVKx^)7gTq8BOk;^#2k{50B*(z5alQiflnTKa^5 zVe1E(nSEUp%*1C^VXkZU`x_EdrXQTR)A}fTXR|o+(SzyBkRF}CntAs;O77ggxp(I) z2;VS2W&Ve}62M(=q~hQcLgIEz+ipH};mC8U!rI*GM2SF)C$cuJSQU@j7Y3Z#zGH2C zoMmPmzn<0SIT{zqwwfg`-ndMJQXx*uG2c{eJ*Y~Gz3)*NrOdXZkkO}F?r)&C~qtFsZ`E zVvFUKm24vni)N}N?(I}qA|yf-4tu#t2GhhvGx$sX>QVx)>>7k6Abd@Gd5T5`7T!>A zObS)nB61#vtj0Mi0!M2#@{*+djRuIkyv`!}vd$wbaOc3$!=?uMTVP|AVY8REEuTKL z{-_!)n_FqUAt`>tssyuf6X%d!Z&H~q=Q7WAAvor{iE!zSphwQyfg1_FVwwb_O6_L{ z!?}%mcmm4Yu4lc~?|rGbOk?;z4Gmo;>sb?n_gFpsg!KGZYh*vyL*mH;`3vLw45fC4 zZpk(Jbj^NAUS-L4RtblHW}A%T?*!t{vj%!xnI6mwk)(y8^crUEkOAYP$FW#WLR3kZ z$L%s0Q$zDw;sh+6H&jBn<}etYH>ycpSvaD{+4RN_p~@SKOFgB8#C~LzsrQu>HYNql z?A;zAt1IIitjv11A4FpYu`#Uo6+I8bJwe(g=DR!a_}f;x2$r6`)d$R;95vLe>~l~f zbhBhQn4xF-O)EAm+hsPELBRTz%A8d+W~IPJt~5Ls4;GDHcFoy2cKy;Fi=ADRd2XMj z-6mbJB6d1ElU+BvP`g=nTkQ_nU9!7wm#r(Uv+8>2hU=E-cInROZt4CgVlGm(NP{9B ziu5lss>rM&i;Ju)vaiUYBBzU7ERta_*t^=-vu|wQ%YLPOto=#*>-M+o@7jN||Kgx? zaCRu}P{E#)Wl)*-Q8 z=+EfS>o4mc=%46c>fZ`g1s|c8Fi@Bv%n;@ZYlIELRv}T?B^(wm2-k&s!c!qzcx7-j zmag(omx4yaSC(_b(-O{)hXTSmFOrsiymSHv9;Jq94H2hQQ`t|vA7zwP% zTcbDES{w`rI^IR6Y#JcQuIplKE<($h^mzys4U7onSbb06U z(O3lTDBX;uj9$j7|F^Pp0jjFb`{&=pDAA|4azy? zqSC6|Qtl`y^|U-;u~}40prx;+za`WXVHs_Svm{y4Epse$@3HjngY?Pv2=|A+Uw3D{ zFJIaDLp7&Hws(tI*6@%O1U&*ix5Z;@GQ@byYiL3<t~_LNGlHRA6$#XYY?FqoTt z+rXaHsBX@lxVVhusZ%`?qdJXVOl^3E9YeWKT@U74f1qS{6%s9dQ=C!J$z}VeXmP>9r2StwuG?9k z^WS1?LhX-qIJ&{-(>x$>ra~W9C$wxmdWi{stVif2^G{kh$jb-CvwJf84@^xMqmL4a zu{61t+4c-;<5emw)b&9u67B;Kr@tF5kj-nJfa>pih6*Ct4%Cz(7IsVW=!EG6w57j@ zEm&R6KM22~gr9{A<^Yit4nk5tMCQB0FVu`>sDa`(ubk9^ zg2hM}r`TzRdjCL3wsuvJ+3RlkO%>!o-h23W>Evs&qR%hh;+B(~)dJILH1!r)#R(yuIqEy|yAd3eB~g zH@OrY)9m(iR5&egu0jID-9E9xRB=PizltyUotU)mMU8A> z6CM5dZxj07pa}EHp%oMNC+l^IUuGPb-TCjSB@WoGI;X{Ggwpbdq$%VtE1mkt#2&7G z=QYeo|9dOs$>{c+N&{qb$YhypX=cU6+-6oLP|*-P)dQrs$0ersWn!zw$plcXs~DU6 zrr*JAiPu>v#;j#BOP2mQ<|vA8z1)M z(b?f38zIey#(NlgJI1eHLj;5$mWCsz%01BAg!a(es-M#yKyPFj7RXXMmyczfIZ6bkD0C`%t1wy@X~zPF}z1J=5T;Y z>#&OnY?^qk>Z8)C3N5X&D*q$ZE*5poGdQhI)2UVdH) zWUKhOM0dZkeIbq;fa1GvZeI>WS|yOZAeg;H$K+9W_-sWhWKRJDaZUQ5%e3LIiwbpf z7_?Ze;oNAV6UCf%Z;7Pd6=L^0OR30fmeG|!d(nb+Z$@1mRyvbp^ucxYj&)uA;fgYs*LuBVtQM3X5XW7DfgG80H`+y*R|rhyYqovcO84#CmYwsJ+AaBIz9ZiiubD|h5tDEEjGZMF8obI z#AEvC`taTYb&AFS*oWK_w%tgwSVe>=k_BV9_gyTKn7_FQ9`#su(Zw0bubA1PEL$)G zVM%GaOx*=Xwm|VbD>!c!2xI{9+1>zyKwV9eDNI$)?5S(v$Kno>n{wc9`iFDgnAt%x zed_w3N!HRN@|fKpKfLL~ZNwVUp*#q1@{+PTC(X~xn`xhCNJyKBGRtlxuW5mTFt zrB0s>Otl#f(JV5~2#D1$wVANa^kdB+od!%EZ~E#kn`HVP8jtf=z#%BQHNz$`-^rht z0UDjoF_yw|c~!lQ@n3g2L_->C1A3s@bYG!UAbQy8DTgD5Cr=G7)|y4qyi>783mqB7 zS@yV@+pg$r33M#0Bs1i@(M;H}{oVI=YUXC*2>uY2ct+w~KK}fIaeGb8#NGsT?6MmH z7uL#+K*=_k`EyEAvv3pYF(W`A7UBa&M6ZtQB4w!xFP?`a(_K1GDDb#%JV8hyj~yhD zyV}@F4-zA0;(xl>LI~y#ubof{*l49Ex&sRt_<7Hna~2mkG+YiuL|2-rw7A+N#X46e z>q^WxT&}_-+J{jmu@w?nqALUzu%t3R%5T8blriYNFj;y7q{BvP14^bFKq)5$b~4yJ zDTSa6y_?u(eouWs%Zf#jS`LRsklV{6$ZG@OPoNOjy0ORRB*eZZacXfb2Om>AxkmR+ z5EzU#!w-HHd;u?`6X;=1a#gS-q)8CXrMAc$*uR>HYx6r?3tZKL?eP(Q0}~Q)hunJ= z*u7avk?>e0>rt6DUr_1F@Kcvg5Br9%mu*f;-da7k-hKcGeKBkP#$7trEjdA=zx-rC zp}=#CU5%KZ%-;+jz`l3_f>PbKoh*XyvBL0BK3CB|=wIE683OY->?|A}Y%O2?o@a6|;#FF{sDK`iAH(mV?G>YK zi2Ey;?h4clk|`XOYB#=rNMpdg@Wj|nG&L;U01~#4bEQg+izn0%wv#c>B)kG-6fuc- z*s%u-580Wm?hfm7fBLN~EWz|UFI}S(TdF_(Y;#KV@T{a5EibrCBv^O&lX$ceT&&Ez zaXLADlJJu7w3T-Vrf)t}bj#Rx%jXMxw#Ma9tB5^w@&?ljQR~OOK8UXjQ%vcc%SY@x z(J@h@>&TbwLWnkGXcH?&5UBJF%96X#!PwYbPie^;o8pfjCu6A_m_(ei0>@YWf6(`q zk(+9#P&{T?aaK{;4s2t)Lecg|z6`K2Z3M6odm@JffOCk&LDA_8wp|=p)4l}nwVwER zqz}Vfy9V-`Xk<@2si`Zwb5IOgm3(~Rwa)Z|`i@FhTUxH-&&`$#_)53o*@heK$2TTj zW!N~On~v%sQbQCQZ6$R1$M6juP=|1Aa-Y0NcNg@*N*ZFVVZG+FUPY`Id1eVudXLz9 zfW`GP@&xl~k&G0!668m>b03;{xB z7GfY)?QF&<@~}SW^LkXGOc#hl&mPCyZp>jHvd67tWj(OKPXDz#8wrmGOzo4d8Dg6u kU9%Dk0t*|U$5n)@dy5_^zZnbGpL5vdM!G5EPHiIn7be9!RsaA1 diff --git a/extra/themes/DefaultThemeDark.oss b/extra/themes/DefaultThemeDark.oss new file mode 100644 index 0000000..c4337b8 --- /dev/null +++ b/extra/themes/DefaultThemeDark.oss @@ -0,0 +1,424 @@ +% ================== DefaultTheme.oss ================== + + +% ==== Variables ==== +const $accentColor = #2FB000FF +const $textColor = #CCEECCFF +const $borderColor = #111111FF +const $darkColor = #223322FF +const $accentColorLight = #87FF5CFF +const $accentColorDark = #3B7500FF +const $backgroundColor = rgba(30, 30, 30, 255) +const $crimsonAccent = rgba(220, 20, 60, 150) +const $blueAccent = #0075C7 +% =================== + + +macro set_focus_border(color, width = 1, show = true) { + focusBorderColor = $color; + showFocusBorder = $show; + focusBorderWidth = $width; +} + +macro set_common_values(_borderColor = $borderColor, _fontSize = 18, _showBorder = true) { + borderColor = $_borderColor; + fontSize = $_fontSize; + showBorder = $_showBorder; +} + + +% ====== Root Widget ====== +(window) { + backgroundColor = $backgroundColor + (tooltip) { + backgroundColor = #FFF7D6FF + borderColor = rgb(30, 30, 30) + textColor = rgb(30, 30, 30) + borderWidth = 1 + fontSize = 20 + } +} +% ========================= + + +% ====== Panel ====== +(panel) { + set_common_values() + backgroundColor = $backgroundColor + titleColor = $accentColorDark + titlebarColor = $borderColor + titlebarBorderColor = $borderColor + borderRadius = 0 + borderWidth = 2 + titlebarBorderWidth = 2 + showBackground = true + titlebarType = full + titlebarHeight = 35 + titlebarFontSize = 18 + titlebarTextAlign = text_left + scrollSpeed = 1.2 + scrollSmoothFactor = 0.7 + padding = rect(15, 15, 15, 15) + margin = rect(0, 0, 0, 0) +} +% =================== + + + +% ====== TabPanel ====== +(tabPanel) { + set_common_values() + backgroundColor = $backgroundColor + borderRadius = 0 + borderWidth = 2 + showBackground = true + margin = rect(0, 0, 0, 0) + textColor = $textColor + + (tabBar) { + height = 35.0 + backgroundColor = $darkColor + borderColor = $borderColor + borderWidth = 1 + sidePadding = 20.0 + } +} +(@panel_tab panel) { +} +% ====================== + + + +% ====== Scrollbar ====== +(scrollbar) { + (thumb) { + color = $darkColor + borderRadius = 30.0 + borderColor = $borderColor + showBorder = true + } + (track) { + color = #111111FF + } + width = 18.0 +} +(scrollbar:hover) { + (thumb) { + color = $accentColorDark + } +} +(scrollbar:pressed) { + (thumb) { + color = #225500FF + } + (track) { + color = #001100FF + } +} +% ======================= + + + +% ====== CheckBox ====== +(checkbox) { + set_common_values($borderColor, 18, false) + checkBorderColor = $accentColorDark + checkBoxColor = $accentColor + textColor = $textColor + borderRadius = 0 + borderWidth = 0 + checkBorderRadius = 6 + checkBorderWidth = 2 + showBackground = false + padding = rect(4, 4, 4, 4) + margin = rect(0, 0, 0, 0) + set_focus_border($blueAccent) +} +(checkbox:hover) { + checkBorderColor = $accentColorLight +} +(checkbox:pressed) { + checkBoxColor = $accentColor + textColor = $accentColorDark + checkBorderColor = $accentColor +} +(checkbox:active) { + checkBoxColor = $accentColor + checkBorderColor = $accentColor + textColor = $accentColorDark +} +% ====================== + + + +% ====== RadioButton ====== +(radioButton) { + set_common_values($borderColor, 18, false) + innerCircleColor = $accentColorDark + outerCircleColor = $accentColor + outerCircleBorderWidth = 2 + textColor = $textColor + showBackground = false + padding = rect(4, 4, 4, 4) + margin = rect(0, 0, 0, 0) + set_focus_border($blueAccent) +} +(radioButton:hover) { + outerCircleColor = $accentColorLight +} +(radioButton:pressed) { + outerCircleColor = $accentColor + textColor = $accentColorDark + innerCircleColor = $accentColor +} +(radioButton:active) { + innerCircleColor = $accentColor + outerCircleColor = $accentColor + textColor = $accentColorDark +} +% ========================= + + + +% ====== Label ====== +(label) { + set_common_values($borderColor, 18, false) + textColor = $textColor + borderRadius = 0 + borderWidth = 0 + showBackground = false + padding = rect(15, 15, 15, 15) + margin = rect(0, 0, 0, 0) +} +% =================== + + + +% ====== Button ====== +(button) { + set_common_values($accentColorDark) + textColor = $textColor + backgroundGradient = gradientV($accentColor - $accentColorDark) + borderRadius = 0 + borderWidth = 1 + showBackground = false + useBackgroundGradient = true + padding = rect(5, 5, 5, 5) + margin = rect(0, 0, 0, 0) + showIcon = false + (icon) { + } + set_focus_border($blueAccent) +} +(button:hover) { + borderColor = $accentColorLight +} +(button:pressed) { + borderColor = $accentColorDark + textColor = #BBBBBBFF + backgroundGradient = gradientV($accentColorDark - $accentColor) +} +% ==================== + + + +% ====== Image ====== +(image) { +} +% =================== + + + +% ====== ProgressBar ====== +(progressbar) { + set_common_values($accentColor) + borderWidth = 1 + showDecimal = false + showText = true + useBackgroundGradient = true + backgroundGradient = gradientV($darkColor - $accentColorDark) + useProgressGradient = true + progressGradient = gradientV($accentColor - $accentColorDark) +} +% ========================= + + + +% ====== Slider ====== +(slider) { + (handle) { + color = $accentColor + size = vec2(10, 18) + } + (track) { + color = $accentColorDark + progressColor = $accentColor + width = 6.0 + } + showStepTicks = true + stepTickHeight = 6.0 + stepTickColor = $accentColor + padding = rect(5, 5, 5, 5) + set_focus_border($blueAccent) +} +% =================== + + + +% ====== Context Menu ====== +(context) { + set_common_values() + padding = rect(16, 0, 16, 0) + itemSpacing = 6.0 + backgroundColor = $darkColor + selectionColor = $accentColor + selectionTextColor = $accentColorLight + separatorLineColor = $borderColor + textColor = $textColor + submenuIndicatorColor = $accentColorDark + useSelectionGradient = true + selectionGradient = gradientV($accentColor - $accentColorDark) + animateOpen = true + animationDelay = 120 +} +% ========================== + + + +% ====== MenuBar ====== +(menubar) { + set_common_values($borderColor, 16, false) + height = 24.0 + itemPadding = rect(0, 0, 15, 0) + backgroundColor = $darkColor + textColor = $textColor + selectionColor = $accentColor + selectionTextColor = $accentColorLight +} +% ===================== + + + +% ====== ToolBar ====== +(toolbar) { + set_common_values() + height = 30.0 + backgroundColor = $darkColor + textColor = $textColor + selectionColor = $accentColor + selectionTextColor = $accentColorLight + showBackground = true +} +(@tool_button button) { + set_common_values(color_black, 18, false) + padding = rect(5, 0, 5, 0) + margin = rect(5, 0, 0, 0) + showBackground = true + backgroundColor = $darkColor + useBackgroundGradient = false + showIcon = true + (icon) { + tint = $accentColorLight + } + set_focus_border($blueAccent) +} +(@tool_button button:hover) { + borderColor = $textColor + backgroundColor = $accentColorDark + showBorder = true + (icon) { + tint = $textColor + } +} +(@tool_button button:pressed) { + borderColor = $accentColorDark + showBorder = true + (icon) { + tint = $accentColorLight + } +} +% ===================== + + + +% ====== ComboBox ====== +(combo) { + set_common_values($accentColor) + backgroundColor = $darkColor + borderWidth = 1 + showBackground = true + triangleIndicatorColor = $accentColor + triangleIndicatorPadding = 8.0 + textColor = $textColor +} +(combo:hover) { + triangleIndicatorColor = $accentColorLight + borderColor = $accentColorLight +} +(combo:active) { + triangleIndicatorColor = $accentColorLight + borderColor = $accentColorLight +} +% ====================== + + + +% ====== TreeView ====== +(tree) { + set_common_values($borderColor, 16, true) + linePadding = rect(5, 5, 0, 0) + selectionColor = $accentColor + selectionTextColor = color_white + iconSpacing = 0.0 + iconInset = 4 + showIcons = true + textColor = $textColor + backgroundColor = $darkColor + backgroundColor2 = $darkColor.lighten(0.06) + showAlternatingBackground = true + separatorLineColor = $borderColor + showSeparatorLine = false + iconTintColor = $accentColorLight + indentWidth = 16.0 + chevronColor = $accentColorDark + chevronInset = 4.0 + branchLineColor = $textColor + showBranchLines = true + branchLineThickness = 1.0 + set_focus_border($blueAccent) +} +% ====================== + + + +% ====== TextEdit ====== +(textEdit) { + set_common_values() + set_focus_border($blueAccent) + backgroundColor = $darkColor + textColor = $textColor + cursorBlink = true + cursorWidth = 2 + cursorColor = $crimsonAccent + selectionColor = $blueAccent + cursorStyle = "line" +} +% ====================== + + + +% ====== ColorPicker ====== +(colorPicker) { + set_common_values() + set_focus_border($blueAccent) + backgroundColor = $darkColor + padding = rect(8, 8, 8, 8) + stripWidth = 20 + regionSpacing = 8 + cursorRadius = 6 +} +(colorButton) { + set_common_values() + set_focus_border($blueAccent) +} +% ========================= diff --git a/other/appIcon.ico b/other/appIcon.ico new file mode 100644 index 0000000000000000000000000000000000000000..85a06b79d3c4f6b976a8007d07cd8a4cb6f1ebe3 GIT binary patch literal 9572 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 literal 0 HcmV?d00001 diff --git a/other/appIcon.rc b/other/appIcon.rc new file mode 100644 index 0000000..47f792a --- /dev/null +++ b/other/appIcon.rc @@ -0,0 +1 @@ + IDI_ICON1 ICON DISCARDABLE "appIcon.ico" diff --git a/other/build.nr b/other/build.nr index 0cfbf08..b8626c4 100644 --- a/other/build.nr +++ b/other/build.nr @@ -1 +1 @@ -2 +4 diff --git a/other/deps.txt b/other/deps.txt new file mode 100644 index 0000000..940141a --- /dev/null +++ b/other/deps.txt @@ -0,0 +1 @@ +mbedtls diff --git a/src/Metadata.hpp b/src/Metadata.hpp new file mode 100644 index 0000000..c2fc53b --- /dev/null +++ b/src/Metadata.hpp @@ -0,0 +1,100 @@ +/* + PianoLibrary + Copyright (C) 2025 OmniaX-Dev + + This file is part of PianoLibrary. + + PianoLibrary is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + PianoLibrary is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PianoLibrary. If not, see . +*/ + +#pragma once + +#include "data.hpp" +#include + +namespace metadata +{ + // Safe conversions — return fallback on any failure. + static float str_to_float(const std::string& s, float fallback = 0.0f) + { + try { return s.empty() ? fallback : std::stof(s); } + catch (...) { return fallback; } + } + + static uint64_t str_to_u64(const std::string& s, uint64_t fallback = 0) + { + try { return s.empty() ? fallback : static_cast(std::stoull(s)); } + catch (...) { return fallback; } + } + + static uint32_t str_to_u32(const std::string& s, uint32_t fallback = 0) + { + try { return s.empty() ? fallback : static_cast(std::stoul(s)); } + catch (...) { return fallback; } + } + + // Parse the full list.json body into a PianoLibrary. + // Returns false on any structural error (missing "data", bad JSON, etc.). + static bool parsePianoLibrary(const std::string& jsonBody, data::PianoLibrary& out) + { + try + { + auto j = nlohmann::json::parse(jsonBody); + + // Root-level metadata + out.generatedAt = j.value("generated-at", std::string("")); + + if (j.contains("revision")) + { + if (j["revision"].is_number()) + out.revision = j["revision"].get(); + else if (j["revision"].is_string()) + out.revision = str_to_u64(j["revision"].get()); + } + + if (!j.contains("data") || !j["data"].is_array()) + return false; + + out.performances.clear(); + out.performances.reserve(j["data"].size()); + + for (const auto& e : j["data"]) + { + data::Performance p; + + p.date = e.value("date", std::string("")); + p.artist = e.value("artist", std::string("")); + p.title = e.value("title", std::string("")); + p.extraInfo = e.value("extra-info", std::string("")); + p.fileName = e.value("file-name", std::string("")); + p.midiFileName = e.value("midi-file-name", std::string("")); + p.id = e.value("ID", std::string("")); + + p.performanceNumber = str_to_u32(e.value("performance-number", std::string("0"))); + p.totalPerformances = str_to_u32(e.value("total-performances", std::string("0"))); + p.fileSize = str_to_u64(e.value("file-size", std::string("0"))); + p.duration = str_to_float(e.value("duration", std::string("0"))); + p.soundStart = str_to_float(e.value("sound-start", std::string("0"))); + + out.performances.push_back(std::move(p)); + } + + return true; + } + catch (...) + { + return false; + } + } +} diff --git a/src/data.hpp b/src/data.hpp new file mode 100644 index 0000000..023ed45 --- /dev/null +++ b/src/data.hpp @@ -0,0 +1,51 @@ +/* + PianoLibrary + Copyright (C) 2025 OmniaX-Dev + + This file is part of PianoLibrary. + + PianoLibrary is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + PianoLibrary is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PianoLibrary. If not, see . +*/ + +#pragma once + +#include +#include + +namespace data +{ + struct Performance + { + String date; + String artist; + String title; + String extraInfo; + String fileName; + String midiFileName; + String id; + + uint32_t performanceNumber { 0 }; + uint32_t totalPerformances { 0 }; + uintmax_t fileSize { 0 }; + float duration { 0.0f }; + float soundStart { 0.0f }; + }; + + struct PianoLibrary + { + String generatedAt; + uint64_t revision { 0 }; + stdvec performances; + }; +} diff --git a/src/info.cpp b/src/info.cpp deleted file mode 100644 index 1910775..0000000 --- a/src/info.cpp +++ /dev/null @@ -1,52 +0,0 @@ -#include -#include - -int main() { - cpr::Response r = cpr::Get(cpr::Url{"https://example.com/data.json"}); - auto j = nlohmann::json::parse(r.text); -} - - - - - - - -#include -#include -#include - -// Portable timegm: temporarily override TZ to UTC, call mktime, restore. -// Works on POSIX, MSVC, MinGW, MSYS2 — everywhere mktime exists. -static std::time_t portable_timegm(std::tm* tm) -{ -#if defined(_WIN32) || defined(__MINGW32__) - // _mkgmtime is MSVC/UCRT's timegm equivalent, also available in MSYS2 UCRT64. - return _mkgmtime(tm); -#else - return timegm(tm); -#endif -} - -std::string utcToLocal(const std::string& iso) -{ - std::tm tm = {}; - - // Manual parse — avoids strptime, which MSVC lacks entirely. - // Expected format: "2026-06-20T14:00:00Z" - if (std::sscanf(iso.c_str(), "%d-%d-%dT%d:%d:%dZ", - &tm.tm_year, &tm.tm_mon, &tm.tm_mday, - &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) - return iso; // Unparseable -> return as-is. - - tm.tm_year -= 1900; - tm.tm_mon -= 1; - tm.tm_isdst = -1; - - std::time_t utc = portable_timegm(&tm); - std::tm* local = std::localtime(&utc); - - char buf[64]; - std::strftime(buf, sizeof(buf), "%d %b %Y, %H:%M %Z", local); - return buf; -} diff --git a/src/main.cpp b/src/main.cpp index a2c8daa..058530f 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,167 +1,258 @@ /* - PianoLibrary - A collection of useful functionality - Copyright (C) 2025 OmniaX-Dev + PianoLibrary + Copyright (C) 2025 OmniaX-Dev - This file is part of PianoLibrary. + This file is part of PianoLibrary. - PianoLibrary is free software: you can redistribute it and/or modify - it under the terms of the GNU General Public License as published by - the Free Software Foundation, either version 3 of the License, or - (at your option) any later version. + PianoLibrary is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - PianoLibrary is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - GNU General Public License for more details. + PianoLibrary is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. - You should have received a copy of the GNU General Public License - along with PianoLibrary. If not, see . + You should have received a copy of the GNU General Public License + along with PianoLibrary. If not, see . */ -#include -#include -#include -#include -#include -#include -#include +#include +#include "vendor/httplib.h" +#include "Metadata.hpp" +#include "utc.hpp" -ostd::ConsoleOutputHandler out; +using namespace ogfx::gui; -struct PianoPerformance -{ - ostd::String date { "" }; - ostd::String artist { "" }; - ostd::String name { "" }; - ostd::String filePath { "" }; - ostd::String extraInfo { "" }; - uint32_t performanceNumber { 0 }; -}; - -int date_to_int(const std::string& s) -{ - int d, m, y; - sscanf(s.c_str(), "%d.%d.%d", &d, &m, &y); - return y * 10000 + m * 100 + d; // YYYYMMDD -} - -class Window : public ogfx::WindowBase +class TestWindow : public Window { public: - inline Window(void) { } + inline TestWindow(void) { } inline void onInitialize(void) override { - enableSignals(); - connectSignal(ostd::tBuiltinSignals::KeyReleased); + m_theme.loadFromFile("./themes/DefaultThemeDark.oss", true, getDefaultStylesheetVariableList()); + setTheme(m_theme); - m_gfx.init(*this); - m_gfx.setFont("res/ttf/Courier Prime.ttf"); + getToolBar().setHeight(30); + getToolBar().setLayout(BoxLayout::Orientation::Horizontal); + getToolBar().getLayout()->setSpacing(10); + getStatusBar().setHeight(24); + showMenuBar(); + showToolBar(); + showStatusBar(); - std::unordered_map> pianoPerformances; + ogfx::AnimationData iconsAD; + iconsAD.frameCount = 1; + iconsAD.fps = 1; + iconsAD.columns = 8; + iconsAD.rows = 5; + iconsAD.frameWidth = 64; + iconsAD.frameHeight = 64; + iconsAD.spacingX = 50; + iconsAD.spacingY = 48; + iconsAD.still = true; - auto musicList = ostd::FileSystem::listFilesInDirectoryRecursive("/home/sylar/Desktop/Music/"); - for (const auto& path : musicList) + auto l_randomIcon = [this](const ogfx::AnimationData& src) -> ogfx::Icon { + static ogfx::Image img("./res/icons.png", getGFX()); + ogfx::AnimationData ad = src; + ad.columnOffset = ostd::Random::getui32(0, 7); + ad.rowOffset = ostd::Random::getui32(0, 4); + if (ad.rowOffset == 3) + ad.columnOffset = ostd::Random::getui32(0, 4); + return { img, ad }; + }; + + for (i32 i = 0; i < 17; i++) { - ostd::String p = path; - p.trim(); - if (p.contains("/")) - p.substr(p.lastIndexOf("/") + 1); - - PianoPerformance pp; - - auto tokens = p.tokenize("-"); - if (tokens.hasNext()) - pp.date = tokens.next(); - if (tokens.hasNext()) - pp.artist = tokens.next(); - if (tokens.hasNext()) - pp.name = tokens.next(); - if (tokens.hasNext()) - { - ostd::String tmp = tokens.next(); - if (!tmp.isNumeric()) - { - int32_t i = 0; - for ( ; i < tmp.len(); i++) - { - char c = tmp[i]; - if (c >= '0' && c <= '9') - continue; - break; - } - if (i == 0) - pp.performanceNumber = 0; - else - pp.performanceNumber = tmp.substr(0, i).toInt(); - } - else - pp.performanceNumber = tmp.toInt(); - } - while (tokens.hasNext()) - pp.extraInfo += tokens.next() + " "; - pianoPerformances[pp.date].push_back(pp); + auto icon = l_randomIcon(iconsAD); + auto& btn = getToolBar().addButton("./res/icons.png"); + btn.enableAnimated(); + btn.setAnimationData(icon); + btn.setTabIndex(i + 100); } - std::vector>> sortedPerformances(pianoPerformances.begin(), pianoPerformances.end()); + m_tabs.setSize(900, 700); + m_tabs.addThemeOverride("@.tabPanel.showBorder", false); + auto& t1 = m_tabs.addTab("Tab1"); + auto& t2 = m_tabs.addTab("Tab2 Test"); + auto& t3 = m_tabs.addTab("Long Tab Test"); - std::sort(sortedPerformances.begin(), sortedPerformances.end(), - [](auto& a, auto& b) { - return date_to_int(a.first) < date_to_int(b.first); - } - ); + addWidget(m_tabs, { 0, 0 }); + getToolBar().reloadTheme(true); - for (auto[date, performances] : sortedPerformances) - { - out.fg(ostd::ConsoleColors::BrightBlue).p(date).nl(); - for (const auto& perf : performances) + auto onActivate = [this](const ContextMenu::Entry& e) { + out().fg("cyan").p("[MenuBar] Activated: ").fg("yellow").p(e.text) + .fg("cyan").p(" (id=").fg("green").p(e.id).fg("cyan").p(")").reset().nl(); + + switch (e.id) { - out.fg(ostd::ConsoleColors::BrightYellow).p(" ").p(perf.artist).p("\t"); - out.fg(ostd::ConsoleColors::BrightGray).p(perf.name).p(" "); - out.fg(ostd::ConsoleColors::BrightRed).p("(").p(perf.performanceNumber).p(")").nl(); + case TestMenuId::File_Exit: + close(); + break; + // ... add real handlers as you build them out + default: + break; } - out.nl().nl(); - } - out.reset(); + }; - close(); - } + fileMenu.onActivate = onActivate; + editMenu.onActivate = onActivate; + viewMenu.onActivate = onActivate; + helpMenu.onActivate = onActivate; - inline void handleSignal(ostd::tSignal& signal) override + getMenuBar().addMenu("File", fileMenu) + .addMenu("Edit", editMenu) + .addMenu("View", viewMenu) + .addMenu("Help", helpMenu); + } + + inline void onSignal(ostd::Signal& signal) override { - if (signal.ID == ostd::tBuiltinSignals::KeyReleased) + if (signal.ID == ostd::BuiltinSignals::KeyReleased) { auto& evtData = (ogfx::KeyEventData&)signal.userData; - if (evtData.keyCode == SDLK_ESCAPE) + if (evtData.keyCode == ogfx::KeyCode::Escape) close(); } + else if (signal.ID == ostd::BuiltinSignals::WindowResized) + { + auto& wrd = cast(signal.userData); + m_tabs.setSize(cast(getWindowWidth()), cast(getWindowHeight() - getMenuBar().geth() - getToolBar().geth() - getStatusBar().geth())); + m_tabs.setPosition(0, -1); + m_tabs.refreshCurrentTab(); + + } } - inline void onRender(void) override + void onRedraw(ogfx::BasicRenderer2D& gfx) override { } - inline void onFixedUpdate(double frameTime_s) override - { - } - - inline void onUpdate(void) override + void onFixedUpdate(void) override { } private: - ogfx::BasicRenderer2D m_gfx; + TabPanel m_tabs { *this }; + + enum TestMenuId : i32 + { + // File + File_New = 1, + File_Open, + File_OpenRecent_Project1, + File_OpenRecent_Project2, + File_OpenRecent_Project3, + File_OpenRecent_ClearList, + File_Save, + File_SaveAs, + File_Export_PNG, + File_Export_JPG, + File_Export_SVG, + File_Export_PDF, + File_Exit, + + // Edit + Edit_Undo, + Edit_Redo, + Edit_Cut, + Edit_Copy, + Edit_Paste, + Edit_SelectAll, + + // View + View_ZoomIn, + View_ZoomOut, + View_ZoomReset, + View_Theme_Dark, + View_Theme_Light, + View_Theme_Crimson, + + // Help + Help_Documentation, + Help_About, + }; + + ContextMenu::Instance fileMenu { { + { "New", TestMenuId::File_New }, + { "Open...", TestMenuId::File_Open }, + { "Open Recent", { + { "Project1.proj", TestMenuId::File_OpenRecent_Project1 }, + { "Project2.proj", TestMenuId::File_OpenRecent_Project2 }, + { "Project3.proj", TestMenuId::File_OpenRecent_Project3 }, + { "Clear Recent List", TestMenuId::File_OpenRecent_ClearList }, + }}, + { "Save", TestMenuId::File_Save }, + { "Save As...",TestMenuId::File_SaveAs }, + { "Export As", { + { "PNG Image", TestMenuId::File_Export_PNG }, + { "JPG Image", TestMenuId::File_Export_JPG }, + { "SVG Vector",TestMenuId::File_Export_SVG }, + { "PDF Document", TestMenuId::File_Export_PDF }, + }}, + { "Exit", TestMenuId::File_Exit } }, + nullptr + }; + + ContextMenu::Instance editMenu { { + { "Undo", TestMenuId::Edit_Undo }, + { "Redo", TestMenuId::Edit_Redo }, + { "Cut", TestMenuId::Edit_Cut }, + { "Copy", TestMenuId::Edit_Copy }, + { "Paste", TestMenuId::Edit_Paste }, + { "Select All", TestMenuId::Edit_SelectAll } }, + nullptr + }; + + ContextMenu::Instance viewMenu { { + { "Zoom In", TestMenuId::View_ZoomIn }, + { "Zoom Out", TestMenuId::View_ZoomOut }, + { "Reset Zoom", TestMenuId::View_ZoomReset }, + { "Theme", { + { "Dark", TestMenuId::View_Theme_Dark }, + { "Light", TestMenuId::View_Theme_Light }, + { "Crimson", TestMenuId::View_Theme_Crimson }, + }} }, + nullptr + }; + + ContextMenu::Instance helpMenu { { + { "Documentation", TestMenuId::Help_Documentation }, + { "About", TestMenuId::Help_About } }, + nullptr + }; + + ostd::Stylesheet m_theme; }; -int main(int argc, char** argv) -{ - Window window; - window.initialize(1280, 720, "PianoLibrary"); - window.setClearColor({ 0, 2 , 15 }); - - while (window.isRunning()) +void request() { + httplib::Client cli("https://timeline.keylightpiano.com"); + auto res = cli.Get("/music/list.json"); + if (res && res->status == 200) { - window.update(); - } + data::PianoLibrary library; + if (metadata::parsePianoLibrary(res->body, library)) + { + std::string localTime = utc::toLocal(library.generatedAt); + printf("Revision %lu, generated %s\n", library.revision, localTime.c_str()); + printf("%zu performances loaded\n", library.performances.size()); + for (const auto& p : library.performances) + printf(" %s - %s (%.1fs)\n", p.artist.c_str(), p.title.c_str(), p.duration); + } + } +} + +i32 main(i32 argc, char** argv) +{ + request(); + ostd::Random::autoSeed(); + TestWindow window; + window.initialize(960, 540, "PianoLibrary"); + window.setClearColor({ 0, 0, 0 }); + window.setPosition({ 50, 50 }); + // window.setWindowState(ogfx::gui::Window::eWindowState::Maximized); + window.mainLoop(); return 0; } diff --git a/src/utc.hpp b/src/utc.hpp new file mode 100644 index 0000000..1f24f0b --- /dev/null +++ b/src/utc.hpp @@ -0,0 +1,61 @@ +/* + PianoLibrary + Copyright (C) 2025 OmniaX-Dev + + This file is part of PianoLibrary. + + PianoLibrary is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + PianoLibrary is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with PianoLibrary. If not, see . +*/ + +#pragma once + +#include + +namespace utc +{ + // Portable timegm: temporarily override TZ to UTC, call mktime, restore. + // Works on POSIX, MSVC, MinGW, MSYS2 — everywhere mktime exists. + static std::time_t portable_timegm(std::tm* tm) + { + #if defined(_WIN32) || defined(__MINGW32__) + // _mkgmtime is MSVC/UCRT's timegm equivalent, also available in MSYS2 UCRT64. + return _mkgmtime(tm); + #else + return timegm(tm); + #endif + } + + static String toLocal(const String& iso) + { + std::tm tm = {}; + + // Manual parse — avoids strptime, which MSVC lacks entirely. + // Expected format: "2026-06-20T14:00:00Z" + if (std::sscanf(iso.c_str(), "%d-%d-%dT%d:%d:%dZ", + &tm.tm_year, &tm.tm_mon, &tm.tm_mday, + &tm.tm_hour, &tm.tm_min, &tm.tm_sec) != 6) + return iso; // Unparseable -> return as-is. + + tm.tm_year -= 1900; + tm.tm_mon -= 1; + tm.tm_isdst = -1; + + std::time_t utc = portable_timegm(&tm); + std::tm* local = std::localtime(&utc); + + char buf[64]; + std::strftime(buf, sizeof(buf), "%d %b %Y, %H:%M %Z", local); + return buf; + } +} diff --git a/src/vendor/httplib.h b/src/vendor/httplib.h new file mode 100644 index 0000000..58c63d0 --- /dev/null +++ b/src/vendor/httplib.h @@ -0,0 +1,20588 @@ +// +// httplib.h +// +// Copyright (c) 2026 Yuji Hirose. All rights reserved. +// MIT License +// + +#ifndef CPPHTTPLIB_HTTPLIB_H +#define CPPHTTPLIB_HTTPLIB_H + +#define CPPHTTPLIB_VERSION "0.48.0" +#define CPPHTTPLIB_VERSION_NUM "0x003000" + +#ifdef _WIN32 +#if defined(_WIN32_WINNT) && _WIN32_WINNT < 0x0A00 +#error \ + "cpp-httplib doesn't support Windows 8 or lower. Please use Windows 10 or later." +#endif +#endif + +/* + * Configuration + */ + +#ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND +#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND 5 +#endif + +#ifndef CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND +#define CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND 10000 +#endif + +#ifndef CPPHTTPLIB_KEEPALIVE_MAX_COUNT +#define CPPHTTPLIB_KEEPALIVE_MAX_COUNT 100 +#endif + +#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND +#define CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND 300 +#endif + +#ifndef CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND +#define CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND +#define CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND 5 +#endif + +#ifndef CPPHTTPLIB_SERVER_READ_TIMEOUT_USECOND +#define CPPHTTPLIB_SERVER_READ_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_SERVER_WRITE_TIMEOUT_SECOND +#define CPPHTTPLIB_SERVER_WRITE_TIMEOUT_SECOND 5 +#endif + +#ifndef CPPHTTPLIB_SERVER_WRITE_TIMEOUT_USECOND +#define CPPHTTPLIB_SERVER_WRITE_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_CLIENT_READ_TIMEOUT_SECOND +#define CPPHTTPLIB_CLIENT_READ_TIMEOUT_SECOND 300 +#endif + +#ifndef CPPHTTPLIB_CLIENT_READ_TIMEOUT_USECOND +#define CPPHTTPLIB_CLIENT_READ_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_SECOND +#define CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_SECOND 5 +#endif + +#ifndef CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_USECOND +#define CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_USECOND 0 +#endif + +#ifndef CPPHTTPLIB_CLIENT_MAX_TIMEOUT_MSECOND +#define CPPHTTPLIB_CLIENT_MAX_TIMEOUT_MSECOND 0 +#endif + +#ifndef CPPHTTPLIB_EXPECT_100_THRESHOLD +#define CPPHTTPLIB_EXPECT_100_THRESHOLD 1024 +#endif + +#ifndef CPPHTTPLIB_EXPECT_100_TIMEOUT_MSECOND +#define CPPHTTPLIB_EXPECT_100_TIMEOUT_MSECOND 1000 +#endif + +#ifndef CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_THRESHOLD +#define CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_THRESHOLD (1024 * 1024) +#endif + +#ifndef CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_TIMEOUT_MSECOND +#define CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_TIMEOUT_MSECOND 50 +#endif + +#ifndef CPPHTTPLIB_IDLE_INTERVAL_SECOND +#define CPPHTTPLIB_IDLE_INTERVAL_SECOND 0 +#endif + +#ifndef CPPHTTPLIB_IDLE_INTERVAL_USECOND +#ifdef _WIN32 +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 1000 +#else +#define CPPHTTPLIB_IDLE_INTERVAL_USECOND 0 +#endif +#endif + +#ifndef CPPHTTPLIB_REQUEST_URI_MAX_LENGTH +#define CPPHTTPLIB_REQUEST_URI_MAX_LENGTH 8192 +#endif + +#ifndef CPPHTTPLIB_HEADER_MAX_LENGTH +#define CPPHTTPLIB_HEADER_MAX_LENGTH 8192 +#endif + +#ifndef CPPHTTPLIB_HEADER_MAX_COUNT +#define CPPHTTPLIB_HEADER_MAX_COUNT 100 +#endif + +#ifndef CPPHTTPLIB_REDIRECT_MAX_COUNT +#define CPPHTTPLIB_REDIRECT_MAX_COUNT 20 +#endif + +#ifndef CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT +#define CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT 1024 +#endif + +#ifndef CPPHTTPLIB_PAYLOAD_MAX_LENGTH +#define CPPHTTPLIB_PAYLOAD_MAX_LENGTH (100 * 1024 * 1024) // 100MB +#endif + +#ifndef CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH +#define CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH 8192 +#endif + +#ifndef CPPHTTPLIB_RANGE_MAX_COUNT +#define CPPHTTPLIB_RANGE_MAX_COUNT 1024 +#endif + +#ifndef CPPHTTPLIB_TCP_NODELAY +#define CPPHTTPLIB_TCP_NODELAY false +#endif + +#ifndef CPPHTTPLIB_IPV6_V6ONLY +#define CPPHTTPLIB_IPV6_V6ONLY false +#endif + +#ifndef CPPHTTPLIB_RECV_BUFSIZ +#define CPPHTTPLIB_RECV_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_SEND_BUFSIZ +#define CPPHTTPLIB_SEND_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_COMPRESSION_BUFSIZ +#define CPPHTTPLIB_COMPRESSION_BUFSIZ size_t(16384u) +#endif + +#ifndef CPPHTTPLIB_THREAD_POOL_COUNT +#define CPPHTTPLIB_THREAD_POOL_COUNT \ + ((std::max)(8u, std::thread::hardware_concurrency() > 0 \ + ? std::thread::hardware_concurrency() - 1 \ + : 0)) +#endif + +#ifndef CPPHTTPLIB_THREAD_POOL_MAX_COUNT +#define CPPHTTPLIB_THREAD_POOL_MAX_COUNT (CPPHTTPLIB_THREAD_POOL_COUNT * 4) +#endif + +#ifndef CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT +#define CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT 3 // seconds +#endif + +#ifndef CPPHTTPLIB_RECV_FLAGS +#define CPPHTTPLIB_RECV_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_SEND_FLAGS +#define CPPHTTPLIB_SEND_FLAGS 0 +#endif + +#ifndef CPPHTTPLIB_LISTEN_BACKLOG +#define CPPHTTPLIB_LISTEN_BACKLOG 5 +#endif + +#ifndef CPPHTTPLIB_MAX_LINE_LENGTH +#define CPPHTTPLIB_MAX_LINE_LENGTH 32768 +#endif + +#ifndef CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH +#define CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH 16777216 +#endif + +#ifndef CPPHTTPLIB_WEBSOCKET_READ_TIMEOUT_SECOND +#define CPPHTTPLIB_WEBSOCKET_READ_TIMEOUT_SECOND 300 +#endif + +#ifndef CPPHTTPLIB_WEBSOCKET_CLOSE_TIMEOUT_SECOND +#define CPPHTTPLIB_WEBSOCKET_CLOSE_TIMEOUT_SECOND 5 +#endif + +#ifndef CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND +#define CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND 30 +#endif + +#ifndef CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS +#define CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS 0 +#endif + +/* + * Headers + */ + +#ifdef _WIN32 +#ifndef _CRT_SECURE_NO_WARNINGS +#define _CRT_SECURE_NO_WARNINGS +#endif //_CRT_SECURE_NO_WARNINGS + +#ifndef _CRT_NONSTDC_NO_DEPRECATE +#define _CRT_NONSTDC_NO_DEPRECATE +#endif //_CRT_NONSTDC_NO_DEPRECATE + +#if defined(_MSC_VER) +#if _MSC_VER < 1900 +#error Sorry, Visual Studio versions prior to 2015 are not supported +#endif + +#pragma comment(lib, "ws2_32.lib") + +#ifndef _SSIZE_T_DEFINED +using ssize_t = __int64; +#define _SSIZE_T_DEFINED +#endif +#endif // _MSC_VER + +#ifndef S_ISREG +#define S_ISREG(m) (((m) & S_IFREG) == S_IFREG) +#endif // S_ISREG + +#ifndef S_ISDIR +#define S_ISDIR(m) (((m) & S_IFDIR) == S_IFDIR) +#endif // S_ISDIR + +#ifndef NOMINMAX +#define NOMINMAX +#endif // NOMINMAX + +#include +#include +#include + +#if defined(__has_include) +#if __has_include() +// afunix.h uses types declared in winsock2.h, so has to be included after it. +#include +#define CPPHTTPLIB_HAVE_AFUNIX_H 1 +#endif +#endif + +#ifndef WSA_FLAG_NO_HANDLE_INHERIT +#define WSA_FLAG_NO_HANDLE_INHERIT 0x80 +#endif + +using nfds_t = unsigned long; +using socket_t = SOCKET; +using socklen_t = int; + +#else // not _WIN32 + +#include +#if !defined(_AIX) && !defined(__MVS__) +#include +#endif +#ifdef __MVS__ +#include +#ifndef NI_MAXHOST +#define NI_MAXHOST 1025 +#endif +#endif +#include +#include +#include +#ifdef __linux__ +#include +#undef _res // Undefine _res macro to avoid conflicts with user code (#2278) +#endif +#include +#include +#include +#include +#include +#include +#include +#include + +using socket_t = int; +#ifndef INVALID_SOCKET +#define INVALID_SOCKET (-1) +#endif +#endif //_WIN32 + +#if defined(__APPLE__) +#include +#endif + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +// On macOS with a TLS backend, enable Keychain root certificates by default +// unless the user explicitly opts out. Not enabled on iOS/tvOS/watchOS since +// the SecTrustSettings APIs used to enumerate anchor certificates are macOS +// only; on those platforms the user must provide a CA bundle explicitly. +#if defined(__APPLE__) && defined(__clang__) && \ + !defined(CPPHTTPLIB_DISABLE_MACOSX_AUTOMATIC_ROOT_CERTIFICATES) && \ + (defined(CPPHTTPLIB_OPENSSL_SUPPORT) || \ + defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || \ + defined(CPPHTTPLIB_WOLFSSL_SUPPORT)) +#if TARGET_OS_OSX +#ifndef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +#define CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +#endif +#endif +#endif + +#if defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) && \ + defined(__APPLE__) && !TARGET_OS_OSX +#error \ + "CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN is only supported on macOS. On iOS/tvOS/watchOS, supply a CA bundle via set_ca_cert_path()." +#endif + +// On Windows, enable Schannel certificate verification by default +// unless the user explicitly opts out. +#if defined(_WIN32) && \ + !defined(CPPHTTPLIB_DISABLE_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE) +#define CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE +#endif + +#if defined(CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO) || \ + defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) +#if TARGET_OS_MAC && defined(__clang__) +#include +#include +#endif +#endif + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +#ifdef _WIN32 +#include + +// these are defined in wincrypt.h and it breaks compilation if BoringSSL is +// used +#undef X509_NAME +#undef X509_CERT_PAIR +#undef X509_EXTENSIONS +#undef PKCS7_SIGNER_INFO + +#ifdef _MSC_VER +#pragma comment(lib, "crypt32.lib") +#endif +#endif // _WIN32 + +#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +#if TARGET_OS_OSX +#include +#endif +#endif + +#include +#include +#include +#include + +#if defined(_WIN32) && defined(OPENSSL_USE_APPLINK) +#include +#endif + +#include +#include + +#if defined(OPENSSL_IS_BORINGSSL) || defined(LIBRESSL_VERSION_NUMBER) +#if OPENSSL_VERSION_NUMBER < 0x1010107f +#error Please use OpenSSL or a current version of BoringSSL +#endif +#define SSL_get1_peer_certificate SSL_get_peer_certificate +#elif OPENSSL_VERSION_NUMBER < 0x30000000L +#error Sorry, OpenSSL versions prior to 3.0.0 are not supported +#endif + +#endif // CPPHTTPLIB_OPENSSL_SUPPORT + +#ifdef CPPHTTPLIB_MBEDTLS_SUPPORT +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#ifdef _MSC_VER +#pragma comment(lib, "crypt32.lib") +#endif +#endif // _WIN32 +#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +#if TARGET_OS_OSX +#include +#endif +#endif + +// Mbed TLS 3.x API compatibility +#if MBEDTLS_VERSION_MAJOR >= 3 +#define CPPHTTPLIB_MBEDTLS_V3 +#endif + +#endif // CPPHTTPLIB_MBEDTLS_SUPPORT + +#ifdef CPPHTTPLIB_WOLFSSL_SUPPORT +#include + +#include + +// Fallback definitions for older wolfSSL versions (e.g., 5.6.6) +#ifndef WOLFSSL_GEN_EMAIL +#define WOLFSSL_GEN_EMAIL 1 +#endif +#ifndef WOLFSSL_GEN_DNS +#define WOLFSSL_GEN_DNS 2 +#endif +#ifndef WOLFSSL_GEN_URI +#define WOLFSSL_GEN_URI 6 +#endif +#ifndef WOLFSSL_GEN_IPADD +#define WOLFSSL_GEN_IPADD 7 +#endif + +#include +#include +#include +#include +#include +#ifdef _WIN32 +#include +#ifdef _MSC_VER +#pragma comment(lib, "crypt32.lib") +#endif +#endif // _WIN32 +#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +#if TARGET_OS_OSX +#include +#endif +#endif +#endif // CPPHTTPLIB_WOLFSSL_SUPPORT + +// Define CPPHTTPLIB_SSL_ENABLED if any SSL backend is available +#if defined(CPPHTTPLIB_OPENSSL_SUPPORT) || \ + defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || defined(CPPHTTPLIB_WOLFSSL_SUPPORT) +#define CPPHTTPLIB_SSL_ENABLED +#endif + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +#include +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +#include +#include +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +#include +#endif + +/* + * Declaration + */ +namespace httplib { + +namespace ws { +class WebSocket; +} // namespace ws + +namespace detail { + +/* + * Backport std::make_unique from C++14. + * + * NOTE: This code came up with the following stackoverflow post: + * https://stackoverflow.com/questions/10149840/c-arrays-and-make-unique + * + */ + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(Args &&...args) { + return std::unique_ptr(new T(std::forward(args)...)); +} + +template +typename std::enable_if::value, std::unique_ptr>::type +make_unique(std::size_t n) { + typedef typename std::remove_extent::type RT; + return std::unique_ptr(new RT[n]); +} + +namespace case_ignore { + +inline unsigned char to_lower(int c) { + const static unsigned char table[256] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, + 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, + 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, + 60, 61, 62, 63, 64, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, + 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, + 122, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, + 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, + 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 215, 248, 249, 250, 251, 252, 253, 254, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, + 255, + }; + return table[(unsigned char)(char)c]; +} + +inline std::string to_lower(const std::string &s) { + std::string result = s; + std::transform( + result.begin(), result.end(), result.begin(), + [](unsigned char c) { return static_cast(to_lower(c)); }); + return result; +} + +inline bool equal(const std::string &a, const std::string &b) { + return a.size() == b.size() && + std::equal(a.begin(), a.end(), b.begin(), [](char ca, char cb) { + return to_lower(ca) == to_lower(cb); + }); +} + +struct equal_to { + bool operator()(const std::string &a, const std::string &b) const { + return equal(a, b); + } +}; + +struct hash { + size_t operator()(const std::string &key) const { + return hash_core(key.data(), key.size(), 0); + } + + size_t hash_core(const char *s, size_t l, size_t h) const { + return (l == 0) ? h + : hash_core(s + 1, l - 1, + // Unsets the 6 high bits of h, therefore no + // overflow happens + (((std::numeric_limits::max)() >> 6) & + h * 33) ^ + static_cast(to_lower(*s))); + } +}; + +template +using unordered_set = std::unordered_set; + +} // namespace case_ignore + +// This is based on +// "http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4189". + +struct scope_exit { + explicit scope_exit(std::function &&f) + : exit_function(std::move(f)), execute_on_destruction{true} {} + + scope_exit(scope_exit &&rhs) noexcept + : exit_function(std::move(rhs.exit_function)), + execute_on_destruction{rhs.execute_on_destruction} { + rhs.release(); + } + + ~scope_exit() { + if (execute_on_destruction) { this->exit_function(); } + } + + void release() { this->execute_on_destruction = false; } + +private: + scope_exit(const scope_exit &) = delete; + void operator=(const scope_exit &) = delete; + scope_exit &operator=(scope_exit &&) = delete; + + std::function exit_function; + bool execute_on_destruction; +}; + +// Simple from_chars implementation for integer and double types (C++17 +// substitute) +template struct from_chars_result { + const char *ptr; + std::errc ec; +}; + +template +inline from_chars_result from_chars(const char *first, const char *last, + T &value, int base = 10) { + value = 0; + const char *p = first; + bool negative = false; + + if (p != last && *p == '-') { + negative = true; + ++p; + } + if (p == last) { return {first, std::errc::invalid_argument}; } + + T result = 0; + for (; p != last; ++p) { + char c = *p; + int digit = -1; + if ('0' <= c && c <= '9') { + digit = c - '0'; + } else if ('a' <= c && c <= 'z') { + digit = c - 'a' + 10; + } else if ('A' <= c && c <= 'Z') { + digit = c - 'A' + 10; + } else { + break; + } + + if (digit < 0 || digit >= base) { break; } + if (result > ((std::numeric_limits::max)() - digit) / base) { + return {p, std::errc::result_out_of_range}; + } + result = result * base + digit; + } + + if (p == first || (negative && p == first + 1)) { + return {first, std::errc::invalid_argument}; + } + + value = negative ? -result : result; + return {p, std::errc{}}; +} + +// from_chars for double (hand-written, locale-independent) +// +// The only double consumed by this library is the HTTP quality value, whose +// grammar is (RFC 9110 12.4.2): +// qvalue = ( "0" [ "." 0*3DIGIT ] ) / ( "1" [ "." 0*3("0") ] ) +// i.e. a non-negative decimal with no sign, exponent, "inf"/"nan", or wide +// magnitude. So this parser recognizes exactly 1*DIGIT [ "." *DIGIT ] with +// '.' always the decimal separator (std::strtod would instead read it from the +// global C locale, mis-parsing q-values once an embedder calls +// setlocale(LC_ALL, "") into a comma-decimal locale). The caller range-checks +// the result to [0, 1], so inputs outside that range need not be distinguished +// here. Allocation-free, single pass, and free of the overflow/rounding edge +// cases that exponent and wide-range handling would introduce. +inline from_chars_result from_chars(const char *first, const char *last, + double &value) { + value = 0.0; + const char *p = first; + + // Each 1eN is exactly representable, so a single final division by the + // matching entry yields a correctly-rounded result. + static const double powers_of_ten[] = { + 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, + 1e10, 1e11, 1e12, 1e13, 1e14, 1e15, 1e16, 1e17, 1e18}; + const int max_frac_digits = + static_cast(sizeof(powers_of_ten) / sizeof(powers_of_ten[0])) - 1; + + // Accumulate digits into a 64-bit integer and remember how many were + // fractional. Two independent caps keep this bounded and safe: + // * accumulation saturates before mantissa could overflow uint64_t, and + // * frac_digits is capped at max_frac_digits so it is always a valid index + // into powers_of_ten (without this an input like "0.000...0" would never + // grow mantissa, so the saturation cap alone would not bound it). + // Both caps only drop digits far beyond the precision a q-value needs; any + // value they would change is well outside [0, 1] and rejected by the caller. + uint64_t mantissa = 0; + int frac_digits = 0; + bool seen_digit = false; + + const uint64_t limit = ((std::numeric_limits::max)() - 9) / 10; + auto accumulate = [&](char c) { + if (mantissa <= limit) { + mantissa = mantissa * 10 + static_cast(c - '0'); + return true; + } + return false; + }; + + for (; p != last && '0' <= *p && *p <= '9'; ++p) { + seen_digit = true; + accumulate(*p); + } + + if (p != last && *p == '.') { + ++p; + for (; p != last && '0' <= *p && *p <= '9'; ++p) { + seen_digit = true; + if (frac_digits < max_frac_digits && accumulate(*p)) { ++frac_digits; } + } + } + + if (!seen_digit) { return {first, std::errc::invalid_argument}; } + + value = static_cast(mantissa) / powers_of_ten[frac_digits]; + return {p, std::errc{}}; +} + +inline bool parse_port(const char *s, size_t len, int &port) { + int val = 0; + auto r = from_chars(s, s + len, val); + if (r.ec != std::errc{} || val < 1 || val > 65535) { return false; } + port = val; + return true; +} + +inline bool parse_port(const std::string &s, int &port) { + return parse_port(s.data(), s.size(), port); +} + +struct UrlComponents { + std::string scheme; + std::string host; + std::string port; + std::string path; + std::string query; +}; + +inline bool parse_url(const std::string &url, UrlComponents &uc) { + uc = {}; + size_t pos = 0; + + auto sep = url.find("://"); + if (sep != std::string::npos) { + uc.scheme = url.substr(0, sep); + + // Scheme must be [a-z]+ only + if (uc.scheme.empty()) { return false; } + for (auto c : uc.scheme) { + if (c < 'a' || c > 'z') { return false; } + } + + pos = sep + 3; + } else if (url.compare(0, 2, "//") == 0) { + pos = 2; + } + + auto has_authority_prefix = pos > 0; + auto has_authority = has_authority_prefix || (!url.empty() && url[0] != '/' && + url[0] != '?' && url[0] != '#'); + if (has_authority) { + if (pos < url.size() && url[pos] == '[') { + auto close = url.find(']', pos); + if (close == std::string::npos) { return false; } + uc.host = url.substr(pos + 1, close - pos - 1); + + // IPv6 host must be [a-fA-F0-9:]+ only + if (uc.host.empty()) { return false; } + for (auto c : uc.host) { + if (!((c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F') || + (c >= '0' && c <= '9') || c == ':')) { + return false; + } + } + + pos = close + 1; + } else { + auto end = url.find_first_of(":/?#", pos); + if (end == std::string::npos) { end = url.size(); } + uc.host = url.substr(pos, end - pos); + pos = end; + } + + if (pos < url.size() && url[pos] == ':') { + ++pos; + auto end = url.find_first_of("/?#", pos); + if (end == std::string::npos) { end = url.size(); } + uc.port = url.substr(pos, end - pos); + pos = end; + } + + // Without :// or //, the entire input must be consumed as host[:port]. + // If there is leftover (path, query, etc.), this is not a valid + // host[:port] string — clear and reparse as a plain path. + if (!has_authority_prefix && pos < url.size()) { + uc.host.clear(); + uc.port.clear(); + pos = 0; + } + } + + if (pos < url.size() && url[pos] != '?' && url[pos] != '#') { + auto end = url.find_first_of("?#", pos); + if (end == std::string::npos) { end = url.size(); } + uc.path = url.substr(pos, end - pos); + pos = end; + } + + if (pos < url.size() && url[pos] == '?') { + auto end = url.find('#', pos); + if (end == std::string::npos) { end = url.size(); } + uc.query = url.substr(pos, end - pos); + } + + return true; +} + +} // namespace detail + +enum class SSLVerifierResponse { + // no decision has been made, use the built-in certificate verifier + NoDecisionMade, + // connection certificate is verified and accepted + CertificateAccepted, + // connection certificate was processed but is rejected + CertificateRejected +}; + +// System CA loading policy for SSL clients. Auto (the default) loads system +// CA certs only when no custom CA is configured; enable_system_ca() switches +// to an explicit policy. +enum class SystemCAMode { Auto, Enabled, Disabled }; + +enum StatusCode { + // Information responses + Continue_100 = 100, + SwitchingProtocol_101 = 101, + Processing_102 = 102, + EarlyHints_103 = 103, + + // Successful responses + OK_200 = 200, + Created_201 = 201, + Accepted_202 = 202, + NonAuthoritativeInformation_203 = 203, + NoContent_204 = 204, + ResetContent_205 = 205, + PartialContent_206 = 206, + MultiStatus_207 = 207, + AlreadyReported_208 = 208, + IMUsed_226 = 226, + + // Redirection messages + MultipleChoices_300 = 300, + MovedPermanently_301 = 301, + Found_302 = 302, + SeeOther_303 = 303, + NotModified_304 = 304, + UseProxy_305 = 305, + unused_306 = 306, + TemporaryRedirect_307 = 307, + PermanentRedirect_308 = 308, + + // Client error responses + BadRequest_400 = 400, + Unauthorized_401 = 401, + PaymentRequired_402 = 402, + Forbidden_403 = 403, + NotFound_404 = 404, + MethodNotAllowed_405 = 405, + NotAcceptable_406 = 406, + ProxyAuthenticationRequired_407 = 407, + RequestTimeout_408 = 408, + Conflict_409 = 409, + Gone_410 = 410, + LengthRequired_411 = 411, + PreconditionFailed_412 = 412, + PayloadTooLarge_413 = 413, + UriTooLong_414 = 414, + UnsupportedMediaType_415 = 415, + RangeNotSatisfiable_416 = 416, + ExpectationFailed_417 = 417, + ImATeapot_418 = 418, + MisdirectedRequest_421 = 421, + UnprocessableContent_422 = 422, + Locked_423 = 423, + FailedDependency_424 = 424, + TooEarly_425 = 425, + UpgradeRequired_426 = 426, + PreconditionRequired_428 = 428, + TooManyRequests_429 = 429, + RequestHeaderFieldsTooLarge_431 = 431, + UnavailableForLegalReasons_451 = 451, + + // Server error responses + InternalServerError_500 = 500, + NotImplemented_501 = 501, + BadGateway_502 = 502, + ServiceUnavailable_503 = 503, + GatewayTimeout_504 = 504, + HttpVersionNotSupported_505 = 505, + VariantAlsoNegotiates_506 = 506, + InsufficientStorage_507 = 507, + LoopDetected_508 = 508, + NotExtended_510 = 510, + NetworkAuthenticationRequired_511 = 511, +}; + +using Headers = + std::unordered_multimap; + +using Params = std::multimap; +using Match = std::smatch; + +using DownloadProgress = std::function; +using UploadProgress = std::function; + +/* + * detail: type-erased storage used by UserData. + * ABI-stable regardless of C++ standard — always uses this custom + * implementation instead of std::any. + */ +namespace detail { + +using any_type_id = const void *; + +template any_type_id any_typeid() noexcept { + static const char id = 0; + return &id; +} + +struct any_storage { + virtual ~any_storage() = default; + virtual std::unique_ptr clone() const = 0; + virtual any_type_id type_id() const noexcept = 0; +}; + +template struct any_value final : any_storage { + T value; + template explicit any_value(U &&v) : value(std::forward(v)) {} + std::unique_ptr clone() const override { + return std::unique_ptr(new any_value(value)); + } + any_type_id type_id() const noexcept override { return any_typeid(); } +}; + +} // namespace detail + +class UserData { +public: + UserData() = default; + UserData(UserData &&) noexcept = default; + UserData &operator=(UserData &&) noexcept = default; + + UserData(const UserData &o) { + for (const auto &e : o.entries_) { + if (e.second) { entries_[e.first] = e.second->clone(); } + } + } + + UserData &operator=(const UserData &o) { + if (this != &o) { + entries_.clear(); + for (const auto &e : o.entries_) { + if (e.second) { entries_[e.first] = e.second->clone(); } + } + } + return *this; + } + + template void set(const std::string &key, T &&value) { + using D = typename std::decay::type; + entries_[key].reset(new detail::any_value(std::forward(value))); + } + + template T *get(const std::string &key) noexcept { + auto it = entries_.find(key); + if (it == entries_.end() || !it->second) { return nullptr; } + if (it->second->type_id() != detail::any_typeid()) { return nullptr; } + return &static_cast *>(it->second.get())->value; + } + + template const T *get(const std::string &key) const noexcept { + auto it = entries_.find(key); + if (it == entries_.end() || !it->second) { return nullptr; } + if (it->second->type_id() != detail::any_typeid()) { return nullptr; } + return &static_cast *>(it->second.get())->value; + } + + bool has(const std::string &key) const noexcept { + return entries_.find(key) != entries_.end(); + } + + void erase(const std::string &key) { entries_.erase(key); } + + void clear() noexcept { entries_.clear(); } + +private: + std::unordered_map> + entries_; +}; + +struct Response; +using ResponseHandler = std::function; + +struct FormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; + Headers headers; +}; + +struct FormField { + std::string name; + std::string content; + Headers headers; +}; +using FormFields = std::multimap; + +using FormFiles = std::multimap; + +struct MultipartFormData { + FormFields fields; // Text fields from multipart + FormFiles files; // Files from multipart + + // Text field access + std::string get_field(const std::string &key, size_t id = 0) const; + std::vector get_fields(const std::string &key) const; + bool has_field(const std::string &key) const; + size_t get_field_count(const std::string &key) const; + + // File access + FormData get_file(const std::string &key, size_t id = 0) const; + std::vector get_files(const std::string &key) const; + bool has_file(const std::string &key) const; + size_t get_file_count(const std::string &key) const; +}; + +struct UploadFormData { + std::string name; + std::string content; + std::string filename; + std::string content_type; +}; +using UploadFormDataItems = std::vector; + +class DataSink { +public: + DataSink() : os(&sb_), sb_(*this) {} + + DataSink(const DataSink &) = delete; + DataSink &operator=(const DataSink &) = delete; + DataSink(DataSink &&) = delete; + DataSink &operator=(DataSink &&) = delete; + + std::function write; + std::function is_writable; + std::function done; + std::function done_with_trailer; + std::ostream os; + +private: + class data_sink_streambuf final : public std::streambuf { + public: + explicit data_sink_streambuf(DataSink &sink) : sink_(sink) {} + + protected: + std::streamsize xsputn(const char *s, std::streamsize n) override { + if (sink_.write(s, static_cast(n))) { return n; } + return 0; + } + + private: + DataSink &sink_; + }; + + data_sink_streambuf sb_; +}; + +using ContentProvider = + std::function; + +using ContentProviderWithoutLength = + std::function; + +using ContentProviderResourceReleaser = std::function; + +struct FormDataProvider { + std::string name; + ContentProviderWithoutLength provider; + std::string filename; + std::string content_type; +}; +using FormDataProviderItems = std::vector; + +inline FormDataProvider +make_file_provider(const std::string &name, const std::string &filepath, + const std::string &filename = std::string(), + const std::string &content_type = std::string()) { + FormDataProvider fdp; + fdp.name = name; + fdp.filename = filename.empty() ? filepath : filename; + fdp.content_type = content_type; + fdp.provider = [filepath](size_t offset, DataSink &sink) -> bool { + std::ifstream f(filepath, std::ios::binary); + if (!f) { return false; } + if (offset > 0) { + f.seekg(static_cast(offset)); + if (!f.good()) { + sink.done(); + return true; + } + } + char buf[8192]; + f.read(buf, sizeof(buf)); + auto n = static_cast(f.gcount()); + if (n > 0) { return sink.write(buf, n); } + sink.done(); // EOF + return true; + }; + return fdp; +} + +inline std::pair +make_file_body(const std::string &filepath) { + size_t size = 0; + { + std::ifstream f(filepath, std::ios::binary | std::ios::ate); + if (!f) { return {0, ContentProvider{}}; } + size = static_cast(f.tellg()); + } + + ContentProvider provider = [filepath](size_t offset, size_t length, + DataSink &sink) -> bool { + std::ifstream f(filepath, std::ios::binary); + if (!f) { return false; } + f.seekg(static_cast(offset)); + if (!f.good()) { return false; } + char buf[8192]; + while (length > 0) { + auto to_read = (std::min)(sizeof(buf), length); + f.read(buf, static_cast(to_read)); + auto n = static_cast(f.gcount()); + if (n == 0) { break; } + if (!sink.write(buf, n)) { return false; } + length -= n; + } + return true; + }; + return {size, std::move(provider)}; +} + +using ContentReceiverWithProgress = std::function; + +using ContentReceiver = + std::function; + +using FormDataHeader = std::function; + +class ContentReader { +public: + using Reader = std::function; + using FormDataReader = + std::function; + + ContentReader(Reader reader, FormDataReader multipart_reader) + : reader_(std::move(reader)), + formdata_reader_(std::move(multipart_reader)) {} + + bool operator()(FormDataHeader header, ContentReceiver receiver) const { + return formdata_reader_(std::move(header), std::move(receiver)); + } + + bool operator()(ContentReceiver receiver) const { + return reader_(std::move(receiver)); + } + + Reader reader_; + FormDataReader formdata_reader_; +}; + +using Range = std::pair; +using Ranges = std::vector; + +#ifdef CPPHTTPLIB_SSL_ENABLED +// TLS abstraction layer - public type definitions and API +namespace tls { + +// Opaque handles (defined as void* for abstraction) +using ctx_t = void *; +using session_t = void *; +using const_session_t = const void *; // For read-only session access +using cert_t = void *; +using ca_store_t = void *; + +// TLS versions +enum class Version { + TLS1_2 = 0x0303, + TLS1_3 = 0x0304, +}; + +// Subject Alternative Names (SAN) entry types +enum class SanType { DNS, IP, EMAIL, URI, OTHER }; + +// SAN entry structure +struct SanEntry { + SanType type; + std::string value; +}; + +// Verification context for certificate verification callback +struct VerifyContext { + session_t session; // TLS session handle + cert_t cert; // Current certificate being verified + int depth; // Certificate chain depth (0 = leaf) + bool preverify_ok; // OpenSSL/Mbed TLS pre-verification result + long error_code; // Backend-specific error code (0 = no error) + const char *error_string; // Human-readable error description + + // Certificate introspection methods + std::string subject_cn() const; + std::string issuer_name() const; + bool check_hostname(const char *hostname) const; + std::vector sans() const; + bool validity(time_t ¬_before, time_t ¬_after) const; + std::string serial() const; +}; + +using VerifyCallback = std::function; + +// TlsError codes for TLS operations (backend-independent) +enum class ErrorCode : int { + Success = 0, + WantRead, // Non-blocking: need to wait for read + WantWrite, // Non-blocking: need to wait for write + PeerClosed, // Peer closed the connection + Fatal, // Unrecoverable error + SyscallError, // System call error (check sys_errno) + CertVerifyFailed, // Certificate verification failed + HostnameMismatch, // Hostname verification failed +}; + +// TLS error information +struct TlsError { + ErrorCode code = ErrorCode::Fatal; + uint64_t backend_code = 0; // OpenSSL: ERR_get_error(), mbedTLS: return value + int sys_errno = 0; // errno when SyscallError + + // Convert verification error code to human-readable string + static std::string verify_error_to_string(long error_code); +}; + +// RAII wrapper for peer certificate +class PeerCert { +public: + PeerCert(); + PeerCert(PeerCert &&other) noexcept; + PeerCert &operator=(PeerCert &&other) noexcept; + ~PeerCert(); + + PeerCert(const PeerCert &) = delete; + PeerCert &operator=(const PeerCert &) = delete; + + explicit operator bool() const; + std::string subject_cn() const; + std::string issuer_name() const; + bool check_hostname(const char *hostname) const; + std::vector sans() const; + bool validity(time_t ¬_before, time_t ¬_after) const; + std::string serial() const; + +private: + explicit PeerCert(cert_t cert); + cert_t cert_ = nullptr; + friend PeerCert get_peer_cert_from_session(const_session_t session); +}; + +// Callback for TLS context setup (used by SSLServer constructor) +using ContextSetupCallback = std::function; + +} // namespace tls +#endif + +struct Request { + std::string method; + std::string path; + std::string matched_route; + Params params; + Headers headers; + Headers trailers; + std::string body; + + std::string remote_addr; + int remote_port = -1; + std::string local_addr; + int local_port = -1; + + // for server + std::string version; + std::string target; + MultipartFormData form; + Ranges ranges; + Match matches; + std::unordered_map path_params; + std::function is_connection_closed = []() { return true; }; + + // for client + std::vector accept_content_types; + ResponseHandler response_handler; + ContentReceiverWithProgress content_receiver; + DownloadProgress download_progress; + UploadProgress upload_progress; + + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, const char *def = "", + size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); + + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + + bool has_param(const std::string &key) const; + std::string get_param_value(const std::string &key, size_t id = 0) const; + std::vector get_param_values(const std::string &key) const; + size_t get_param_value_count(const std::string &key) const; + + bool is_multipart_form_data() const; + + // private members... + bool body_consumed_ = false; + size_t redirect_count_ = CPPHTTPLIB_REDIRECT_MAX_COUNT; + size_t content_length_ = 0; + ContentProvider content_provider_; + bool is_chunked_content_provider_ = false; + size_t authorization_count_ = 0; + std::chrono::time_point start_time_ = + (std::chrono::steady_clock::time_point::min)(); + +#ifdef CPPHTTPLIB_SSL_ENABLED + tls::const_session_t ssl = nullptr; + tls::PeerCert peer_cert() const; + std::string sni() const; +#endif +}; + +struct Response { + std::string version; + int status = -1; + std::string reason; + Headers headers; + Headers trailers; + std::string body; + std::string location; // Redirect location + + // User-defined context — set by pre-routing/pre-request handlers and read + // by route handlers to pass arbitrary data (e.g. decoded auth tokens). + UserData user_data; + + bool has_header(const std::string &key) const; + std::string get_header_value(const std::string &key, const char *def = "", + size_t id = 0) const; + size_t get_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_header_value_count(const std::string &key) const; + void set_header(const std::string &key, const std::string &val); + + bool has_trailer(const std::string &key) const; + std::string get_trailer_value(const std::string &key, size_t id = 0) const; + size_t get_trailer_value_count(const std::string &key) const; + + void set_redirect(const std::string &url, int status = StatusCode::Found_302); + void set_content(const char *s, size_t n, const std::string &content_type); + void set_content(const std::string &s, const std::string &content_type); + void set_content(std::string &&s, const std::string &content_type); + + void set_content_provider( + size_t length, const std::string &content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_chunked_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser = nullptr); + + void set_file_content(const std::string &path, + const std::string &content_type); + void set_file_content(const std::string &path); + + Response() = default; + Response(const Response &) = default; + Response &operator=(const Response &) = default; + Response(Response &&) = default; + Response &operator=(Response &&) = default; + ~Response() { + if (content_provider_resource_releaser_) { + content_provider_resource_releaser_(content_provider_success_); + } + } + + // private members... + size_t content_length_ = 0; + ContentProvider content_provider_; + ContentProviderResourceReleaser content_provider_resource_releaser_; + bool is_chunked_content_provider_ = false; + bool content_provider_success_ = false; + std::string file_content_path_; + std::string file_content_content_type_; +}; + +enum class Error { + Success = 0, + Unknown, + Connection, + BindIPAddress, + Read, + Write, + ExceedRedirectCount, + Canceled, + SSLConnection, + SSLLoadingCerts, + SSLServerVerification, + SSLServerHostnameVerification, + UnsupportedMultipartBoundaryChars, + Compression, + ConnectionTimeout, + ProxyConnection, + ConnectionClosed, + Timeout, + ResourceExhaustion, + TooManyFormDataFiles, + ExceedMaxPayloadSize, + ExceedUriMaxLength, + ExceedMaxSocketDescriptorCount, + InvalidRequestLine, + InvalidHTTPMethod, + InvalidHTTPVersion, + InvalidHeaders, + MultipartParsing, + OpenFile, + Listen, + GetSockName, + UnsupportedAddressFamily, + HTTPParsing, + InvalidRangeHeader, + + // For internal use only + SSLPeerCouldBeClosed_, +}; + +std::string to_string(Error error); + +std::ostream &operator<<(std::ostream &os, const Error &obj); + +class Stream { +public: + virtual ~Stream() = default; + + virtual bool is_readable() const = 0; + virtual bool wait_readable() const = 0; + virtual bool wait_writable() const = 0; + virtual bool is_peer_alive() const { return wait_writable(); } + + virtual ssize_t read(char *ptr, size_t size) = 0; + virtual ssize_t write(const char *ptr, size_t size) = 0; + virtual void get_remote_ip_and_port(std::string &ip, int &port) const = 0; + virtual void get_local_ip_and_port(std::string &ip, int &port) const = 0; + virtual socket_t socket() const = 0; + + virtual time_t duration() const = 0; + + virtual void set_read_timeout(time_t sec, time_t usec = 0) { + (void)sec; + (void)usec; + } + + ssize_t write(const char *ptr); + ssize_t write(const std::string &s); + + Error get_error() const { return error_; } + +protected: + Error error_ = Error::Success; +}; + +class TaskQueue { +public: + TaskQueue() = default; + virtual ~TaskQueue() = default; + + virtual bool enqueue(std::function fn) = 0; + virtual void shutdown() = 0; + + virtual void on_idle() {} +}; + +class ThreadPool final : public TaskQueue { +public: + explicit ThreadPool(size_t n, size_t max_n = 0, size_t mqr = 0); + ThreadPool(const ThreadPool &) = delete; + ~ThreadPool() override = default; + + bool enqueue(std::function fn) override; + void shutdown() override; + +private: + void worker(bool is_dynamic); + void move_to_finished(std::thread::id id); + void cleanup_finished_threads(); + + size_t base_thread_count_; + size_t max_thread_count_; + size_t max_queued_requests_; + size_t idle_thread_count_; + + bool shutdown_; + + std::list> jobs_; + std::vector threads_; // base threads + std::list dynamic_threads_; // dynamic threads + std::vector + finished_threads_; // exited dynamic threads awaiting join + + std::condition_variable cond_; + std::mutex mutex_; +}; + +using Logger = std::function; + +// Forward declaration for Error type +enum class Error; +using ErrorLogger = std::function; + +using SocketOptions = std::function; + +void default_socket_options(socket_t sock); + +bool set_socket_opt(socket_t sock, int level, int optname, int optval); + +const char *status_message(int status); + +std::string to_string(Error error); + +std::ostream &operator<<(std::ostream &os, const Error &obj); + +std::string get_bearer_token_auth(const Request &req); + +namespace detail { + +class MatcherBase { +public: + MatcherBase(std::string pattern) : pattern_(std::move(pattern)) {} + virtual ~MatcherBase() = default; + + const std::string &pattern() const { return pattern_; } + + // Match request path and populate its matches and + virtual bool match(Request &request) const = 0; + +private: + std::string pattern_; +}; + +/** + * Captures parameters in request path and stores them in Request::path_params + * + * Capture name is a substring of a pattern from : to /. + * The rest of the pattern is matched against the request path directly + * Parameters are captured starting from the next character after + * the end of the last matched static pattern fragment until the next /. + * + * Example pattern: + * "/path/fragments/:capture/more/fragments/:second_capture" + * Static fragments: + * "/path/fragments/", "more/fragments/" + * + * Given the following request path: + * "/path/fragments/:1/more/fragments/:2" + * the resulting capture will be + * {{"capture", "1"}, {"second_capture", "2"}} + */ +class PathParamsMatcher final : public MatcherBase { +public: + PathParamsMatcher(const std::string &pattern); + + bool match(Request &request) const override; + +private: + // Treat segment separators as the end of path parameter capture + // Does not need to handle query parameters as they are parsed before path + // matching + static constexpr char separator = '/'; + + // Contains static path fragments to match against, excluding the '/' after + // path params + // Fragments are separated by path params + std::vector static_fragments_; + // Stores the names of the path parameters to be used as keys in the + // Request::path_params map + std::vector param_names_; +}; + +/** + * Performs std::regex_match on request path + * and stores the result in Request::matches + * + * Note that regex match is performed directly on the whole request. + * This means that wildcard patterns may match multiple path segments with /: + * "/begin/(.*)/end" will match both "/begin/middle/end" and "/begin/1/2/end". + */ +class RegexMatcher final : public MatcherBase { +public: + RegexMatcher(const std::string &pattern) + : MatcherBase(pattern), regex_(pattern) {} + + bool match(Request &request) const override; + +private: + std::regex regex_; +}; + +int close_socket(socket_t sock) noexcept; + +ssize_t write_headers(Stream &strm, const Headers &headers); + +bool set_socket_opt_time(socket_t sock, int level, int optname, time_t sec, + time_t usec); + +size_t get_multipart_content_length(const UploadFormDataItems &items, + const std::string &boundary); + +ContentProvider +make_multipart_content_provider(const UploadFormDataItems &items, + const std::string &boundary); + +} // namespace detail + +class Server { +public: + using Handler = std::function; + + using ExceptionHandler = + std::function; + + enum class HandlerResponse { + Handled, + Unhandled, + }; + using HandlerWithResponse = + std::function; + + using HandlerWithContentReader = std::function; + + using Expect100ContinueHandler = + std::function; + + using StartHandler = std::function; + + using WebSocketHandler = + std::function; + using SubProtocolSelector = + std::function &protocols)>; + + Server(); + + virtual ~Server(); + + virtual bool is_valid() const; + + Server &Get(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, Handler handler); + Server &Post(const std::string &pattern, HandlerWithContentReader handler); + Server &Put(const std::string &pattern, Handler handler); + Server &Put(const std::string &pattern, HandlerWithContentReader handler); + Server &Patch(const std::string &pattern, Handler handler); + Server &Patch(const std::string &pattern, HandlerWithContentReader handler); + Server &Delete(const std::string &pattern, Handler handler); + Server &Delete(const std::string &pattern, HandlerWithContentReader handler); + Server &Options(const std::string &pattern, Handler handler); + + Server &WebSocket(const std::string &pattern, WebSocketHandler handler); + Server &WebSocket(const std::string &pattern, WebSocketHandler handler, + SubProtocolSelector sub_protocol_selector); + + bool set_base_dir(const std::string &dir, + const std::string &mount_point = std::string()); + bool set_mount_point(const std::string &mount_point, const std::string &dir, + Headers headers = Headers()); + bool remove_mount_point(const std::string &mount_point); + Server &set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime); + Server &set_default_file_mimetype(const std::string &mime); + Server &set_file_request_handler(Handler handler); + + template + Server &set_error_handler(ErrorHandlerFunc &&handler) { + return set_error_handler_core( + std::forward(handler), + std::is_convertible{}); + } + + Server &set_exception_handler(ExceptionHandler handler); + + Server &set_pre_routing_handler(HandlerWithResponse handler); + Server &set_post_routing_handler(Handler handler); + + Server &set_pre_request_handler(HandlerWithResponse handler); + + Server &set_expect_100_continue_handler(Expect100ContinueHandler handler); + + Server &set_start_handler(StartHandler handler); + + Server &set_logger(Logger logger); + Server &set_pre_compression_logger(Logger logger); + Server &set_error_logger(ErrorLogger error_logger); + + Server &set_address_family(int family); + Server &set_tcp_nodelay(bool on); + Server &set_ipv6_v6only(bool on); + Server &set_socket_options(SocketOptions socket_options); + + Server &set_default_headers(Headers headers); + Server & + set_header_writer(std::function const &writer); + + Server &set_trusted_proxies(const std::vector &proxies); + + Server &set_keep_alive_max_count(size_t count); + Server &set_keep_alive_timeout(time_t sec); + template + Server & + set_keep_alive_timeout(const std::chrono::duration &duration); + + Server &set_read_timeout(time_t sec, time_t usec = 0); + template + Server &set_read_timeout(const std::chrono::duration &duration); + + Server &set_write_timeout(time_t sec, time_t usec = 0); + template + Server &set_write_timeout(const std::chrono::duration &duration); + + Server &set_idle_interval(time_t sec, time_t usec = 0); + template + Server &set_idle_interval(const std::chrono::duration &duration); + + Server &set_payload_max_length(size_t length); + + Server &set_websocket_ping_interval(time_t sec); + template + Server &set_websocket_ping_interval( + const std::chrono::duration &duration); + + Server &set_websocket_max_missed_pongs(int count); + + bool bind_to_port(const std::string &host, int port, int socket_flags = 0); + int bind_to_any_port(const std::string &host, int socket_flags = 0); + bool listen_after_bind(); + + bool listen(const std::string &host, int port, int socket_flags = 0); + + bool is_running() const; + void wait_until_ready() const; + void stop() noexcept; + void decommission(); + + std::function new_task_queue; + +protected: + bool process_request(Stream &strm, const std::string &remote_addr, + int remote_port, const std::string &local_addr, + int local_port, bool close_connection, + bool &connection_closed, + const std::function &setup_request, + bool *websocket_upgraded = nullptr); + + std::atomic svr_sock_{INVALID_SOCKET}; + + std::vector trusted_proxies_; + + size_t keep_alive_max_count_ = CPPHTTPLIB_KEEPALIVE_MAX_COUNT; + time_t keep_alive_timeout_sec_ = CPPHTTPLIB_KEEPALIVE_TIMEOUT_SECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_SERVER_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_SERVER_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_SERVER_WRITE_TIMEOUT_USECOND; + time_t idle_interval_sec_ = CPPHTTPLIB_IDLE_INTERVAL_SECOND; + time_t idle_interval_usec_ = CPPHTTPLIB_IDLE_INTERVAL_USECOND; + size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; + time_t websocket_ping_interval_sec_ = + CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND; + int websocket_max_missed_pongs_ = CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS; + +private: + using Handlers = + std::vector, Handler>>; + using HandlersForContentReader = + std::vector, + HandlerWithContentReader>>; + + static std::unique_ptr + make_matcher(const std::string &pattern); + + template + Server &add_handler( + std::vector, H>> &handlers, + const std::string &pattern, H handler) { + handlers.emplace_back(make_matcher(pattern), std::move(handler)); + return *this; + } + + Server &set_error_handler_core(HandlerWithResponse handler, std::true_type); + Server &set_error_handler_core(Handler handler, std::false_type); + + socket_t create_server_socket(const std::string &host, int port, + int socket_flags, + SocketOptions socket_options) const; + int bind_internal(const std::string &host, int port, int socket_flags); + bool listen_internal(); + + bool routing(Request &req, Response &res, Stream &strm); + bool handle_file_request(Request &req, Response &res); + bool check_if_not_modified(const Request &req, Response &res, + const std::string &etag, time_t mtime) const; + bool check_if_range(Request &req, const std::string &etag, + time_t mtime) const; + bool dispatch_request(Request &req, Response &res, const Handlers &handlers, + Stream &strm); + bool dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) const; + + bool parse_request_line(const char *s, Request &req) const; + void apply_ranges(const Request &req, Response &res, + std::string &content_type, std::string &boundary) const; + bool write_response(Stream &strm, bool close_connection, Request &req, + Response &res); + bool write_response_with_content(Stream &strm, bool close_connection, + const Request &req, Response &res); + bool write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges); + bool write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type); + bool read_content(Stream &strm, Request &req, Response &res); + bool read_content_with_content_receiver(Stream &strm, Request &req, + Response &res, + ContentReceiver receiver, + FormDataHeader multipart_header, + ContentReceiver multipart_receiver); + bool read_content_core(Stream &strm, Request &req, Response &res, + ContentReceiver receiver, + FormDataHeader multipart_header, + ContentReceiver multipart_receiver) const; + + virtual bool process_and_close_socket(socket_t sock); + + void output_log(const Request &req, const Response &res) const; + void output_pre_compression_log(const Request &req, + const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + + std::atomic is_running_{false}; + std::atomic is_decommissioned{false}; + + struct MountPointEntry { + std::string mount_point; + std::string base_dir; + std::string resolved_base_dir; + Headers headers; + }; + std::vector base_dirs_; + std::map file_extension_and_mimetype_map_; + std::string default_file_mimetype_ = "application/octet-stream"; + Handler file_request_handler_; + + Handlers get_handlers_; + Handlers post_handlers_; + HandlersForContentReader post_handlers_for_content_reader_; + Handlers put_handlers_; + HandlersForContentReader put_handlers_for_content_reader_; + Handlers patch_handlers_; + HandlersForContentReader patch_handlers_for_content_reader_; + Handlers delete_handlers_; + HandlersForContentReader delete_handlers_for_content_reader_; + Handlers options_handlers_; + + struct WebSocketHandlerEntry { + std::unique_ptr matcher; + WebSocketHandler handler; + SubProtocolSelector sub_protocol_selector; + }; + using WebSocketHandlers = std::vector; + WebSocketHandlers websocket_handlers_; + + HandlerWithResponse error_handler_; + ExceptionHandler exception_handler_; + HandlerWithResponse pre_routing_handler_; + Handler post_routing_handler_; + HandlerWithResponse pre_request_handler_; + Expect100ContinueHandler expect_100_continue_handler_; + StartHandler start_handler_; + + mutable std::mutex logger_mutex_; + Logger logger_; + Logger pre_compression_logger_; + ErrorLogger error_logger_; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + bool ipv6_v6only_ = CPPHTTPLIB_IPV6_V6ONLY; + SocketOptions socket_options_ = default_socket_options; + + Headers default_headers_; + std::function header_writer_ = + detail::write_headers; +}; + +class Result { +public: + Result() = default; + Result(std::unique_ptr &&res, Error err, + Headers &&request_headers = Headers{}) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)) {} + // Response + operator bool() const { return res_ != nullptr; } + bool operator==(std::nullptr_t) const { return res_ == nullptr; } + bool operator!=(std::nullptr_t) const { return res_ != nullptr; } + const Response &value() const { return *res_; } + Response &value() { return *res_; } + const Response &operator*() const { return *res_; } + Response &operator*() { return *res_; } + const Response *operator->() const { return res_.get(); } + Response *operator->() { return res_.get(); } + + // Error + Error error() const { return err_; } + + // Request Headers + bool has_request_header(const std::string &key) const; + std::string get_request_header_value(const std::string &key, + const char *def = "", + size_t id = 0) const; + size_t get_request_header_value_u64(const std::string &key, size_t def = 0, + size_t id = 0) const; + size_t get_request_header_value_count(const std::string &key) const; + +private: + std::unique_ptr res_; + Error err_ = Error::Unknown; + Headers request_headers_; + +#ifdef CPPHTTPLIB_SSL_ENABLED +public: + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error) {} + Result(std::unique_ptr &&res, Error err, Headers &&request_headers, + int ssl_error, uint64_t ssl_backend_error) + : res_(std::move(res)), err_(err), + request_headers_(std::move(request_headers)), ssl_error_(ssl_error), + ssl_backend_error_(ssl_backend_error) {} + + int ssl_error() const { return ssl_error_; } + uint64_t ssl_backend_error() const { return ssl_backend_error_; } + +private: + int ssl_error_ = 0; + uint64_t ssl_backend_error_ = 0; +#endif +}; + +struct ClientConnection { + socket_t sock = INVALID_SOCKET; + + bool is_open() const { return sock != INVALID_SOCKET; } + + ClientConnection() = default; + + ~ClientConnection(); + + ClientConnection(const ClientConnection &) = delete; + ClientConnection &operator=(const ClientConnection &) = delete; + + ClientConnection(ClientConnection &&other) noexcept + : sock(other.sock) +#ifdef CPPHTTPLIB_SSL_ENABLED + , + session(other.session) +#endif + { + other.sock = INVALID_SOCKET; +#ifdef CPPHTTPLIB_SSL_ENABLED + other.session = nullptr; +#endif + } + + ClientConnection &operator=(ClientConnection &&other) noexcept { + if (this != &other) { + sock = other.sock; + other.sock = INVALID_SOCKET; +#ifdef CPPHTTPLIB_SSL_ENABLED + session = other.session; + other.session = nullptr; +#endif + } + return *this; + } + +#ifdef CPPHTTPLIB_SSL_ENABLED + tls::session_t session = nullptr; +#endif +}; + +namespace detail { + +struct ChunkedDecoder; + +struct BodyReader { + Stream *stream = nullptr; + bool has_content_length = false; + size_t content_length = 0; + size_t payload_max_length = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; + size_t bytes_read = 0; + bool chunked = false; + bool eof = false; + std::unique_ptr chunked_decoder; + Error last_error = Error::Success; + + ssize_t read(char *buf, size_t len); + bool has_error() const { return last_error != Error::Success; } +}; + +inline ssize_t read_body_content(Stream *stream, BodyReader &br, char *buf, + size_t len) { + (void)stream; + return br.read(buf, len); +} + +class decompressor; + +enum class NoProxyKind { + Wildcard, // "*" + HostnameSuffix, // "example.com" or ".example.com" + IPv4Cidr, // "10.0.0.0/8" (or single IP, treated as /32) + IPv6Cidr, // "fe80::/10" (or single IP, treated as /128) +}; + +// Unified 16-byte buffer holding either a v4 (first 4 bytes) or v6 address. +// Lets one CIDR matcher cover both families. +using IPBytes = std::array; + +struct NoProxyEntry { + NoProxyKind kind = NoProxyKind::Wildcard; + std::string hostname_pattern; // lowercased, leading/trailing dot stripped + IPBytes net{}; + int prefix_bits = 0; +}; + +struct NormalizedTarget { + std::string hostname; // lowercase; brackets and trailing dot removed + bool is_ipv4 = false; + bool is_ipv6 = false; + IPBytes ip{}; +}; + +} // namespace detail + +class ClientImpl { +public: + explicit ClientImpl(const std::string &host); + + explicit ClientImpl(const std::string &host, int port); + + explicit ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + virtual ~ClientImpl(); + + virtual bool is_valid() const; + + struct StreamHandle { + std::unique_ptr response; + Error error = Error::Success; + + StreamHandle() = default; + StreamHandle(const StreamHandle &) = delete; + StreamHandle &operator=(const StreamHandle &) = delete; + StreamHandle(StreamHandle &&) = default; + StreamHandle &operator=(StreamHandle &&) = default; + ~StreamHandle() = default; + + bool is_valid() const { + return response != nullptr && error == Error::Success; + } + + ssize_t read(char *buf, size_t len); + void parse_trailers_if_needed(); + Error get_read_error() const { return body_reader_.last_error; } + bool has_read_error() const { return body_reader_.has_error(); } + + bool trailers_parsed_ = false; + + private: + friend class ClientImpl; + + ssize_t read_with_decompression(char *buf, size_t len); + + std::unique_ptr connection_; + std::unique_ptr socket_stream_; + Stream *stream_ = nullptr; + detail::BodyReader body_reader_; + + std::unique_ptr decompressor_; + std::string decompress_buffer_; + size_t decompress_offset_ = 0; + size_t decompressed_bytes_read_ = 0; + }; + + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); + + Result Post(const std::string &path); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); + // clang-format on + + // Streaming API: Open a stream for reading response body incrementally + // Socket ownership is transferred to StreamHandle for true streaming + // Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE, etc.) + StreamHandle open_stream(const std::string &method, const std::string &path, + const Params ¶ms = {}, + const Headers &headers = {}, + const std::string &body = {}, + const std::string &content_type = {}); + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + void stop(); + + std::string host() const; + int port() const; + + size_t is_socket_open() const; + socket_t socket() const; + + void set_hostname_addr_map(std::map addr_map); + + void set_default_headers(Headers headers); + + void + set_header_writer(std::function const &writer); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_ipv6_v6only(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_max_timeout(time_t msec); + template + void set_max_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_path_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_payload_max_length(size_t length); + + void set_interface(const std::string &intf); + + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); + void set_no_proxy(const std::vector &patterns); + + void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); + +protected: + struct Socket { + socket_t sock = INVALID_SOCKET; + + // For Mbed TLS compatibility: start_time for request timeout tracking + std::chrono::time_point start_time_; + + bool is_open() const { return sock != INVALID_SOCKET; } + +#ifdef CPPHTTPLIB_SSL_ENABLED + tls::session_t ssl = nullptr; +#endif + }; + + virtual bool create_and_connect_socket(Socket &socket, Error &error); + virtual bool ensure_socket_connection(Socket &socket, Error &error); + virtual bool setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error); + + bool is_proxy_enabled_for_host(const std::string &host) const; + + // All of: + // shutdown_ssl + // shutdown_socket + // close_socket + // disconnect + // should ONLY be called when socket_mutex_ is locked, and only when + // no other thread is using the socket. + virtual void shutdown_ssl(Socket &socket, bool shutdown_gracefully); + void shutdown_socket(Socket &socket) const; + void close_socket(Socket &socket); + void disconnect(bool gracefully); + + bool process_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + + bool write_content_with_provider(Stream &strm, const Request &req, + Error &error) const; + + void copy_settings(const ClientImpl &rhs); + + void output_log(const Request &req, const Response &res) const; + void output_error_log(const Error &err, const Request *req) const; + + // Socket endpoint information + const std::string host_; + const int port_; + + // Current open socket + Socket socket_; + mutable std::mutex socket_mutex_; + std::recursive_mutex request_mutex_; + + // These are all protected under socket_mutex + size_t socket_requests_in_flight_ = 0; + std::thread::id socket_requests_are_from_thread_ = std::thread::id(); + bool socket_should_be_closed_when_request_is_done_ = false; + + // Hostname-IP map + std::map addr_map_; + + // Default headers + Headers default_headers_; + + // Header writer + std::function header_writer_ = + detail::write_headers; + + // Settings + std::string client_cert_path_; + std::string client_key_path_; + + time_t connection_timeout_sec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND; + time_t connection_timeout_usec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND; + time_t read_timeout_sec_ = CPPHTTPLIB_CLIENT_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = CPPHTTPLIB_CLIENT_READ_TIMEOUT_USECOND; + time_t write_timeout_sec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_USECOND; + time_t max_timeout_msec_ = CPPHTTPLIB_CLIENT_MAX_TIMEOUT_MSECOND; + + std::string basic_auth_username_; + std::string basic_auth_password_; + std::string bearer_token_auth_token_; + + bool keep_alive_ = false; + bool follow_location_ = false; + + bool path_encode_ = true; + + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + bool ipv6_v6only_ = CPPHTTPLIB_IPV6_V6ONLY; + SocketOptions socket_options_ = nullptr; + + bool compress_ = false; + bool decompress_ = true; + + size_t payload_max_length_ = CPPHTTPLIB_PAYLOAD_MAX_LENGTH; + bool has_payload_max_length_ = false; + + std::string interface_; + + std::string proxy_host_; + int proxy_port_ = -1; + + std::string proxy_basic_auth_username_; + std::string proxy_basic_auth_password_; + std::string proxy_bearer_token_auth_token_; + + std::vector no_proxy_entries_; + + mutable detail::NormalizedTarget host_normalized_; + mutable bool host_normalized_valid_ = false; + + mutable std::mutex logger_mutex_; + Logger logger_; + ErrorLogger error_logger_; + +private: + bool send_(Request &req, Response &res, Error &error); + Result send_(Request &&req); + + socket_t create_client_socket(Error &error) const; + bool read_response_line(Stream &strm, const Request &req, Response &res, + bool skip_100_continue = true) const; + bool write_request(Stream &strm, Request &req, bool close_connection, + Error &error, bool skip_body = false); + bool write_request_body(Stream &strm, Request &req, Error &error); + void prepare_default_headers(Request &r, bool for_stream, + const std::string &ct); + bool redirect(Request &req, Response &res, Error &error); + bool create_redirect_client(const std::string &scheme, + const std::string &host, int port, Request &req, + Response &res, const std::string &path, + const std::string &location, Error &error); + template void setup_redirect_client(ClientType &client); + bool handle_request(Stream &strm, Request &req, Response &res, + bool close_connection, Error &error); + std::unique_ptr send_with_content_provider_and_receiver( + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + Error &error); + Result send_with_content_provider_and_receiver( + const std::string &method, const std::string &path, + const Headers &headers, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + UploadProgress progress); + ContentProviderWithoutLength get_multipart_content_provider( + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const; + + virtual bool + process_socket(const Socket &socket, + std::chrono::time_point start_time, + std::function callback); + virtual bool is_ssl() const; + + void transfer_socket_ownership_to_handle(StreamHandle &handle); + +#ifdef CPPHTTPLIB_SSL_ENABLED +public: + void set_digest_auth(const std::string &username, + const std::string &password); + void set_proxy_digest_auth(const std::string &username, + const std::string &password); + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); + void enable_server_certificate_verification(bool enabled); + void enable_server_hostname_verification(bool enabled); + void enable_system_ca(bool enabled); + +protected: + std::string digest_auth_username_; + std::string digest_auth_password_; + std::string proxy_digest_auth_username_; + std::string proxy_digest_auth_password_; + std::string ca_cert_file_path_; + std::string ca_cert_dir_path_; + bool server_certificate_verification_ = true; + bool server_hostname_verification_ = true; + SystemCAMode system_ca_mode_ = SystemCAMode::Auto; + std::string ca_cert_pem_; // Store CA cert PEM for redirect transfer + int last_ssl_error_ = 0; + uint64_t last_backend_error_ = 0; +#endif +}; + +class Client { +public: + // Universal interface + explicit Client(const std::string &scheme_host_port); + + explicit Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path); + + // HTTP only interface + explicit Client(const std::string &host, int port); + + explicit Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path); + + Client(Client &&) = default; + Client &operator=(Client &&) = default; + + ~Client(); + + bool is_valid() const; + + // clang-format off + Result Get(const std::string &path, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Get(const std::string &path, const Params ¶ms, const Headers &headers, ResponseHandler response_handler, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Head(const std::string &path); + Result Head(const std::string &path, const Headers &headers); + + Result Post(const std::string &path); + Result Post(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Params ¶ms); + Result Post(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers); + Result Post(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const Params ¶ms); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Post(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Put(const std::string &path); + Result Put(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Params ¶ms); + Result Put(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers); + Result Put(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const Params ¶ms); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Put(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Patch(const std::string &path); + Result Patch(const std::string &path, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Params ¶ms); + Result Patch(const std::string &path, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers); + Result Patch(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, size_t content_length, ContentProvider content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, ContentProviderWithoutLength content_provider, const std::string &content_type, ContentReceiver content_receiver, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const Params ¶ms); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const std::string &boundary, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const UploadFormDataItems &items, const FormDataProviderItems &provider_items, UploadProgress progress = nullptr); + Result Patch(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, ContentReceiver content_receiver, DownloadProgress progress = nullptr); + + Result Delete(const std::string &path, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Params ¶ms, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const char *body, size_t content_length, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const std::string &body, const std::string &content_type, DownloadProgress progress = nullptr); + Result Delete(const std::string &path, const Headers &headers, const Params ¶ms, DownloadProgress progress = nullptr); + + Result Options(const std::string &path); + Result Options(const std::string &path, const Headers &headers); + // clang-format on + + // Streaming API: Open a stream for reading response body incrementally + // Socket ownership is transferred to StreamHandle for true streaming + // Supports all HTTP methods (GET, POST, PUT, PATCH, DELETE, etc.) + ClientImpl::StreamHandle open_stream(const std::string &method, + const std::string &path, + const Params ¶ms = {}, + const Headers &headers = {}, + const std::string &body = {}, + const std::string &content_type = {}); + + bool send(Request &req, Response &res, Error &error); + Result send(const Request &req); + + void stop(); + + std::string host() const; + int port() const; + + size_t is_socket_open() const; + socket_t socket() const; + + void set_hostname_addr_map(std::map addr_map); + + void set_default_headers(Headers headers); + + void + set_header_writer(std::function const &writer); + + void set_address_family(int family); + void set_tcp_nodelay(bool on); + void set_socket_options(SocketOptions socket_options); + + void set_connection_timeout(time_t sec, time_t usec = 0); + template + void + set_connection_timeout(const std::chrono::duration &duration); + + void set_read_timeout(time_t sec, time_t usec = 0); + template + void set_read_timeout(const std::chrono::duration &duration); + + void set_write_timeout(time_t sec, time_t usec = 0); + template + void set_write_timeout(const std::chrono::duration &duration); + + void set_max_timeout(time_t msec); + template + void set_max_timeout(const std::chrono::duration &duration); + + void set_basic_auth(const std::string &username, const std::string &password); + void set_bearer_token_auth(const std::string &token); + + void set_keep_alive(bool on); + void set_follow_location(bool on); + + void set_path_encode(bool on); + + void set_compress(bool on); + + void set_decompress(bool on); + + void set_payload_max_length(size_t length); + + void set_interface(const std::string &intf); + + void set_proxy(const std::string &host, int port); + void set_proxy_basic_auth(const std::string &username, + const std::string &password); + void set_proxy_bearer_token_auth(const std::string &token); + void set_no_proxy(const std::vector &patterns); + void set_logger(Logger logger); + void set_error_logger(ErrorLogger error_logger); + +private: + std::unique_ptr cli_; + +#ifdef CPPHTTPLIB_SSL_ENABLED +public: + void set_digest_auth(const std::string &username, + const std::string &password); + void set_proxy_digest_auth(const std::string &username, + const std::string &password); + void enable_server_certificate_verification(bool enabled); + void enable_server_hostname_verification(bool enabled); + void enable_system_ca(bool enabled); + void set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path = std::string()); + + void set_ca_cert_store(tls::ca_store_t ca_cert_store); + void load_ca_cert_store(const char *ca_cert, std::size_t size); + + void set_server_certificate_verifier(tls::VerifyCallback verifier); + + void set_session_verifier( + std::function verifier); + + tls::ctx_t tls_context() const; + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE + void enable_windows_certificate_verification(bool enabled); +#endif + +private: + bool is_ssl_ = false; +#endif +}; + +#ifdef CPPHTTPLIB_SSL_ENABLED +class SSLServer : public Server { +public: + SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path = nullptr, + const char *client_ca_cert_dir_path = nullptr, + const char *private_key_password = nullptr); + + struct PemMemory { + const char *cert_pem; + size_t cert_pem_len; + const char *key_pem; + size_t key_pem_len; + const char *client_ca_pem; + size_t client_ca_pem_len; + const char *private_key_password; + }; + explicit SSLServer(const PemMemory &pem); + + // The callback receives the ctx_t handle which can be cast to the + // appropriate backend type (SSL_CTX* for OpenSSL, + // tls::impl::MbedTlsContext* for Mbed TLS) + explicit SSLServer(const tls::ContextSetupCallback &setup_callback); + + ~SSLServer() override; + + bool is_valid() const override; + + bool update_certs_pem(const char *cert_pem, const char *key_pem, + const char *client_ca_pem = nullptr, + const char *password = nullptr); + + tls::ctx_t tls_context() const { return ctx_; } + + int ssl_last_error() const { return last_ssl_error_; } + +private: + bool process_and_close_socket(socket_t sock) override; + + tls::ctx_t ctx_ = nullptr; + std::mutex ctx_mutex_; + + int last_ssl_error_ = 0; +}; + +class SSLClient final : public ClientImpl { +public: + explicit SSLClient(const std::string &host); + + explicit SSLClient(const std::string &host, int port); + + explicit SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path, + const std::string &private_key_password = std::string()); + + struct PemMemory { + const char *cert_pem; + size_t cert_pem_len; + const char *key_pem; + size_t key_pem_len; + const char *private_key_password; + }; + explicit SSLClient(const std::string &host, int port, const PemMemory &pem); + + ~SSLClient() override; + + bool is_valid() const override; + + void set_ca_cert_store(tls::ca_store_t ca_cert_store); + void load_ca_cert_store(const char *ca_cert, std::size_t size); + + void set_server_certificate_verifier(tls::VerifyCallback verifier); + + // Post-handshake session verifier (backend-independent) + void set_session_verifier( + std::function verifier); + + tls::ctx_t tls_context() const { return ctx_; } + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE + void enable_windows_certificate_verification(bool enabled); +#endif + +private: + bool create_and_connect_socket(Socket &socket, Error &error) override; + bool ensure_socket_connection(Socket &socket, Error &error) override; + void shutdown_ssl(Socket &socket, bool shutdown_gracefully) override; + void shutdown_ssl_impl(Socket &socket, bool shutdown_gracefully); + + bool + process_socket(const Socket &socket, + std::chrono::time_point start_time, + std::function callback) override; + bool is_ssl() const override; + + bool setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) override; + bool connect_with_proxy( + Socket &sock, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error); + bool initialize_ssl(Socket &socket, Error &error); + + void init_ctx(); + void reset_ctx_on_error(); + + bool load_certs(); + + tls::ctx_t ctx_ = nullptr; + std::mutex ctx_mutex_; + std::once_flag initialize_cert_; + + // Tracks whether a custom CA store was applied via set_ca_cert_store(), + // since the store handle itself is owned by ctx_ and leaves no other trace. + // Used to keep custom CA configuration exclusive with system CA loading. + bool ca_cert_store_set_ = false; + + long verify_result_ = 0; + + std::function session_verifier_; + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE + bool enable_windows_cert_verification_ = true; +#endif + + friend class ClientImpl; +}; +#endif // CPPHTTPLIB_SSL_ENABLED + +namespace detail { + +template +inline void duration_to_sec_and_usec(const T &duration, U callback) { + auto sec = std::chrono::duration_cast(duration).count(); + auto usec = std::chrono::duration_cast( + duration - std::chrono::seconds(sec)) + .count(); + callback(static_cast(sec), static_cast(usec)); +} + +template inline constexpr size_t str_len(const char (&)[N]) { + return N - 1; +} + +inline bool is_numeric(const std::string &str) { + return !str.empty() && + std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); +} + +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id, bool &is_invalid_value) { + is_invalid_value = false; + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { + if (is_numeric(it->second)) { + return static_cast(std::strtoull(it->second.data(), nullptr, 10)); + } else { + is_invalid_value = true; + } + } + return def; +} + +inline size_t get_header_value_u64(const Headers &headers, + const std::string &key, size_t def, + size_t id) { + auto dummy = false; + return get_header_value_u64(headers, key, def, id, dummy); +} + +} // namespace detail + +template +inline Server & +Server::set_read_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_write_timeout(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); + return *this; +} + +template +inline Server & +Server::set_idle_interval(const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_idle_interval(sec, usec); }); + return *this; +} + +template +inline void ClientImpl::set_connection_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec(duration, [&](time_t sec, time_t usec) { + set_connection_timeout(sec, usec); + }); +} + +template +inline void ClientImpl::set_read_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_read_timeout(sec, usec); }); +} + +template +inline void ClientImpl::set_write_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec( + duration, [&](time_t sec, time_t usec) { set_write_timeout(sec, usec); }); +} + +template +inline void ClientImpl::set_max_timeout( + const std::chrono::duration &duration) { + auto msec = + std::chrono::duration_cast(duration).count(); + set_max_timeout(msec); +} + +template +inline void Client::set_connection_timeout( + const std::chrono::duration &duration) { + cli_->set_connection_timeout(duration); +} + +template +inline void +Client::set_read_timeout(const std::chrono::duration &duration) { + cli_->set_read_timeout(duration); +} + +template +inline void +Client::set_write_timeout(const std::chrono::duration &duration) { + cli_->set_write_timeout(duration); +} + +inline void Client::set_max_timeout(time_t msec) { + cli_->set_max_timeout(msec); +} + +template +inline void +Client::set_max_timeout(const std::chrono::duration &duration) { + cli_->set_max_timeout(duration); +} + +/* + * Forward declarations and types that will be part of the .h file if split into + * .h + .cc. + */ + +std::string hosted_at(const std::string &hostname); + +void hosted_at(const std::string &hostname, std::vector &addrs); + +// JavaScript-style URL encoding/decoding functions +std::string encode_uri_component(const std::string &value); +std::string encode_uri(const std::string &value); +std::string decode_uri_component(const std::string &value); +std::string decode_uri(const std::string &value); + +// RFC 3986 compliant URL component encoding/decoding functions +std::string encode_path_component(const std::string &component); +std::string decode_path_component(const std::string &component); +std::string encode_query_component(const std::string &component, + bool space_as_plus = true); +std::string decode_query_component(const std::string &component, + bool plus_as_space = true); + +std::string sanitize_filename(const std::string &filename); + +std::string append_query_params(const std::string &path, const Params ¶ms); + +std::pair make_range_header(const Ranges &ranges); + +std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, + bool is_proxy = false); + +namespace detail { + +#if defined(_WIN32) +inline std::wstring u8string_to_wstring(const char *s) { + if (!s) { return std::wstring(); } + + auto len = static_cast(strlen(s)); + if (!len) { return std::wstring(); } + + auto wlen = ::MultiByteToWideChar(CP_UTF8, 0, s, len, nullptr, 0); + if (!wlen) { return std::wstring(); } + + std::wstring ws; + ws.resize(wlen); + wlen = ::MultiByteToWideChar( + CP_UTF8, 0, s, len, + const_cast(reinterpret_cast(ws.data())), wlen); + if (wlen != static_cast(ws.size())) { ws.clear(); } + return ws; +} +#endif + +struct FileStat { + FileStat(const std::string &path); + bool is_file() const; + bool is_dir() const; + time_t mtime() const; + size_t size() const; + +private: +#if defined(_WIN32) + struct _stat st_; +#else + struct stat st_; +#endif + int ret_ = -1; +}; + +std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl); + +std::string trim_copy(const std::string &s); + +void divide( + const char *data, std::size_t size, char d, + std::function + fn); + +void divide( + const std::string &str, char d, + std::function + fn); + +void split(const char *b, const char *e, char d, + std::function fn); + +void split(const char *b, const char *e, char d, size_t m, + std::function fn); + +bool process_client_socket( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, + std::function callback); + +socket_t create_client_socket(const std::string &host, const std::string &ip, + int port, int address_family, bool tcp_nodelay, + bool ipv6_v6only, SocketOptions socket_options, + time_t connection_timeout_sec, + time_t connection_timeout_usec, + time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, + time_t write_timeout_usec, + const std::string &intf, Error &error); + +const char *get_header_value(const Headers &headers, const std::string &key, + const char *def, size_t id); + +std::string params_to_query_str(const Params ¶ms); + +void parse_query_text(const char *data, std::size_t size, Params ¶ms); + +void parse_query_text(const std::string &s, Params ¶ms); + +bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary); + +bool parse_range_header(const std::string &s, Ranges &ranges); + +bool parse_accept_header(const std::string &s, + std::vector &content_types); + +ssize_t send_socket(socket_t sock, const void *ptr, size_t size, int flags); + +ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags); + +enum class EncodingType { None = 0, Gzip, Brotli, Zstd }; + +EncodingType encoding_type(const Request &req, const Response &res); + +class BufferStream final : public Stream { +public: + BufferStream() = default; + ~BufferStream() override = default; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + + const std::string &get_buffer() const; + +private: + std::string buffer; + size_t position = 0; +}; + +class compressor { +public: + virtual ~compressor() = default; + + typedef std::function Callback; + virtual bool compress(const char *data, size_t data_length, bool last, + Callback callback) = 0; +}; + +class decompressor { +public: + virtual ~decompressor() = default; + + virtual bool is_valid() const = 0; + + typedef std::function Callback; + virtual bool decompress(const char *data, size_t data_length, + Callback callback) = 0; +}; + +class nocompressor final : public compressor { +public: + ~nocompressor() override = default; + + bool compress(const char *data, size_t data_length, bool /*last*/, + Callback callback) override; +}; + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +class gzip_compressor final : public compressor { +public: + gzip_compressor(); + ~gzip_compressor() override; + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; + +class gzip_decompressor final : public decompressor { +public: + gzip_decompressor(); + ~gzip_decompressor() override; + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + bool is_valid_ = false; + z_stream strm_; +}; +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +class brotli_compressor final : public compressor { +public: + brotli_compressor(); + ~brotli_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + BrotliEncoderState *state_ = nullptr; +}; + +class brotli_decompressor final : public decompressor { +public: + brotli_decompressor(); + ~brotli_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + BrotliDecoderResult decoder_r; + BrotliDecoderState *decoder_s = nullptr; +}; +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +class zstd_compressor : public compressor { +public: + zstd_compressor(); + ~zstd_compressor(); + + bool compress(const char *data, size_t data_length, bool last, + Callback callback) override; + +private: + ZSTD_CCtx *ctx_ = nullptr; +}; + +class zstd_decompressor : public decompressor { +public: + zstd_decompressor(); + ~zstd_decompressor(); + + bool is_valid() const override; + + bool decompress(const char *data, size_t data_length, + Callback callback) override; + +private: + ZSTD_DCtx *ctx_ = nullptr; +}; +#endif + +// NOTE: until the read size reaches `fixed_buffer_size`, use `fixed_buffer` +// to store data. The call can set memory on stack for performance. +class stream_line_reader { +public: + stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size); + const char *ptr() const; + size_t size() const; + bool end_with_crlf() const; + bool getline(); + +private: + void append(char c); + + Stream &strm_; + char *fixed_buffer_; + const size_t fixed_buffer_size_; + size_t fixed_buffer_used_size_ = 0; + std::string growable_buffer_; +}; + +bool parse_trailers(stream_line_reader &line_reader, Headers &dest, + const Headers &src_headers); + +struct ChunkedDecoder { + Stream &strm; + size_t chunk_remaining = 0; + bool finished = false; + char line_buf[64]; + size_t last_chunk_total = 0; + size_t last_chunk_offset = 0; + + explicit ChunkedDecoder(Stream &s); + + ssize_t read_payload(char *buf, size_t len, size_t &out_chunk_offset, + size_t &out_chunk_total); + + bool parse_trailers_into(Headers &dest, const Headers &src_headers); +}; + +class mmap { +public: + mmap(const char *path); + ~mmap(); + + bool open(const char *path); + void close(); + + bool is_open() const; + size_t size() const; + const char *data() const; + +private: +#if defined(_WIN32) + HANDLE hFile_ = NULL; + HANDLE hMapping_ = NULL; +#else + int fd_ = -1; +#endif + size_t size_ = 0; + void *addr_ = nullptr; + bool is_open_empty_file = false; +}; + +// NOTE: https://www.rfc-editor.org/rfc/rfc9110#section-5 +namespace fields { + +bool is_token_char(char c); +bool is_token(const std::string &s); +bool is_field_name(const std::string &s); +bool is_vchar(char c); +bool is_obs_text(char c); +bool is_field_vchar(char c); +bool is_field_content(const std::string &s); +bool is_field_value(const std::string &s); + +} // namespace fields +} // namespace detail + +/* + * TLS Abstraction Layer Declarations + */ + +#ifdef CPPHTTPLIB_SSL_ENABLED +// TLS abstraction layer - backend-specific type declarations +#ifdef CPPHTTPLIB_MBEDTLS_SUPPORT +namespace tls { +namespace impl { + +// Mbed TLS context wrapper (holds config, entropy, DRBG, CA chain, own +// cert/key). This struct is accessible via tls::impl for use in SSL context +// setup callbacks (cast ctx_t to tls::impl::MbedTlsContext*). +struct MbedTlsContext { + mbedtls_ssl_config conf; + mbedtls_entropy_context entropy; + mbedtls_ctr_drbg_context ctr_drbg; + mbedtls_x509_crt ca_chain; + mbedtls_x509_crt own_cert; + mbedtls_pk_context own_key; + bool is_server = false; + bool verify_client = false; + bool has_verify_callback = false; + + MbedTlsContext(); + ~MbedTlsContext(); + + MbedTlsContext(const MbedTlsContext &) = delete; + MbedTlsContext &operator=(const MbedTlsContext &) = delete; +}; + +} // namespace impl +} // namespace tls +#endif + +#ifdef CPPHTTPLIB_WOLFSSL_SUPPORT +namespace tls { +namespace impl { + +// wolfSSL context wrapper (holds WOLFSSL_CTX and related state). +// This struct is accessible via tls::impl for use in SSL context +// setup callbacks (cast ctx_t to tls::impl::WolfSSLContext*). +struct WolfSSLContext { + WOLFSSL_CTX *ctx = nullptr; + bool is_server = false; + bool verify_client = false; + bool has_verify_callback = false; + std::string ca_pem_data_; // accumulated PEM for get_ca_names/get_ca_certs + + WolfSSLContext(); + ~WolfSSLContext(); + + WolfSSLContext(const WolfSSLContext &) = delete; + WolfSSLContext &operator=(const WolfSSLContext &) = delete; +}; + +// CA store for wolfSSL: holds raw PEM bytes to allow reloading into any ctx +struct WolfSSLCAStore { + std::string pem_data; +}; + +} // namespace impl +} // namespace tls +#endif + +#endif // CPPHTTPLIB_SSL_ENABLED + +namespace stream { + +class Result { +public: + Result(); + explicit Result(ClientImpl::StreamHandle &&handle, size_t chunk_size = 8192); + Result(Result &&other) noexcept; + Result &operator=(Result &&other) noexcept; + Result(const Result &) = delete; + Result &operator=(const Result &) = delete; + + // Response info + bool is_valid() const; + explicit operator bool() const; + int status() const; + const Headers &headers() const; + std::string get_header_value(const std::string &key, + const char *def = "") const; + bool has_header(const std::string &key) const; + Error error() const; + Error read_error() const; + bool has_read_error() const; + + // Stream reading + bool next(); + const char *data() const; + size_t size() const; + std::string read_all(); + +private: + ClientImpl::StreamHandle handle_; + std::string buffer_; + size_t current_size_ = 0; + size_t chunk_size_; + bool finished_ = false; +}; + +// GET +template +inline Result Get(ClientType &cli, const std::string &path, + size_t chunk_size = 8192) { + return Result{cli.open_stream("GET", path), chunk_size}; +} + +template +inline Result Get(ClientType &cli, const std::string &path, + const Headers &headers, size_t chunk_size = 8192) { + return Result{cli.open_stream("GET", path, {}, headers), chunk_size}; +} + +template +inline Result Get(ClientType &cli, const std::string &path, + const Params ¶ms, size_t chunk_size = 8192) { + return Result{cli.open_stream("GET", path, params), chunk_size}; +} + +template +inline Result Get(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + size_t chunk_size = 8192) { + return Result{cli.open_stream("GET", path, params, headers), chunk_size}; +} + +// POST +template +inline Result Post(ClientType &cli, const std::string &path, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{cli.open_stream("POST", path, {}, {}, body, content_type), + chunk_size}; +} + +template +inline Result Post(ClientType &cli, const std::string &path, + const Headers &headers, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("POST", path, {}, headers, body, content_type), + chunk_size}; +} + +template +inline Result Post(ClientType &cli, const std::string &path, + const Params ¶ms, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("POST", path, params, {}, body, content_type), + chunk_size}; +} + +template +inline Result Post(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{ + cli.open_stream("POST", path, params, headers, body, content_type), + chunk_size}; +} + +// PUT +template +inline Result Put(ClientType &cli, const std::string &path, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{cli.open_stream("PUT", path, {}, {}, body, content_type), + chunk_size}; +} + +template +inline Result Put(ClientType &cli, const std::string &path, + const Headers &headers, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("PUT", path, {}, headers, body, content_type), + chunk_size}; +} + +template +inline Result Put(ClientType &cli, const std::string &path, + const Params ¶ms, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("PUT", path, params, {}, body, content_type), + chunk_size}; +} + +template +inline Result Put(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{ + cli.open_stream("PUT", path, params, headers, body, content_type), + chunk_size}; +} + +// PATCH +template +inline Result Patch(ClientType &cli, const std::string &path, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{cli.open_stream("PATCH", path, {}, {}, body, content_type), + chunk_size}; +} + +template +inline Result Patch(ClientType &cli, const std::string &path, + const Headers &headers, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("PATCH", path, {}, headers, body, content_type), + chunk_size}; +} + +template +inline Result Patch(ClientType &cli, const std::string &path, + const Params ¶ms, const std::string &body, + const std::string &content_type, size_t chunk_size = 8192) { + return Result{cli.open_stream("PATCH", path, params, {}, body, content_type), + chunk_size}; +} + +template +inline Result Patch(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{ + cli.open_stream("PATCH", path, params, headers, body, content_type), + chunk_size}; +} + +// DELETE +template +inline Result Delete(ClientType &cli, const std::string &path, + size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path), chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Headers &headers, size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path, {}, headers), chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path, {}, {}, body, content_type), + chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Headers &headers, const std::string &body, + const std::string &content_type, + size_t chunk_size = 8192) { + return Result{ + cli.open_stream("DELETE", path, {}, headers, body, content_type), + chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Params ¶ms, size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path, params), chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path, params, headers), chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Params ¶ms, const std::string &body, + const std::string &content_type, + size_t chunk_size = 8192) { + return Result{cli.open_stream("DELETE", path, params, {}, body, content_type), + chunk_size}; +} + +template +inline Result Delete(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, const std::string &content_type, + size_t chunk_size = 8192) { + return Result{ + cli.open_stream("DELETE", path, params, headers, body, content_type), + chunk_size}; +} + +// HEAD +template +inline Result Head(ClientType &cli, const std::string &path, + size_t chunk_size = 8192) { + return Result{cli.open_stream("HEAD", path), chunk_size}; +} + +template +inline Result Head(ClientType &cli, const std::string &path, + const Headers &headers, size_t chunk_size = 8192) { + return Result{cli.open_stream("HEAD", path, {}, headers), chunk_size}; +} + +template +inline Result Head(ClientType &cli, const std::string &path, + const Params ¶ms, size_t chunk_size = 8192) { + return Result{cli.open_stream("HEAD", path, params), chunk_size}; +} + +template +inline Result Head(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + size_t chunk_size = 8192) { + return Result{cli.open_stream("HEAD", path, params, headers), chunk_size}; +} + +// OPTIONS +template +inline Result Options(ClientType &cli, const std::string &path, + size_t chunk_size = 8192) { + return Result{cli.open_stream("OPTIONS", path), chunk_size}; +} + +template +inline Result Options(ClientType &cli, const std::string &path, + const Headers &headers, size_t chunk_size = 8192) { + return Result{cli.open_stream("OPTIONS", path, {}, headers), chunk_size}; +} + +template +inline Result Options(ClientType &cli, const std::string &path, + const Params ¶ms, size_t chunk_size = 8192) { + return Result{cli.open_stream("OPTIONS", path, params), chunk_size}; +} + +template +inline Result Options(ClientType &cli, const std::string &path, + const Params ¶ms, const Headers &headers, + size_t chunk_size = 8192) { + return Result{cli.open_stream("OPTIONS", path, params, headers), chunk_size}; +} + +} // namespace stream + +namespace sse { + +struct SSEMessage { + std::string event; // Event type (default: "message") + std::string data; // Event payload + std::string id; // Event ID for Last-Event-ID header + + SSEMessage(); + void clear(); +}; + +class SSEClient { +public: + using MessageHandler = std::function; + using ErrorHandler = std::function; + using OpenHandler = std::function; + + SSEClient(Client &client, const std::string &path); + SSEClient(Client &client, const std::string &path, const Headers &headers); + ~SSEClient(); + + SSEClient(const SSEClient &) = delete; + SSEClient &operator=(const SSEClient &) = delete; + + // Event handlers + SSEClient &on_message(MessageHandler handler); + SSEClient &on_event(const std::string &type, MessageHandler handler); + SSEClient &on_open(OpenHandler handler); + SSEClient &on_error(ErrorHandler handler); + SSEClient &set_reconnect_interval(int ms); + SSEClient &set_max_reconnect_attempts(int n); + + // Update headers (thread-safe) + SSEClient &set_headers(const Headers &headers); + + // State accessors + bool is_connected() const; + const std::string &last_event_id() const; + + // Blocking start - runs event loop with auto-reconnect + void start(); + + // Non-blocking start - runs in background thread + void start_async(); + + // Stop the client (thread-safe) + void stop(); + +private: + bool parse_sse_line(const std::string &line, SSEMessage &msg, int &retry_ms); + void run_event_loop(); + void dispatch_event(const SSEMessage &msg); + bool should_reconnect(int count) const; + void wait_for_reconnect(); + + // Client and path + Client &client_; + std::string path_; + Headers headers_; + mutable std::mutex headers_mutex_; + + // Callbacks + MessageHandler on_message_; + std::map event_handlers_; + OpenHandler on_open_; + ErrorHandler on_error_; + + // Configuration + int reconnect_interval_ms_ = 3000; + int max_reconnect_attempts_ = 0; // 0 = unlimited + + // State + std::atomic running_{false}; + std::atomic connected_{false}; + std::string last_event_id_; + + // Async support + std::thread async_thread_; +}; + +} // namespace sse + +namespace ws { + +enum class Opcode : uint8_t { + Continuation = 0x0, + Text = 0x1, + Binary = 0x2, + Close = 0x8, + Ping = 0x9, + Pong = 0xA, +}; + +enum class CloseStatus : uint16_t { + Normal = 1000, + GoingAway = 1001, + ProtocolError = 1002, + UnsupportedData = 1003, + NoStatus = 1005, + Abnormal = 1006, + InvalidPayload = 1007, + PolicyViolation = 1008, + MessageTooBig = 1009, + MandatoryExtension = 1010, + InternalError = 1011, +}; + +enum ReadResult : int { Fail = 0, Text = 1, Binary = 2 }; + +class WebSocket { +public: + WebSocket(const WebSocket &) = delete; + WebSocket &operator=(const WebSocket &) = delete; + ~WebSocket(); + + ReadResult read(std::string &msg); + bool send(const std::string &data); + bool send(const char *data, size_t len); + void close(CloseStatus status = CloseStatus::Normal, + const std::string &reason = ""); + const Request &request() const; + bool is_open() const; + +private: + friend class httplib::Server; + friend class WebSocketClient; + + WebSocket( + Stream &strm, const Request &req, bool is_server, + time_t ping_interval_sec = CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND, + int max_missed_pongs = CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS) + : strm_(strm), req_(req), is_server_(is_server), + ping_interval_sec_(ping_interval_sec), + max_missed_pongs_(max_missed_pongs) { + start_heartbeat(); + } + + WebSocket( + std::unique_ptr &&owned_strm, const Request &req, bool is_server, + time_t ping_interval_sec = CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND, + int max_missed_pongs = CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS) + : strm_(*owned_strm), owned_strm_(std::move(owned_strm)), req_(req), + is_server_(is_server), ping_interval_sec_(ping_interval_sec), + max_missed_pongs_(max_missed_pongs) { + start_heartbeat(); + } + + void start_heartbeat(); + bool send_frame(Opcode op, const char *data, size_t len, bool fin = true); + + Stream &strm_; + std::unique_ptr owned_strm_; + Request req_; + bool is_server_; + time_t ping_interval_sec_; + int max_missed_pongs_; + int unacked_pings_ = 0; + std::atomic closed_{false}; + std::mutex write_mutex_; + std::thread ping_thread_; + std::mutex ping_mutex_; + std::condition_variable ping_cv_; +}; + +class WebSocketClient { +public: + explicit WebSocketClient(const std::string &scheme_host_port_path, + const Headers &headers = {}); + + ~WebSocketClient(); + WebSocketClient(const WebSocketClient &) = delete; + WebSocketClient &operator=(const WebSocketClient &) = delete; + + bool is_valid() const; + + bool connect(); + ReadResult read(std::string &msg); + bool send(const std::string &data); + bool send(const char *data, size_t len); + void close(CloseStatus status = CloseStatus::Normal, + const std::string &reason = ""); + bool is_open() const; + const std::string &subprotocol() const; + void set_read_timeout(time_t sec, time_t usec = 0); + void set_write_timeout(time_t sec, time_t usec = 0); + void set_websocket_ping_interval(time_t sec); + void set_websocket_max_missed_pongs(int count); + void set_tcp_nodelay(bool on); + void set_address_family(int family); + void set_ipv6_v6only(bool on); + void set_socket_options(SocketOptions socket_options); + void set_connection_timeout(time_t sec, time_t usec = 0); + void set_interface(const std::string &intf); + void set_hostname_addr_map(std::map addr_map); + +#ifdef CPPHTTPLIB_SSL_ENABLED + void set_ca_cert_path(const std::string &path); + void set_ca_cert_store(tls::ca_store_t store); + void load_ca_cert_store(const char *ca_cert, std::size_t size); + void enable_server_certificate_verification(bool enabled); + void enable_system_ca(bool enabled); +#endif + +private: + void shutdown_and_close(); + bool create_stream(std::unique_ptr &strm); + + std::string host_; + int port_; + std::string path_; + Headers headers_; + std::string subprotocol_; + bool is_valid_ = false; + socket_t sock_ = INVALID_SOCKET; + std::unique_ptr ws_; + time_t read_timeout_sec_ = CPPHTTPLIB_WEBSOCKET_READ_TIMEOUT_SECOND; + time_t read_timeout_usec_ = 0; + time_t write_timeout_sec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_SECOND; + time_t write_timeout_usec_ = CPPHTTPLIB_CLIENT_WRITE_TIMEOUT_USECOND; + time_t websocket_ping_interval_sec_ = + CPPHTTPLIB_WEBSOCKET_PING_INTERVAL_SECOND; + int websocket_max_missed_pongs_ = CPPHTTPLIB_WEBSOCKET_MAX_MISSED_PONGS; + int address_family_ = AF_UNSPEC; + bool tcp_nodelay_ = CPPHTTPLIB_TCP_NODELAY; + bool ipv6_v6only_ = CPPHTTPLIB_IPV6_V6ONLY; + SocketOptions socket_options_ = nullptr; + time_t connection_timeout_sec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_SECOND; + time_t connection_timeout_usec_ = CPPHTTPLIB_CONNECTION_TIMEOUT_USECOND; + std::string interface_; + + // Hostname-IP map + std::map addr_map_; + +#ifdef CPPHTTPLIB_SSL_ENABLED + bool is_ssl_ = false; + tls::ctx_t tls_ctx_ = nullptr; + tls::session_t tls_session_ = nullptr; + std::string ca_cert_file_path_; + bool custom_ca_loaded_ = false; + bool certs_loaded_ = false; + SystemCAMode system_ca_mode_ = SystemCAMode::Auto; + bool server_certificate_verification_ = true; +#endif +}; + +namespace impl { + +bool is_valid_utf8(const std::string &s); + +bool read_websocket_frame(Stream &strm, Opcode &opcode, std::string &payload, + bool &fin, bool expect_masked, size_t max_len); + +} // namespace impl + +} // namespace ws + +// ---------------------------------------------------------------------------- + +/* + * Implementation that will be part of the .cc file if split into .h + .cc. + */ + +namespace stream { + +// stream::Result implementations +inline Result::Result() : chunk_size_(8192) {} + +inline Result::Result(ClientImpl::StreamHandle &&handle, size_t chunk_size) + : handle_(std::move(handle)), chunk_size_(chunk_size) {} + +inline Result::Result(Result &&other) noexcept + : handle_(std::move(other.handle_)), buffer_(std::move(other.buffer_)), + current_size_(other.current_size_), chunk_size_(other.chunk_size_), + finished_(other.finished_) { + other.current_size_ = 0; + other.finished_ = true; +} + +inline Result &Result::operator=(Result &&other) noexcept { + if (this != &other) { + handle_ = std::move(other.handle_); + buffer_ = std::move(other.buffer_); + current_size_ = other.current_size_; + chunk_size_ = other.chunk_size_; + finished_ = other.finished_; + other.current_size_ = 0; + other.finished_ = true; + } + return *this; +} + +inline bool Result::is_valid() const { return handle_.is_valid(); } +inline Result::operator bool() const { return is_valid(); } + +inline int Result::status() const { + return handle_.response ? handle_.response->status : -1; +} + +inline const Headers &Result::headers() const { + static const Headers empty_headers; + return handle_.response ? handle_.response->headers : empty_headers; +} + +inline std::string Result::get_header_value(const std::string &key, + const char *def) const { + return handle_.response ? handle_.response->get_header_value(key, def) : def; +} + +inline bool Result::has_header(const std::string &key) const { + return handle_.response ? handle_.response->has_header(key) : false; +} + +inline Error Result::error() const { return handle_.error; } +inline Error Result::read_error() const { return handle_.get_read_error(); } +inline bool Result::has_read_error() const { return handle_.has_read_error(); } + +inline bool Result::next() { + if (!handle_.is_valid() || finished_) { return false; } + + if (buffer_.size() < chunk_size_) { buffer_.resize(chunk_size_); } + + ssize_t n = handle_.read(&buffer_[0], chunk_size_); + if (n > 0) { + current_size_ = static_cast(n); + return true; + } + + current_size_ = 0; + finished_ = true; + return false; +} + +inline const char *Result::data() const { return buffer_.data(); } +inline size_t Result::size() const { return current_size_; } + +inline std::string Result::read_all() { + std::string result; + while (next()) { + result.append(data(), size()); + } + return result; +} + +} // namespace stream + +namespace sse { + +// SSEMessage implementations +inline SSEMessage::SSEMessage() : event("message") {} + +inline void SSEMessage::clear() { + event = "message"; + data.clear(); + id.clear(); +} + +// SSEClient implementations +inline SSEClient::SSEClient(Client &client, const std::string &path) + : client_(client), path_(path) {} + +inline SSEClient::SSEClient(Client &client, const std::string &path, + const Headers &headers) + : client_(client), path_(path), headers_(headers) {} + +inline SSEClient::~SSEClient() { stop(); } + +inline SSEClient &SSEClient::on_message(MessageHandler handler) { + on_message_ = std::move(handler); + return *this; +} + +inline SSEClient &SSEClient::on_event(const std::string &type, + MessageHandler handler) { + event_handlers_[type] = std::move(handler); + return *this; +} + +inline SSEClient &SSEClient::on_open(OpenHandler handler) { + on_open_ = std::move(handler); + return *this; +} + +inline SSEClient &SSEClient::on_error(ErrorHandler handler) { + on_error_ = std::move(handler); + return *this; +} + +inline SSEClient &SSEClient::set_reconnect_interval(int ms) { + reconnect_interval_ms_ = ms; + return *this; +} + +inline SSEClient &SSEClient::set_max_reconnect_attempts(int n) { + max_reconnect_attempts_ = n; + return *this; +} + +inline SSEClient &SSEClient::set_headers(const Headers &headers) { + std::lock_guard lock(headers_mutex_); + headers_ = headers; + return *this; +} + +inline bool SSEClient::is_connected() const { return connected_.load(); } + +inline const std::string &SSEClient::last_event_id() const { + return last_event_id_; +} + +inline void SSEClient::start() { + running_.store(true); + run_event_loop(); +} + +inline void SSEClient::start_async() { + running_.store(true); + async_thread_ = std::thread([this]() { run_event_loop(); }); +} + +inline void SSEClient::stop() { + running_.store(false); + client_.stop(); // Cancel any pending operations + if (async_thread_.joinable()) { async_thread_.join(); } +} + +inline bool SSEClient::parse_sse_line(const std::string &line, SSEMessage &msg, + int &retry_ms) { + // Blank line signals end of event + if (line.empty() || line == "\r") { return true; } + + // Lines starting with ':' are comments (ignored) + if (!line.empty() && line[0] == ':') { return false; } + + // Find the colon separator + auto colon_pos = line.find(':'); + if (colon_pos == std::string::npos) { + // Line with no colon is treated as field name with empty value + return false; + } + + auto field = line.substr(0, colon_pos); + std::string value; + + // Value starts after colon, skip optional single space + if (colon_pos + 1 < line.size()) { + auto value_start = colon_pos + 1; + if (line[value_start] == ' ') { value_start++; } + value = line.substr(value_start); + // Remove trailing \r if present + if (!value.empty() && value.back() == '\r') { value.pop_back(); } + } + + // Handle known fields + if (field == "event") { + msg.event = value; + } else if (field == "data") { + // Multiple data lines are concatenated with newlines + if (!msg.data.empty()) { msg.data += "\n"; } + msg.data += value; + } else if (field == "id") { + // Empty id is valid (clears the last event ID) + msg.id = value; + } else if (field == "retry") { + // Parse retry interval in milliseconds + { + int v = 0; + auto res = + detail::from_chars(value.data(), value.data() + value.size(), v); + if (res.ec == std::errc{}) { retry_ms = v; } + } + } + // Unknown fields are ignored per SSE spec + + return false; +} + +inline void SSEClient::run_event_loop() { + auto reconnect_count = 0; + + while (running_.load()) { + // Build headers, including Last-Event-ID if we have one + Headers request_headers; + { + std::lock_guard lock(headers_mutex_); + request_headers = headers_; + } + if (!last_event_id_.empty()) { + request_headers.emplace("Last-Event-ID", last_event_id_); + } + + // Open streaming connection + auto result = stream::Get(client_, path_, request_headers); + + // Connection error handling + if (!result) { + connected_.store(false); + if (on_error_) { on_error_(result.error()); } + + if (!should_reconnect(reconnect_count)) { break; } + wait_for_reconnect(); + reconnect_count++; + continue; + } + + if (result.status() != StatusCode::OK_200) { + connected_.store(false); + if (on_error_) { on_error_(Error::Connection); } + + // For certain errors, don't reconnect. + // Note: 401 is intentionally absent so that handlers can refresh + // credentials via set_headers() and let the client reconnect. + if (result.status() == StatusCode::NoContent_204 || + result.status() == StatusCode::NotFound_404 || + result.status() == StatusCode::Forbidden_403) { + break; + } + + if (!should_reconnect(reconnect_count)) { break; } + wait_for_reconnect(); + reconnect_count++; + continue; + } + + // Connection successful + connected_.store(true); + reconnect_count = 0; + if (on_open_) { on_open_(); } + + // Event receiving loop + std::string buffer; + SSEMessage current_msg; + + while (running_.load() && result.next()) { + buffer.append(result.data(), result.size()); + + // Process complete lines in the buffer + size_t line_start = 0; + size_t newline_pos; + + while ((newline_pos = buffer.find('\n', line_start)) != + std::string::npos) { + auto line = buffer.substr(line_start, newline_pos - line_start); + line_start = newline_pos + 1; + + // Parse the line and check if event is complete + auto event_complete = + parse_sse_line(line, current_msg, reconnect_interval_ms_); + + if (event_complete && !current_msg.data.empty()) { + // Update last_event_id for reconnection + if (!current_msg.id.empty()) { last_event_id_ = current_msg.id; } + + // Dispatch event to appropriate handler + dispatch_event(current_msg); + + current_msg.clear(); + } + } + + // Keep unprocessed data in buffer + buffer.erase(0, line_start); + } + + // Connection ended + connected_.store(false); + + if (!running_.load()) { break; } + + // Check for read errors + if (result.has_read_error()) { + if (on_error_) { on_error_(result.read_error()); } + } + + if (!should_reconnect(reconnect_count)) { break; } + wait_for_reconnect(); + reconnect_count++; + } + + connected_.store(false); +} + +inline void SSEClient::dispatch_event(const SSEMessage &msg) { + // Check for specific event type handler first + auto it = event_handlers_.find(msg.event); + if (it != event_handlers_.end()) { + it->second(msg); + return; + } + + // Fall back to generic message handler + if (on_message_) { on_message_(msg); } +} + +inline bool SSEClient::should_reconnect(int count) const { + if (!running_.load()) { return false; } + if (max_reconnect_attempts_ == 0) { return true; } // unlimited + return count < max_reconnect_attempts_; +} + +inline void SSEClient::wait_for_reconnect() { + // Use small increments to check running_ flag frequently + auto waited = 0; + while (running_.load() && waited < reconnect_interval_ms_) { + std::this_thread::sleep_for(std::chrono::milliseconds(100)); + waited += 100; + } +} + +} // namespace sse + +#ifdef CPPHTTPLIB_SSL_ENABLED +/* + * TLS abstraction layer - internal function declarations + * These are implementation details and not part of the public API. + */ +namespace tls { + +// Client context +ctx_t create_client_context(); +void free_context(ctx_t ctx); +bool set_min_version(ctx_t ctx, Version version); +bool load_ca_pem(ctx_t ctx, const char *pem, size_t len); +bool load_ca_file(ctx_t ctx, const char *file_path); +bool load_ca_dir(ctx_t ctx, const char *dir_path); +bool load_system_certs(ctx_t ctx); +bool set_client_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password); +bool set_client_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password); + +// Server context +ctx_t create_server_context(); +bool set_server_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password); +bool set_server_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password); +bool set_client_ca_file(ctx_t ctx, const char *ca_file, const char *ca_dir); +void set_verify_client(ctx_t ctx, bool require); + +// Session management +session_t create_session(ctx_t ctx, socket_t sock); +void free_session(session_t session); +bool set_sni(session_t session, const char *hostname); +bool set_hostname(session_t session, const char *hostname); + +// Handshake (non-blocking capable) +TlsError connect(session_t session); +TlsError accept(session_t session); + +// Handshake with timeout (blocking until timeout) +bool connect_nonblocking(session_t session, socket_t sock, time_t timeout_sec, + time_t timeout_usec, TlsError *err); +bool accept_nonblocking(session_t session, socket_t sock, time_t timeout_sec, + time_t timeout_usec, TlsError *err); + +// I/O (non-blocking capable) +ssize_t read(session_t session, void *buf, size_t len, TlsError &err); +ssize_t write(session_t session, const void *buf, size_t len, TlsError &err); +int pending(const_session_t session); +void shutdown(session_t session, bool graceful); + +// Connection state +bool is_peer_closed(session_t session, socket_t sock); + +// Certificate verification +cert_t get_peer_cert(const_session_t session); +void free_cert(cert_t cert); +bool verify_hostname(cert_t cert, const char *hostname); +uint64_t hostname_mismatch_code(); +long get_verify_result(const_session_t session); + +// Certificate introspection +std::string get_cert_subject_cn(cert_t cert); +std::string get_cert_issuer_name(cert_t cert); +bool get_cert_sans(cert_t cert, std::vector &sans); +bool get_cert_validity(cert_t cert, time_t ¬_before, time_t ¬_after); +std::string get_cert_serial(cert_t cert); +bool get_cert_der(cert_t cert, std::vector &der); +const char *get_sni(const_session_t session); + +// CA store management +ca_store_t create_ca_store(const char *pem, size_t len); +void free_ca_store(ca_store_t store); +bool set_ca_store(ctx_t ctx, ca_store_t store); +size_t get_ca_certs(ctx_t ctx, std::vector &certs); +std::vector get_ca_names(ctx_t ctx); + +// Dynamic certificate update (for servers) +bool update_server_cert(ctx_t ctx, const char *cert_pem, const char *key_pem, + const char *password); +bool update_server_client_ca(ctx_t ctx, const char *ca_pem); + +// Certificate verification callback +bool set_verify_callback(ctx_t ctx, VerifyCallback callback); +long get_verify_error(const_session_t session); +std::string verify_error_string(long error_code); + +// TlsError information +uint64_t peek_error(); +uint64_t get_error(); +std::string error_string(uint64_t code); + +} // namespace tls +#endif // CPPHTTPLIB_SSL_ENABLED + +/* + * Group 1: detail namespace - Non-SSL utilities + */ + +namespace detail { + +inline bool set_socket_opt_impl(socket_t sock, int level, int optname, + const void *optval, socklen_t optlen) { + return setsockopt(sock, level, optname, +#ifdef _WIN32 + reinterpret_cast(optval), +#else + optval, +#endif + optlen) == 0; +} + +inline bool set_socket_opt_time(socket_t sock, int level, int optname, + time_t sec, time_t usec) { +#ifdef _WIN32 + auto timeout = static_cast(sec * 1000 + usec / 1000); +#else + timeval timeout; + timeout.tv_sec = static_cast(sec); + timeout.tv_usec = static_cast(usec); +#endif + return set_socket_opt_impl(sock, level, optname, &timeout, sizeof(timeout)); +} + +inline bool is_hex(char c, int &v) { + if (isdigit(static_cast(c))) { + v = c - '0'; + return true; + } else if ('A' <= c && c <= 'F') { + v = c - 'A' + 10; + return true; + } else if ('a' <= c && c <= 'f') { + v = c - 'a' + 10; + return true; + } + return false; +} + +inline bool from_hex_to_i(const std::string &s, size_t i, size_t cnt, + int &val) { + if (i >= s.size()) { return false; } + + val = 0; + for (; cnt; i++, cnt--) { + if (!s[i]) { return false; } + auto v = 0; + if (is_hex(s[i], v)) { + val = val * 16 + v; + } else { + return false; + } + } + return true; +} + +inline std::string from_i_to_hex(size_t n) { + static const auto charset = "0123456789abcdef"; + std::string ret; + do { + ret = charset[n & 15] + ret; + n >>= 4; + } while (n > 0); + return ret; +} + +inline std::string compute_etag(const FileStat &fs) { + if (!fs.is_file()) { return std::string(); } + + // If mtime cannot be determined (negative value indicates an error + // or sentinel), do not generate an ETag. Returning a neutral / fixed + // value like 0 could collide with a real file that legitimately has + // mtime == 0 (epoch) and lead to misleading validators. + auto mtime_raw = fs.mtime(); + if (mtime_raw < 0) { return std::string(); } + + auto mtime = static_cast(mtime_raw); + auto size = fs.size(); + + return std::string("W/\"") + from_i_to_hex(mtime) + "-" + + from_i_to_hex(size) + "\""; +} + +// Format time_t as HTTP-date (RFC 9110 Section 5.6.7): "Sun, 06 Nov 1994 +// 08:49:37 GMT" This implementation is defensive: it validates `mtime`, checks +// return values from `gmtime_r`/`gmtime_s`, and ensures `strftime` succeeds. +inline std::string file_mtime_to_http_date(time_t mtime) { + if (mtime < 0) { return std::string(); } + + struct tm tm_buf; +#ifdef _WIN32 + if (gmtime_s(&tm_buf, &mtime) != 0) { return std::string(); } +#else + if (gmtime_r(&mtime, &tm_buf) == nullptr) { return std::string(); } +#endif + char buf[64]; + if (strftime(buf, sizeof(buf), "%a, %d %b %Y %H:%M:%S GMT", &tm_buf) == 0) { + return std::string(); + } + + return std::string(buf); +} + +// Parse HTTP-date (RFC 9110 Section 5.6.7) to time_t. Returns -1 on failure. +inline time_t parse_http_date(const std::string &date_str) { + struct tm tm_buf; + + // Create a classic locale object once for all parsing attempts + const std::locale classic_locale = std::locale::classic(); + + // Try to parse using std::get_time (C++11, cross-platform) + auto try_parse = [&](const char *fmt) -> bool { + std::istringstream ss(date_str); + ss.imbue(classic_locale); + + memset(&tm_buf, 0, sizeof(tm_buf)); + ss >> std::get_time(&tm_buf, fmt); + + return !ss.fail(); + }; + + // RFC 9110 preferred format (HTTP-date): "Sun, 06 Nov 1994 08:49:37 GMT" + if (!try_parse("%a, %d %b %Y %H:%M:%S")) { + // RFC 850 format: "Sunday, 06-Nov-94 08:49:37 GMT" + if (!try_parse("%A, %d-%b-%y %H:%M:%S")) { + // asctime format: "Sun Nov 6 08:49:37 1994" + if (!try_parse("%a %b %d %H:%M:%S %Y")) { + return static_cast(-1); + } + } + } + +#ifdef _WIN32 + return _mkgmtime(&tm_buf); +#elif defined _AIX + return mktime(&tm_buf); +#else + return timegm(&tm_buf); +#endif +} + +inline bool is_weak_etag(const std::string &s) { + // Check if the string is a weak ETag (starts with 'W/"') + return s.size() > 3 && s[0] == 'W' && s[1] == '/' && s[2] == '"'; +} + +inline bool is_strong_etag(const std::string &s) { + // Check if the string is a strong ETag (starts and ends with '"', at least 2 + // chars) + return s.size() >= 2 && s[0] == '"' && s.back() == '"'; +} + +inline size_t to_utf8(int code, char *buff) { + if (code < 0x0080) { + buff[0] = static_cast(code & 0x7F); + return 1; + } else if (code < 0x0800) { + buff[0] = static_cast(0xC0 | ((code >> 6) & 0x1F)); + buff[1] = static_cast(0x80 | (code & 0x3F)); + return 2; + } else if (code < 0xD800) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0xE000) { // D800 - DFFF is invalid... + return 0; + } else if (code < 0x10000) { + buff[0] = static_cast(0xE0 | ((code >> 12) & 0xF)); + buff[1] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[2] = static_cast(0x80 | (code & 0x3F)); + return 3; + } else if (code < 0x110000) { + buff[0] = static_cast(0xF0 | ((code >> 18) & 0x7)); + buff[1] = static_cast(0x80 | ((code >> 12) & 0x3F)); + buff[2] = static_cast(0x80 | ((code >> 6) & 0x3F)); + buff[3] = static_cast(0x80 | (code & 0x3F)); + return 4; + } + + // NOTREACHED + return 0; +} + +} // namespace detail + +namespace ws { +namespace impl { + +inline bool is_valid_utf8(const std::string &s) { + size_t i = 0; + auto n = s.size(); + while (i < n) { + auto c = static_cast(s[i]); + size_t len; + uint32_t cp; + if (c < 0x80) { + i++; + continue; + } else if ((c & 0xE0) == 0xC0) { + len = 2; + cp = c & 0x1F; + } else if ((c & 0xF0) == 0xE0) { + len = 3; + cp = c & 0x0F; + } else if ((c & 0xF8) == 0xF0) { + len = 4; + cp = c & 0x07; + } else { + return false; + } + if (i + len > n) { return false; } + for (size_t j = 1; j < len; j++) { + auto b = static_cast(s[i + j]); + if ((b & 0xC0) != 0x80) { return false; } + cp = (cp << 6) | (b & 0x3F); + } + // Overlong encoding check + if (len == 2 && cp < 0x80) { return false; } + if (len == 3 && cp < 0x800) { return false; } + if (len == 4 && cp < 0x10000) { return false; } + // Surrogate halves (U+D800..U+DFFF) and beyond U+10FFFF are invalid + if (cp >= 0xD800 && cp <= 0xDFFF) { return false; } + if (cp > 0x10FFFF) { return false; } + i += len; + } + return true; +} + +} // namespace impl +} // namespace ws + +namespace detail { + +// NOTE: This code came up with the following stackoverflow post: +// https://stackoverflow.com/questions/180947/base64-decode-snippet-in-c +inline std::string base64_encode(const std::string &in) { + static const auto lookup = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + + std::string out; + out.reserve(in.size()); + + auto val = 0; + auto valb = -6; + + for (auto c : in) { + val = (val << 8) + static_cast(c); + valb += 8; + while (valb >= 0) { + out.push_back(lookup[(val >> valb) & 0x3F]); + valb -= 6; + } + } + + if (valb > -6) { out.push_back(lookup[((val << 8) >> (valb + 8)) & 0x3F]); } + + while (out.size() % 4) { + out.push_back('='); + } + + return out; +} + +inline std::string sha1(const std::string &input) { + // RFC 3174 SHA-1 implementation + auto left_rotate = [](uint32_t x, uint32_t n) -> uint32_t { + return (x << n) | (x >> (32 - n)); + }; + + uint32_t h0 = 0x67452301; + uint32_t h1 = 0xEFCDAB89; + uint32_t h2 = 0x98BADCFE; + uint32_t h3 = 0x10325476; + uint32_t h4 = 0xC3D2E1F0; + + // Pre-processing: adding padding bits + std::string msg = input; + uint64_t original_bit_len = static_cast(msg.size()) * 8; + msg.push_back(static_cast(0x80u)); + while (msg.size() % 64 != 56) { + msg.push_back(0); + } + + // Append original length in bits as 64-bit big-endian + for (int i = 56; i >= 0; i -= 8) { + msg.push_back(static_cast((original_bit_len >> i) & 0xFF)); + } + + // Process each 512-bit chunk + for (size_t offset = 0; offset < msg.size(); offset += 64) { + uint32_t w[80]; + + for (size_t i = 0; i < 16; i++) { + w[i] = + (static_cast(static_cast(msg[offset + i * 4])) + << 24) | + (static_cast(static_cast(msg[offset + i * 4 + 1])) + << 16) | + (static_cast(static_cast(msg[offset + i * 4 + 2])) + << 8) | + (static_cast( + static_cast(msg[offset + i * 4 + 3]))); + } + + for (int i = 16; i < 80; i++) { + w[i] = left_rotate(w[i - 3] ^ w[i - 8] ^ w[i - 14] ^ w[i - 16], 1); + } + + uint32_t a = h0, b = h1, c = h2, d = h3, e = h4; + + for (int i = 0; i < 80; i++) { + uint32_t f, k; + if (i < 20) { + f = (b & c) | ((~b) & d); + k = 0x5A827999; + } else if (i < 40) { + f = b ^ c ^ d; + k = 0x6ED9EBA1; + } else if (i < 60) { + f = (b & c) | (b & d) | (c & d); + k = 0x8F1BBCDC; + } else { + f = b ^ c ^ d; + k = 0xCA62C1D6; + } + + uint32_t temp = left_rotate(a, 5) + f + e + k + w[i]; + e = d; + d = c; + c = left_rotate(b, 30); + b = a; + a = temp; + } + + h0 += a; + h1 += b; + h2 += c; + h3 += d; + h4 += e; + } + + // Produce the final hash as a 20-byte binary string + std::string hash(20, '\0'); + for (size_t i = 0; i < 4; i++) { + hash[i] = static_cast((h0 >> (24 - i * 8)) & 0xFF); + hash[4 + i] = static_cast((h1 >> (24 - i * 8)) & 0xFF); + hash[8 + i] = static_cast((h2 >> (24 - i * 8)) & 0xFF); + hash[12 + i] = static_cast((h3 >> (24 - i * 8)) & 0xFF); + hash[16 + i] = static_cast((h4 >> (24 - i * 8)) & 0xFF); + } + return hash; +} + +inline std::string websocket_accept_key(const std::string &client_key) { + const std::string magic = "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; + return base64_encode(sha1(client_key + magic)); +} + +inline bool is_websocket_upgrade(const Request &req) { + if (req.method != "GET") { return false; } + + // Check Upgrade: websocket (case-insensitive) + auto upgrade_it = req.headers.find("Upgrade"); + if (upgrade_it == req.headers.end()) { return false; } + auto upgrade_val = case_ignore::to_lower(upgrade_it->second); + if (upgrade_val != "websocket") { return false; } + + // Check Connection header contains "Upgrade" + auto connection_it = req.headers.find("Connection"); + if (connection_it == req.headers.end()) { return false; } + auto connection_val = case_ignore::to_lower(connection_it->second); + if (connection_val.find("upgrade") == std::string::npos) { return false; } + + // Check Sec-WebSocket-Key is a valid base64-encoded 16-byte value (24 chars) + // RFC 6455 Section 4.2.1 + auto ws_key = req.get_header_value("Sec-WebSocket-Key"); + if (ws_key.size() != 24 || ws_key[22] != '=' || ws_key[23] != '=') { + return false; + } + static const std::string b64chars = + "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; + for (size_t i = 0; i < 22; i++) { + if (b64chars.find(ws_key[i]) == std::string::npos) { return false; } + } + + // Check Sec-WebSocket-Version: 13 + auto version = req.get_header_value("Sec-WebSocket-Version"); + if (version != "13") { return false; } + + return true; +} + +inline bool write_websocket_frame(Stream &strm, ws::Opcode opcode, + const char *data, size_t len, bool fin, + bool mask) { + // First byte: FIN + opcode + uint8_t header[2]; + header[0] = static_cast((fin ? 0x80 : 0x00) | + (static_cast(opcode) & 0x0F)); + + // Second byte: MASK + payload length + if (len < 126) { + header[1] = static_cast(len); + if (mask) { header[1] |= 0x80; } + if (strm.write(reinterpret_cast(header), 2) < 0) { return false; } + } else if (len <= 0xFFFF) { + header[1] = 126; + if (mask) { header[1] |= 0x80; } + if (strm.write(reinterpret_cast(header), 2) < 0) { return false; } + uint8_t ext[2]; + ext[0] = static_cast((len >> 8) & 0xFF); + ext[1] = static_cast(len & 0xFF); + if (strm.write(reinterpret_cast(ext), 2) < 0) { return false; } + } else { + header[1] = 127; + if (mask) { header[1] |= 0x80; } + if (strm.write(reinterpret_cast(header), 2) < 0) { return false; } + uint8_t ext[8]; + for (int i = 7; i >= 0; i--) { + ext[7 - i] = + static_cast((static_cast(len) >> (i * 8)) & 0xFF); + } + if (strm.write(reinterpret_cast(ext), 8) < 0) { return false; } + } + + if (mask) { + // Generate random mask key + thread_local std::mt19937 rng(std::random_device{}()); + uint8_t mask_key[4]; + auto r = rng(); + std::memcpy(mask_key, &r, 4); + if (strm.write(reinterpret_cast(mask_key), 4) < 0) { return false; } + + // Write masked payload in chunks + const size_t chunk_size = 4096; + std::vector buf((std::min)(len, chunk_size)); + for (size_t offset = 0; offset < len; offset += chunk_size) { + size_t n = (std::min)(chunk_size, len - offset); + for (size_t i = 0; i < n; i++) { + buf[i] = + data[offset + i] ^ static_cast(mask_key[(offset + i) % 4]); + } + if (strm.write(buf.data(), n) < 0) { return false; } + } + } else { + if (len > 0) { + if (strm.write(data, len) < 0) { return false; } + } + } + + return true; +} + +} // namespace detail + +namespace ws { +namespace impl { + +inline bool read_websocket_frame(Stream &strm, Opcode &opcode, + std::string &payload, bool &fin, + bool expect_masked, size_t max_len) { + // Read first 2 bytes + uint8_t header[2]; + if (strm.read(reinterpret_cast(header), 2) != 2) { return false; } + + fin = (header[0] & 0x80) != 0; + + // RSV1, RSV2, RSV3 must be 0 when no extension is negotiated + if (header[0] & 0x70) { return false; } + + opcode = static_cast(header[0] & 0x0F); + bool masked = (header[1] & 0x80) != 0; + uint64_t payload_len = header[1] & 0x7F; + + // RFC 6455 Section 5.5: control frames MUST NOT be fragmented and + // MUST have a payload length of 125 bytes or less + bool is_control = (static_cast(opcode) & 0x08) != 0; + if (is_control) { + if (!fin) { return false; } + if (payload_len > 125) { return false; } + } + + if (masked != expect_masked) { return false; } + + // Extended payload length + if (payload_len == 126) { + uint8_t ext[2]; + if (strm.read(reinterpret_cast(ext), 2) != 2) { return false; } + payload_len = (static_cast(ext[0]) << 8) | ext[1]; + } else if (payload_len == 127) { + uint8_t ext[8]; + if (strm.read(reinterpret_cast(ext), 8) != 8) { return false; } + // RFC 6455 Section 5.2: the most significant bit MUST be 0 + if (ext[0] & 0x80) { return false; } + payload_len = 0; + for (int i = 0; i < 8; i++) { + payload_len = (payload_len << 8) | ext[i]; + } + } + + if (payload_len > max_len) { return false; } + + // Read mask key if present + uint8_t mask_key[4] = {0}; + if (masked) { + if (strm.read(reinterpret_cast(mask_key), 4) != 4) { return false; } + } + + // Read payload + payload.resize(static_cast(payload_len)); + if (payload_len > 0) { + size_t total_read = 0; + while (total_read < payload_len) { + auto n = strm.read(&payload[total_read], + static_cast(payload_len - total_read)); + if (n <= 0) { return false; } + total_read += static_cast(n); + } + } + + // Unmask if needed + if (masked) { + for (size_t i = 0; i < payload.size(); i++) { + payload[i] ^= static_cast(mask_key[i % 4]); + } + } + + return true; +} + +} // namespace impl +} // namespace ws + +namespace detail { + +inline bool is_valid_path(const std::string &path) { + size_t level = 0; + size_t i = 0; + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + + while (i < path.size()) { + // Read component + auto beg = i; + while (i < path.size() && path[i] != '/') { + if (path[i] == '\0') { + return false; + } else if (path[i] == '\\') { + return false; + } + i++; + } + + auto len = i - beg; + assert(len > 0); + + if (!path.compare(beg, len, ".")) { + ; + } else if (!path.compare(beg, len, "..")) { + if (level == 0) { return false; } + level--; + } else { + level++; + } + + // Skip slash + while (i < path.size() && path[i] == '/') { + i++; + } + } + + return true; +} + +inline bool canonicalize_path(const char *path, std::string &resolved) { +#if defined(_WIN32) + char buf[_MAX_PATH]; + if (_fullpath(buf, path, _MAX_PATH) == nullptr) { return false; } + resolved = buf; +#elif defined(PATH_MAX) + char buf[PATH_MAX]; + if (realpath(path, buf) == nullptr) { return false; } + resolved = buf; +#else + auto buf = realpath(path, nullptr); + auto guard = scope_exit([&]() { std::free(buf); }); + if (buf == nullptr) { return false; } + resolved = buf; +#endif + return true; +} + +inline bool is_path_within_base(const std::string &resolved_path, + const std::string &resolved_base) { +#if defined(_WIN32) + return _strnicmp(resolved_path.c_str(), resolved_base.c_str(), + resolved_base.size()) == 0; +#else + return strncmp(resolved_path.c_str(), resolved_base.c_str(), + resolved_base.size()) == 0; +#endif +} + +inline FileStat::FileStat(const std::string &path) { +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path.c_str()); + ret_ = _wstat(wpath.c_str(), &st_); +#else + ret_ = stat(path.c_str(), &st_); +#endif +} +inline bool FileStat::is_file() const { + return ret_ >= 0 && S_ISREG(st_.st_mode); +} +inline bool FileStat::is_dir() const { + return ret_ >= 0 && S_ISDIR(st_.st_mode); +} + +inline time_t FileStat::mtime() const { + return ret_ >= 0 ? static_cast(st_.st_mtime) + : static_cast(-1); +} + +inline size_t FileStat::size() const { + return ret_ >= 0 ? static_cast(st_.st_size) : 0; +} + +inline std::string encode_path(const std::string &s) { + std::string result; + result.reserve(s.size()); + + for (size_t i = 0; s[i]; i++) { + switch (s[i]) { + case ' ': result += "%20"; break; + case '+': result += "%2B"; break; + case '\r': result += "%0D"; break; + case '\n': result += "%0A"; break; + case '\'': result += "%27"; break; + case ',': result += "%2C"; break; + // case ':': result += "%3A"; break; // ok? probably... + case ';': result += "%3B"; break; + default: + auto c = static_cast(s[i]); + if (c >= 0x80) { + result += '%'; + char hex[4]; + auto len = snprintf(hex, sizeof(hex) - 1, "%02X", c); + assert(len == 2); + result.append(hex, static_cast(len)); + } else { + result += s[i]; + } + break; + } + } + + return result; +} + +inline std::string file_extension(const std::string &path) { + std::smatch m; + thread_local auto re = std::regex("\\.([a-zA-Z0-9]+)$"); + if (std::regex_search(path, m, re)) { return m[1].str(); } + return std::string(); +} + +inline bool is_space_or_tab(char c) { return c == ' ' || c == '\t'; } + +template +inline bool parse_header(const char *beg, const char *end, T fn); + +template +inline bool parse_header(const char *beg, const char *end, T fn) { + // Skip trailing spaces and tabs. + while (beg < end && is_space_or_tab(end[-1])) { + end--; + } + + auto p = beg; + while (p < end && *p != ':') { + p++; + } + + auto name = std::string(beg, p); + if (!detail::fields::is_field_name(name)) { return false; } + + if (p == end) { return false; } + + auto key_end = p; + + if (*p++ != ':') { return false; } + + while (p < end && is_space_or_tab(*p)) { + p++; + } + + if (p <= end) { + auto key_len = key_end - beg; + if (!key_len) { return false; } + + auto key = std::string(beg, key_end); + auto val = std::string(p, end); + + if (!detail::fields::is_field_value(val)) { return false; } + + // RFC 9110 §5.5: header field values are opaque octets and MUST NOT be + // percent-decoded by the recipient. Applications that need to interpret a + // value as a URI component should call httplib::decode_uri_component() + // (or decode_path_component()) explicitly. + fn(key, val); + + return true; + } + + return false; +} + +inline bool parse_trailers(stream_line_reader &line_reader, Headers &dest, + const Headers &src_headers) { + // NOTE: In RFC 9112, '7.1 Chunked Transfer Coding' mentions "The chunked + // transfer coding is complete when a chunk with a chunk-size of zero is + // received, possibly followed by a trailer section, and finally terminated by + // an empty line". https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1 + // + // In '7.1.3. Decoding Chunked', however, the pseudo-code in the section + // doesn't care for the existence of the final CRLF. In other words, it seems + // to be ok whether the final CRLF exists or not in the chunked data. + // https://www.rfc-editor.org/rfc/rfc9112.html#section-7.1.3 + // + // According to the reference code in RFC 9112, cpp-httplib now allows + // chunked transfer coding data without the final CRLF. + + // RFC 7230 Section 4.1.2 - Headers prohibited in trailers + thread_local case_ignore::unordered_set prohibited_trailers = { + "transfer-encoding", + "content-length", + "host", + "authorization", + "www-authenticate", + "proxy-authenticate", + "proxy-authorization", + "cookie", + "set-cookie", + "cache-control", + "expect", + "max-forwards", + "pragma", + "range", + "te", + "age", + "expires", + "date", + "location", + "retry-after", + "vary", + "warning", + "content-encoding", + "content-type", + "content-range", + "trailer"}; + + case_ignore::unordered_set declared_trailers; + auto trailer_header = get_header_value(src_headers, "Trailer", "", 0); + if (trailer_header && std::strlen(trailer_header)) { + auto len = std::strlen(trailer_header); + split(trailer_header, trailer_header + len, ',', + [&](const char *b, const char *e) { + const char *kbeg = b; + const char *kend = e; + while (kbeg < kend && (*kbeg == ' ' || *kbeg == '\t')) { + ++kbeg; + } + while (kend > kbeg && (kend[-1] == ' ' || kend[-1] == '\t')) { + --kend; + } + std::string key(kbeg, static_cast(kend - kbeg)); + if (!key.empty() && + prohibited_trailers.find(key) == prohibited_trailers.end()) { + declared_trailers.insert(key); + } + }); + } + + size_t trailer_header_count = 0; + while (strcmp(line_reader.ptr(), "\r\n") != 0) { + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + if (trailer_header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } + + constexpr auto line_terminator_len = 2; + auto line_beg = line_reader.ptr(); + auto line_end = + line_reader.ptr() + line_reader.size() - line_terminator_len; + + if (!parse_header(line_beg, line_end, + [&](const std::string &key, const std::string &val) { + if (declared_trailers.find(key) != + declared_trailers.end()) { + dest.emplace(key, val); + trailer_header_count++; + } + })) { + return false; + } + + if (!line_reader.getline()) { return false; } + } + + return true; +} + +inline std::pair trim(const char *b, const char *e, size_t left, + size_t right) { + while (b + left < e && is_space_or_tab(b[left])) { + left++; + } + while (right > 0 && is_space_or_tab(b[right - 1])) { + right--; + } + return std::make_pair(left, right); +} + +inline std::string trim_copy(const std::string &s) { + auto r = trim(s.data(), s.data() + s.size(), 0, s.size()); + return s.substr(r.first, r.second - r.first); +} + +inline std::string trim_double_quotes_copy(const std::string &s) { + if (s.length() >= 2 && s.front() == '"' && s.back() == '"') { + return s.substr(1, s.size() - 2); + } + return s; +} + +inline void +divide(const char *data, std::size_t size, char d, + std::function + fn) { + const auto it = std::find(data, data + size, d); + const auto found = static_cast(it != data + size); + const auto lhs_data = data; + const auto lhs_size = static_cast(it - data); + const auto rhs_data = it + found; + const auto rhs_size = size - lhs_size - found; + + fn(lhs_data, lhs_size, rhs_data, rhs_size); +} + +inline void +divide(const std::string &str, char d, + std::function + fn) { + divide(str.data(), str.size(), d, std::move(fn)); +} + +inline void split(const char *b, const char *e, char d, + std::function fn) { + return split(b, e, d, (std::numeric_limits::max)(), std::move(fn)); +} + +inline void split(const char *b, const char *e, char d, size_t m, + std::function fn) { + size_t i = 0; + size_t beg = 0; + size_t count = 1; + + while (e ? (b + i < e) : (b[i] != '\0')) { + if (b[i] == d && count < m) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + beg = i + 1; + count++; + } + i++; + } + + if (i) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { fn(&b[r.first], &b[r.second]); } + } +} + +inline bool split_find(const char *b, const char *e, char d, size_t m, + std::function fn) { + size_t i = 0; + size_t beg = 0; + size_t count = 1; + + while (e ? (b + i < e) : (b[i] != '\0')) { + if (b[i] == d && count < m) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { + auto found = fn(&b[r.first], &b[r.second]); + if (found) { return true; } + } + beg = i + 1; + count++; + } + i++; + } + + if (i) { + auto r = trim(b, e, beg, i); + if (r.first < r.second) { + auto found = fn(&b[r.first], &b[r.second]); + if (found) { return true; } + } + } + + return false; +} + +inline bool split_find(const char *b, const char *e, char d, + std::function fn) { + return split_find(b, e, d, (std::numeric_limits::max)(), + std::move(fn)); +} + +inline stream_line_reader::stream_line_reader(Stream &strm, char *fixed_buffer, + size_t fixed_buffer_size) + : strm_(strm), fixed_buffer_(fixed_buffer), + fixed_buffer_size_(fixed_buffer_size) {} + +inline const char *stream_line_reader::ptr() const { + if (growable_buffer_.empty()) { + return fixed_buffer_; + } else { + return growable_buffer_.data(); + } +} + +inline size_t stream_line_reader::size() const { + if (growable_buffer_.empty()) { + return fixed_buffer_used_size_; + } else { + return growable_buffer_.size(); + } +} + +inline bool stream_line_reader::end_with_crlf() const { + auto end = ptr() + size(); + return size() >= 2 && end[-2] == '\r' && end[-1] == '\n'; +} + +inline bool stream_line_reader::getline() { + fixed_buffer_used_size_ = 0; + growable_buffer_.clear(); + +#ifndef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + char prev_byte = 0; +#endif + + for (size_t i = 0;; i++) { + if (size() >= CPPHTTPLIB_MAX_LINE_LENGTH) { + // Treat exceptionally long lines as an error to + // prevent infinite loops/memory exhaustion + return false; + } + char byte; + auto n = strm_.read(&byte, 1); + + if (n < 0) { + return false; + } else if (n == 0) { + if (i == 0) { + return false; + } else { + break; + } + } + + append(byte); + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + if (byte == '\n') { break; } +#else + if (prev_byte == '\r' && byte == '\n') { break; } + prev_byte = byte; +#endif + } + + return true; +} + +inline void stream_line_reader::append(char c) { + if (fixed_buffer_used_size_ < fixed_buffer_size_ - 1) { + fixed_buffer_[fixed_buffer_used_size_++] = c; + fixed_buffer_[fixed_buffer_used_size_] = '\0'; + } else { + if (growable_buffer_.empty()) { + assert(fixed_buffer_[fixed_buffer_used_size_] == '\0'); + growable_buffer_.assign(fixed_buffer_, fixed_buffer_used_size_); + } + growable_buffer_ += c; + } +} + +inline mmap::mmap(const char *path) { open(path); } + +inline mmap::~mmap() { close(); } + +inline bool mmap::open(const char *path) { + close(); + +#if defined(_WIN32) + auto wpath = u8string_to_wstring(path); + if (wpath.empty()) { return false; } + + hFile_ = + ::CreateFile2(wpath.c_str(), GENERIC_READ, + FILE_SHARE_READ | FILE_SHARE_WRITE, OPEN_EXISTING, NULL); + + if (hFile_ == INVALID_HANDLE_VALUE) { return false; } + + LARGE_INTEGER size{}; + if (!::GetFileSizeEx(hFile_, &size)) { return false; } + // If the following line doesn't compile due to QuadPart, update Windows SDK. + // See: + // https://github.com/yhirose/cpp-httplib/issues/1903#issuecomment-2316520721 + if (static_cast(size.QuadPart) > + (std::numeric_limits::max)()) { + // `size_t` might be 32-bits, on 32-bits Windows. + return false; + } + size_ = static_cast(size.QuadPart); + + hMapping_ = + ::CreateFileMappingFromApp(hFile_, NULL, PAGE_READONLY, size_, NULL); + + // Special treatment for an empty file... + if (hMapping_ == NULL && size_ == 0) { + close(); + is_open_empty_file = true; + return true; + } + + if (hMapping_ == NULL) { + close(); + return false; + } + + addr_ = ::MapViewOfFileFromApp(hMapping_, FILE_MAP_READ, 0, 0); + + if (addr_ == nullptr) { + close(); + return false; + } +#else + fd_ = ::open(path, O_RDONLY); + if (fd_ == -1) { return false; } + + struct stat sb; + if (fstat(fd_, &sb) == -1) { + close(); + return false; + } + size_ = static_cast(sb.st_size); + + addr_ = ::mmap(NULL, size_, PROT_READ, MAP_PRIVATE, fd_, 0); + + // Special treatment for an empty file... + if (addr_ == MAP_FAILED && size_ == 0) { + close(); + is_open_empty_file = true; + return false; + } +#endif + + return true; +} + +inline bool mmap::is_open() const { + return is_open_empty_file ? true : addr_ != nullptr; +} + +inline size_t mmap::size() const { return size_; } + +inline const char *mmap::data() const { + return is_open_empty_file ? "" : static_cast(addr_); +} + +inline void mmap::close() { +#if defined(_WIN32) + if (addr_) { + ::UnmapViewOfFile(addr_); + addr_ = nullptr; + } + + if (hMapping_) { + ::CloseHandle(hMapping_); + hMapping_ = NULL; + } + + if (hFile_ != INVALID_HANDLE_VALUE) { + ::CloseHandle(hFile_); + hFile_ = INVALID_HANDLE_VALUE; + } + + is_open_empty_file = false; +#else + if (addr_ != nullptr) { + munmap(addr_, size_); + addr_ = nullptr; + } + + if (fd_ != -1) { + ::close(fd_); + fd_ = -1; + } +#endif + size_ = 0; +} +inline int close_socket(socket_t sock) noexcept { +#ifdef _WIN32 + return closesocket(sock); +#else + return close(sock); +#endif +} + +template inline ssize_t handle_EINTR(T fn) { + ssize_t res = 0; + while (true) { + res = fn(); + if (res < 0 && errno == EINTR) { + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } + break; + } + return res; +} + +inline ssize_t read_socket(socket_t sock, void *ptr, size_t size, int flags) { + return handle_EINTR([&]() { + return recv(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline ssize_t send_socket(socket_t sock, const void *ptr, size_t size, + int flags) { + return handle_EINTR([&]() { + return send(sock, +#ifdef _WIN32 + static_cast(ptr), static_cast(size), +#else + ptr, size, +#endif + flags); + }); +} + +inline int poll_wrapper(struct pollfd *fds, nfds_t nfds, int timeout) { +#ifdef _WIN32 + return ::WSAPoll(fds, nfds, timeout); +#else + return ::poll(fds, nfds, timeout); +#endif +} + +inline ssize_t select_impl(socket_t sock, short events, time_t sec, + time_t usec) { + struct pollfd pfd; + pfd.fd = sock; + pfd.events = events; + pfd.revents = 0; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + return handle_EINTR([&]() { return poll_wrapper(&pfd, 1, timeout); }); +} + +inline ssize_t select_read(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, POLLIN, sec, usec); +} + +inline ssize_t select_write(socket_t sock, time_t sec, time_t usec) { + return select_impl(sock, POLLOUT, sec, usec); +} + +inline Error wait_until_socket_is_ready(socket_t sock, time_t sec, + time_t usec) { + struct pollfd pfd_read; + pfd_read.fd = sock; + pfd_read.events = POLLIN | POLLOUT; + pfd_read.revents = 0; + + auto timeout = static_cast(sec * 1000 + usec / 1000); + + auto poll_res = + handle_EINTR([&]() { return poll_wrapper(&pfd_read, 1, timeout); }); + + if (poll_res == 0) { return Error::ConnectionTimeout; } + + if (poll_res > 0 && pfd_read.revents & (POLLIN | POLLOUT)) { + auto error = 0; + socklen_t len = sizeof(error); + auto res = getsockopt(sock, SOL_SOCKET, SO_ERROR, + reinterpret_cast(&error), &len); + auto successful = res >= 0 && !error; + return successful ? Error::Success : Error::Connection; + } + + return Error::Connection; +} + +inline bool is_socket_alive(socket_t sock) { + const auto val = detail::select_read(sock, 0, 0); + if (val == 0) { + return true; + } else if (val < 0 && errno == EBADF) { + return false; + } + char buf[1]; + return detail::read_socket(sock, &buf[0], sizeof(buf), MSG_PEEK) > 0; +} + +class SocketStream final : public Stream { +public: + SocketStream(socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + bool is_peer_alive() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + void set_read_timeout(time_t sec, time_t usec = 0) override; + +private: + socket_t sock_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; + + std::vector read_buff_; + size_t read_buff_off_ = 0; + size_t read_buff_content_size_ = 0; + + static const size_t read_buff_size_ = 1024l * 4; +}; + +inline bool keep_alive(const std::atomic &svr_sock, socket_t sock, + time_t keep_alive_timeout_sec) { + using namespace std::chrono; + + const auto interval_usec = + CPPHTTPLIB_KEEPALIVE_TIMEOUT_CHECK_INTERVAL_USECOND; + + // Avoid expensive `steady_clock::now()` call for the first time + if (select_read(sock, 0, interval_usec) > 0) { return true; } + + const auto start = steady_clock::now() - microseconds{interval_usec}; + const auto timeout = seconds{keep_alive_timeout_sec}; + + while (true) { + if (svr_sock == INVALID_SOCKET) { + break; // Server socket is closed + } + + auto val = select_read(sock, 0, interval_usec); + if (val < 0) { + break; // Ssocket error + } else if (val == 0) { + if (steady_clock::now() - start > timeout) { + break; // Timeout + } + } else { + return true; // Ready for read + } + } + + return false; +} + +template +inline bool +process_server_socket_core(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, T callback) { + assert(keep_alive_max_count > 0); + auto ret = false; + auto count = keep_alive_max_count; + while (count > 0 && keep_alive(svr_sock, sock, keep_alive_timeout_sec)) { + auto close_connection = count == 1; + auto connection_closed = false; + ret = callback(close_connection, connection_closed); + if (!ret || connection_closed) { break; } + count--; + } + return ret; +} + +template +inline bool +process_server_socket(const std::atomic &svr_sock, socket_t sock, + size_t keep_alive_max_count, + time_t keep_alive_timeout_sec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +inline bool process_client_socket( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time, + std::function callback) { + SocketStream strm(sock, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +inline int shutdown_socket(socket_t sock) noexcept { +#ifdef _WIN32 + return shutdown(sock, SD_BOTH); +#else + return shutdown(sock, SHUT_RDWR); +#endif +} + +inline std::string escape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '\0') { + auto ret = s; + ret[0] = '@'; + return ret; + } + return s; +} + +inline std::string +unescape_abstract_namespace_unix_domain(const std::string &s) { + if (s.size() > 1 && s[0] == '@') { + auto ret = s; + ret[0] = '\0'; + return ret; + } + return s; +} + +inline int getaddrinfo_with_timeout(const char *node, const char *service, + const struct addrinfo *hints, + struct addrinfo **res, time_t timeout_sec) { +#ifdef CPPHTTPLIB_USE_NON_BLOCKING_GETADDRINFO + if (timeout_sec <= 0) { + // No timeout specified, use standard getaddrinfo + return getaddrinfo(node, service, hints, res); + } + +#ifdef _WIN32 + // Windows-specific implementation using GetAddrInfoEx with overlapped I/O + OVERLAPPED overlapped = {}; + HANDLE event = CreateEventW(nullptr, TRUE, FALSE, nullptr); + if (!event) { return EAI_FAIL; } + + overlapped.hEvent = event; + + PADDRINFOEXW result_addrinfo = nullptr; + HANDLE cancel_handle = nullptr; + + ADDRINFOEXW hints_ex = {}; + if (hints) { + hints_ex.ai_flags = hints->ai_flags; + hints_ex.ai_family = hints->ai_family; + hints_ex.ai_socktype = hints->ai_socktype; + hints_ex.ai_protocol = hints->ai_protocol; + } + + auto wnode = u8string_to_wstring(node); + auto wservice = u8string_to_wstring(service); + + auto ret = ::GetAddrInfoExW(wnode.data(), wservice.data(), NS_DNS, nullptr, + hints ? &hints_ex : nullptr, &result_addrinfo, + nullptr, &overlapped, nullptr, &cancel_handle); + + if (ret == WSA_IO_PENDING) { + auto wait_result = + ::WaitForSingleObject(event, static_cast(timeout_sec * 1000)); + if (wait_result == WAIT_TIMEOUT) { + if (cancel_handle) { ::GetAddrInfoExCancel(&cancel_handle); } + ::CloseHandle(event); + return EAI_AGAIN; + } + + DWORD bytes_returned; + if (!::GetOverlappedResult((HANDLE)INVALID_SOCKET, &overlapped, + &bytes_returned, FALSE)) { + ::CloseHandle(event); + return ::WSAGetLastError(); + } + } + + ::CloseHandle(event); + + if (ret == NO_ERROR || ret == WSA_IO_PENDING) { + *res = reinterpret_cast(result_addrinfo); + return 0; + } + + return ret; +#elif TARGET_OS_MAC && defined(__clang__) + if (!node) { return EAI_NONAME; } + // macOS implementation using CFHost API for asynchronous DNS resolution + CFStringRef hostname_ref = CFStringCreateWithCString( + kCFAllocatorDefault, node, kCFStringEncodingUTF8); + if (!hostname_ref) { return EAI_MEMORY; } + + CFHostRef host_ref = CFHostCreateWithName(kCFAllocatorDefault, hostname_ref); + CFRelease(hostname_ref); + if (!host_ref) { return EAI_MEMORY; } + + // Set up context for callback + struct CFHostContext { + bool completed = false; + bool success = false; + CFArrayRef addresses = nullptr; + std::mutex mutex; + std::condition_variable cv; + } context; + + CFHostClientContext client_context; + memset(&client_context, 0, sizeof(client_context)); + client_context.info = &context; + + // Set callback + auto callback = [](CFHostRef theHost, CFHostInfoType /*typeInfo*/, + const CFStreamError *error, void *info) { + auto ctx = static_cast(info); + std::lock_guard lock(ctx->mutex); + + if (error && error->error != 0) { + ctx->success = false; + } else { + Boolean hasBeenResolved; + ctx->addresses = CFHostGetAddressing(theHost, &hasBeenResolved); + if (ctx->addresses && hasBeenResolved) { + CFRetain(ctx->addresses); + ctx->success = true; + } else { + ctx->success = false; + } + } + ctx->completed = true; + ctx->cv.notify_one(); + }; + + if (!CFHostSetClient(host_ref, callback, &client_context)) { + CFRelease(host_ref); + return EAI_SYSTEM; + } + + // Schedule on run loop + CFRunLoopRef run_loop = CFRunLoopGetCurrent(); + CFHostScheduleWithRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + + // Start resolution + CFStreamError stream_error; + if (!CFHostStartInfoResolution(host_ref, kCFHostAddresses, &stream_error)) { + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFRelease(host_ref); + return EAI_FAIL; + } + + // Wait for completion with timeout + auto timeout_time = + std::chrono::steady_clock::now() + std::chrono::seconds(timeout_sec); + bool timed_out = false; + + { + std::unique_lock lock(context.mutex); + + while (!context.completed) { + auto now = std::chrono::steady_clock::now(); + if (now >= timeout_time) { + timed_out = true; + break; + } + + // Run the runloop for a short time + lock.unlock(); + CFRunLoopRunInMode(kCFRunLoopDefaultMode, 0.1, true); + lock.lock(); + } + } + + // Clean up + CFHostUnscheduleFromRunLoop(host_ref, run_loop, kCFRunLoopDefaultMode); + CFHostSetClient(host_ref, nullptr, nullptr); + + if (timed_out || !context.completed) { + CFHostCancelInfoResolution(host_ref, kCFHostAddresses); + CFRelease(host_ref); + return EAI_AGAIN; + } + + if (!context.success || !context.addresses) { + CFRelease(host_ref); + return EAI_NODATA; + } + + // Convert CFArray to addrinfo + CFIndex count = CFArrayGetCount(context.addresses); + if (count == 0) { + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_NODATA; + } + + struct addrinfo *result_addrinfo = nullptr; + struct addrinfo **current = &result_addrinfo; + + for (CFIndex i = 0; i < count; i++) { + CFDataRef addr_data = + static_cast(CFArrayGetValueAtIndex(context.addresses, i)); + if (!addr_data) continue; + + const struct sockaddr *sockaddr_ptr = + reinterpret_cast(CFDataGetBytePtr(addr_data)); + socklen_t sockaddr_len = static_cast(CFDataGetLength(addr_data)); + + // Allocate addrinfo structure + *current = static_cast(malloc(sizeof(struct addrinfo))); + if (!*current) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + + memset(*current, 0, sizeof(struct addrinfo)); + + // Set up addrinfo fields + (*current)->ai_family = sockaddr_ptr->sa_family; + (*current)->ai_socktype = hints ? hints->ai_socktype : SOCK_STREAM; + (*current)->ai_protocol = hints ? hints->ai_protocol : IPPROTO_TCP; + (*current)->ai_addrlen = sockaddr_len; + + // Copy sockaddr + (*current)->ai_addr = static_cast(malloc(sockaddr_len)); + if (!(*current)->ai_addr) { + freeaddrinfo(result_addrinfo); + CFRelease(context.addresses); + CFRelease(host_ref); + return EAI_MEMORY; + } + memcpy((*current)->ai_addr, sockaddr_ptr, sockaddr_len); + + // Set port if service is specified + if (service && *service) { + int port = 0; + if (parse_port(service, strlen(service), port)) { + if (sockaddr_ptr->sa_family == AF_INET) { + reinterpret_cast((*current)->ai_addr) + ->sin_port = htons(static_cast(port)); + } else if (sockaddr_ptr->sa_family == AF_INET6) { + reinterpret_cast((*current)->ai_addr) + ->sin6_port = htons(static_cast(port)); + } + } + } + + current = &((*current)->ai_next); + } + + CFRelease(context.addresses); + CFRelease(host_ref); + + *res = result_addrinfo; + return 0; +#elif defined(_GNU_SOURCE) && defined(__GLIBC__) && \ + (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2)) + // #2431: gai_cancel() is non-blocking and may return EAI_NOTCANCELED while + // the resolver worker still references the stack-local gaicb. The cancel + // path therefore waits (gai_suspend with no timeout) for the worker to + // actually finish before letting the stack frame go. The trade-off is that + // a wedged DNS server can hold this thread for the system resolver timeout + // (~30s by default) past the caller's connection timeout. + struct gaicb request {}; + struct gaicb *requests[1] = {&request}; + struct sigevent sevp {}; + struct timespec timeout { + timeout_sec, 0 + }; + + request.ar_name = node; + request.ar_service = service; + request.ar_request = hints; + sevp.sigev_notify = SIGEV_NONE; + + int rc = getaddrinfo_a(GAI_NOWAIT, requests, 1, &sevp); + if (rc != 0) { return rc; } + + auto cleanup = scope_exit([&] { + if (request.ar_result) { freeaddrinfo(request.ar_result); } + }); + + int wait_result = gai_suspend(requests, 1, &timeout); + + if (wait_result == 0 || wait_result == EAI_ALLDONE) { + int gai_result = gai_error(&request); + if (gai_result == 0) { + *res = request.ar_result; + request.ar_result = nullptr; + return 0; + } + return gai_result; + } + + gai_cancel(&request); + while (gai_error(&request) == EAI_INPROGRESS) { + gai_suspend(requests, 1, nullptr); + } + return wait_result; +#else + // Fallback implementation using thread-based timeout for other Unix systems. + + struct GetAddrInfoState { + ~GetAddrInfoState() { + if (info) { freeaddrinfo(info); } + } + + std::mutex mutex; + std::condition_variable result_cv; + bool completed = false; + int result = EAI_SYSTEM; + std::string node; + std::string service; + struct addrinfo hints; + struct addrinfo *info = nullptr; + }; + + // Allocate on the heap, so the resolver thread can keep using the data. + auto state = std::make_shared(); + if (node) { state->node = node; } + state->service = service; + state->hints = *hints; + + std::thread resolve_thread([state]() { + auto thread_result = + getaddrinfo(state->node.c_str(), state->service.c_str(), &state->hints, + &state->info); + + std::lock_guard lock(state->mutex); + state->result = thread_result; + state->completed = true; + state->result_cv.notify_one(); + }); + + // Wait for completion or timeout + std::unique_lock lock(state->mutex); + auto finished = + state->result_cv.wait_for(lock, std::chrono::seconds(timeout_sec), + [&] { return state->completed; }); + + if (finished) { + // Operation completed within timeout + resolve_thread.join(); + *res = state->info; + state->info = nullptr; // Pass ownership to caller + return state->result; + } else { + // Timeout occurred + resolve_thread.detach(); // Let the thread finish in background + return EAI_AGAIN; // Return timeout error + } +#endif +#else + (void)(timeout_sec); // Unused parameter for non-blocking getaddrinfo + return getaddrinfo(node, service, hints, res); +#endif +} + +template +socket_t create_socket(const std::string &host, const std::string &ip, int port, + int address_family, int socket_flags, bool tcp_nodelay, + bool ipv6_v6only, SocketOptions socket_options, + BindOrConnect bind_or_connect, time_t timeout_sec = 0) { + // Get address info + const char *node = nullptr; + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = IPPROTO_IP; + + if (!ip.empty()) { + node = ip.c_str(); + // Ask getaddrinfo to convert IP in c-string to address + hints.ai_family = AF_UNSPEC; + hints.ai_flags = AI_NUMERICHOST; + } else { + if (!host.empty()) { node = host.c_str(); } + hints.ai_family = address_family; + hints.ai_flags = socket_flags; + } + +#if !defined(_WIN32) || defined(CPPHTTPLIB_HAVE_AFUNIX_H) + if (hints.ai_family == AF_UNIX) { + const auto addrlen = host.length(); + if (addrlen > sizeof(sockaddr_un::sun_path)) { return INVALID_SOCKET; } + +#ifdef SOCK_CLOEXEC + auto sock = socket(hints.ai_family, hints.ai_socktype | SOCK_CLOEXEC, + hints.ai_protocol); +#else + auto sock = socket(hints.ai_family, hints.ai_socktype, hints.ai_protocol); +#endif + + if (sock != INVALID_SOCKET) { + sockaddr_un addr{}; + addr.sun_family = AF_UNIX; + + auto unescaped_host = unescape_abstract_namespace_unix_domain(host); + std::copy(unescaped_host.begin(), unescaped_host.end(), addr.sun_path); + + hints.ai_addr = reinterpret_cast(&addr); + hints.ai_addrlen = static_cast( + sizeof(addr) - sizeof(addr.sun_path) + addrlen); + +#ifndef SOCK_CLOEXEC +#ifndef _WIN32 + fcntl(sock, F_SETFD, FD_CLOEXEC); +#endif +#endif + + if (socket_options) { socket_options(sock); } + +#ifdef _WIN32 + // Setting SO_REUSEADDR seems not to work well with AF_UNIX on windows, so + // remove the option. + set_socket_opt(sock, SOL_SOCKET, SO_REUSEADDR, 0); +#endif + + bool dummy; + if (!bind_or_connect(sock, hints, dummy)) { + close_socket(sock); + sock = INVALID_SOCKET; + } + } + return sock; + } +#endif + + auto service = std::to_string(port); + + if (getaddrinfo_with_timeout(node, service.c_str(), &hints, &result, + timeout_sec)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return INVALID_SOCKET; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + // Create a socket +#ifdef _WIN32 + auto sock = + WSASocketW(rp->ai_family, rp->ai_socktype, rp->ai_protocol, nullptr, 0, + WSA_FLAG_NO_HANDLE_INHERIT | WSA_FLAG_OVERLAPPED); + /** + * Since the WSA_FLAG_NO_HANDLE_INHERIT is only supported on Windows 7 SP1 + * and above the socket creation fails on older Windows Systems. + * + * Let's try to create a socket the old way in this case. + * + * Reference: + * https://docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsasocketa + * + * WSA_FLAG_NO_HANDLE_INHERIT: + * This flag is supported on Windows 7 with SP1, Windows Server 2008 R2 with + * SP1, and later + * + */ + if (sock == INVALID_SOCKET) { + sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); + } +#else + +#ifdef SOCK_CLOEXEC + auto sock = + socket(rp->ai_family, rp->ai_socktype | SOCK_CLOEXEC, rp->ai_protocol); +#else + auto sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol); +#endif + +#endif + if (sock == INVALID_SOCKET) { continue; } + +#if !defined _WIN32 && !defined SOCK_CLOEXEC + if (fcntl(sock, F_SETFD, FD_CLOEXEC) == -1) { + close_socket(sock); + continue; + } +#endif + + if (tcp_nodelay) { set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); } + + if (rp->ai_family == AF_INET6) { + set_socket_opt(sock, IPPROTO_IPV6, IPV6_V6ONLY, ipv6_v6only ? 1 : 0); + } + + if (socket_options) { socket_options(sock); } + + // bind or connect + auto quit = false; + if (bind_or_connect(sock, *rp, quit)) { return sock; } + + close_socket(sock); + + if (quit) { break; } + } + + return INVALID_SOCKET; +} + +inline void set_nonblocking(socket_t sock, bool nonblocking) { +#ifdef _WIN32 + auto flags = nonblocking ? 1UL : 0UL; + ioctlsocket(sock, FIONBIO, &flags); +#else + auto flags = fcntl(sock, F_GETFL, 0); + fcntl(sock, F_SETFL, + nonblocking ? (flags | O_NONBLOCK) : (flags & (~O_NONBLOCK))); +#endif +} + +inline bool is_connection_error() { +#ifdef _WIN32 + return WSAGetLastError() != WSAEWOULDBLOCK; +#else + return errno != EINPROGRESS; +#endif +} + +inline bool bind_ip_address(socket_t sock, const std::string &host) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (getaddrinfo_with_timeout(host.c_str(), "0", &hints, &result, 0)) { + return false; + } + + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + auto ret = false; + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &ai = *rp; + if (!::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + ret = true; + break; + } + } + + return ret; +} + +#if !defined _WIN32 && !defined ANDROID && !defined _AIX && !defined __MVS__ +#define USE_IF2IP +#endif + +#ifdef USE_IF2IP +inline std::string if2ip(int address_family, const std::string &ifn) { + struct ifaddrs *ifap; + getifaddrs(&ifap); + auto se = detail::scope_exit([&] { freeifaddrs(ifap); }); + + std::string addr_candidate; + for (auto ifa = ifap; ifa; ifa = ifa->ifa_next) { + if (ifa->ifa_addr && ifn == ifa->ifa_name && + (AF_UNSPEC == address_family || + ifa->ifa_addr->sa_family == address_family)) { + if (ifa->ifa_addr->sa_family == AF_INET) { + auto sa = reinterpret_cast(ifa->ifa_addr); + char buf[INET_ADDRSTRLEN]; + if (inet_ntop(AF_INET, &sa->sin_addr, buf, INET_ADDRSTRLEN)) { + return std::string(buf, INET_ADDRSTRLEN); + } + } else if (ifa->ifa_addr->sa_family == AF_INET6) { + auto sa = reinterpret_cast(ifa->ifa_addr); + if (!IN6_IS_ADDR_LINKLOCAL(&sa->sin6_addr)) { + char buf[INET6_ADDRSTRLEN] = {}; + if (inet_ntop(AF_INET6, &sa->sin6_addr, buf, INET6_ADDRSTRLEN)) { + // equivalent to mac's IN6_IS_ADDR_UNIQUE_LOCAL + auto s6_addr_head = sa->sin6_addr.s6_addr[0]; + if (s6_addr_head == 0xfc || s6_addr_head == 0xfd) { + addr_candidate = std::string(buf, INET6_ADDRSTRLEN); + } else { + return std::string(buf, INET6_ADDRSTRLEN); + } + } + } + } + } + } + return addr_candidate; +} +#endif + +inline socket_t create_client_socket( + const std::string &host, const std::string &ip, int port, + int address_family, bool tcp_nodelay, bool ipv6_v6only, + SocketOptions socket_options, time_t connection_timeout_sec, + time_t connection_timeout_usec, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, const std::string &intf, Error &error) { + auto sock = create_socket( + host, ip, port, address_family, 0, tcp_nodelay, ipv6_v6only, + std::move(socket_options), + [&](socket_t sock2, struct addrinfo &ai, bool &quit) -> bool { + if (!intf.empty()) { +#ifdef USE_IF2IP + auto ip_from_if = if2ip(address_family, intf); + if (ip_from_if.empty()) { ip_from_if = intf; } + if (!bind_ip_address(sock2, ip_from_if)) { + error = Error::BindIPAddress; + return false; + } +#endif + } + + set_nonblocking(sock2, true); + + auto ret = + ::connect(sock2, ai.ai_addr, static_cast(ai.ai_addrlen)); + + if (ret < 0) { + if (is_connection_error()) { + error = Error::Connection; + return false; + } + error = wait_until_socket_is_ready(sock2, connection_timeout_sec, + connection_timeout_usec); + if (error != Error::Success) { + if (error == Error::ConnectionTimeout) { quit = true; } + return false; + } + } + + set_nonblocking(sock2, false); + set_socket_opt_time(sock2, SOL_SOCKET, SO_RCVTIMEO, read_timeout_sec, + read_timeout_usec); + set_socket_opt_time(sock2, SOL_SOCKET, SO_SNDTIMEO, write_timeout_sec, + write_timeout_usec); + + error = Error::Success; + return true; + }, + connection_timeout_sec); // Pass DNS timeout + + if (sock != INVALID_SOCKET) { + error = Error::Success; + } else { + if (error == Error::Success) { error = Error::Connection; } + } + + return sock; +} + +inline bool get_ip_and_port(const struct sockaddr_storage &addr, + socklen_t addr_len, std::string &ip, int &port) { + if (addr.ss_family == AF_INET) { + port = ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + port = + ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + return false; + } + + std::array ipstr{}; + if (getnameinfo(reinterpret_cast(&addr), addr_len, + ipstr.data(), static_cast(ipstr.size()), nullptr, + 0, NI_NUMERICHOST)) { + return false; + } + + ip = ipstr.data(); + return true; +} + +inline void get_local_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (!getsockname(sock, reinterpret_cast(&addr), + &addr_len)) { + get_ip_and_port(addr, addr_len, ip, port); + } +} + +inline void get_remote_ip_and_port(socket_t sock, std::string &ip, int &port) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + + if (!getpeername(sock, reinterpret_cast(&addr), + &addr_len)) { +#ifndef _WIN32 + if (addr.ss_family == AF_UNIX) { +#if defined(__linux__) + struct ucred ucred; + socklen_t len = sizeof(ucred); + if (getsockopt(sock, SOL_SOCKET, SO_PEERCRED, &ucred, &len) == 0) { + port = ucred.pid; + } +#elif defined(SOL_LOCAL) && defined(SO_PEERPID) + pid_t pid; + socklen_t len = sizeof(pid); + if (getsockopt(sock, SOL_LOCAL, SO_PEERPID, &pid, &len) == 0) { + port = pid; + } +#endif + return; + } +#endif + get_ip_and_port(addr, addr_len, ip, port); + } +} + +// Recursive form retained so operator""_t below can compute hashes for +// switch-case labels at compile time (C++11 constexpr forbids loops). Do not +// call from runtime paths with arbitrary-length inputs — use str2tag() +// instead, which is iterative and stack-safe. +inline constexpr unsigned int str2tag_core(const char *s, size_t l, + unsigned int h) { + return (l == 0) + ? h + : str2tag_core( + s + 1, l - 1, + // Unsets the 6 high bits of h, therefore no overflow happens + (((std::numeric_limits::max)() >> 6) & + h * 33) ^ + static_cast(*s)); +} + +inline unsigned int str2tag(const std::string &s) { + // Iterative form of str2tag_core: the recursive constexpr version is kept + // for compile-time UDL evaluation of short string literals, but at runtime + // we may receive arbitrarily long inputs (e.g. fuzzed Content-Type) that + // would blow the stack with one frame per character. + unsigned int h = 0; + for (auto c : s) { + h = (((std::numeric_limits::max)() >> 6) & h * 33) ^ + static_cast(c); + } + return h; +} + +namespace udl { + +inline constexpr unsigned int operator""_t(const char *s, size_t l) { + return str2tag_core(s, l, 0); +} + +} // namespace udl + +inline std::string +find_content_type(const std::string &path, + const std::map &user_data, + const std::string &default_content_type) { + auto ext = file_extension(path); + + auto it = user_data.find(ext); + if (it != user_data.end()) { return it->second; } + + using udl::operator""_t; + + switch (str2tag(ext)) { + default: return default_content_type; + + case "css"_t: return "text/css"; + case "csv"_t: return "text/csv"; + case "htm"_t: + case "html"_t: return "text/html"; + case "js"_t: + case "mjs"_t: return "text/javascript"; + case "txt"_t: return "text/plain"; + case "vtt"_t: return "text/vtt"; + + case "apng"_t: return "image/apng"; + case "avif"_t: return "image/avif"; + case "bmp"_t: return "image/bmp"; + case "gif"_t: return "image/gif"; + case "png"_t: return "image/png"; + case "svg"_t: return "image/svg+xml"; + case "webp"_t: return "image/webp"; + case "ico"_t: return "image/x-icon"; + case "tif"_t: return "image/tiff"; + case "tiff"_t: return "image/tiff"; + case "jpg"_t: + case "jpeg"_t: return "image/jpeg"; + + case "mp4"_t: return "video/mp4"; + case "mpeg"_t: return "video/mpeg"; + case "webm"_t: return "video/webm"; + + case "mp3"_t: return "audio/mp3"; + case "mpga"_t: return "audio/mpeg"; + case "weba"_t: return "audio/webm"; + case "wav"_t: return "audio/wave"; + + case "otf"_t: return "font/otf"; + case "ttf"_t: return "font/ttf"; + case "woff"_t: return "font/woff"; + case "woff2"_t: return "font/woff2"; + + case "7z"_t: return "application/x-7z-compressed"; + case "atom"_t: return "application/atom+xml"; + case "pdf"_t: return "application/pdf"; + case "json"_t: return "application/json"; + case "rss"_t: return "application/rss+xml"; + case "tar"_t: return "application/x-tar"; + case "xht"_t: + case "xhtml"_t: return "application/xhtml+xml"; + case "xslt"_t: return "application/xslt+xml"; + case "xml"_t: return "application/xml"; + case "gz"_t: return "application/gzip"; + case "zip"_t: return "application/zip"; + case "wasm"_t: return "application/wasm"; + } +} + +inline std::string +extract_media_type(const std::string &content_type, + std::map *params = nullptr) { + // Extract type/subtype from Content-Type value (RFC 2045) + // e.g. "application/json; charset=utf-8" -> "application/json" + auto media_type = content_type; + auto semicolon_pos = media_type.find(';'); + if (semicolon_pos != std::string::npos) { + auto param_str = media_type.substr(semicolon_pos + 1); + media_type = media_type.substr(0, semicolon_pos); + + if (params) { + // Parse parameters: key=value pairs separated by ';' + split(param_str.data(), param_str.data() + param_str.size(), ';', + [&](const char *b, const char *e) { + std::string key; + std::string val; + split(b, e, '=', [&](const char *b2, const char *e2) { + if (key.empty()) { + key.assign(b2, e2); + } else { + val.assign(b2, e2); + } + }); + if (!key.empty()) { + params->emplace(trim_copy(key), trim_double_quotes_copy(val)); + } + }); + } + } + + // Trim whitespace from media type + return trim_copy(media_type); +} + +inline bool can_compress_content_type(const std::string &content_type) { + using udl::operator""_t; + + auto mime_type = extract_media_type(content_type); + auto tag = str2tag(mime_type); + + switch (tag) { + case "image/svg+xml"_t: + case "application/javascript"_t: + case "application/x-javascript"_t: + case "application/json"_t: + case "application/ld+json"_t: + case "application/xml"_t: + case "application/xhtml+xml"_t: + case "application/rss+xml"_t: + case "application/atom+xml"_t: + case "application/xslt+xml"_t: + case "application/protobuf"_t: return true; + + case "text/event-stream"_t: return false; + + default: return !mime_type.rfind("text/", 0); + } +} + +inline bool parse_quality(const char *b, const char *e, std::string &token, + double &quality) { + quality = 1.0; + token.clear(); + + // Split on first ';': left = token name, right = parameters + const char *params_b = nullptr; + std::size_t params_len = 0; + + divide( + b, static_cast(e - b), ';', + [&](const char *lb, std::size_t llen, const char *rb, std::size_t rlen) { + auto r = trim(lb, lb + llen, 0, llen); + if (r.first < r.second) { token.assign(lb + r.first, lb + r.second); } + params_b = rb; + params_len = rlen; + }); + + if (token.empty()) { return false; } + if (params_len == 0) { return true; } + + // Scan parameters for q= (stops on first match) + bool invalid = false; + split_find(params_b, params_b + params_len, ';', + (std::numeric_limits::max)(), + [&](const char *pb, const char *pe) -> bool { + // Match exactly "q=" or "Q=" (not "query=" etc.) + auto len = static_cast(pe - pb); + if (len < 2) { return false; } + if ((pb[0] != 'q' && pb[0] != 'Q') || pb[1] != '=') { + return false; + } + + // Trim the value portion + auto r = trim(pb, pe, 2, len); + if (r.first >= r.second) { + invalid = true; + return true; + } + + double v = 0.0; + auto res = from_chars(pb + r.first, pb + r.second, v); + if (res.ec != std::errc{} || v < 0.0 || v > 1.0) { + invalid = true; + return true; + } + quality = v; + return true; + }); + + return !invalid; +} + +inline EncodingType encoding_type(const Request &req, const Response &res) { + if (!can_compress_content_type(res.get_header_value("Content-Type"))) { + return EncodingType::None; + } + + const auto &s = req.get_header_value("Accept-Encoding"); + if (s.empty()) { return EncodingType::None; } + + // Single-pass: iterate tokens and track the best supported encoding. + // Server preference breaks ties (br > gzip > zstd). + EncodingType best = EncodingType::None; + double best_q = 0.0; // q=0 means "not acceptable" + + // Server preference: Brotli > Gzip > Zstd (lower = more preferred) + auto priority = [](EncodingType t) -> int { + switch (t) { + case EncodingType::Brotli: return 0; + case EncodingType::Gzip: return 1; + case EncodingType::Zstd: return 2; + default: return 3; + } + }; + + std::string name; + split(s.data(), s.data() + s.size(), ',', [&](const char *b, const char *e) { + double quality = 1.0; + if (!parse_quality(b, e, name, quality)) { return; } + if (quality <= 0.0) { return; } + + EncodingType type = EncodingType::None; +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + if (case_ignore::equal(name, "br")) { type = EncodingType::Brotli; } +#endif +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (type == EncodingType::None && case_ignore::equal(name, "gzip")) { + type = EncodingType::Gzip; + } +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (type == EncodingType::None && case_ignore::equal(name, "zstd")) { + type = EncodingType::Zstd; + } +#endif + + if (type == EncodingType::None) { return; } + + // Higher q-value wins; for equal q, server preference breaks ties + if (quality > best_q || + (quality == best_q && priority(type) < priority(best))) { + best_q = quality; + best = type; + } + }); + + return best; +} + +inline std::unique_ptr make_compressor(EncodingType type) { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (type == EncodingType::Gzip) { + return detail::make_unique(); + } +#endif +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + if (type == EncodingType::Brotli) { + return detail::make_unique(); + } +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (type == EncodingType::Zstd) { + return detail::make_unique(); + } +#endif + (void)type; + return nullptr; +} + +inline const char *encoding_name(EncodingType type) { + switch (type) { + case EncodingType::Gzip: return "gzip"; + case EncodingType::Brotli: return "br"; + case EncodingType::Zstd: return "zstd"; + default: return ""; + } +} + +inline bool nocompressor::compress(const char *data, size_t data_length, + bool /*last*/, Callback callback) { + if (!data_length) { return true; } + return callback(data, data_length); +} + +#ifdef CPPHTTPLIB_ZLIB_SUPPORT +inline gzip_compressor::gzip_compressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + is_valid_ = deflateInit2(&strm_, Z_DEFAULT_COMPRESSION, Z_DEFLATED, 31, 8, + Z_DEFAULT_STRATEGY) == Z_OK; +} + +inline gzip_compressor::~gzip_compressor() { deflateEnd(&strm_); } + +inline bool gzip_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + assert(is_valid_); + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + auto flush = (last && data_length == 0) ? Z_FINISH : Z_NO_FLUSH; + auto ret = Z_OK; + + std::array buff{}; + do { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = deflate(&strm_, flush); + if (ret == Z_STREAM_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } while (strm_.avail_out == 0); + + assert((flush == Z_FINISH && ret == Z_STREAM_END) || + (flush == Z_NO_FLUSH && ret == Z_OK)); + assert(strm_.avail_in == 0); + } while (data_length > 0); + + return true; +} + +inline gzip_decompressor::gzip_decompressor() { + std::memset(&strm_, 0, sizeof(strm_)); + strm_.zalloc = Z_NULL; + strm_.zfree = Z_NULL; + strm_.opaque = Z_NULL; + + // 15 is the value of wbits, which should be at the maximum possible value + // to ensure that any gzip stream can be decoded. The offset of 32 specifies + // that the stream type should be automatically detected either gzip or + // deflate. + is_valid_ = inflateInit2(&strm_, 32 + 15) == Z_OK; +} + +inline gzip_decompressor::~gzip_decompressor() { inflateEnd(&strm_); } + +inline bool gzip_decompressor::is_valid() const { return is_valid_; } + +inline bool gzip_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + assert(is_valid_); + + auto ret = Z_OK; + + do { + constexpr size_t max_avail_in = + (std::numeric_limits::max)(); + + strm_.avail_in = static_cast( + (std::min)(data_length, max_avail_in)); + strm_.next_in = const_cast(reinterpret_cast(data)); + + data_length -= strm_.avail_in; + data += strm_.avail_in; + + std::array buff{}; + while (strm_.avail_in > 0 && ret == Z_OK) { + strm_.avail_out = static_cast(buff.size()); + strm_.next_out = reinterpret_cast(buff.data()); + + ret = inflate(&strm_, Z_NO_FLUSH); + + assert(ret != Z_STREAM_ERROR); + switch (ret) { + case Z_NEED_DICT: + case Z_DATA_ERROR: + case Z_MEM_ERROR: inflateEnd(&strm_); return false; + } + + if (!callback(buff.data(), buff.size() - strm_.avail_out)) { + return false; + } + } + + if (ret != Z_OK && ret != Z_STREAM_END) { return false; } + + } while (data_length > 0); + + return true; +} +#endif + +#ifdef CPPHTTPLIB_BROTLI_SUPPORT +inline brotli_compressor::brotli_compressor() { + state_ = BrotliEncoderCreateInstance(nullptr, nullptr, nullptr); +} + +inline brotli_compressor::~brotli_compressor() { + BrotliEncoderDestroyInstance(state_); +} + +inline bool brotli_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + auto operation = last ? BROTLI_OPERATION_FINISH : BROTLI_OPERATION_PROCESS; + auto available_in = data_length; + auto next_in = reinterpret_cast(data); + + for (;;) { + if (last) { + if (BrotliEncoderIsFinished(state_)) { break; } + } else { + if (!available_in) { break; } + } + + auto available_out = buff.size(); + auto next_out = buff.data(); + + if (!BrotliEncoderCompressStream(state_, operation, &available_in, &next_in, + &available_out, &next_out, nullptr)) { + return false; + } + + auto output_bytes = buff.size() - available_out; + if (output_bytes) { + callback(reinterpret_cast(buff.data()), output_bytes); + } + } + + return true; +} + +inline brotli_decompressor::brotli_decompressor() { + decoder_s = BrotliDecoderCreateInstance(0, 0, 0); + decoder_r = decoder_s ? BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT + : BROTLI_DECODER_RESULT_ERROR; +} + +inline brotli_decompressor::~brotli_decompressor() { + if (decoder_s) { BrotliDecoderDestroyInstance(decoder_s); } +} + +inline bool brotli_decompressor::is_valid() const { return decoder_s; } + +inline bool brotli_decompressor::decompress(const char *data, + size_t data_length, + Callback callback) { + if (decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_ERROR) { + return 0; + } + + auto next_in = reinterpret_cast(data); + size_t avail_in = data_length; + size_t total_out; + + decoder_r = BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT; + + std::array buff{}; + while (decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT) { + char *next_out = buff.data(); + size_t avail_out = buff.size(); + + decoder_r = BrotliDecoderDecompressStream( + decoder_s, &avail_in, &next_in, &avail_out, + reinterpret_cast(&next_out), &total_out); + + if (decoder_r == BROTLI_DECODER_RESULT_ERROR) { return false; } + + if (!callback(buff.data(), buff.size() - avail_out)) { return false; } + } + + return decoder_r == BROTLI_DECODER_RESULT_SUCCESS || + decoder_r == BROTLI_DECODER_RESULT_NEEDS_MORE_INPUT; +} +#endif + +#ifdef CPPHTTPLIB_ZSTD_SUPPORT +inline zstd_compressor::zstd_compressor() { + ctx_ = ZSTD_createCCtx(); + ZSTD_CCtx_setParameter(ctx_, ZSTD_c_compressionLevel, ZSTD_fast); +} + +inline zstd_compressor::~zstd_compressor() { ZSTD_freeCCtx(ctx_); } + +inline bool zstd_compressor::compress(const char *data, size_t data_length, + bool last, Callback callback) { + std::array buff{}; + + ZSTD_EndDirective mode = last ? ZSTD_e_end : ZSTD_e_continue; + ZSTD_inBuffer input = {data, data_length, 0}; + + bool finished; + do { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_compressStream2(ctx_, &output, &input, mode); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + + finished = last ? (remaining == 0) : (input.pos == input.size); + + } while (!finished); + + return true; +} + +inline zstd_decompressor::zstd_decompressor() { ctx_ = ZSTD_createDCtx(); } + +inline zstd_decompressor::~zstd_decompressor() { ZSTD_freeDCtx(ctx_); } + +inline bool zstd_decompressor::is_valid() const { return ctx_ != nullptr; } + +inline bool zstd_decompressor::decompress(const char *data, size_t data_length, + Callback callback) { + std::array buff{}; + ZSTD_inBuffer input = {data, data_length, 0}; + + while (input.pos < input.size) { + ZSTD_outBuffer output = {buff.data(), CPPHTTPLIB_COMPRESSION_BUFSIZ, 0}; + size_t const remaining = ZSTD_decompressStream(ctx_, &output, &input); + + if (ZSTD_isError(remaining)) { return false; } + + if (!callback(buff.data(), output.pos)) { return false; } + } + + return true; +} +#endif + +inline std::unique_ptr +create_decompressor(const std::string &encoding) { + std::unique_ptr decompressor; + + if (encoding == "gzip" || encoding == "deflate") { +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + decompressor = detail::make_unique(); +#endif + } else if (encoding.find("br") != std::string::npos) { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + decompressor = detail::make_unique(); +#endif + } else if (encoding == "zstd" || encoding.find("zstd") != std::string::npos) { +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + decompressor = detail::make_unique(); +#endif + } + + return decompressor; +} + +// Returns the best available compressor and its Content-Encoding name. +// Priority: Brotli > Gzip > Zstd (matches server-side preference). +inline std::pair, const char *> +create_compressor() { +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + return {detail::make_unique(), "br"}; +#elif defined(CPPHTTPLIB_ZLIB_SUPPORT) + return {detail::make_unique(), "gzip"}; +#elif defined(CPPHTTPLIB_ZSTD_SUPPORT) + return {detail::make_unique(), "zstd"}; +#else + return {nullptr, nullptr}; +#endif +} + +inline bool is_prohibited_header_name(const std::string &name) { + using udl::operator""_t; + + switch (str2tag(name)) { + case "REMOTE_ADDR"_t: + case "REMOTE_PORT"_t: + case "LOCAL_ADDR"_t: + case "LOCAL_PORT"_t: return true; + default: return false; + } +} + +inline bool has_header(const Headers &headers, const std::string &key) { + if (is_prohibited_header_name(key)) { return false; } + return headers.find(key) != headers.end(); +} + +inline const char *get_header_value(const Headers &headers, + const std::string &key, const char *def, + size_t id) { + if (is_prohibited_header_name(key)) { +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "Prohibited header name '" + key + "' is specified."; + throw std::invalid_argument(msg); +#else + return ""; +#endif + } + + auto rng = headers.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.c_str(); } + return def; +} + +inline size_t get_header_value_count(const Headers &headers, + const std::string &key) { + auto r = headers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +template +inline typename Map::mapped_type +get_multimap_value(const Map &m, const std::string &key, size_t id) { + auto rng = m.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second; } + return typename Map::mapped_type(); +} + +inline void set_header(Headers &headers, const std::string &key, + const std::string &val) { + if (fields::is_field_name(key) && fields::is_field_value(val)) { + headers.emplace(key, val); + } +} + +inline bool read_headers(Stream &strm, Headers &headers) { + const auto bufsiz = 2048; + char buf[bufsiz]; + stream_line_reader line_reader(strm, buf, bufsiz); + + size_t header_count = 0; + + for (;;) { + if (!line_reader.getline()) { return false; } + + // Check if the line ends with CRLF. + auto line_terminator_len = 2; + if (line_reader.end_with_crlf()) { + // Blank line indicates end of headers. + if (line_reader.size() == 2) { break; } + } else { +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + // Blank line indicates end of headers. + if (line_reader.size() == 1) { break; } + line_terminator_len = 1; +#else + continue; // Skip invalid line. +#endif + } + + if (line_reader.size() > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + + // Check header count limit + if (header_count >= CPPHTTPLIB_HEADER_MAX_COUNT) { return false; } + + // Exclude line terminator + auto end = line_reader.ptr() + line_reader.size() - line_terminator_len; + + if (!parse_header(line_reader.ptr(), end, + [&](const std::string &key, const std::string &val) { + headers.emplace(key, val); + })) { + return false; + } + + header_count++; + } + + // RFC 9110 Section 8.6: Reject requests with multiple Content-Length + // headers that have different values to prevent request smuggling. + auto cl_range = headers.equal_range("Content-Length"); + if (cl_range.first != cl_range.second) { + const auto &first_val = cl_range.first->second; + for (auto it = std::next(cl_range.first); it != cl_range.second; ++it) { + if (it->second != first_val) { return false; } + } + } + + return true; +} + +inline bool read_websocket_upgrade_response(Stream &strm, + const std::string &expected_accept, + std::string &selected_subprotocol) { + // Read status line + const auto bufsiz = 2048; + char buf[bufsiz]; + stream_line_reader line_reader(strm, buf, bufsiz); + if (!line_reader.getline()) { return false; } + + // Check for "HTTP/1.1 101" + auto line = std::string(line_reader.ptr(), line_reader.size()); + if (line.find("HTTP/1.1 101") == std::string::npos) { return false; } + + // Parse headers using existing read_headers + Headers headers; + if (!read_headers(strm, headers)) { return false; } + + // Verify Upgrade: websocket (case-insensitive) + auto upgrade_it = headers.find("Upgrade"); + if (upgrade_it == headers.end()) { return false; } + auto upgrade_val = case_ignore::to_lower(upgrade_it->second); + if (upgrade_val != "websocket") { return false; } + + // Verify Connection header contains "Upgrade" (case-insensitive) + auto connection_it = headers.find("Connection"); + if (connection_it == headers.end()) { return false; } + auto connection_val = case_ignore::to_lower(connection_it->second); + if (connection_val.find("upgrade") == std::string::npos) { return false; } + + // Verify Sec-WebSocket-Accept header value + auto it = headers.find("Sec-WebSocket-Accept"); + if (it == headers.end() || it->second != expected_accept) { return false; } + + // Extract negotiated subprotocol + auto proto_it = headers.find("Sec-WebSocket-Protocol"); + if (proto_it != headers.end()) { selected_subprotocol = proto_it->second; } + + return true; +} + +enum class ReadContentResult { + Success, // Successfully read the content + PayloadTooLarge, // The content exceeds the specified payload limit + Error // An error occurred while reading the content +}; + +inline ReadContentResult read_content_with_length( + Stream &strm, size_t len, DownloadProgress progress, + ContentReceiverWithProgress out, + size_t payload_max_length = (std::numeric_limits::max)()) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + + detail::BodyReader br; + br.stream = &strm; + br.has_content_length = true; + br.content_length = len; + br.payload_max_length = payload_max_length; + br.chunked = false; + br.bytes_read = 0; + br.last_error = Error::Success; + + size_t r = 0; + while (r < len) { + auto read_len = static_cast(len - r); + auto to_read = (std::min)(read_len, CPPHTTPLIB_RECV_BUFSIZ); + auto n = detail::read_body_content(&strm, br, buf, to_read); + if (n <= 0) { + // Check if it was a payload size error + if (br.last_error == Error::ExceedMaxPayloadSize) { + return ReadContentResult::PayloadTooLarge; + } + return ReadContentResult::Error; + } + + if (!out(buf, static_cast(n), r, len)) { + return ReadContentResult::Error; + } + r += static_cast(n); + + if (progress) { + if (!progress(r, len)) { return ReadContentResult::Error; } + } + } + + return ReadContentResult::Success; +} + +inline ReadContentResult +read_content_without_length(Stream &strm, size_t payload_max_length, + ContentReceiverWithProgress out) { + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + size_t r = 0; + for (;;) { + auto n = strm.read(buf, CPPHTTPLIB_RECV_BUFSIZ); + if (n == 0) { return ReadContentResult::Success; } + if (n < 0) { return ReadContentResult::Error; } + + // Check if adding this data would exceed the payload limit + if (r > payload_max_length || + payload_max_length - r < static_cast(n)) { + return ReadContentResult::PayloadTooLarge; + } + + if (!out(buf, static_cast(n), r, 0)) { + return ReadContentResult::Error; + } + r += static_cast(n); + } + + return ReadContentResult::Success; +} + +template +inline ReadContentResult read_content_chunked(Stream &strm, T &x, + size_t payload_max_length, + ContentReceiverWithProgress out) { + detail::ChunkedDecoder dec(strm); + + char buf[CPPHTTPLIB_RECV_BUFSIZ]; + size_t total_len = 0; + + for (;;) { + size_t chunk_offset = 0; + size_t chunk_total = 0; + auto n = dec.read_payload(buf, sizeof(buf), chunk_offset, chunk_total); + if (n < 0) { return ReadContentResult::Error; } + + if (n == 0) { + if (!dec.parse_trailers_into(x.trailers, x.headers)) { + return ReadContentResult::Error; + } + return ReadContentResult::Success; + } + + if (total_len > payload_max_length || + payload_max_length - total_len < static_cast(n)) { + return ReadContentResult::PayloadTooLarge; + } + + if (!out(buf, static_cast(n), chunk_offset, chunk_total)) { + return ReadContentResult::Error; + } + + total_len += static_cast(n); + } +} + +inline bool is_chunked_transfer_encoding(const Headers &headers) { + return case_ignore::equal( + get_header_value(headers, "Transfer-Encoding", "", 0), "chunked"); +} + +template +bool prepare_content_receiver(T &x, int &status, + ContentReceiverWithProgress receiver, + bool decompress, size_t payload_max_length, + bool &exceed_payload_max_length, U callback) { + if (decompress) { + std::string encoding = x.get_header_value("Content-Encoding"); + std::unique_ptr decompressor; + + if (!encoding.empty()) { + decompressor = detail::create_decompressor(encoding); + if (!decompressor) { + // Unsupported encoding or no support compiled in + status = StatusCode::UnsupportedMediaType_415; + return false; + } + } + + if (decompressor) { + if (decompressor->is_valid()) { + size_t decompressed_size = 0; + ContentReceiverWithProgress out = [&](const char *buf, size_t n, + size_t off, size_t len) { + return decompressor->decompress( + buf, n, [&](const char *buf2, size_t n2) { + // Guard against zip-bomb: check + // decompressed size against limit. + if (payload_max_length > 0 && + (decompressed_size >= payload_max_length || + n2 > payload_max_length - decompressed_size)) { + exceed_payload_max_length = true; + return false; + } + decompressed_size += n2; + return receiver(buf2, n2, off, len); + }); + }; + return callback(std::move(out)); + } else { + status = StatusCode::InternalServerError_500; + return false; + } + } + } + + ContentReceiverWithProgress out = [&](const char *buf, size_t n, size_t off, + size_t len) { + return receiver(buf, n, off, len); + }; + return callback(std::move(out)); +} + +template +bool read_content(Stream &strm, T &x, size_t payload_max_length, int &status, + DownloadProgress progress, + ContentReceiverWithProgress receiver, bool decompress) { + bool exceed_payload_max_length = false; + return prepare_content_receiver( + x, status, std::move(receiver), decompress, payload_max_length, + exceed_payload_max_length, [&](const ContentReceiverWithProgress &out) { + auto ret = true; + // Note: exceed_payload_max_length may also be set by the decompressor + // wrapper in prepare_content_receiver when the decompressed payload + // size exceeds the limit. + + if (is_chunked_transfer_encoding(x.headers)) { + auto result = read_content_chunked(strm, x, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } + } else if (!has_header(x.headers, "Content-Length")) { + auto result = + read_content_without_length(strm, payload_max_length, out); + if (result == ReadContentResult::Success) { + ret = true; + } else if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + ret = false; + } else { + ret = false; + } + } else { + auto is_invalid_value = false; + auto len = get_header_value_u64(x.headers, "Content-Length", + (std::numeric_limits::max)(), + 0, is_invalid_value); + + if (is_invalid_value) { + ret = false; + } else if (len > 0) { + auto result = read_content_with_length( + strm, len, std::move(progress), out, payload_max_length); + ret = (result == ReadContentResult::Success); + if (result == ReadContentResult::PayloadTooLarge) { + exceed_payload_max_length = true; + } + } + } + + if (!ret) { + status = exceed_payload_max_length ? StatusCode::PayloadTooLarge_413 + : StatusCode::BadRequest_400; + } + return ret; + }); +} + +inline ssize_t write_request_line(Stream &strm, const std::string &method, + const std::string &path) { + std::string s = method; + s += ' '; + s += path; + s += " HTTP/1.1\r\n"; + return strm.write(s.data(), s.size()); +} + +inline ssize_t write_response_line(Stream &strm, int status) { + std::string s = "HTTP/1.1 "; + s += std::to_string(status); + s += ' '; + s += httplib::status_message(status); + s += "\r\n"; + return strm.write(s.data(), s.size()); +} + +inline ssize_t write_headers(Stream &strm, const Headers &headers) { + ssize_t write_len = 0; + for (const auto &x : headers) { + std::string s; + s = x.first; + s += ": "; + s += x.second; + s += "\r\n"; + + auto len = strm.write(s.data(), s.size()); + if (len < 0) { return len; } + write_len += len; + } + auto len = strm.write("\r\n"); + if (len < 0) { return len; } + write_len += len; + return write_len; +} + +inline bool write_data(Stream &strm, const char *d, size_t l) { + size_t offset = 0; + while (offset < l) { + auto length = strm.write(d + offset, l - offset); + if (length < 0) { return false; } + offset += static_cast(length); + } + return true; +} + +template +inline bool write_content_with_progress(Stream &strm, + const ContentProvider &content_provider, + size_t offset, size_t length, + T is_shutting_down, + const UploadProgress &upload_progress, + Error &error) { + size_t end_offset = offset + length; + size_t start_offset = offset; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + if (write_data(strm, d, l)) { + offset += l; + + if (upload_progress && length > 0) { + size_t current_written = offset - start_offset; + if (!upload_progress(current_written, length)) { + ok = false; + return false; + } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.is_peer_alive(); }; + + while (offset < end_offset && !is_shutting_down()) { + if (!strm.wait_writable() || !strm.is_peer_alive()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, end_offset - offset, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + if (offset < end_offset) { // exited due to is_shutting_down(), not completion + error = Error::Write; + return false; + } + + error = Error::Success; + return true; +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, T is_shutting_down, + Error &error) { + return write_content_with_progress(strm, content_provider, offset, length, + is_shutting_down, nullptr, error); +} + +template +inline bool write_content(Stream &strm, const ContentProvider &content_provider, + size_t offset, size_t length, + const T &is_shutting_down) { + auto error = Error::Success; + return write_content(strm, content_provider, offset, length, is_shutting_down, + error); +} + +template +inline bool +write_content_without_length(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + offset += l; + if (!write_data(strm, d, l)) { ok = false; } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.is_peer_alive(); }; + + data_sink.done = [&](void) { data_available = false; }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable() || !strm.is_peer_alive()) { + return false; + } else if (!content_provider(offset, 0, data_sink)) { + return false; + } else if (!ok) { + return false; + } + } + return !data_available; // true only if done() was called, false if shutting + // down +} + +template +inline bool +write_content_chunked(Stream &strm, const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor, Error &error) { + size_t offset = 0; + auto data_available = true; + auto ok = true; + DataSink data_sink; + + data_sink.write = [&](const char *d, size_t l) -> bool { + if (ok) { + data_available = l > 0; + offset += l; + + std::string payload; + if (compressor.compress(d, l, false, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = + from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { ok = false; } + } + } else { + ok = false; + } + } + return ok; + }; + + data_sink.is_writable = [&]() -> bool { return strm.is_peer_alive(); }; + + auto done_with_trailer = [&](const Headers *trailer) { + if (!ok) { return; } + + data_available = false; + + std::string payload; + if (!compressor.compress(nullptr, 0, true, + [&](const char *data, size_t data_len) { + payload.append(data, data_len); + return true; + })) { + ok = false; + return; + } + + if (!payload.empty()) { + // Emit chunked response header and footer for each chunk + auto chunk = from_i_to_hex(payload.size()) + "\r\n" + payload + "\r\n"; + if (!write_data(strm, chunk.data(), chunk.size())) { + ok = false; + return; + } + } + + constexpr const char done_marker[] = "0\r\n"; + if (!write_data(strm, done_marker, str_len(done_marker))) { ok = false; } + + // Trailer + if (trailer) { + for (const auto &kv : *trailer) { + std::string field_line = kv.first + ": " + kv.second + "\r\n"; + if (!write_data(strm, field_line.data(), field_line.size())) { + ok = false; + } + } + } + + constexpr const char crlf[] = "\r\n"; + if (!write_data(strm, crlf, str_len(crlf))) { ok = false; } + }; + + data_sink.done = [&](void) { done_with_trailer(nullptr); }; + + data_sink.done_with_trailer = [&](const Headers &trailer) { + done_with_trailer(&trailer); + }; + + while (data_available && !is_shutting_down()) { + if (!strm.wait_writable() || !strm.is_peer_alive()) { + error = Error::Write; + return false; + } else if (!content_provider(offset, 0, data_sink)) { + error = Error::Canceled; + return false; + } else if (!ok) { + error = Error::Write; + return false; + } + } + + if (data_available) { // exited due to is_shutting_down(), not done() + error = Error::Write; + return false; + } + + error = Error::Success; + return true; +} + +template +inline bool write_content_chunked(Stream &strm, + const ContentProvider &content_provider, + const T &is_shutting_down, U &compressor) { + auto error = Error::Success; + return write_content_chunked(strm, content_provider, is_shutting_down, + compressor, error); +} + +template +inline bool redirect(T &cli, Request &req, Response &res, + const std::string &path, const std::string &location, + Error &error) { + Request new_req = req; + new_req.path = path; + new_req.redirect_count_ -= 1; + + if (res.status == StatusCode::SeeOther_303 && + (req.method != "GET" && req.method != "HEAD")) { + new_req.method = "GET"; + new_req.body.clear(); + new_req.headers.clear(); + } + + Response new_res; + + auto ret = cli.send(new_req, new_res, error); + if (ret) { + req = std::move(new_req); + res = std::move(new_res); + + if (res.location.empty()) { res.location = location; } + } + return ret; +} + +inline std::string params_to_query_str(const Params ¶ms) { + std::string query; + + for (auto it = params.begin(); it != params.end(); ++it) { + if (it != params.begin()) { query += '&'; } + query += encode_query_component(it->first); + query += '='; + query += encode_query_component(it->second); + } + return query; +} + +inline void parse_query_text(const char *data, std::size_t size, + Params ¶ms) { + std::set cache; + split(data, data + size, '&', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(std::move(kv)); + + std::string key; + std::string val; + divide(b, static_cast(e - b), '=', + [&](const char *lhs_data, std::size_t lhs_size, const char *rhs_data, + std::size_t rhs_size) { + key.assign(lhs_data, lhs_size); + val.assign(rhs_data, rhs_size); + }); + + if (!key.empty()) { + params.emplace(decode_query_component(key), decode_query_component(val)); + } + }); +} + +inline void parse_query_text(const std::string &s, Params ¶ms) { + parse_query_text(s.data(), s.size(), params); +} + +// Normalize a query string by decoding and re-encoding each key/value pair +// while preserving the original parameter order. This avoids double-encoding +// and ensures consistent encoding without reordering (unlike Params which +// uses std::multimap and sorts keys). +inline std::string normalize_query_string(const std::string &query) { + std::string result; + split(query.data(), query.data() + query.size(), '&', + [&](const char *b, const char *e) { + std::string key; + std::string val; + divide(b, static_cast(e - b), '=', + [&](const char *lhs_data, std::size_t lhs_size, + const char *rhs_data, std::size_t rhs_size) { + key.assign(lhs_data, lhs_size); + val.assign(rhs_data, rhs_size); + }); + + if (!key.empty()) { + auto dec_key = decode_query_component(key); + auto dec_val = decode_query_component(val); + + if (!result.empty()) { result += '&'; } + result += encode_query_component(dec_key); + if (!val.empty() || std::find(b, e, '=') != e) { + result += '='; + result += encode_query_component(dec_val); + } + } + }); + return result; +} + +inline bool parse_multipart_boundary(const std::string &content_type, + std::string &boundary) { + std::map params; + extract_media_type(content_type, ¶ms); + auto it = params.find("boundary"); + if (it == params.end()) { return false; } + boundary = it->second; + return !boundary.empty(); +} + +inline void parse_disposition_params(const std::string &s, Params ¶ms) { + std::set cache; + split(s.data(), s.data() + s.size(), ';', [&](const char *b, const char *e) { + std::string kv(b, e); + if (cache.find(kv) != cache.end()) { return; } + cache.insert(kv); + + std::string key; + std::string val; + split(b, e, '=', [&](const char *b2, const char *e2) { + if (key.empty()) { + key.assign(b2, e2); + } else { + val.assign(b2, e2); + } + }); + + if (!key.empty()) { + params.emplace(trim_double_quotes_copy((key)), + trim_double_quotes_copy((val))); + } + }); +} + +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +inline bool parse_range_header(const std::string &s, Ranges &ranges) { +#else +inline bool parse_range_header(const std::string &s, Ranges &ranges) try { +#endif + auto is_valid = [](const std::string &str) { + return std::all_of(str.cbegin(), str.cend(), + [](unsigned char c) { return std::isdigit(c); }); + }; + + if (s.size() > 7 && s.compare(0, 6, "bytes=") == 0) { + const auto pos = static_cast(6); + const auto len = static_cast(s.size() - 6); + auto all_valid_ranges = true; + split(&s[pos], &s[pos + len], ',', [&](const char *b, const char *e) { + if (!all_valid_ranges) { return; } + + const auto it = std::find(b, e, '-'); + if (it == e) { + all_valid_ranges = false; + return; + } + + const auto lhs = std::string(b, it); + const auto rhs = std::string(it + 1, e); + if (!is_valid(lhs) || !is_valid(rhs)) { + all_valid_ranges = false; + return; + } + + ssize_t first = -1; + if (!lhs.empty()) { + ssize_t v; + auto res = detail::from_chars(lhs.data(), lhs.data() + lhs.size(), v); + if (res.ec == std::errc{}) { first = v; } + } + + ssize_t last = -1; + if (!rhs.empty()) { + ssize_t v; + auto res = detail::from_chars(rhs.data(), rhs.data() + rhs.size(), v); + if (res.ec == std::errc{}) { last = v; } + } + + if ((first == -1 && last == -1) || + (first != -1 && last != -1 && first > last)) { + all_valid_ranges = false; + return; + } + + ranges.emplace_back(first, last); + }); + return all_valid_ranges && !ranges.empty(); + } + return false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS +} +#else +} catch (...) { return false; } +#endif + +inline bool parse_accept_header(const std::string &s, + std::vector &content_types) { + content_types.clear(); + + // Empty string is considered valid (no preference) + if (s.empty()) { return true; } + + // Check for invalid patterns: leading/trailing commas or consecutive commas + if (s.front() == ',' || s.back() == ',' || + s.find(",,") != std::string::npos) { + return false; + } + + struct AcceptEntry { + std::string media_type; + double quality; + int order; + }; + + std::vector entries; + int order = 0; + bool has_invalid_entry = false; + + // Split by comma and parse each entry + split(s.data(), s.data() + s.size(), ',', [&](const char *b, const char *e) { + std::string entry(b, e); + entry = trim_copy(entry); + + if (entry.empty()) { + has_invalid_entry = true; + return; + } + + AcceptEntry accept_entry; + accept_entry.order = order++; + + if (!parse_quality(entry.data(), entry.data() + entry.size(), + accept_entry.media_type, accept_entry.quality)) { + has_invalid_entry = true; + return; + } + + // Remove additional parameters from media type + accept_entry.media_type = extract_media_type(accept_entry.media_type); + + // Basic validation of media type format + if (accept_entry.media_type.empty()) { + has_invalid_entry = true; + return; + } + + // Check for basic media type format (should contain '/' or be '*') + if (accept_entry.media_type != "*" && + accept_entry.media_type.find('/') == std::string::npos) { + has_invalid_entry = true; + return; + } + + entries.push_back(std::move(accept_entry)); + }); + + // Return false if any invalid entry was found + if (has_invalid_entry) { return false; } + + // Sort by quality (descending), then by original order (ascending) + std::sort(entries.begin(), entries.end(), + [](const AcceptEntry &a, const AcceptEntry &b) { + if (a.quality != b.quality) { + return a.quality > b.quality; // Higher quality first + } + return a.order < b.order; // Earlier order first for same quality + }); + + // Extract sorted media types + content_types.reserve(entries.size()); + for (auto &entry : entries) { + content_types.push_back(std::move(entry.media_type)); + } + + return true; +} + +class FormDataParser { +public: + FormDataParser() = default; + + void set_boundary(std::string &&boundary) { + boundary_ = std::move(boundary); + dash_boundary_crlf_ = dash_ + boundary_ + crlf_; + crlf_dash_boundary_ = crlf_ + dash_ + boundary_; + } + + bool is_valid() const { return is_valid_; } + + bool parse(const char *buf, size_t n, const FormDataHeader &header_callback, + const ContentReceiver &content_callback) { + + buf_append(buf, n); + + while (buf_size() > 0) { + switch (state_) { + case 0: { // Initial boundary + auto pos = buf_find(dash_boundary_crlf_); + if (pos == buf_size()) { return true; } + buf_erase(pos + dash_boundary_crlf_.size()); + state_ = 1; + break; + } + case 1: { // New entry + clear_file_info(); + state_ = 2; + break; + } + case 2: { // Headers + auto pos = buf_find(crlf_); + if (pos > CPPHTTPLIB_HEADER_MAX_LENGTH) { return false; } + while (pos < buf_size()) { + // Empty line + if (pos == 0) { + if (!header_callback(file_)) { + is_valid_ = false; + return false; + } + buf_erase(crlf_.size()); + state_ = 3; + break; + } + + const auto header = buf_head(pos); + + if (!parse_header(header.data(), header.data() + header.size(), + [&](const std::string &, const std::string &) {})) { + is_valid_ = false; + return false; + } + + // Parse and emplace space trimmed headers into a map + if (!parse_header( + header.data(), header.data() + header.size(), + [&](const std::string &key, const std::string &val) { + file_.headers.emplace(key, val); + })) { + is_valid_ = false; + return false; + } + + constexpr const char header_content_type[] = "Content-Type:"; + + if (start_with_case_ignore(header, header_content_type)) { + file_.content_type = + trim_copy(header.substr(str_len(header_content_type))); + } else { + std::string disposition_params; + if (parse_content_disposition(header, disposition_params)) { + Params params; + parse_disposition_params(disposition_params, params); + + auto it = params.find("name"); + if (it != params.end()) { + file_.name = it->second; + } else { + is_valid_ = false; + return false; + } + + it = params.find("filename"); + if (it != params.end()) { file_.filename = it->second; } + + it = params.find("filename*"); + if (it != params.end()) { + // RFC 5987: only UTF-8 encoding is allowed + const auto &val = it->second; + constexpr const char utf8_prefix[] = "UTF-8''"; + constexpr size_t prefix_len = str_len(utf8_prefix); + if (val.size() > prefix_len && + start_with_case_ignore(val, utf8_prefix)) { + file_.filename = decode_path_component( + val.substr(prefix_len)); // override... + } else { + is_valid_ = false; + return false; + } + } + } + } + buf_erase(pos + crlf_.size()); + pos = buf_find(crlf_); + } + if (state_ != 3) { return true; } + break; + } + case 3: { // Body + if (crlf_dash_boundary_.size() > buf_size()) { return true; } + auto pos = buf_find(crlf_dash_boundary_); + if (pos < buf_size()) { + if (!content_callback(buf_data(), pos)) { + is_valid_ = false; + return false; + } + buf_erase(pos + crlf_dash_boundary_.size()); + state_ = 4; + } else { + auto len = buf_size() - crlf_dash_boundary_.size(); + if (len > 0) { + if (!content_callback(buf_data(), len)) { + is_valid_ = false; + return false; + } + buf_erase(len); + } + return true; + } + break; + } + case 4: { // Boundary + if (crlf_.size() > buf_size()) { return true; } + if (buf_start_with(crlf_)) { + buf_erase(crlf_.size()); + state_ = 1; + } else { + if (dash_.size() > buf_size()) { return true; } + if (buf_start_with(dash_)) { + buf_erase(dash_.size()); + is_valid_ = true; + buf_erase(buf_size()); // Remove epilogue + } else { + return true; + } + } + break; + } + } + } + + return true; + } + +private: + void clear_file_info() { + file_.name.clear(); + file_.filename.clear(); + file_.content_type.clear(); + file_.headers.clear(); + } + + bool start_with_case_ignore(const std::string &a, const char *b, + size_t offset = 0) const { + const auto b_len = strlen(b); + if (a.size() < offset + b_len) { return false; } + for (size_t i = 0; i < b_len; i++) { + if (case_ignore::to_lower(a[offset + i]) != case_ignore::to_lower(b[i])) { + return false; + } + } + return true; + } + + // Parses "Content-Disposition: form-data; " without std::regex. + // Returns true if header matches, with the params portion in `params_out`. + bool parse_content_disposition(const std::string &header, + std::string ¶ms_out) const { + constexpr const char prefix[] = "Content-Disposition:"; + constexpr size_t prefix_len = str_len(prefix); + + if (!start_with_case_ignore(header, prefix)) { return false; } + + // Skip whitespace after "Content-Disposition:" + auto pos = prefix_len; + while (pos < header.size() && (header[pos] == ' ' || header[pos] == '\t')) { + pos++; + } + + // Match "form-data;" (case-insensitive) + constexpr const char form_data[] = "form-data;"; + constexpr size_t form_data_len = str_len(form_data); + if (!start_with_case_ignore(header, form_data, pos)) { return false; } + pos += form_data_len; + + // Skip whitespace after "form-data;" + while (pos < header.size() && (header[pos] == ' ' || header[pos] == '\t')) { + pos++; + } + + params_out = header.substr(pos); + return true; + } + + const std::string dash_ = "--"; + const std::string crlf_ = "\r\n"; + std::string boundary_; + std::string dash_boundary_crlf_; + std::string crlf_dash_boundary_; + + size_t state_ = 0; + bool is_valid_ = false; + FormData file_; + + // Buffer + bool start_with(const std::string &a, size_t spos, size_t epos, + const std::string &b) const { + if (epos - spos < b.size()) { return false; } + for (size_t i = 0; i < b.size(); i++) { + if (a[i + spos] != b[i]) { return false; } + } + return true; + } + + size_t buf_size() const { return buf_epos_ - buf_spos_; } + + const char *buf_data() const { return &buf_[buf_spos_]; } + + std::string buf_head(size_t l) const { return buf_.substr(buf_spos_, l); } + + bool buf_start_with(const std::string &s) const { + return start_with(buf_, buf_spos_, buf_epos_, s); + } + + size_t buf_find(const std::string &s) const { + auto c = s.front(); + + size_t off = buf_spos_; + while (off < buf_epos_) { + auto pos = off; + while (true) { + if (pos == buf_epos_) { return buf_size(); } + if (buf_[pos] == c) { break; } + pos++; + } + + auto remaining_size = buf_epos_ - pos; + if (s.size() > remaining_size) { return buf_size(); } + + if (start_with(buf_, pos, buf_epos_, s)) { return pos - buf_spos_; } + + off = pos + 1; + } + + return buf_size(); + } + + void buf_append(const char *data, size_t n) { + auto remaining_size = buf_size(); + if (remaining_size > 0 && buf_spos_ > 0) { + for (size_t i = 0; i < remaining_size; i++) { + buf_[i] = buf_[buf_spos_ + i]; + } + } + buf_spos_ = 0; + buf_epos_ = remaining_size; + + if (remaining_size + n > buf_.size()) { buf_.resize(remaining_size + n); } + + for (size_t i = 0; i < n; i++) { + buf_[buf_epos_ + i] = data[i]; + } + buf_epos_ += n; + } + + void buf_erase(size_t size) { buf_spos_ += size; } + + std::string buf_; + size_t buf_spos_ = 0; + size_t buf_epos_ = 0; +}; + +inline std::string random_string(size_t length) { + constexpr const char data[] = + "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; + + thread_local auto engine([]() { + // std::random_device might actually be deterministic on some + // platforms, but due to lack of support in the c++ standard library, + // doing better requires either some ugly hacks or breaking portability. + std::random_device seed_gen; + // Request 128 bits of entropy for initialization + std::seed_seq seed_sequence{seed_gen(), seed_gen(), seed_gen(), seed_gen()}; + return std::mt19937(seed_sequence); + }()); + + std::string result; + for (size_t i = 0; i < length; i++) { + result += data[engine() % (sizeof(data) - 1)]; + } + return result; +} + +inline std::string make_multipart_data_boundary() { + return "--cpp-httplib-multipart-data-" + detail::random_string(16); +} + +inline bool is_multipart_boundary_chars_valid(const std::string &boundary) { + auto valid = true; + for (size_t i = 0; i < boundary.size(); i++) { + auto c = boundary[i]; + if (!std::isalnum(static_cast(c)) && c != '-' && c != '_') { + valid = false; + break; + } + } + return valid; +} + +template +inline std::string +serialize_multipart_formdata_item_begin(const T &item, + const std::string &boundary) { + std::string body = "--" + boundary + "\r\n"; + body += "Content-Disposition: form-data; name=\"" + item.name + "\""; + if (!item.filename.empty()) { + body += "; filename=\"" + item.filename + "\""; + } + body += "\r\n"; + if (!item.content_type.empty()) { + body += "Content-Type: " + item.content_type + "\r\n"; + } + body += "\r\n"; + + return body; +} + +inline std::string serialize_multipart_formdata_item_end() { return "\r\n"; } + +inline std::string +serialize_multipart_formdata_finish(const std::string &boundary) { + return "--" + boundary + "--\r\n"; +} + +inline std::string +serialize_multipart_formdata_get_content_type(const std::string &boundary) { + return "multipart/form-data; boundary=" + boundary; +} + +inline std::string +serialize_multipart_formdata(const UploadFormDataItems &items, + const std::string &boundary, bool finish = true) { + std::string body; + + for (const auto &item : items) { + body += serialize_multipart_formdata_item_begin(item, boundary); + body += item.content + serialize_multipart_formdata_item_end(); + } + + if (finish) { body += serialize_multipart_formdata_finish(boundary); } + + return body; +} + +inline size_t get_multipart_content_length(const UploadFormDataItems &items, + const std::string &boundary) { + size_t total = 0; + for (const auto &item : items) { + total += serialize_multipart_formdata_item_begin(item, boundary).size(); + total += item.content.size(); + total += serialize_multipart_formdata_item_end().size(); + } + total += serialize_multipart_formdata_finish(boundary).size(); + return total; +} + +struct MultipartSegment { + const char *data; + size_t size; +}; + +// NOTE: items must outlive the returned ContentProvider +// (safe for synchronous use inside Post/Put/Patch) +inline ContentProvider +make_multipart_content_provider(const UploadFormDataItems &items, + const std::string &boundary) { + // Own the per-item header strings and the finish string + std::vector owned; + owned.reserve(items.size() + 1); + for (const auto &item : items) + owned.push_back(serialize_multipart_formdata_item_begin(item, boundary)); + owned.push_back(serialize_multipart_formdata_finish(boundary)); + + // Flat segment list: [header, content, "\r\n"] * N + [finish] + std::vector segs; + segs.reserve(items.size() * 3 + 1); + static const char crlf[] = "\r\n"; + for (size_t i = 0; i < items.size(); i++) { + segs.push_back({owned[i].data(), owned[i].size()}); + segs.push_back({items[i].content.data(), items[i].content.size()}); + segs.push_back({crlf, 2}); + } + segs.push_back({owned.back().data(), owned.back().size()}); + + struct MultipartState { + std::vector owned; + std::vector segs; + std::vector buf = std::vector(CPPHTTPLIB_SEND_BUFSIZ); + }; + auto state = std::make_shared(); + state->owned = std::move(owned); + // `segs` holds raw pointers into owned strings; std::string move preserves + // the data pointer, so these pointers remain valid after the move above. + state->segs = std::move(segs); + + return [state](size_t offset, size_t length, DataSink &sink) -> bool { + // Buffer multiple small segments into fewer, larger writes to avoid + // excessive TCP packets when there are many form data items (#2410) + auto &buf = state->buf; + auto buf_size = buf.size(); + size_t buf_len = 0; + size_t remaining = length; + + // Find the first segment containing 'offset' + size_t pos = 0; + size_t seg_idx = 0; + for (; seg_idx < state->segs.size(); seg_idx++) { + const auto &seg = state->segs[seg_idx]; + if (seg.size > 0 && offset - pos < seg.size) { break; } + pos += seg.size; + } + + size_t seg_offset = (seg_idx < state->segs.size()) ? offset - pos : 0; + + for (; seg_idx < state->segs.size() && remaining > 0; seg_idx++) { + const auto &seg = state->segs[seg_idx]; + size_t available = seg.size - seg_offset; + size_t to_copy = (std::min)(available, remaining); + const char *src = seg.data + seg_offset; + seg_offset = 0; // only the first segment has a non-zero offset + + while (to_copy > 0) { + size_t space = buf_size - buf_len; + size_t chunk = (std::min)(to_copy, space); + std::memcpy(buf.data() + buf_len, src, chunk); + buf_len += chunk; + src += chunk; + to_copy -= chunk; + remaining -= chunk; + + if (buf_len == buf_size) { + if (!sink.write(buf.data(), buf_len)) { return false; } + buf_len = 0; + } + } + } + + if (buf_len > 0) { return sink.write(buf.data(), buf_len); } + return true; + }; +} + +inline void coalesce_ranges(Ranges &ranges, size_t content_length) { + if (ranges.size() <= 1) return; + + // Sort ranges by start position + std::sort(ranges.begin(), ranges.end(), + [](const Range &a, const Range &b) { return a.first < b.first; }); + + Ranges coalesced; + coalesced.reserve(ranges.size()); + + for (auto &r : ranges) { + auto first_pos = r.first; + auto last_pos = r.second; + + // Handle special cases like in range_error + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = static_cast(content_length); + } + + if (first_pos == -1) { + first_pos = static_cast(content_length) - last_pos; + last_pos = static_cast(content_length) - 1; + } + + if (last_pos == -1 || last_pos >= static_cast(content_length)) { + last_pos = static_cast(content_length) - 1; + } + + // Skip invalid ranges + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos < static_cast(content_length))) { + continue; + } + + // Coalesce with previous range if overlapping or adjacent (but not + // identical) + if (!coalesced.empty()) { + auto &prev = coalesced.back(); + // Check if current range overlaps or is adjacent to previous range + // but don't coalesce identical ranges (allow duplicates) + if (first_pos <= prev.second + 1 && + !(first_pos == prev.first && last_pos == prev.second)) { + // Extend the previous range + prev.second = (std::max)(prev.second, last_pos); + continue; + } + } + + // Add new range + coalesced.emplace_back(first_pos, last_pos); + } + + ranges = std::move(coalesced); +} + +inline bool range_error(Request &req, Response &res) { + if (!req.ranges.empty() && 200 <= res.status && res.status < 300) { + if (res.body.empty() && res.content_provider_ && res.content_length_ == 0) { + req.ranges.clear(); + if (res.status == StatusCode::PartialContent_206) { + res.status = StatusCode::OK_200; + } + return false; + } + + ssize_t content_len = static_cast( + res.content_length_ ? res.content_length_ : res.body.size()); + + std::vector> processed_ranges; + size_t overwrapping_count = 0; + + // NOTE: The following Range check is based on '14.2. Range' in RFC 9110 + // 'HTTP Semantics' to avoid potential denial-of-service attacks. + // https://www.rfc-editor.org/rfc/rfc9110#section-14.2 + + // Too many ranges + if (req.ranges.size() > CPPHTTPLIB_RANGE_MAX_COUNT) { return true; } + + for (auto &r : req.ranges) { + auto &first_pos = r.first; + auto &last_pos = r.second; + + if (first_pos == -1 && last_pos == -1) { + first_pos = 0; + last_pos = content_len; + } + + if (first_pos == -1) { + first_pos = content_len - last_pos; + last_pos = content_len - 1; + } + + // NOTE: RFC-9110 '14.1.2. Byte Ranges': + // A client can limit the number of bytes requested without knowing the + // size of the selected representation. If the last-pos value is absent, + // or if the value is greater than or equal to the current length of the + // representation data, the byte range is interpreted as the remainder of + // the representation (i.e., the server replaces the value of last-pos + // with a value that is one less than the current length of the selected + // representation). + // https://www.rfc-editor.org/rfc/rfc9110.html#section-14.1.2-6 + if (last_pos == -1 || last_pos >= content_len) { + last_pos = content_len - 1; + } + + // Range must be within content length + if (!(0 <= first_pos && first_pos <= last_pos && + last_pos <= content_len - 1)) { + return true; + } + + // Request must not have more than two overlapping ranges + for (const auto &processed_range : processed_ranges) { + if (!(last_pos < processed_range.first || + first_pos > processed_range.second)) { + overwrapping_count++; + if (overwrapping_count > 2) { return true; } + break; // Only count once per range + } + } + + processed_ranges.emplace_back(first_pos, last_pos); + } + + // After validation, coalesce overlapping ranges as per RFC 9110 + coalesce_ranges(req.ranges, static_cast(content_len)); + } + + return false; +} + +inline std::pair +get_range_offset_and_length(Range r, size_t content_length) { + assert(r.first != -1 && r.second != -1); + assert(0 <= r.first && r.first < static_cast(content_length)); + assert(r.first <= r.second && + r.second < static_cast(content_length)); + (void)(content_length); + return std::make_pair(static_cast(r.first), + static_cast(r.second - r.first) + 1); +} + +inline std::string make_content_range_header_field( + const std::pair &offset_and_length, size_t content_length) { + auto st = offset_and_length.first; + auto ed = st + offset_and_length.second - 1; + + std::string field = "bytes "; + field += std::to_string(st); + field += '-'; + field += std::to_string(ed); + field += '/'; + field += std::to_string(content_length); + return field; +} + +template +bool process_multipart_ranges_data(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length, SToken stoken, + CToken ctoken, Content content) { + for (size_t i = 0; i < req.ranges.size(); i++) { + ctoken("--"); + stoken(boundary); + ctoken("\r\n"); + if (!content_type.empty()) { + ctoken("Content-Type: "); + stoken(content_type); + ctoken("\r\n"); + } + + auto offset_and_length = + get_range_offset_and_length(req.ranges[i], content_length); + + ctoken("Content-Range: "); + stoken(make_content_range_header_field(offset_and_length, content_length)); + ctoken("\r\n"); + ctoken("\r\n"); + + if (!content(offset_and_length.first, offset_and_length.second)) { + return false; + } + ctoken("\r\n"); + } + + ctoken("--"); + stoken(boundary); + ctoken("--"); + + return true; +} + +inline void make_multipart_ranges_data(const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, + std::string &data) { + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data += token; }, + [&](const std::string &token) { data += token; }, + [&](size_t offset, size_t length) { + assert(offset + length <= content_length); + data += res.body.substr(offset, length); + return true; + }); +} + +inline size_t get_multipart_ranges_data_length(const Request &req, + const std::string &boundary, + const std::string &content_type, + size_t content_length) { + size_t data_length = 0; + + process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { data_length += token.size(); }, + [&](const std::string &token) { data_length += token.size(); }, + [&](size_t /*offset*/, size_t length) { + data_length += length; + return true; + }); + + return data_length; +} + +template +inline bool +write_multipart_ranges_data(Stream &strm, const Request &req, Response &res, + const std::string &boundary, + const std::string &content_type, + size_t content_length, const T &is_shutting_down) { + return process_multipart_ranges_data( + req, boundary, content_type, content_length, + [&](const std::string &token) { strm.write(token); }, + [&](const std::string &token) { strm.write(token); }, + [&](size_t offset, size_t length) { + return write_content(strm, res.content_provider_, offset, length, + is_shutting_down); + }); +} + +inline bool has_framed_body(const Request &req) { + return is_chunked_transfer_encoding(req.headers) || + req.get_header_value_u64("Content-Length") > 0; +} + +inline bool is_connection_persistent(const Request &req) { + auto conn = req.get_header_value("Connection"); + if (conn == "close") { return false; } + if (req.version == "HTTP/1.0" && conn != "Keep-Alive") { return false; } + return true; +} + +inline bool expect_content(const Request &req) { + if (req.method == "POST" || req.method == "PUT" || req.method == "PATCH" || + req.method == "DELETE") { + return true; + } + return has_framed_body(req); +} + +#ifdef _WIN32 +class WSInit { +public: + WSInit() { + WSADATA wsaData; + if (WSAStartup(0x0002, &wsaData) == 0) is_valid_ = true; + } + + ~WSInit() { + if (is_valid_) WSACleanup(); + } + + bool is_valid_ = false; +}; + +static WSInit wsinit_; +#endif + +inline bool parse_www_authenticate(const Response &res, + std::map &auth, + bool is_proxy) { + auto auth_key = is_proxy ? "Proxy-Authenticate" : "WWW-Authenticate"; + if (res.has_header(auth_key)) { + thread_local auto re = + std::regex(R"~((?:(?:,\s*)?(.+?)=(?:"(.*?)"|([^,]*))))~"); + auto s = res.get_header_value(auth_key); + auto pos = s.find(' '); + if (pos != std::string::npos) { + auto type = s.substr(0, pos); + if (type == "Basic") { + return false; + } else if (type == "Digest") { + s = s.substr(pos + 1); + auto beg = std::sregex_iterator(s.begin(), s.end(), re); + for (auto i = beg; i != std::sregex_iterator(); ++i) { + const auto &m = *i; + auto key = s.substr(static_cast(m.position(1)), + static_cast(m.length(1))); + auto val = m.length(2) > 0 + ? s.substr(static_cast(m.position(2)), + static_cast(m.length(2))) + : s.substr(static_cast(m.position(3)), + static_cast(m.length(3))); + auth[std::move(key)] = std::move(val); + } + return true; + } + } + } + return false; +} + +class ContentProviderAdapter { +public: + explicit ContentProviderAdapter( + ContentProviderWithoutLength &&content_provider) + : content_provider_(std::move(content_provider)) {} + + bool operator()(size_t offset, size_t, DataSink &sink) { + return content_provider_(offset, sink); + } + +private: + ContentProviderWithoutLength content_provider_; +}; + +// NOTE: https://www.rfc-editor.org/rfc/rfc9110#section-5 +namespace fields { + +inline bool is_token_char(char c) { + return std::isalnum(static_cast(c)) || c == '!' || c == '#' || + c == '$' || c == '%' || c == '&' || c == '\'' || c == '*' || + c == '+' || c == '-' || c == '.' || c == '^' || c == '_' || c == '`' || + c == '|' || c == '~'; +} + +inline bool is_token(const std::string &s) { + if (s.empty()) { return false; } + for (auto c : s) { + if (!is_token_char(c)) { return false; } + } + return true; +} + +inline bool is_field_name(const std::string &s) { return is_token(s); } + +inline bool is_vchar(char c) { return c >= 33 && c <= 126; } + +inline bool is_obs_text(char c) { return 128 <= static_cast(c); } + +inline bool is_field_vchar(char c) { return is_vchar(c) || is_obs_text(c); } + +inline bool is_field_content(const std::string &s) { + if (s.empty()) { return true; } + + if (s.size() == 1) { + return is_field_vchar(s[0]); + } else if (s.size() == 2) { + return is_field_vchar(s[0]) && is_field_vchar(s[1]); + } else { + size_t i = 0; + + if (!is_field_vchar(s[i])) { return false; } + i++; + + while (i < s.size() - 1) { + auto c = s[i++]; + if (c == ' ' || c == '\t' || is_field_vchar(c)) { + } else { + return false; + } + } + + return is_field_vchar(s[i]); + } +} + +inline bool is_field_value(const std::string &s) { return is_field_content(s); } + +} // namespace fields + +inline bool perform_websocket_handshake(Stream &strm, const std::string &host, + int port, const std::string &path, + const Headers &headers, + std::string &selected_subprotocol) { + // Validate path and host + if (!fields::is_field_value(path) || !fields::is_field_value(host)) { + return false; + } + + // Validate user-provided headers + for (const auto &h : headers) { + if (!fields::is_field_name(h.first) || !fields::is_field_value(h.second)) { + return false; + } + } + + // Generate random Sec-WebSocket-Key + thread_local std::mt19937 rng(std::random_device{}()); + std::string key_bytes(16, '\0'); + for (size_t i = 0; i < 16; i += 4) { + auto r = rng(); + std::memcpy(&key_bytes[i], &r, (std::min)(size_t(4), size_t(16 - i))); + } + auto client_key = base64_encode(key_bytes); + + // Build upgrade request + std::string req_str = "GET " + path + " HTTP/1.1\r\n"; + req_str += "Host: " + host + ":" + std::to_string(port) + "\r\n"; + req_str += "Upgrade: websocket\r\n"; + req_str += "Connection: Upgrade\r\n"; + req_str += "Sec-WebSocket-Key: " + client_key + "\r\n"; + req_str += "Sec-WebSocket-Version: 13\r\n"; + for (const auto &h : headers) { + req_str += h.first + ": " + h.second + "\r\n"; + } + req_str += "\r\n"; + + if (strm.write(req_str.data(), req_str.size()) < 0) { return false; } + + // Verify 101 response and Sec-WebSocket-Accept header + auto expected_accept = websocket_accept_key(client_key); + return read_websocket_upgrade_response(strm, expected_accept, + selected_subprotocol); +} + +} // namespace detail + +/* + * Group 2: detail namespace - SSL common utilities + */ + +#ifdef CPPHTTPLIB_SSL_ENABLED +namespace detail { + +class SSLSocketStream final : public Stream { +public: + SSLSocketStream( + socket_t sock, tls::session_t session, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, time_t max_timeout_msec = 0, + std::chrono::time_point start_time = + (std::chrono::steady_clock::time_point::min)()); + ~SSLSocketStream() override; + + bool is_readable() const override; + bool wait_readable() const override; + bool wait_writable() const override; + bool is_peer_alive() const override; + ssize_t read(char *ptr, size_t size) override; + ssize_t write(const char *ptr, size_t size) override; + void get_remote_ip_and_port(std::string &ip, int &port) const override; + void get_local_ip_and_port(std::string &ip, int &port) const override; + socket_t socket() const override; + time_t duration() const override; + void set_read_timeout(time_t sec, time_t usec = 0) override; + +private: + socket_t sock_; + tls::session_t session_; + time_t read_timeout_sec_; + time_t read_timeout_usec_; + time_t write_timeout_sec_; + time_t write_timeout_usec_; + time_t max_timeout_msec_; + const std::chrono::time_point start_time_; +}; + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +inline std::string message_digest(const std::string &s, const EVP_MD *algo) { + auto context = std::unique_ptr( + EVP_MD_CTX_new(), EVP_MD_CTX_free); + + unsigned int hash_length = 0; + unsigned char hash[EVP_MAX_MD_SIZE]; + + EVP_DigestInit_ex(context.get(), algo, nullptr); + EVP_DigestUpdate(context.get(), s.c_str(), s.size()); + EVP_DigestFinal_ex(context.get(), hash, &hash_length); + + std::stringstream ss; + for (auto i = 0u; i < hash_length; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << static_cast(hash[i]); + } + + return ss.str(); +} + +inline std::string MD5(const std::string &s) { + return message_digest(s, EVP_md5()); +} + +inline std::string SHA_256(const std::string &s) { + return message_digest(s, EVP_sha256()); +} + +inline std::string SHA_512(const std::string &s) { + return message_digest(s, EVP_sha512()); +} +#elif defined(CPPHTTPLIB_MBEDTLS_SUPPORT) +namespace { +template +inline std::string hash_to_hex(const unsigned char (&hash)[N]) { + std::stringstream ss; + for (size_t i = 0; i < N; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << static_cast(hash[i]); + } + return ss.str(); +} +} // namespace + +inline std::string MD5(const std::string &s) { + unsigned char hash[16]; +#ifdef CPPHTTPLIB_MBEDTLS_V3 + mbedtls_md5(reinterpret_cast(s.c_str()), s.size(), + hash); +#else + mbedtls_md5_ret(reinterpret_cast(s.c_str()), s.size(), + hash); +#endif + return hash_to_hex(hash); +} + +inline std::string SHA_256(const std::string &s) { + unsigned char hash[32]; +#ifdef CPPHTTPLIB_MBEDTLS_V3 + mbedtls_sha256(reinterpret_cast(s.c_str()), s.size(), + hash, 0); +#else + mbedtls_sha256_ret(reinterpret_cast(s.c_str()), + s.size(), hash, 0); +#endif + return hash_to_hex(hash); +} + +inline std::string SHA_512(const std::string &s) { + unsigned char hash[64]; +#ifdef CPPHTTPLIB_MBEDTLS_V3 + mbedtls_sha512(reinterpret_cast(s.c_str()), s.size(), + hash, 0); +#else + mbedtls_sha512_ret(reinterpret_cast(s.c_str()), + s.size(), hash, 0); +#endif + return hash_to_hex(hash); +} +#elif defined(CPPHTTPLIB_WOLFSSL_SUPPORT) +namespace { +template +inline std::string hash_to_hex(const unsigned char (&hash)[N]) { + std::stringstream ss; + for (size_t i = 0; i < N; ++i) { + ss << std::hex << std::setw(2) << std::setfill('0') + << static_cast(hash[i]); + } + return ss.str(); +} +} // namespace + +inline std::string MD5(const std::string &s) { + unsigned char hash[WC_MD5_DIGEST_SIZE]; + wc_Md5Hash(reinterpret_cast(s.c_str()), + static_cast(s.size()), hash); + return hash_to_hex(hash); +} + +inline std::string SHA_256(const std::string &s) { + unsigned char hash[WC_SHA256_DIGEST_SIZE]; + wc_Sha256Hash(reinterpret_cast(s.c_str()), + static_cast(s.size()), hash); + return hash_to_hex(hash); +} + +inline std::string SHA_512(const std::string &s) { + unsigned char hash[WC_SHA512_DIGEST_SIZE]; + wc_Sha512Hash(reinterpret_cast(s.c_str()), + static_cast(s.size()), hash); + return hash_to_hex(hash); +} +#endif + +inline bool is_ip_address(const std::string &host) { + struct in_addr addr4; + struct in6_addr addr6; + return inet_pton(AF_INET, host.c_str(), &addr4) == 1 || + inet_pton(AF_INET6, host.c_str(), &addr6) == 1; +} + +template +inline bool process_server_socket_ssl( + const std::atomic &svr_sock, tls::session_t session, + socket_t sock, size_t keep_alive_max_count, time_t keep_alive_timeout_sec, + time_t read_timeout_sec, time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, T callback) { + return process_server_socket_core( + svr_sock, sock, keep_alive_max_count, keep_alive_timeout_sec, + [&](bool close_connection, bool &connection_closed) { + SSLSocketStream strm(sock, session, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec); + return callback(strm, close_connection, connection_closed); + }); +} + +template +inline bool process_client_socket_ssl( + tls::session_t session, socket_t sock, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, time_t max_timeout_msec, + std::chrono::time_point start_time, T callback) { + SSLSocketStream strm(sock, session, read_timeout_sec, read_timeout_usec, + write_timeout_sec, write_timeout_usec, max_timeout_msec, + start_time); + return callback(strm); +} + +inline std::pair make_digest_authentication_header( + const Request &req, const std::map &auth, + size_t cnonce_count, const std::string &cnonce, const std::string &username, + const std::string &password, bool is_proxy = false) { + std::string nc; + { + std::stringstream ss; + ss << std::setfill('0') << std::setw(8) << std::hex << cnonce_count; + nc = ss.str(); + } + + std::string qop; + if (auth.find("qop") != auth.end()) { + qop = auth.at("qop"); + if (qop.find("auth-int") != std::string::npos) { + qop = "auth-int"; + } else if (qop.find("auth") != std::string::npos) { + qop = "auth"; + } else { + qop.clear(); + } + } + + std::string algo = "MD5"; + if (auth.find("algorithm") != auth.end()) { algo = auth.at("algorithm"); } + + std::string response; + { + auto H = algo == "SHA-256" ? detail::SHA_256 + : algo == "SHA-512" ? detail::SHA_512 + : detail::MD5; + + auto A1 = username + ":" + auth.at("realm") + ":" + password; + + auto A2 = req.method + ":" + req.path; + if (qop == "auth-int") { A2 += ":" + H(req.body); } + + if (qop.empty()) { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + H(A2)); + } else { + response = H(H(A1) + ":" + auth.at("nonce") + ":" + nc + ":" + cnonce + + ":" + qop + ":" + H(A2)); + } + } + + auto opaque = (auth.find("opaque") != auth.end()) ? auth.at("opaque") : ""; + + auto field = "Digest username=\"" + username + "\", realm=\"" + + auth.at("realm") + "\", nonce=\"" + auth.at("nonce") + + "\", uri=\"" + req.path + "\", algorithm=" + algo + + (qop.empty() ? ", response=\"" + : ", qop=" + qop + ", nc=" + nc + ", cnonce=\"" + + cnonce + "\", response=\"") + + response + "\"" + + (opaque.empty() ? "" : ", opaque=\"" + opaque + "\""); + + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, field); +} + +inline bool match_hostname(const std::string &pattern, + const std::string &hostname) { + // Exact match (case-insensitive) + if (detail::case_ignore::equal(hostname, pattern)) { return true; } + + // Split both pattern and hostname into components by '.' + std::vector pattern_components; + if (!pattern.empty()) { + split(pattern.data(), pattern.data() + pattern.size(), '.', + [&](const char *b, const char *e) { + pattern_components.emplace_back(b, e); + }); + } + + std::vector host_components; + if (!hostname.empty()) { + split(hostname.data(), hostname.data() + hostname.size(), '.', + [&](const char *b, const char *e) { + host_components.emplace_back(b, e); + }); + } + + // Component count must match + if (host_components.size() != pattern_components.size()) { return false; } + + // Compare each component with wildcard support + // Supports: "*" (full wildcard), "prefix*" (partial wildcard) + // https://bugs.launchpad.net/ubuntu/+source/firefox-3.0/+bug/376484 + auto itr = pattern_components.begin(); + for (const auto &h : host_components) { + auto &p = *itr; + if (!detail::case_ignore::equal(p, h) && p != "*") { + bool partial_match = false; + if (!p.empty() && p[p.size() - 1] == '*') { + const auto prefix_length = p.size() - 1; + if (prefix_length == 0) { + partial_match = true; + } else if (h.size() >= prefix_length) { + partial_match = + std::equal(p.begin(), + p.begin() + static_cast( + prefix_length), + h.begin(), [](const char ca, const char cb) { + return detail::case_ignore::to_lower(ca) == + detail::case_ignore::to_lower(cb); + }); + } + } + if (!partial_match) { return false; } + } + ++itr; + } + + return true; +} + +#ifdef _WIN32 +// Verify certificate using Windows CertGetCertificateChain API. +// This provides real-time certificate validation with Windows Update +// integration, independent of the TLS backend (OpenSSL or MbedTLS). +inline bool +verify_cert_with_windows_schannel(const std::vector &der_cert, + const std::string &hostname, + bool verify_hostname, uint64_t &out_error) { + if (der_cert.empty()) { return false; } + + out_error = 0; + + // Create Windows certificate context from DER data + auto cert_context = CertCreateCertificateContext( + X509_ASN_ENCODING | PKCS_7_ASN_ENCODING, der_cert.data(), + static_cast(der_cert.size())); + + if (!cert_context) { + out_error = GetLastError(); + return false; + } + + auto cert_guard = + scope_exit([&] { CertFreeCertificateContext(cert_context); }); + + // Setup chain parameters + CERT_CHAIN_PARA chain_para = {}; + chain_para.cbSize = sizeof(chain_para); + + // Build certificate chain with revocation checking + PCCERT_CHAIN_CONTEXT chain_context = nullptr; + auto chain_result = CertGetCertificateChain( + nullptr, cert_context, nullptr, cert_context->hCertStore, &chain_para, + CERT_CHAIN_CACHE_END_CERT | CERT_CHAIN_REVOCATION_CHECK_END_CERT | + CERT_CHAIN_REVOCATION_ACCUMULATIVE_TIMEOUT, + nullptr, &chain_context); + + if (!chain_result || !chain_context) { + out_error = GetLastError(); + return false; + } + + auto chain_guard = + scope_exit([&] { CertFreeCertificateChain(chain_context); }); + + // Check if chain has errors + if (chain_context->TrustStatus.dwErrorStatus != CERT_TRUST_NO_ERROR) { + out_error = chain_context->TrustStatus.dwErrorStatus; + return false; + } + + // Verify SSL policy + SSL_EXTRA_CERT_CHAIN_POLICY_PARA extra_policy_para = {}; + extra_policy_para.cbSize = sizeof(extra_policy_para); +#ifdef AUTHTYPE_SERVER + extra_policy_para.dwAuthType = AUTHTYPE_SERVER; +#endif + + std::wstring whost; + if (verify_hostname) { + whost = u8string_to_wstring(hostname.c_str()); + extra_policy_para.pwszServerName = const_cast(whost.c_str()); + } + + CERT_CHAIN_POLICY_PARA policy_para = {}; + policy_para.cbSize = sizeof(policy_para); +#ifdef CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS + policy_para.dwFlags = CERT_CHAIN_POLICY_IGNORE_ALL_REV_UNKNOWN_FLAGS; +#else + policy_para.dwFlags = 0; +#endif + policy_para.pvExtraPolicyPara = &extra_policy_para; + + CERT_CHAIN_POLICY_STATUS policy_status = {}; + policy_status.cbSize = sizeof(policy_status); + + if (!CertVerifyCertificateChainPolicy(CERT_CHAIN_POLICY_SSL, chain_context, + &policy_para, &policy_status)) { + out_error = GetLastError(); + return false; + } + + if (policy_status.dwError != 0) { + out_error = policy_status.dwError; + return false; + } + + return true; +} +#endif // _WIN32 + +// Loads CA file/dir configuration and applies the system CA policy to a +// client TLS context. PEM data and native stores are applied to the context +// directly at set time; has_custom_store reflects them for the Auto policy +// decision. +inline bool load_client_ca_config(tls::ctx_t ctx, + const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path, + bool has_custom_store, SystemCAMode mode, + uint64_t &backend_error) { + auto ret = true; + + if (!ca_cert_file_path.empty()) { + if (!tls::load_ca_file(ctx, ca_cert_file_path.c_str())) { + backend_error = tls::get_error(); + ret = false; + } + } else if (!ca_cert_dir_path.empty()) { + if (!tls::load_ca_dir(ctx, ca_cert_dir_path.c_str())) { + backend_error = tls::get_error(); + ret = false; + } + } + + auto has_custom_ca = !ca_cert_file_path.empty() || + !ca_cert_dir_path.empty() || has_custom_store; + if (mode == SystemCAMode::Enabled || + (mode == SystemCAMode::Auto && !has_custom_ca)) { + if (!tls::load_system_certs(ctx)) { backend_error = tls::get_error(); } + } + + return ret; +} + +inline bool setup_client_tls_session(const std::string &host, tls::ctx_t ctx, + tls::session_t &session, socket_t sock, + bool server_certificate_verification, + time_t timeout_sec, time_t timeout_usec) { + using namespace tls; + + if (!ctx) { return false; } + + bool is_ip = is_ip_address(host); + +#if defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || defined(CPPHTTPLIB_WOLFSSL_SUPPORT) + // Chain verification happens during the handshake even for IP hosts; the + // certificate identity is verified post-handshake via verify_hostname() + set_verify_client(ctx, server_certificate_verification); +#endif + + session = create_session(ctx, sock); + if (!session) { return false; } + + // RFC 6066: SNI must not be set for IP addresses. On Mbed TLS and wolfSSL + // set_hostname also sets SNI, so it must be skipped for IP hosts as well; + // their identity is checked post-handshake below instead. + if (!is_ip) { + if (server_certificate_verification) { + set_hostname(session, host.c_str()); + } else { + set_sni(session, host.c_str()); + } + } + + if (!connect_nonblocking(session, sock, timeout_sec, timeout_usec, nullptr)) { + return false; + } + + if (server_certificate_verification) { + if (get_verify_result(session) != 0) { return false; } + + // Identity check against the peer certificate, post-handshake for all + // backends (same as SSLClient). For IP hosts this is the only identity + // verification since no hostname is bound during the handshake. + auto server_cert = get_peer_cert(session); + if (!server_cert) { return false; } + auto cert_guard = detail::scope_exit([&] { free_cert(server_cert); }); + if (!verify_hostname(server_cert, host.c_str())) { return false; } + } + + return true; +} + +} // namespace detail +#endif // CPPHTTPLIB_SSL_ENABLED + +/* + * Group 3: httplib namespace - Non-SSL public API implementations + */ + +inline void default_socket_options(socket_t sock) { + set_socket_opt(sock, SOL_SOCKET, +#ifdef SO_REUSEPORT + SO_REUSEPORT, +#else + SO_REUSEADDR, +#endif + 1); +} + +inline bool set_socket_opt(socket_t sock, int level, int optname, int optval) { + return detail::set_socket_opt_impl(sock, level, optname, &optval, + sizeof(optval)); +} + +inline std::string get_bearer_token_auth(const Request &req) { + if (req.has_header("Authorization")) { + constexpr auto bearer_header_prefix_len = detail::str_len("Bearer "); + return req.get_header_value("Authorization") + .substr(bearer_header_prefix_len); + } + return ""; +} + +inline const char *status_message(int status) { + switch (status) { + case StatusCode::Continue_100: return "Continue"; + case StatusCode::SwitchingProtocol_101: return "Switching Protocol"; + case StatusCode::Processing_102: return "Processing"; + case StatusCode::EarlyHints_103: return "Early Hints"; + case StatusCode::OK_200: return "OK"; + case StatusCode::Created_201: return "Created"; + case StatusCode::Accepted_202: return "Accepted"; + case StatusCode::NonAuthoritativeInformation_203: + return "Non-Authoritative Information"; + case StatusCode::NoContent_204: return "No Content"; + case StatusCode::ResetContent_205: return "Reset Content"; + case StatusCode::PartialContent_206: return "Partial Content"; + case StatusCode::MultiStatus_207: return "Multi-Status"; + case StatusCode::AlreadyReported_208: return "Already Reported"; + case StatusCode::IMUsed_226: return "IM Used"; + case StatusCode::MultipleChoices_300: return "Multiple Choices"; + case StatusCode::MovedPermanently_301: return "Moved Permanently"; + case StatusCode::Found_302: return "Found"; + case StatusCode::SeeOther_303: return "See Other"; + case StatusCode::NotModified_304: return "Not Modified"; + case StatusCode::UseProxy_305: return "Use Proxy"; + case StatusCode::unused_306: return "unused"; + case StatusCode::TemporaryRedirect_307: return "Temporary Redirect"; + case StatusCode::PermanentRedirect_308: return "Permanent Redirect"; + case StatusCode::BadRequest_400: return "Bad Request"; + case StatusCode::Unauthorized_401: return "Unauthorized"; + case StatusCode::PaymentRequired_402: return "Payment Required"; + case StatusCode::Forbidden_403: return "Forbidden"; + case StatusCode::NotFound_404: return "Not Found"; + case StatusCode::MethodNotAllowed_405: return "Method Not Allowed"; + case StatusCode::NotAcceptable_406: return "Not Acceptable"; + case StatusCode::ProxyAuthenticationRequired_407: + return "Proxy Authentication Required"; + case StatusCode::RequestTimeout_408: return "Request Timeout"; + case StatusCode::Conflict_409: return "Conflict"; + case StatusCode::Gone_410: return "Gone"; + case StatusCode::LengthRequired_411: return "Length Required"; + case StatusCode::PreconditionFailed_412: return "Precondition Failed"; + case StatusCode::PayloadTooLarge_413: return "Payload Too Large"; + case StatusCode::UriTooLong_414: return "URI Too Long"; + case StatusCode::UnsupportedMediaType_415: return "Unsupported Media Type"; + case StatusCode::RangeNotSatisfiable_416: return "Range Not Satisfiable"; + case StatusCode::ExpectationFailed_417: return "Expectation Failed"; + case StatusCode::ImATeapot_418: return "I'm a teapot"; + case StatusCode::MisdirectedRequest_421: return "Misdirected Request"; + case StatusCode::UnprocessableContent_422: return "Unprocessable Content"; + case StatusCode::Locked_423: return "Locked"; + case StatusCode::FailedDependency_424: return "Failed Dependency"; + case StatusCode::TooEarly_425: return "Too Early"; + case StatusCode::UpgradeRequired_426: return "Upgrade Required"; + case StatusCode::PreconditionRequired_428: return "Precondition Required"; + case StatusCode::TooManyRequests_429: return "Too Many Requests"; + case StatusCode::RequestHeaderFieldsTooLarge_431: + return "Request Header Fields Too Large"; + case StatusCode::UnavailableForLegalReasons_451: + return "Unavailable For Legal Reasons"; + case StatusCode::NotImplemented_501: return "Not Implemented"; + case StatusCode::BadGateway_502: return "Bad Gateway"; + case StatusCode::ServiceUnavailable_503: return "Service Unavailable"; + case StatusCode::GatewayTimeout_504: return "Gateway Timeout"; + case StatusCode::HttpVersionNotSupported_505: + return "HTTP Version Not Supported"; + case StatusCode::VariantAlsoNegotiates_506: return "Variant Also Negotiates"; + case StatusCode::InsufficientStorage_507: return "Insufficient Storage"; + case StatusCode::LoopDetected_508: return "Loop Detected"; + case StatusCode::NotExtended_510: return "Not Extended"; + case StatusCode::NetworkAuthenticationRequired_511: + return "Network Authentication Required"; + + default: + case StatusCode::InternalServerError_500: return "Internal Server Error"; + } +} + +inline std::string to_string(const Error error) { + switch (error) { + case Error::Success: return "Success (no error)"; + case Error::Unknown: return "Unknown"; + case Error::Connection: return "Could not establish connection"; + case Error::BindIPAddress: return "Failed to bind IP address"; + case Error::Read: return "Failed to read connection"; + case Error::Write: return "Failed to write connection"; + case Error::ExceedRedirectCount: return "Maximum redirect count exceeded"; + case Error::Canceled: return "Connection handling canceled"; + case Error::SSLConnection: return "SSL connection failed"; + case Error::SSLLoadingCerts: return "SSL certificate loading failed"; + case Error::SSLServerVerification: return "SSL server verification failed"; + case Error::SSLServerHostnameVerification: + return "SSL server hostname verification failed"; + case Error::UnsupportedMultipartBoundaryChars: + return "Unsupported HTTP multipart boundary characters"; + case Error::Compression: return "Compression failed"; + case Error::ConnectionTimeout: return "Connection timed out"; + case Error::ProxyConnection: return "Proxy connection failed"; + case Error::ConnectionClosed: return "Connection closed by server"; + case Error::Timeout: return "Read timeout"; + case Error::ResourceExhaustion: return "Resource exhaustion"; + case Error::TooManyFormDataFiles: return "Too many form data files"; + case Error::ExceedMaxPayloadSize: return "Exceeded maximum payload size"; + case Error::ExceedUriMaxLength: return "Exceeded maximum URI length"; + case Error::ExceedMaxSocketDescriptorCount: + return "Exceeded maximum socket descriptor count"; + case Error::InvalidRequestLine: return "Invalid request line"; + case Error::InvalidHTTPMethod: return "Invalid HTTP method"; + case Error::InvalidHTTPVersion: return "Invalid HTTP version"; + case Error::InvalidHeaders: return "Invalid headers"; + case Error::MultipartParsing: return "Multipart parsing failed"; + case Error::OpenFile: return "Failed to open file"; + case Error::Listen: return "Failed to listen on socket"; + case Error::GetSockName: return "Failed to get socket name"; + case Error::UnsupportedAddressFamily: return "Unsupported address family"; + case Error::HTTPParsing: return "HTTP parsing failed"; + case Error::InvalidRangeHeader: return "Invalid Range header"; + default: break; + } + + return "Invalid"; +} + +inline std::ostream &operator<<(std::ostream &os, const Error &obj) { + os << to_string(obj); + os << " (" << static_cast::type>(obj) << ')'; + return os; +} + +inline std::string hosted_at(const std::string &hostname) { + std::vector addrs; + hosted_at(hostname, addrs); + if (addrs.empty()) { return std::string(); } + return addrs[0]; +} + +inline void hosted_at(const std::string &hostname, + std::vector &addrs) { + struct addrinfo hints; + struct addrinfo *result; + + memset(&hints, 0, sizeof(struct addrinfo)); + hints.ai_family = AF_UNSPEC; + hints.ai_socktype = SOCK_STREAM; + hints.ai_protocol = 0; + + if (detail::getaddrinfo_with_timeout(hostname.c_str(), nullptr, &hints, + &result, 0)) { +#if defined __linux__ && !defined __ANDROID__ + res_init(); +#endif + return; + } + auto se = detail::scope_exit([&] { freeaddrinfo(result); }); + + for (auto rp = result; rp; rp = rp->ai_next) { + const auto &addr = + *reinterpret_cast(rp->ai_addr); + std::string ip; + auto dummy = -1; + if (detail::get_ip_and_port(addr, sizeof(struct sockaddr_storage), ip, + dummy)) { + addrs.emplace_back(std::move(ip)); + } + } +} + +inline std::string encode_uri_component(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +inline std::string encode_uri(const std::string &value) { + std::ostringstream escaped; + escaped.fill('0'); + escaped << std::hex; + + for (auto c : value) { + if (std::isalnum(static_cast(c)) || c == '-' || c == '_' || + c == '.' || c == '!' || c == '~' || c == '*' || c == '\'' || c == '(' || + c == ')' || c == ';' || c == '/' || c == '?' || c == ':' || c == '@' || + c == '&' || c == '=' || c == '+' || c == '$' || c == ',' || c == '#') { + escaped << c; + } else { + escaped << std::uppercase; + escaped << '%' << std::setw(2) + << static_cast(static_cast(c)); + escaped << std::nouppercase; + } + } + + return escaped.str(); +} + +inline std::string decode_uri_component(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +inline std::string decode_uri(const std::string &value) { + std::string result; + + for (size_t i = 0; i < value.size(); i++) { + if (value[i] == '%' && i + 2 < value.size()) { + auto val = 0; + if (detail::from_hex_to_i(value, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += value[i]; + } + } else { + result += value[i]; + } + } + + return result; +} + +inline std::string encode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986: ALPHA / DIGIT / "-" / "." / "_" / "~" + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Path-safe sub-delimiters: "!" / "$" / "&" / "'" / "(" / ")" / "*" / "+" / + // "," / ";" / "=" + else if (c == '!' || c == '$' || c == '&' || c == '\'' || c == '(' || + c == ')' || c == '*' || c == '+' || c == ',' || c == ';' || + c == '=') { + result += static_cast(c); + } + // Colon is allowed in path segments except first segment + else if (c == ':') { + result += static_cast(c); + } + // @ is allowed in path + else if (c == '@') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +inline std::string decode_path_component(const std::string &component) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 1 < component.size()) { + if (component[i + 1] == 'u') { + // Unicode %uXXXX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 2, 4, val)) { + // 4 digits Unicode codes: val is 0x0000-0xFFFF (from 4 hex digits), + // so to_utf8 writes at most 3 bytes. buff[4] is safe. + char buff[4]; + size_t len = detail::to_utf8(val, buff); + if (len > 0) { result.append(buff, len); } + i += 5; // 'u0000' + } else { + result += component[i]; + } + } else { + // Standard %XX encoding + auto val = 0; + if (detail::from_hex_to_i(component, i + 1, 2, val)) { + // 2 digits hex codes + result += static_cast(val); + i += 2; // 'XX' + } else { + result += component[i]; + } + } + } else { + result += component[i]; + } + } + return result; +} + +inline std::string encode_query_component(const std::string &component, + bool space_as_plus) { + std::string result; + result.reserve(component.size() * 3); + + for (size_t i = 0; i < component.size(); i++) { + auto c = static_cast(component[i]); + + // Unreserved characters per RFC 3986 + if (std::isalnum(c) || c == '-' || c == '.' || c == '_' || c == '~') { + result += static_cast(c); + } + // Space handling + else if (c == ' ') { + if (space_as_plus) { + result += '+'; + } else { + result += "%20"; + } + } + // Plus sign handling + else if (c == '+') { + if (space_as_plus) { + result += "%2B"; + } else { + result += static_cast(c); + } + } + // Query-safe sub-delimiters (excluding & and = which are query delimiters) + else if (c == '!' || c == '$' || c == '\'' || c == '(' || c == ')' || + c == '*' || c == ',' || c == ';') { + result += static_cast(c); + } + // Colon and @ are allowed in query + else if (c == ':' || c == '@') { + result += static_cast(c); + } + // Forward slash is allowed in query values + else if (c == '/') { + result += static_cast(c); + } + // Question mark is allowed in query values (after first ?) + else if (c == '?') { + result += static_cast(c); + } else { + result += '%'; + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", c); + result.append(hex, 2); + } + } + return result; +} + +inline std::string decode_query_component(const std::string &component, + bool plus_as_space) { + std::string result; + result.reserve(component.size()); + + for (size_t i = 0; i < component.size(); i++) { + if (component[i] == '%' && i + 2 < component.size()) { + auto val = 0; + if (detail::from_hex_to_i(component, i + 1, 2, val)) { + result += static_cast(val); + i += 2; + } else { + result += component[i]; + } + } else if (component[i] == '+' && plus_as_space) { + result += ' '; // + becomes space in form-urlencoded + } else { + result += component[i]; + } + } + return result; +} + +inline std::string sanitize_filename(const std::string &filename) { + // Extract basename: find the last path separator (/ or \) + auto pos = filename.find_last_of("/\\"); + auto result = + (pos != std::string::npos) ? filename.substr(pos + 1) : filename; + + // Strip null bytes + result.erase(std::remove(result.begin(), result.end(), '\0'), result.end()); + + // Trim whitespace + { + auto start = result.find_first_not_of(" \t"); + auto end = result.find_last_not_of(" \t"); + result = (start == std::string::npos) + ? "" + : result.substr(start, end - start + 1); + } + + // Reject . and .. + if (result == "." || result == "..") { return ""; } + + return result; +} + +inline std::string append_query_params(const std::string &path, + const Params ¶ms) { + std::string path_with_query = path; + thread_local const std::regex re("[^?]+\\?.*"); + auto delm = std::regex_match(path, re) ? '&' : '?'; + path_with_query += delm + detail::params_to_query_str(params); + return path_with_query; +} + +// Header utilities +inline std::pair +make_range_header(const Ranges &ranges) { + std::string field = "bytes="; + auto i = 0; + for (const auto &r : ranges) { + if (i != 0) { field += ", "; } + if (r.first != -1) { field += std::to_string(r.first); } + field += '-'; + if (r.second != -1) { field += std::to_string(r.second); } + i++; + } + return std::make_pair("Range", std::move(field)); +} + +inline std::pair +make_basic_authentication_header(const std::string &username, + const std::string &password, bool is_proxy) { + auto field = "Basic " + detail::base64_encode(username + ":" + password); + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +inline std::pair +make_bearer_token_authentication_header(const std::string &token, + bool is_proxy = false) { + auto field = "Bearer " + token; + auto key = is_proxy ? "Proxy-Authorization" : "Authorization"; + return std::make_pair(key, std::move(field)); +} + +// Request implementation +inline size_t Request::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { + return detail::get_header_value_u64(headers, key, def, id); +} + +inline bool Request::has_header(const std::string &key) const { + return detail::has_header(headers, key); +} + +inline std::string Request::get_header_value(const std::string &key, + const char *def, size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +inline size_t Request::get_header_value_count(const std::string &key) const { + return detail::get_header_value_count(headers, key); +} + +inline void Request::set_header(const std::string &key, + const std::string &val) { + detail::set_header(headers, key, val); +} + +inline bool Request::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +inline std::string Request::get_trailer_value(const std::string &key, + size_t id) const { + return detail::get_multimap_value(trailers, key, id); +} + +inline size_t Request::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline bool Request::has_param(const std::string &key) const { + return params.find(key) != params.end(); +} + +inline std::string Request::get_param_value(const std::string &key, + size_t id) const { + return detail::get_multimap_value(params, key, id); +} + +inline std::vector +Request::get_param_values(const std::string &key) const { + auto rng = params.equal_range(key); + std::vector values; + values.reserve(static_cast(std::distance(rng.first, rng.second))); + for (auto it = rng.first; it != rng.second; ++it) { + values.push_back(it->second); + } + return values; +} + +inline size_t Request::get_param_value_count(const std::string &key) const { + auto r = params.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline bool Request::is_multipart_form_data() const { + const auto &content_type = get_header_value("Content-Type"); + return detail::extract_media_type(content_type) == "multipart/form-data"; +} + +// Multipart FormData implementation +inline std::string MultipartFormData::get_field(const std::string &key, + size_t id) const { + auto rng = fields.equal_range(key); + auto it = rng.first; + std::advance(it, static_cast(id)); + if (it != rng.second) { return it->second.content; } + return std::string(); +} + +inline std::vector +MultipartFormData::get_fields(const std::string &key) const { + std::vector values; + auto rng = fields.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second.content); + } + return values; +} + +inline bool MultipartFormData::has_field(const std::string &key) const { + return fields.find(key) != fields.end(); +} + +inline size_t MultipartFormData::get_field_count(const std::string &key) const { + auto r = fields.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline FormData MultipartFormData::get_file(const std::string &key, + size_t id) const { + return detail::get_multimap_value(files, key, id); +} + +inline std::vector +MultipartFormData::get_files(const std::string &key) const { + std::vector values; + auto rng = files.equal_range(key); + for (auto it = rng.first; it != rng.second; it++) { + values.push_back(it->second); + } + return values; +} + +inline bool MultipartFormData::has_file(const std::string &key) const { + return files.find(key) != files.end(); +} + +inline size_t MultipartFormData::get_file_count(const std::string &key) const { + auto r = files.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Response implementation +inline size_t Response::get_header_value_u64(const std::string &key, size_t def, + size_t id) const { + return detail::get_header_value_u64(headers, key, def, id); +} + +inline bool Response::has_header(const std::string &key) const { + return headers.find(key) != headers.end(); +} + +inline std::string Response::get_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(headers, key, def, id); +} + +inline size_t Response::get_header_value_count(const std::string &key) const { + return detail::get_header_value_count(headers, key); +} + +inline void Response::set_header(const std::string &key, + const std::string &val) { + detail::set_header(headers, key, val); +} +inline bool Response::has_trailer(const std::string &key) const { + return trailers.find(key) != trailers.end(); +} + +inline std::string Response::get_trailer_value(const std::string &key, + size_t id) const { + return detail::get_multimap_value(trailers, key, id); +} + +inline size_t Response::get_trailer_value_count(const std::string &key) const { + auto r = trailers.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +inline void Response::set_redirect(const std::string &url, int stat) { + if (detail::fields::is_field_value(url)) { + set_header("Location", url); + if (300 <= stat && stat < 400) { + this->status = stat; + } else { + this->status = StatusCode::Found_302; + } + } +} + +inline void Response::set_content(const char *s, size_t n, + const std::string &content_type) { + body.assign(s, n); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +inline void Response::set_content(const std::string &s, + const std::string &content_type) { + set_content(s.data(), s.size(), content_type); +} + +inline void Response::set_content(std::string &&s, + const std::string &content_type) { + body = std::move(s); + + auto rng = headers.equal_range("Content-Type"); + headers.erase(rng.first, rng.second); + set_header("Content-Type", content_type); +} + +inline void Response::set_content_provider( + size_t in_length, const std::string &content_type, ContentProvider provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = in_length; + if (in_length > 0) { content_provider_ = std::move(provider); } + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +inline void Response::set_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = false; +} + +inline void Response::set_chunked_content_provider( + const std::string &content_type, ContentProviderWithoutLength provider, + ContentProviderResourceReleaser resource_releaser) { + set_header("Content-Type", content_type); + content_length_ = 0; + content_provider_ = detail::ContentProviderAdapter(std::move(provider)); + content_provider_resource_releaser_ = std::move(resource_releaser); + is_chunked_content_provider_ = true; +} + +inline void Response::set_file_content(const std::string &path, + const std::string &content_type) { + file_content_path_ = path; + file_content_content_type_ = content_type; +} + +inline void Response::set_file_content(const std::string &path) { + file_content_path_ = path; +} + +// Result implementation +inline size_t Result::get_request_header_value_u64(const std::string &key, + size_t def, + size_t id) const { + return detail::get_header_value_u64(request_headers_, key, def, id); +} + +inline bool Result::has_request_header(const std::string &key) const { + return request_headers_.find(key) != request_headers_.end(); +} + +inline std::string Result::get_request_header_value(const std::string &key, + const char *def, + size_t id) const { + return detail::get_header_value(request_headers_, key, def, id); +} + +inline size_t +Result::get_request_header_value_count(const std::string &key) const { + auto r = request_headers_.equal_range(key); + return static_cast(std::distance(r.first, r.second)); +} + +// Stream implementation +inline ssize_t Stream::write(const char *ptr) { + return write(ptr, strlen(ptr)); +} + +inline ssize_t Stream::write(const std::string &s) { + return write(s.data(), s.size()); +} + +// BodyReader implementation +inline ssize_t detail::BodyReader::read(char *buf, size_t len) { + if (!stream) { + last_error = Error::Connection; + return -1; + } + if (eof) { return 0; } + + if (!chunked) { + // Content-Length based reading + if (has_content_length && bytes_read >= content_length) { + eof = true; + return 0; + } + + auto to_read = len; + if (has_content_length) { + auto remaining = content_length - bytes_read; + to_read = (std::min)(len, remaining); + } + auto n = stream->read(buf, to_read); + + if (n < 0) { + last_error = stream->get_error(); + if (last_error == Error::Success) { last_error = Error::Read; } + eof = true; + return n; + } + if (n == 0) { + // Unexpected EOF before content_length + last_error = stream->get_error(); + if (last_error == Error::Success) { last_error = Error::Read; } + eof = true; + return 0; + } + + bytes_read += static_cast(n); + if (has_content_length && bytes_read >= content_length) { eof = true; } + if (payload_max_length > 0 && bytes_read > payload_max_length) { + last_error = Error::ExceedMaxPayloadSize; + eof = true; + return -1; + } + return n; + } + + // Chunked transfer encoding: delegate to shared decoder instance. + if (!chunked_decoder) { chunked_decoder.reset(new ChunkedDecoder(*stream)); } + + size_t chunk_offset = 0; + size_t chunk_total = 0; + auto n = chunked_decoder->read_payload(buf, len, chunk_offset, chunk_total); + if (n < 0) { + last_error = stream->get_error(); + if (last_error == Error::Success) { last_error = Error::Read; } + eof = true; + return n; + } + + if (n == 0) { + // Final chunk observed. Leave trailer parsing to the caller (StreamHandle). + eof = true; + return 0; + } + + bytes_read += static_cast(n); + if (payload_max_length > 0 && bytes_read > payload_max_length) { + last_error = Error::ExceedMaxPayloadSize; + eof = true; + return -1; + } + return n; +} + +// ThreadPool implementation +inline ThreadPool::ThreadPool(size_t n, size_t max_n, size_t mqr) + : base_thread_count_(n), max_queued_requests_(mqr), idle_thread_count_(0), + shutdown_(false) { +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + if (max_n != 0 && max_n < n) { + std::string msg = "max_threads must be >= base_threads"; + throw std::invalid_argument(msg); + } +#endif + max_thread_count_ = max_n == 0 ? n : max_n; + threads_.reserve(base_thread_count_); +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + try { +#endif + for (size_t i = 0; i < base_thread_count_; i++) { + threads_.emplace_back(std::thread([this]() { worker(false); })); + } +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + } catch (...) { + // If thread creation fails partway (e.g., pthread_create returns EAGAIN), + // signal the workers we already spawned to exit and join them so the + // vector destructor does not see joinable threads (which would call + // std::terminate). Then rethrow so the caller learns of the failure. + { + std::unique_lock lock(mutex_); + shutdown_ = true; + } + cond_.notify_all(); + for (auto &t : threads_) { + if (t.joinable()) { t.join(); } + } + throw; + } +#endif +} + +inline bool ThreadPool::enqueue(std::function fn) { + { + std::unique_lock lock(mutex_); + if (shutdown_) { return false; } + if (max_queued_requests_ > 0 && jobs_.size() >= max_queued_requests_) { + return false; + } + jobs_.push_back(std::move(fn)); + + // Spawn a dynamic thread if no idle threads and under max + if (idle_thread_count_ == 0 && + threads_.size() + dynamic_threads_.size() < max_thread_count_) { + cleanup_finished_threads(); + dynamic_threads_.emplace_back(std::thread([this]() { worker(true); })); + } + } + + cond_.notify_one(); + return true; +} + +inline void ThreadPool::shutdown() { + { + std::unique_lock lock(mutex_); + shutdown_ = true; + } + + cond_.notify_all(); + + for (auto &t : threads_) { + if (t.joinable()) { t.join(); } + } + + // Move dynamic_threads_ to a local list under the lock to avoid racing + // with worker threads that call move_to_finished() concurrently. + std::list remaining_dynamic; + { + std::unique_lock lock(mutex_); + remaining_dynamic = std::move(dynamic_threads_); + } + for (auto &t : remaining_dynamic) { + if (t.joinable()) { t.join(); } + } + + std::unique_lock lock(mutex_); + cleanup_finished_threads(); +} + +inline void ThreadPool::move_to_finished(std::thread::id id) { + // Must be called with mutex_ held + for (auto it = dynamic_threads_.begin(); it != dynamic_threads_.end(); ++it) { + if (it->get_id() == id) { + finished_threads_.push_back(std::move(*it)); + dynamic_threads_.erase(it); + return; + } + } +} + +inline void ThreadPool::cleanup_finished_threads() { + // Must be called with mutex_ held + for (auto &t : finished_threads_) { + if (t.joinable()) { t.join(); } + } + finished_threads_.clear(); +} + +inline void ThreadPool::worker(bool is_dynamic) { + for (;;) { + std::function fn; + { + std::unique_lock lock(mutex_); + idle_thread_count_++; + + if (is_dynamic) { + auto has_work = cond_.wait_for( + lock, std::chrono::seconds(CPPHTTPLIB_THREAD_POOL_IDLE_TIMEOUT), + [&] { return !jobs_.empty() || shutdown_; }); + if (!has_work) { + // Timed out with no work - exit this dynamic thread + idle_thread_count_--; + move_to_finished(std::this_thread::get_id()); + break; + } + } else { + cond_.wait(lock, [&] { return !jobs_.empty() || shutdown_; }); + } + + idle_thread_count_--; + + if (shutdown_ && jobs_.empty()) { break; } + + fn = std::move(jobs_.front()); + jobs_.pop_front(); + } + + assert(true == static_cast(fn)); + fn(); + } + +#if defined(CPPHTTPLIB_OPENSSL_SUPPORT) && !defined(OPENSSL_IS_BORINGSSL) && \ + !defined(LIBRESSL_VERSION_NUMBER) + OPENSSL_thread_stop(); +#endif +} + +/* + * Group 1 (continued): detail namespace - Stream implementations + */ + +namespace detail { + +inline void calc_actual_timeout(time_t max_timeout_msec, time_t duration_msec, + time_t timeout_sec, time_t timeout_usec, + time_t &actual_timeout_sec, + time_t &actual_timeout_usec) { + auto timeout_msec = (timeout_sec * 1000) + (timeout_usec / 1000); + + auto actual_timeout_msec = + (std::min)(max_timeout_msec - duration_msec, timeout_msec); + + if (actual_timeout_msec < 0) { actual_timeout_msec = 0; } + + actual_timeout_sec = actual_timeout_msec / 1000; + actual_timeout_usec = (actual_timeout_msec % 1000) * 1000; +} + +// Socket stream implementation +inline SocketStream::SocketStream( + socket_t sock, time_t read_timeout_sec, time_t read_timeout_usec, + time_t write_timeout_sec, time_t write_timeout_usec, + time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time), + read_buff_(read_buff_size_, 0) {} + +inline SocketStream::~SocketStream() = default; + +inline bool SocketStream::is_readable() const { + return read_buff_off_ < read_buff_content_size_; +} + +inline bool SocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +inline bool SocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0; +} + +inline bool SocketStream::is_peer_alive() const { + return detail::is_socket_alive(sock_); +} + +inline ssize_t SocketStream::read(char *ptr, size_t size) { +#ifdef _WIN32 + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#else + size = (std::min)(size, + static_cast((std::numeric_limits::max)())); +#endif + + if (read_buff_off_ < read_buff_content_size_) { + auto remaining_size = read_buff_content_size_ - read_buff_off_; + if (size <= remaining_size) { + memcpy(ptr, read_buff_.data() + read_buff_off_, size); + read_buff_off_ += size; + return static_cast(size); + } else { + memcpy(ptr, read_buff_.data() + read_buff_off_, remaining_size); + read_buff_off_ += remaining_size; + return static_cast(remaining_size); + } + } + + if (!wait_readable()) { + error_ = Error::Timeout; + return -1; + } + + read_buff_off_ = 0; + read_buff_content_size_ = 0; + + if (size < read_buff_size_) { + auto n = read_socket(sock_, read_buff_.data(), read_buff_size_, + CPPHTTPLIB_RECV_FLAGS); + if (n <= 0) { + if (n == 0) { + error_ = Error::ConnectionClosed; + } else { + error_ = Error::Read; + } + return n; + } else if (n <= static_cast(size)) { + memcpy(ptr, read_buff_.data(), static_cast(n)); + return n; + } else { + memcpy(ptr, read_buff_.data(), size); + read_buff_off_ = size; + read_buff_content_size_ = static_cast(n); + return static_cast(size); + } + } else { + auto n = read_socket(sock_, ptr, size, CPPHTTPLIB_RECV_FLAGS); + if (n <= 0) { + if (n == 0) { + error_ = Error::ConnectionClosed; + } else { + error_ = Error::Read; + } + } + return n; + } +} + +inline ssize_t SocketStream::write(const char *ptr, size_t size) { + if (!wait_writable()) { return -1; } + +#if defined(_WIN32) && !defined(_WIN64) + size = + (std::min)(size, static_cast((std::numeric_limits::max)())); +#endif + + return send_socket(sock_, ptr, size, CPPHTTPLIB_SEND_FLAGS); +} + +inline void SocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + return detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline void SocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + return detail::get_local_ip_and_port(sock_, ip, port); +} + +inline socket_t SocketStream::socket() const { return sock_; } + +inline time_t SocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +inline void SocketStream::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +// Buffer stream implementation +inline bool BufferStream::is_readable() const { return true; } + +inline bool BufferStream::wait_readable() const { return true; } + +inline bool BufferStream::wait_writable() const { return true; } + +inline ssize_t BufferStream::read(char *ptr, size_t size) { +#if defined(_MSC_VER) && _MSC_VER < 1910 + auto len_read = buffer._Copy_s(ptr, size, size, position); +#else + auto len_read = buffer.copy(ptr, size, position); +#endif + position += static_cast(len_read); + return static_cast(len_read); +} + +inline ssize_t BufferStream::write(const char *ptr, size_t size) { + buffer.append(ptr, size); + return static_cast(size); +} + +inline void BufferStream::get_remote_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +inline void BufferStream::get_local_ip_and_port(std::string & /*ip*/, + int & /*port*/) const {} + +inline socket_t BufferStream::socket() const { return 0; } + +inline time_t BufferStream::duration() const { return 0; } + +inline const std::string &BufferStream::get_buffer() const { return buffer; } + +inline PathParamsMatcher::PathParamsMatcher(const std::string &pattern) + : MatcherBase(pattern) { + constexpr const char marker[] = "/:"; + + // One past the last ending position of a path param substring + std::size_t last_param_end = 0; + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + // Needed to ensure that parameter names are unique during matcher + // construction + // If exceptions are disabled, only last duplicate path + // parameter will be set + std::unordered_set param_name_set; +#endif + + while (true) { + const auto marker_pos = pattern.find( + marker, last_param_end == 0 ? last_param_end : last_param_end - 1); + if (marker_pos == std::string::npos) { break; } + + static_fragments_.push_back( + pattern.substr(last_param_end, marker_pos - last_param_end + 1)); + + const auto param_name_start = marker_pos + str_len(marker); + + auto sep_pos = pattern.find(separator, param_name_start); + if (sep_pos == std::string::npos) { sep_pos = pattern.length(); } + + auto param_name = + pattern.substr(param_name_start, sep_pos - param_name_start); + +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + if (param_name_set.find(param_name) != param_name_set.cend()) { + std::string msg = "Encountered path parameter '" + param_name + + "' multiple times in route pattern '" + pattern + "'."; + throw std::invalid_argument(msg); + } +#endif + + param_names_.push_back(std::move(param_name)); + + last_param_end = sep_pos + 1; + } + + if (last_param_end < pattern.length()) { + static_fragments_.push_back(pattern.substr(last_param_end)); + } +} + +inline bool PathParamsMatcher::match(Request &request) const { + request.matches = std::smatch(); + request.path_params.clear(); + request.path_params.reserve(param_names_.size()); + + // One past the position at which the path matched the pattern last time + std::size_t starting_pos = 0; + for (size_t i = 0; i < static_fragments_.size(); ++i) { + const auto &fragment = static_fragments_[i]; + + if (starting_pos + fragment.length() > request.path.length()) { + return false; + } + + // Avoid unnecessary allocation by using strncmp instead of substr + + // comparison + if (std::strncmp(request.path.c_str() + starting_pos, fragment.c_str(), + fragment.length()) != 0) { + return false; + } + + starting_pos += fragment.length(); + + // Should only happen when we have a static fragment after a param + // Example: '/users/:id/subscriptions' + // The 'subscriptions' fragment here does not have a corresponding param + if (i >= param_names_.size()) { continue; } + + auto sep_pos = request.path.find(separator, starting_pos); + if (sep_pos == std::string::npos) { sep_pos = request.path.length(); } + + const auto ¶m_name = param_names_[i]; + + request.path_params.emplace( + param_name, request.path.substr(starting_pos, sep_pos - starting_pos)); + + // Mark everything up to '/' as matched + starting_pos = sep_pos + 1; + } + // Returns false if the path is longer than the pattern + return starting_pos >= request.path.length(); +} + +inline bool RegexMatcher::match(Request &request) const { + request.path_params.clear(); + return std::regex_match(request.path, request.matches, regex_); +} + +// Enclose IPv6 address in brackets if needed +inline std::string prepare_host_string(const std::string &host) { + // Enclose IPv6 address in brackets (but not if already enclosed) + if (host.find(':') == std::string::npos || + (!host.empty() && host[0] == '[')) { + // IPv4, hostname, or already bracketed IPv6 + return host; + } else { + // IPv6 address without brackets + return "[" + host + "]"; + } +} + +inline std::string make_host_and_port_string(const std::string &host, int port, + bool is_ssl) { + auto result = prepare_host_string(host); + + // Append port if not default + if ((!is_ssl && port == 80) || (is_ssl && port == 443)) { + ; // do nothing + } else { + result += ":" + std::to_string(port); + } + + return result; +} + +// Create "host:port" string always including port number (for CONNECT method) +inline std::string +make_host_and_port_string_always_port(const std::string &host, int port) { + return prepare_host_string(host) + ":" + std::to_string(port); +} + +bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out); +NormalizedTarget normalize_target(const std::string &host); +bool ip_in_cidr(const IPBytes &ip, const IPBytes &net, int prefix_bits); +bool host_matches_no_proxy(const NormalizedTarget &target, + const std::vector &entries); + +inline bool ip_in_cidr(const IPBytes &ip, const IPBytes &net, int prefix_bits) { + if (prefix_bits < 0 || prefix_bits > 128) { return false; } + if (prefix_bits == 0) { return true; } + int full_bytes = prefix_bits / 8; + int rem_bits = prefix_bits % 8; + if (full_bytes > 0 && std::memcmp(ip.data(), net.data(), + static_cast(full_bytes)) != 0) { + return false; + } + if (rem_bits == 0) { return true; } + auto i = static_cast(full_bytes); + auto mask = static_cast(0xFFu << (8 - rem_bits)); + return (ip[i] & mask) == (net[i] & mask); +} + +inline bool parse_no_proxy_entry(const std::string &token, NoProxyEntry &out) { + if (token.empty()) { return false; } + + if (token == "*") { + out.kind = NoProxyKind::Wildcard; + return true; + } + + auto slash = token.find('/'); + std::string addr_part = + (slash == std::string::npos) ? token : token.substr(0, slash); + std::string prefix_part = + (slash == std::string::npos) ? std::string() : token.substr(slash + 1); + + // A bare slash or trailing-slash CIDR like "10.0.0.0/" is malformed; + // don't silently treat it as a /32 (or /128). + if (slash != std::string::npos && prefix_part.empty()) { return false; } + + // Accept the bracketed IPv6 form ("[::1]", "[fe80::]/10") as well as the + // bare form. Brackets have no meaning for IPv4, so skip the IPv4 attempt + // when brackets are present. + bool bracketed = addr_part.size() >= 2 && addr_part.front() == '[' && + addr_part.back() == ']'; + if (bracketed) { addr_part = addr_part.substr(1, addr_part.size() - 2); } + + if (!bracketed) { + struct in_addr v4; + if (inet_pton(AF_INET, addr_part.c_str(), &v4) == 1) { + int prefix = 32; + if (!prefix_part.empty()) { + auto r = from_chars(prefix_part.data(), + prefix_part.data() + prefix_part.size(), prefix); + if (r.ec != std::errc{} || + r.ptr != prefix_part.data() + prefix_part.size()) { + return false; + } + if (prefix < 0 || prefix > 32) { return false; } + } + out.kind = NoProxyKind::IPv4Cidr; + std::memcpy(out.net.data(), &v4, sizeof(v4)); + out.prefix_bits = prefix; + return true; + } + } + + struct in6_addr v6; + if (inet_pton(AF_INET6, addr_part.c_str(), &v6) == 1) { + int prefix = 128; + if (!prefix_part.empty()) { + auto r = from_chars(prefix_part.data(), + prefix_part.data() + prefix_part.size(), prefix); + if (r.ec != std::errc{} || + r.ptr != prefix_part.data() + prefix_part.size()) { + return false; + } + if (prefix < 0 || prefix > 128) { return false; } + } + out.kind = NoProxyKind::IPv6Cidr; + std::memcpy(out.net.data(), &v6, sizeof(v6)); + out.prefix_bits = prefix; + return true; + } + + // Bracketed entries can only be IPv6. If the IPv6 parse above failed, + // the entry is malformed — don't fall through to the hostname branch. + if (bracketed) { return false; } + + // A '/' on a non-IP token means a CIDR prefix without an address. Reject. + if (slash != std::string::npos) { return false; } + // Port-specific entries (host:port) are not supported. + if (token.find(':') != std::string::npos) { return false; } + + std::string hostname = case_ignore::to_lower(token); + while (!hostname.empty() && hostname.front() == '.') { + hostname.erase(hostname.begin()); + } + while (!hostname.empty() && hostname.back() == '.') { + hostname.pop_back(); + } + if (hostname.empty()) { return false; } + + out.kind = NoProxyKind::HostnameSuffix; + out.hostname_pattern = std::move(hostname); + return true; +} + +inline NormalizedTarget normalize_target(const std::string &host) { + NormalizedTarget t; + std::string h = host; + + if (h.size() >= 2 && h.front() == '[' && h.back() == ']') { + h = h.substr(1, h.size() - 2); + } + + // Strip a single trailing dot so "example.com." canonicalizes to + // "example.com". + if (!h.empty() && h.back() == '.') { h.pop_back(); } + + t.hostname = case_ignore::to_lower(h); + + if (!t.hostname.empty()) { + struct in_addr v4; + struct in6_addr v6; + if (inet_pton(AF_INET, t.hostname.c_str(), &v4) == 1) { + t.is_ipv4 = true; + std::memcpy(t.ip.data(), &v4, sizeof(v4)); + } else if (inet_pton(AF_INET6, t.hostname.c_str(), &v6) == 1) { + t.is_ipv6 = true; + std::memcpy(t.ip.data(), &v6, sizeof(v6)); + } + } + return t; +} + +inline bool host_matches_no_proxy(const NormalizedTarget &target, + const std::vector &entries) { + if (target.hostname.empty()) { return false; } + for (const auto &e : entries) { + switch (e.kind) { + case NoProxyKind::Wildcard: return true; + case NoProxyKind::IPv4Cidr: + if (target.is_ipv4 && ip_in_cidr(target.ip, e.net, e.prefix_bits)) { + return true; + } + break; + case NoProxyKind::IPv6Cidr: + if (target.is_ipv6 && ip_in_cidr(target.ip, e.net, e.prefix_bits)) { + return true; + } + break; + case NoProxyKind::HostnameSuffix: + if (target.is_ipv4 || target.is_ipv6) { break; } + if (target.hostname == e.hostname_pattern) { return true; } + // Dot-boundary suffix match: prevents "evilexample.com" from matching + // an entry of "example.com". + if (target.hostname.size() > e.hostname_pattern.size() + 1) { + auto offset = target.hostname.size() - e.hostname_pattern.size(); + if (target.hostname[offset - 1] == '.' && + target.hostname.compare(offset, e.hostname_pattern.size(), + e.hostname_pattern) == 0) { + return true; + } + } + break; + } + } + return false; +} + +template +inline bool check_and_write_headers(Stream &strm, Headers &headers, + T header_writer, Error &error) { + for (const auto &h : headers) { + if (!detail::fields::is_field_name(h.first) || + !detail::fields::is_field_value(h.second)) { + error = Error::InvalidHeaders; + return false; + } + } + if (header_writer(strm, headers) <= 0) { + error = Error::Write; + return false; + } + return true; +} + +} // namespace detail + +/* + * Group 2 (continued): detail namespace - SSLSocketStream implementation + */ + +#ifdef CPPHTTPLIB_SSL_ENABLED +namespace detail { + +// SSL socket stream implementation +inline SSLSocketStream::SSLSocketStream( + socket_t sock, tls::session_t session, time_t read_timeout_sec, + time_t read_timeout_usec, time_t write_timeout_sec, + time_t write_timeout_usec, time_t max_timeout_msec, + std::chrono::time_point start_time) + : sock_(sock), session_(session), read_timeout_sec_(read_timeout_sec), + read_timeout_usec_(read_timeout_usec), + write_timeout_sec_(write_timeout_sec), + write_timeout_usec_(write_timeout_usec), + max_timeout_msec_(max_timeout_msec), start_time_(start_time) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // Clear AUTO_RETRY for proper non-blocking I/O timeout handling + // Note: create_session() also clears this, but SSLClient currently + // uses ssl_new() which does not. Until full TLS API migration is complete, + // we need to ensure AUTO_RETRY is cleared here regardless of how the + // SSL session was created. + SSL_clear_mode(static_cast(session), SSL_MODE_AUTO_RETRY); +#endif +} + +inline SSLSocketStream::~SSLSocketStream() = default; + +inline bool SSLSocketStream::is_readable() const { + return tls::pending(session_) > 0; +} + +inline bool SSLSocketStream::wait_readable() const { + if (max_timeout_msec_ <= 0) { + return select_read(sock_, read_timeout_sec_, read_timeout_usec_) > 0; + } + + time_t read_timeout_sec; + time_t read_timeout_usec; + calc_actual_timeout(max_timeout_msec_, duration(), read_timeout_sec_, + read_timeout_usec_, read_timeout_sec, read_timeout_usec); + + return select_read(sock_, read_timeout_sec, read_timeout_usec) > 0; +} + +inline bool SSLSocketStream::wait_writable() const { + return select_write(sock_, write_timeout_sec_, write_timeout_usec_) > 0 && + !tls::is_peer_closed(session_, sock_); +} + +inline bool SSLSocketStream::is_peer_alive() const { + return !tls::is_peer_closed(session_, sock_); +} + +inline ssize_t SSLSocketStream::read(char *ptr, size_t size) { + if (tls::pending(session_) > 0) { + tls::TlsError err; + auto ret = tls::read(session_, ptr, size, err); + if (ret == 0 || err.code == tls::ErrorCode::PeerClosed) { + error_ = Error::ConnectionClosed; + } + return ret; + } else if (wait_readable()) { + tls::TlsError err; + auto ret = tls::read(session_, ptr, size, err); + if (ret < 0) { + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err.code == tls::ErrorCode::WantRead || + (err.code == tls::ErrorCode::SyscallError && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err.code == tls::ErrorCode::WantRead) { +#endif + if (tls::pending(session_) > 0) { + return tls::read(session_, ptr, size, err); + } else if (wait_readable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = tls::read(session_, ptr, size, err); + if (ret >= 0) { return ret; } + } else { + break; + } + } + assert(ret < 0); + } else if (ret == 0 || err.code == tls::ErrorCode::PeerClosed) { + error_ = Error::ConnectionClosed; + } + return ret; + } else { + error_ = Error::Timeout; + return -1; + } +} + +inline ssize_t SSLSocketStream::write(const char *ptr, size_t size) { + if (wait_writable()) { + auto handle_size = + std::min(size, (std::numeric_limits::max)()); + + tls::TlsError err; + auto ret = tls::write(session_, ptr, handle_size, err); + if (ret < 0) { + auto n = 1000; +#ifdef _WIN32 + while (--n >= 0 && (err.code == tls::ErrorCode::WantWrite || + (err.code == tls::ErrorCode::SyscallError && + WSAGetLastError() == WSAETIMEDOUT))) { +#else + while (--n >= 0 && err.code == tls::ErrorCode::WantWrite) { +#endif + if (wait_writable()) { + std::this_thread::sleep_for(std::chrono::microseconds{10}); + ret = tls::write(session_, ptr, handle_size, err); + if (ret >= 0) { return ret; } + } else { + break; + } + } + assert(ret < 0); + } + return ret; + } + return -1; +} + +inline void SSLSocketStream::get_remote_ip_and_port(std::string &ip, + int &port) const { + detail::get_remote_ip_and_port(sock_, ip, port); +} + +inline void SSLSocketStream::get_local_ip_and_port(std::string &ip, + int &port) const { + detail::get_local_ip_and_port(sock_, ip, port); +} + +inline socket_t SSLSocketStream::socket() const { return sock_; } + +inline time_t SSLSocketStream::duration() const { + return std::chrono::duration_cast( + std::chrono::steady_clock::now() - start_time_) + .count(); +} + +inline void SSLSocketStream::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +} // namespace detail +#endif // CPPHTTPLIB_SSL_ENABLED + +/* + * Group 4: Server implementation + */ + +// HTTP server implementation +inline Server::Server() + : new_task_queue([] { + return new ThreadPool(CPPHTTPLIB_THREAD_POOL_COUNT, + CPPHTTPLIB_THREAD_POOL_MAX_COUNT); + }) { +#ifndef _WIN32 + signal(SIGPIPE, SIG_IGN); +#endif +} + +inline Server::~Server() = default; + +inline std::unique_ptr +Server::make_matcher(const std::string &pattern) { + if (pattern.find("/:") != std::string::npos) { + return detail::make_unique(pattern); + } else { + return detail::make_unique(pattern); + } +} + +inline Server &Server::Get(const std::string &pattern, Handler handler) { + return add_handler(get_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::Post(const std::string &pattern, Handler handler) { + return add_handler(post_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::Post(const std::string &pattern, + HandlerWithContentReader handler) { + return add_handler(post_handlers_for_content_reader_, pattern, + std::move(handler)); +} + +inline Server &Server::Put(const std::string &pattern, Handler handler) { + return add_handler(put_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::Put(const std::string &pattern, + HandlerWithContentReader handler) { + return add_handler(put_handlers_for_content_reader_, pattern, + std::move(handler)); +} + +inline Server &Server::Patch(const std::string &pattern, Handler handler) { + return add_handler(patch_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::Patch(const std::string &pattern, + HandlerWithContentReader handler) { + return add_handler(patch_handlers_for_content_reader_, pattern, + std::move(handler)); +} + +inline Server &Server::Delete(const std::string &pattern, Handler handler) { + return add_handler(delete_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::Delete(const std::string &pattern, + HandlerWithContentReader handler) { + return add_handler(delete_handlers_for_content_reader_, pattern, + std::move(handler)); +} + +inline Server &Server::Options(const std::string &pattern, Handler handler) { + return add_handler(options_handlers_, pattern, std::move(handler)); +} + +inline Server &Server::WebSocket(const std::string &pattern, + WebSocketHandler handler) { + websocket_handlers_.push_back( + {make_matcher(pattern), std::move(handler), nullptr}); + return *this; +} + +inline Server &Server::WebSocket(const std::string &pattern, + WebSocketHandler handler, + SubProtocolSelector sub_protocol_selector) { + websocket_handlers_.push_back({make_matcher(pattern), std::move(handler), + std::move(sub_protocol_selector)}); + return *this; +} + +inline bool Server::set_base_dir(const std::string &dir, + const std::string &mount_point) { + return set_mount_point(mount_point, dir); +} + +inline bool Server::set_mount_point(const std::string &mount_point, + const std::string &dir, Headers headers) { + detail::FileStat stat(dir); + if (stat.is_dir()) { + std::string mnt = !mount_point.empty() ? mount_point : "/"; + if (!mnt.empty() && mnt[0] == '/') { + std::string resolved_base; + if (detail::canonicalize_path(dir.c_str(), resolved_base)) { +#if defined(_WIN32) + if (resolved_base.back() != '\\' && resolved_base.back() != '/') { + resolved_base += '\\'; + } +#else + if (resolved_base.back() != '/') { resolved_base += '/'; } +#endif + } + base_dirs_.push_back( + {std::move(mnt), dir, std::move(resolved_base), std::move(headers)}); + return true; + } + } + return false; +} + +inline bool Server::remove_mount_point(const std::string &mount_point) { + for (auto it = base_dirs_.begin(); it != base_dirs_.end(); ++it) { + if (it->mount_point == mount_point) { + base_dirs_.erase(it); + return true; + } + } + return false; +} + +inline Server & +Server::set_file_extension_and_mimetype_mapping(const std::string &ext, + const std::string &mime) { + file_extension_and_mimetype_map_[ext] = mime; + return *this; +} + +inline Server &Server::set_default_file_mimetype(const std::string &mime) { + default_file_mimetype_ = mime; + return *this; +} + +inline Server &Server::set_file_request_handler(Handler handler) { + file_request_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler_core(HandlerWithResponse handler, + std::true_type) { + error_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_error_handler_core(Handler handler, + std::false_type) { + error_handler_ = [handler](const Request &req, Response &res) { + handler(req, res); + return HandlerResponse::Handled; + }; + return *this; +} + +inline Server &Server::set_exception_handler(ExceptionHandler handler) { + exception_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_pre_routing_handler(HandlerWithResponse handler) { + pre_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_post_routing_handler(Handler handler) { + post_routing_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_pre_request_handler(HandlerWithResponse handler) { + pre_request_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_logger(Logger logger) { + logger_ = std::move(logger); + return *this; +} + +inline Server &Server::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); + return *this; +} + +inline Server &Server::set_pre_compression_logger(Logger logger) { + pre_compression_logger_ = std::move(logger); + return *this; +} + +inline Server & +Server::set_expect_100_continue_handler(Expect100ContinueHandler handler) { + expect_100_continue_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_start_handler(StartHandler handler) { + start_handler_ = std::move(handler); + return *this; +} + +inline Server &Server::set_address_family(int family) { + address_family_ = family; + return *this; +} + +inline Server &Server::set_tcp_nodelay(bool on) { + tcp_nodelay_ = on; + return *this; +} + +inline Server &Server::set_ipv6_v6only(bool on) { + ipv6_v6only_ = on; + return *this; +} + +inline Server &Server::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); + return *this; +} + +inline Server &Server::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); + return *this; +} + +inline Server &Server::set_header_writer( + std::function const &writer) { + header_writer_ = writer; + return *this; +} + +inline Server & +Server::set_trusted_proxies(const std::vector &proxies) { + trusted_proxies_ = proxies; + return *this; +} + +inline Server &Server::set_keep_alive_max_count(size_t count) { + keep_alive_max_count_ = count; + return *this; +} + +inline Server &Server::set_keep_alive_timeout(time_t sec) { + keep_alive_timeout_sec_ = sec; + return *this; +} + +template +inline Server &Server::set_keep_alive_timeout( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec(duration, [&](time_t sec, time_t /*usec*/) { + set_keep_alive_timeout(sec); + }); + return *this; +} + +inline Server &Server::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; + return *this; +} + +inline Server &Server::set_idle_interval(time_t sec, time_t usec) { + idle_interval_sec_ = sec; + idle_interval_usec_ = usec; + return *this; +} + +inline Server &Server::set_payload_max_length(size_t length) { + payload_max_length_ = length; + return *this; +} + +inline Server &Server::set_websocket_max_missed_pongs(int count) { + websocket_max_missed_pongs_ = count; + return *this; +} + +inline Server &Server::set_websocket_ping_interval(time_t sec) { + websocket_ping_interval_sec_ = sec; + return *this; +} + +template +inline Server &Server::set_websocket_ping_interval( + const std::chrono::duration &duration) { + detail::duration_to_sec_and_usec(duration, [&](time_t sec, time_t /*usec*/) { + set_websocket_ping_interval(sec); + }); + return *this; +} + +inline bool Server::bind_to_port(const std::string &host, int port, + int socket_flags) { + auto ret = bind_internal(host, port, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret >= 0; +} +inline int Server::bind_to_any_port(const std::string &host, int socket_flags) { + auto ret = bind_internal(host, 0, socket_flags); + if (ret == -1) { is_decommissioned = true; } + return ret; +} + +inline bool Server::listen_after_bind() { return listen_internal(); } + +inline bool Server::listen(const std::string &host, int port, + int socket_flags) { + return bind_to_port(host, port, socket_flags) && listen_internal(); +} + +inline bool Server::is_running() const { return is_running_; } + +inline void Server::wait_until_ready() const { + while (!is_running_ && !is_decommissioned) { + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } +} + +inline void Server::stop() noexcept { + if (is_running_) { + assert(svr_sock_ != INVALID_SOCKET); + std::atomic sock(svr_sock_.exchange(INVALID_SOCKET)); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + is_decommissioned = false; +} + +inline void Server::decommission() { is_decommissioned = true; } + +inline bool Server::parse_request_line(const char *s, Request &req) const { + auto len = strlen(s); + if (len < 2 || s[len - 2] != '\r' || s[len - 1] != '\n') { return false; } + len -= 2; + + { + size_t count = 0; + + detail::split(s, s + len, ' ', [&](const char *b, const char *e) { + switch (count) { + case 0: req.method = std::string(b, e); break; + case 1: req.target = std::string(b, e); break; + case 2: req.version = std::string(b, e); break; + default: break; + } + count++; + }); + + if (count != 3) { return false; } + } + + thread_local const std::set methods{ + "GET", "HEAD", "POST", "PUT", "DELETE", + "CONNECT", "OPTIONS", "TRACE", "PATCH", "PRI"}; + + if (methods.find(req.method) == methods.end()) { + output_error_log(Error::InvalidHTTPMethod, &req); + return false; + } + + if (req.version != "HTTP/1.1" && req.version != "HTTP/1.0") { + output_error_log(Error::InvalidHTTPVersion, &req); + return false; + } + + { + // Skip URL fragment + for (size_t i = 0; i < req.target.size(); i++) { + if (req.target[i] == '#') { + req.target.erase(i); + break; + } + } + + detail::divide(req.target, '?', + [&](const char *lhs_data, std::size_t lhs_size, + const char *rhs_data, std::size_t rhs_size) { + req.path = + decode_path_component(std::string(lhs_data, lhs_size)); + detail::parse_query_text(rhs_data, rhs_size, req.params); + }); + } + + return true; +} + +inline bool Server::write_response(Stream &strm, bool close_connection, + Request &req, Response &res) { + // NOTE: `req.ranges` should be empty, otherwise it will be applied + // incorrectly to the error content. + req.ranges.clear(); + return write_response_core(strm, close_connection, req, res, false); +} + +inline bool Server::write_response_with_content(Stream &strm, + bool close_connection, + const Request &req, + Response &res) { + return write_response_core(strm, close_connection, req, res, true); +} + +inline bool Server::write_response_core(Stream &strm, bool close_connection, + const Request &req, Response &res, + bool need_apply_ranges) { + assert(res.status != -1); + + if (400 <= res.status && error_handler_ && + error_handler_(req, res) == HandlerResponse::Handled) { + need_apply_ranges = true; + } + + std::string content_type; + std::string boundary; + if (need_apply_ranges) { apply_ranges(req, res, content_type, boundary); } + + // Prepare additional headers + if (close_connection || req.get_header_value("Connection") == "close" || + 400 <= res.status) { // Don't leave connections open after errors + res.set_header("Connection", "close"); + } else { + std::string s = "timeout="; + s += std::to_string(keep_alive_timeout_sec_); + s += ", max="; + s += std::to_string(keep_alive_max_count_); + res.set_header("Keep-Alive", s); + } + + if ((!res.body.empty() || res.content_length_ > 0 || res.content_provider_) && + !res.has_header("Content-Type")) { + res.set_header("Content-Type", "text/plain"); + } + + if (res.body.empty() && !res.content_length_ && !res.content_provider_ && + !res.has_header("Content-Length")) { + res.set_header("Content-Length", "0"); + } + + if (req.method == "HEAD" && !res.has_header("Accept-Ranges")) { + res.set_header("Accept-Ranges", "bytes"); + } + + if (post_routing_handler_) { post_routing_handler_(req, res); } + + // Response line and headers + detail::BufferStream bstrm; + if (!detail::write_response_line(bstrm, res.status)) { return false; } + if (header_writer_(bstrm, res.headers) <= 0) { return false; } + + // Combine small body with headers to reduce write syscalls + if (req.method != "HEAD" && !res.body.empty() && !res.content_provider_) { + bstrm.write(res.body.data(), res.body.size()); + } + + // Log before writing to avoid race condition with client-side code that + // accesses logger-captured data immediately after receiving the response. + output_log(req, res); + + // Flush buffer + auto &data = bstrm.get_buffer(); + if (!detail::write_data(strm, data.data(), data.size())) { return false; } + + // Streaming body + auto ret = true; + if (req.method != "HEAD" && res.content_provider_) { + if (write_content_with_provider(strm, req, res, boundary, content_type)) { + res.content_provider_success_ = true; + } else { + ret = false; + } + } + + return ret; +} + +inline bool +Server::write_content_with_provider(Stream &strm, const Request &req, + Response &res, const std::string &boundary, + const std::string &content_type) { + auto is_shutting_down = [this]() { + return this->svr_sock_ == INVALID_SOCKET; + }; + + if (res.content_length_ > 0) { + if (req.ranges.empty()) { + return detail::write_content(strm, res.content_provider_, 0, + res.content_length_, is_shutting_down); + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + return detail::write_content(strm, res.content_provider_, + offset_and_length.first, + offset_and_length.second, is_shutting_down); + } else { + return detail::write_multipart_ranges_data( + strm, req, res, boundary, content_type, res.content_length_, + is_shutting_down); + } + } else { + if (res.is_chunked_content_provider_) { + auto type = detail::encoding_type(req, res); + + auto compressor = detail::make_compressor(type); + if (!compressor) { + compressor = detail::make_unique(); + } + + return detail::write_content_chunked(strm, res.content_provider_, + is_shutting_down, *compressor); + } else { + return detail::write_content_without_length(strm, res.content_provider_, + is_shutting_down); + } + } +} + +inline bool Server::read_content(Stream &strm, Request &req, Response &res) { + FormFields::iterator cur_field; + FormFiles::iterator cur_file; + auto is_text_field = false; + size_t count = 0; + if (read_content_core( + strm, req, res, + // Regular + [&](const char *buf, size_t n) { + // Prevent arithmetic overflow when checking sizes. + // Avoid computing (req.body.size() + n) directly because + // adding two unsigned `size_t` values can wrap around and + // produce a small result instead of indicating overflow. + // Instead, check using subtraction: ensure `n` does not + // exceed the remaining capacity `max_size() - size()`. + if (req.body.size() >= req.body.max_size() || + n > req.body.max_size() - req.body.size()) { + return false; + } + + // Limit decompressed body size to payload_max_length_ to protect + // against "zip bomb" attacks where a small compressed payload + // decompresses to a massive size. + if (payload_max_length_ > 0 && + (req.body.size() >= payload_max_length_ || + n > payload_max_length_ - req.body.size())) { + return false; + } + + req.body.append(buf, n); + return true; + }, + // Multipart FormData + [&](const FormData &file) { + if (count++ == CPPHTTPLIB_MULTIPART_FORM_DATA_FILE_MAX_COUNT) { + output_error_log(Error::TooManyFormDataFiles, &req); + return false; + } + + if (file.filename.empty()) { + cur_field = req.form.fields.emplace( + file.name, FormField{file.name, file.content, file.headers}); + is_text_field = true; + } else { + cur_file = req.form.files.emplace(file.name, file); + is_text_field = false; + } + return true; + }, + [&](const char *buf, size_t n) { + if (is_text_field) { + auto &content = cur_field->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } else { + auto &content = cur_file->second.content; + if (content.size() + n > content.max_size()) { return false; } + content.append(buf, n); + } + return true; + })) { + const auto &content_type = req.get_header_value("Content-Type"); + if (detail::extract_media_type(content_type) == + "application/x-www-form-urlencoded") { + if (req.body.size() > CPPHTTPLIB_FORM_URL_ENCODED_PAYLOAD_MAX_LENGTH) { + res.status = StatusCode::PayloadTooLarge_413; // NOTE: should be 414? + output_error_log(Error::ExceedMaxPayloadSize, &req); + return false; + } + detail::parse_query_text(req.body, req.params); + } + return true; + } + return false; +} + +inline bool Server::read_content_with_content_receiver( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) { + return read_content_core(strm, req, res, std::move(receiver), + std::move(multipart_header), + std::move(multipart_receiver)); +} + +inline bool Server::read_content_core( + Stream &strm, Request &req, Response &res, ContentReceiver receiver, + FormDataHeader multipart_header, ContentReceiver multipart_receiver) const { + detail::FormDataParser multipart_form_data_parser; + ContentReceiverWithProgress out; + + if (req.is_multipart_form_data()) { + const auto &content_type = req.get_header_value("Content-Type"); + std::string boundary; + if (!detail::parse_multipart_boundary(content_type, boundary)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); + return false; + } + + multipart_form_data_parser.set_boundary(std::move(boundary)); + out = [&](const char *buf, size_t n, size_t /*off*/, size_t /*len*/) { + return multipart_form_data_parser.parse(buf, n, multipart_header, + multipart_receiver); + }; + } else { + out = [receiver](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { return receiver(buf, n); }; + } + + // RFC 9112 §6: no Transfer-Encoding and no Content-Length means no body. + // For non-SSL builds we still scan non-persistent connections for stray + // body bytes so the payload limit is enforced (413). On keep-alive, + // pending bytes may be the next request (issue #2450), so skip. +#if !defined(CPPHTTPLIB_SSL_ENABLED) + if (!req.has_header("Content-Length") && + !detail::is_chunked_transfer_encoding(req.headers)) { + if (!detail::is_connection_persistent(req) && payload_max_length_ > 0 && + payload_max_length_ < (std::numeric_limits::max)()) { + auto has_data = strm.is_readable(); + if (!has_data) { + auto s = strm.socket(); + if (s != INVALID_SOCKET) { + has_data = detail::select_read(s, 0, 0) > 0; + } + } + if (has_data) { + auto result = + detail::read_content_without_length(strm, payload_max_length_, out); + if (result == detail::ReadContentResult::PayloadTooLarge) { + res.status = StatusCode::PayloadTooLarge_413; + return false; + } else if (result != detail::ReadContentResult::Success) { + return false; + } + return true; + } + } + return true; + } +#else + if (!req.has_header("Content-Length") && + !detail::is_chunked_transfer_encoding(req.headers)) { + return true; + } +#endif + + if (!detail::read_content(strm, req, payload_max_length_, res.status, nullptr, + out, true)) { + return false; + } + + req.body_consumed_ = true; + + if (req.is_multipart_form_data()) { + if (!multipart_form_data_parser.is_valid()) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::MultipartParsing, &req); + return false; + } + } + + return true; +} + +inline bool Server::handle_file_request(Request &req, Response &res) { + for (const auto &entry : base_dirs_) { + // Prefix match + if (!req.path.compare(0, entry.mount_point.size(), entry.mount_point)) { + std::string sub_path = "/" + req.path.substr(entry.mount_point.size()); + if (detail::is_valid_path(sub_path)) { + auto path = entry.base_dir + sub_path; + if (path.back() == '/') { path += "index.html"; } + + // Defense-in-depth: is_valid_path blocks ".." traversal in the URL, + // but symlinks/junctions can still escape the base directory. + if (!entry.resolved_base_dir.empty()) { + std::string resolved_path; + if (detail::canonicalize_path(path.c_str(), resolved_path) && + !detail::is_path_within_base(resolved_path, + entry.resolved_base_dir)) { + res.status = StatusCode::Forbidden_403; + return true; + } + } + + detail::FileStat stat(path); + + if (stat.is_dir()) { + res.set_redirect(sub_path + "/", StatusCode::MovedPermanently_301); + return true; + } + + if (stat.is_file()) { + for (const auto &kv : entry.headers) { + res.set_header(kv.first, kv.second); + } + + auto etag = detail::compute_etag(stat); + if (!etag.empty()) { res.set_header("ETag", etag); } + + auto mtime = stat.mtime(); + + auto last_modified = detail::file_mtime_to_http_date(mtime); + if (!last_modified.empty()) { + res.set_header("Last-Modified", last_modified); + } + + if (check_if_not_modified(req, res, etag, mtime)) { return true; } + + check_if_range(req, etag, mtime); + + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { + output_error_log(Error::OpenFile, &req); + return false; + } + + res.set_content_provider( + mm->size(), + detail::find_content_type(path, file_extension_and_mimetype_map_, + default_file_mimetype_), + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + + if (req.method != "HEAD" && file_request_handler_) { + file_request_handler_(req, res); + } + + return true; + } else { + output_error_log(Error::OpenFile, &req); + } + } + } + } + return false; +} + +inline bool Server::check_if_not_modified(const Request &req, Response &res, + const std::string &etag, + time_t mtime) const { + // Handle conditional GET: + // 1. If-None-Match takes precedence (RFC 9110 Section 13.1.2) + // 2. If-Modified-Since is checked only when If-None-Match is absent + if (req.has_header("If-None-Match")) { + if (!etag.empty()) { + auto val = req.get_header_value("If-None-Match"); + + // NOTE: We use exact string matching here. This works correctly + // because our server always generates weak ETags (W/"..."), and + // clients typically send back the same ETag they received. + // RFC 9110 Section 8.8.3.2 allows weak comparison for + // If-None-Match, where W/"x" and "x" would match, but this + // simplified implementation requires exact matches. + auto ret = detail::split_find(val.data(), val.data() + val.size(), ',', + [&](const char *b, const char *e) { + auto seg_len = static_cast(e - b); + return (seg_len == 1 && *b == '*') || + (seg_len == etag.size() && + std::equal(b, e, etag.begin())); + }); + + if (ret) { + res.status = StatusCode::NotModified_304; + return true; + } + } + } else if (req.has_header("If-Modified-Since")) { + auto val = req.get_header_value("If-Modified-Since"); + auto t = detail::parse_http_date(val); + + if (t != static_cast(-1) && mtime <= t) { + res.status = StatusCode::NotModified_304; + return true; + } + } + return false; +} + +inline bool Server::check_if_range(Request &req, const std::string &etag, + time_t mtime) const { + // Handle If-Range for partial content requests (RFC 9110 + // Section 13.1.5). If-Range is only evaluated when Range header is + // present. If the validator matches, serve partial content; otherwise + // serve full content. + if (!req.ranges.empty() && req.has_header("If-Range")) { + auto val = req.get_header_value("If-Range"); + + auto is_valid_range = [&]() { + if (detail::is_strong_etag(val)) { + // RFC 9110 Section 13.1.5: If-Range requires strong ETag + // comparison. + return (!etag.empty() && val == etag); + } else if (detail::is_weak_etag(val)) { + // Weak ETags are not valid for If-Range (RFC 9110 Section 13.1.5) + return false; + } else { + // HTTP-date comparison + auto t = detail::parse_http_date(val); + return (t != static_cast(-1) && mtime <= t); + } + }; + + if (!is_valid_range()) { + // Validator doesn't match: ignore Range and serve full content + req.ranges.clear(); + return false; + } + } + + return true; +} + +inline socket_t +Server::create_server_socket(const std::string &host, int port, + int socket_flags, + SocketOptions socket_options) const { + return detail::create_socket( + host, std::string(), port, address_family_, socket_flags, tcp_nodelay_, + ipv6_v6only_, std::move(socket_options), + [&](socket_t sock, struct addrinfo &ai, bool & /*quit*/) -> bool { + if (::bind(sock, ai.ai_addr, static_cast(ai.ai_addrlen))) { + output_error_log(Error::BindIPAddress, nullptr); + return false; + } + if (::listen(sock, CPPHTTPLIB_LISTEN_BACKLOG)) { + output_error_log(Error::Listen, nullptr); + return false; + } + return true; + }); +} + +inline int Server::bind_internal(const std::string &host, int port, + int socket_flags) { + if (is_decommissioned) { return -1; } + + if (!is_valid()) { return -1; } + + svr_sock_ = create_server_socket(host, port, socket_flags, socket_options_); + if (svr_sock_ == INVALID_SOCKET) { return -1; } + + if (port == 0) { + struct sockaddr_storage addr; + socklen_t addr_len = sizeof(addr); + if (getsockname(svr_sock_, reinterpret_cast(&addr), + &addr_len) == -1) { + output_error_log(Error::GetSockName, nullptr); + return -1; + } + if (addr.ss_family == AF_INET) { + return ntohs(reinterpret_cast(&addr)->sin_port); + } else if (addr.ss_family == AF_INET6) { + return ntohs(reinterpret_cast(&addr)->sin6_port); + } else { + output_error_log(Error::UnsupportedAddressFamily, nullptr); + return -1; + } + } else { + return port; + } +} + +inline bool Server::listen_internal() { + if (is_decommissioned) { return false; } + + auto ret = true; + is_running_ = true; + auto se = detail::scope_exit([&]() { is_running_ = false; }); + + if (start_handler_) { start_handler_(); } + + { + std::unique_ptr task_queue(new_task_queue()); + + while (svr_sock_ != INVALID_SOCKET) { +#ifndef _WIN32 + if (idle_interval_sec_ > 0 || idle_interval_usec_ > 0) { +#endif + auto val = detail::select_read(svr_sock_, idle_interval_sec_, + idle_interval_usec_); + if (val == 0) { // Timeout + task_queue->on_idle(); + continue; + } +#ifndef _WIN32 + } +#endif + +#if defined _WIN32 + // sockets connected via WASAccept inherit flags NO_HANDLE_INHERIT, + // OVERLAPPED + socket_t sock = WSAAccept(svr_sock_, nullptr, nullptr, nullptr, 0); +#elif defined SOCK_CLOEXEC + socket_t sock = accept4(svr_sock_, nullptr, nullptr, SOCK_CLOEXEC); +#else + socket_t sock = accept(svr_sock_, nullptr, nullptr); +#endif + + if (sock == INVALID_SOCKET) { + if (errno == EMFILE) { + // The per-process limit of open file descriptors has been reached. + // Try to accept new connections after a short sleep. + std::this_thread::sleep_for(std::chrono::microseconds{1}); + continue; + } else if (errno == EINTR || errno == EAGAIN) { + continue; + } + if (svr_sock_ != INVALID_SOCKET) { + detail::close_socket(svr_sock_); + ret = false; + output_error_log(Error::Connection, nullptr); + } else { + ; // The server socket was closed by user. + } + break; + } + + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_RCVTIMEO, + read_timeout_sec_, read_timeout_usec_); + detail::set_socket_opt_time(sock, SOL_SOCKET, SO_SNDTIMEO, + write_timeout_sec_, write_timeout_usec_); + + if (tcp_nodelay_) { set_socket_opt(sock, IPPROTO_TCP, TCP_NODELAY, 1); } + + if (!task_queue->enqueue( + [this, sock]() { process_and_close_socket(sock); })) { + output_error_log(Error::ResourceExhaustion, nullptr); + detail::shutdown_socket(sock); + detail::close_socket(sock); + } + } + + task_queue->shutdown(); + } + + is_decommissioned = !ret; + return ret; +} + +inline bool Server::routing(Request &req, Response &res, Stream &strm) { + if (pre_routing_handler_ && + pre_routing_handler_(req, res) == HandlerResponse::Handled) { + return true; + } + + // File handler + if ((req.method == "GET" || req.method == "HEAD") && + handle_file_request(req, res)) { + return true; + } + + if (detail::expect_content(req)) { + // Content reader handler + { + // Track whether the ContentReader was aborted due to the decompressed + // payload exceeding `payload_max_length_`. + // The user handler runs after the lambda returns, so we must restore the + // 413 status if the handler overwrites it. + bool content_reader_payload_too_large = false; + + ContentReader reader( + [&](ContentReceiver receiver) { + auto result = read_content_with_content_receiver( + strm, req, res, std::move(receiver), nullptr, nullptr); + if (!result) { + output_error_log(Error::Read, &req); + if (res.status == StatusCode::PayloadTooLarge_413) { + content_reader_payload_too_large = true; + } + } + return result; + }, + [&](FormDataHeader header, ContentReceiver receiver) { + auto result = read_content_with_content_receiver( + strm, req, res, nullptr, std::move(header), + std::move(receiver)); + if (!result) { + output_error_log(Error::Read, &req); + if (res.status == StatusCode::PayloadTooLarge_413) { + content_reader_payload_too_large = true; + } + } + return result; + }); + + bool dispatched = false; + if (req.method == "POST") { + dispatched = dispatch_request_for_content_reader( + req, res, std::move(reader), post_handlers_for_content_reader_); + } else if (req.method == "PUT") { + dispatched = dispatch_request_for_content_reader( + req, res, std::move(reader), put_handlers_for_content_reader_); + } else if (req.method == "PATCH") { + dispatched = dispatch_request_for_content_reader( + req, res, std::move(reader), patch_handlers_for_content_reader_); + } else if (req.method == "DELETE") { + dispatched = dispatch_request_for_content_reader( + req, res, std::move(reader), delete_handlers_for_content_reader_); + } + + if (dispatched) { + if (content_reader_payload_too_large) { + // Enforce the limit: override any status the handler may have set + // and return false so the error path sends a plain 413 response. + res.status = StatusCode::PayloadTooLarge_413; + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + return false; + } + return true; + } + } + + // NOTE: `req.body` is not read here. For a regular handler the body is + // read inside dispatch_request(), after the route has matched and the + // pre-request handler has approved the request, so that a rejected + // request (e.g. failed authentication) never forces us to buffer a + // potentially large body. + } + + // Regular handler + if (req.method == "GET" || req.method == "HEAD") { + return dispatch_request(req, res, get_handlers_, strm); + } else if (req.method == "POST") { + return dispatch_request(req, res, post_handlers_, strm); + } else if (req.method == "PUT") { + return dispatch_request(req, res, put_handlers_, strm); + } else if (req.method == "DELETE") { + return dispatch_request(req, res, delete_handlers_, strm); + } else if (req.method == "OPTIONS") { + return dispatch_request(req, res, options_handlers_, strm); + } else if (req.method == "PATCH") { + return dispatch_request(req, res, patch_handlers_, strm); + } + + res.status = StatusCode::BadRequest_400; + return false; +} + +inline bool Server::dispatch_request(Request &req, Response &res, + const Handlers &handlers, Stream &strm) { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + req.matched_route = matcher->pattern(); + + // Run the pre-request handler before reading the body so a rejected + // request (e.g. failed authentication) never forces us to buffer a + // potentially large body. `req.matched_route` is available here. + if (pre_request_handler_ && + pre_request_handler_(req, res) == HandlerResponse::Handled) { + return true; + } + + // The route matched and the request was approved; read the body now. + if (detail::expect_content(req) && !read_content(strm, req, res)) { + output_error_log(Error::Read, &req); + return false; + } + + handler(req, res); + return true; + } + } + return false; +} + +inline void Server::apply_ranges(const Request &req, Response &res, + std::string &content_type, + std::string &boundary) const { + if (req.ranges.size() > 1 && res.status == StatusCode::PartialContent_206) { + auto it = res.headers.find("Content-Type"); + if (it != res.headers.end()) { + content_type = it->second; + res.headers.erase(it); + } + + boundary = detail::make_multipart_data_boundary(); + + res.set_header("Content-Type", + "multipart/byteranges; boundary=" + boundary); + } + + auto type = detail::encoding_type(req, res); + + if (res.body.empty()) { + if (res.content_length_ > 0) { + size_t length = 0; + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + length = res.content_length_; + } else if (req.ranges.size() == 1) { + auto offset_and_length = detail::get_range_offset_and_length( + req.ranges[0], res.content_length_); + + length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.content_length_); + res.set_header("Content-Range", content_range); + } else { + length = detail::get_multipart_ranges_data_length( + req, boundary, content_type, res.content_length_); + } + res.set_header("Content-Length", std::to_string(length)); + } else { + if (res.content_provider_) { + if (res.is_chunked_content_provider_) { + res.set_header("Transfer-Encoding", "chunked"); + if (type != detail::EncodingType::None) { + res.set_header("Content-Encoding", detail::encoding_name(type)); + res.set_header("Vary", "Accept-Encoding"); + } + } + } + } + } else { + if (req.ranges.empty() || res.status != StatusCode::PartialContent_206) { + ; + } else if (req.ranges.size() == 1) { + auto offset_and_length = + detail::get_range_offset_and_length(req.ranges[0], res.body.size()); + auto offset = offset_and_length.first; + auto length = offset_and_length.second; + + auto content_range = detail::make_content_range_header_field( + offset_and_length, res.body.size()); + res.set_header("Content-Range", content_range); + + assert(offset + length <= res.body.size()); + res.body = res.body.substr(offset, length); + } else { + std::string data; + detail::make_multipart_ranges_data(req, res, boundary, content_type, + res.body.size(), data); + res.body.swap(data); + } + + if (type != detail::EncodingType::None) { + output_pre_compression_log(req, res); + + if (auto compressor = detail::make_compressor(type)) { + std::string compressed; + if (compressor->compress(res.body.data(), res.body.size(), true, + [&](const char *data, size_t data_len) { + compressed.append(data, data_len); + return true; + })) { + res.body.swap(compressed); + res.set_header("Content-Encoding", detail::encoding_name(type)); + res.set_header("Vary", "Accept-Encoding"); + } + } + } + + auto length = std::to_string(res.body.size()); + res.set_header("Content-Length", length); + } +} + +inline bool Server::dispatch_request_for_content_reader( + Request &req, Response &res, ContentReader content_reader, + const HandlersForContentReader &handlers) const { + for (const auto &x : handlers) { + const auto &matcher = x.first; + const auto &handler = x.second; + + if (matcher->match(req)) { + req.matched_route = matcher->pattern(); + if (!pre_request_handler_ || + pre_request_handler_(req, res) != HandlerResponse::Handled) { + handler(req, res, content_reader); + } + return true; + } + } + return false; +} + +inline std::string +get_client_ip(const std::string &x_forwarded_for, + const std::vector &trusted_proxies) { + // X-Forwarded-For is a comma-separated list per RFC 7239 + std::vector ip_list; + detail::split(x_forwarded_for.data(), + x_forwarded_for.data() + x_forwarded_for.size(), ',', + [&](const char *b, const char *e) { + auto r = detail::trim(b, e, 0, static_cast(e - b)); + ip_list.emplace_back(std::string(b + r.first, b + r.second)); + }); + + // A malformed X-Forwarded-For (empty, comma-only, whitespace-only) yields + // no segments. Signal "no client IP derived" with an empty string so the + // caller can fall back to the connection-level remote address. + if (ip_list.empty()) { return std::string(); } + + for (size_t i = 0; i < ip_list.size(); ++i) { + auto ip = ip_list[i]; + + auto is_trusted_proxy = + std::any_of(trusted_proxies.begin(), trusted_proxies.end(), + [&](const std::string &proxy) { return ip == proxy; }); + + if (is_trusted_proxy) { + if (i == 0) { + // If the trusted proxy is the first IP, there's no preceding client IP + return ip; + } else { + // Return the IP immediately before the trusted proxy + return ip_list[i - 1]; + } + } + } + + // If no trusted proxy is found, return the first IP in the list + return ip_list.front(); +} + +inline bool +Server::process_request(Stream &strm, const std::string &remote_addr, + int remote_port, const std::string &local_addr, + int local_port, bool close_connection, + bool &connection_closed, + const std::function &setup_request, + bool *websocket_upgraded) { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + // Connection has been closed on client + if (!line_reader.getline()) { return false; } + + Request req; + req.start_time_ = std::chrono::steady_clock::now(); + req.remote_addr = remote_addr; + req.remote_port = remote_port; + req.local_addr = local_addr; + req.local_port = local_port; + + Response res; + res.version = "HTTP/1.1"; + res.headers = default_headers_; + + // Request line and headers + if (!parse_request_line(line_reader.ptr(), req)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidRequestLine, &req); + return write_response(strm, close_connection, req, res); + } + + // Request headers + if (!detail::read_headers(strm, req.headers)) { + res.status = StatusCode::BadRequest_400; + output_error_log(Error::InvalidHeaders, &req); + return write_response(strm, close_connection, req, res); + } + + // RFC 9112 §6.3: Reject requests with both a non-zero Content-Length and + // any Transfer-Encoding to prevent request smuggling. Content-Length: 0 is + // tolerated for compatibility with existing clients. + if (req.get_header_value_u64("Content-Length") > 0 && + req.has_header("Transfer-Encoding")) { + connection_closed = true; + res.status = StatusCode::BadRequest_400; + return write_response(strm, close_connection, req, res); + } + + // Check if the request URI doesn't exceed the limit + if (req.target.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + connection_closed = true; + res.status = StatusCode::UriTooLong_414; + output_error_log(Error::ExceedUriMaxLength, &req); + return write_response(strm, close_connection, req, res); + } + + if (req.get_header_value("Connection") == "close") { + connection_closed = true; + } + + if (req.version == "HTTP/1.0" && + req.get_header_value("Connection") != "Keep-Alive") { + connection_closed = true; + } + + if (!trusted_proxies_.empty() && req.has_header("X-Forwarded-For")) { + auto x_forwarded_for = req.get_header_value("X-Forwarded-For"); + auto derived = get_client_ip(x_forwarded_for, trusted_proxies_); + req.remote_addr = derived.empty() ? remote_addr : derived; + } else { + req.remote_addr = remote_addr; + } + req.remote_port = remote_port; + + req.local_addr = local_addr; + req.local_port = local_port; + + if (req.has_header("Accept")) { + const auto &accept_header = req.get_header_value("Accept"); + if (!detail::parse_accept_header(accept_header, req.accept_content_types)) { + connection_closed = true; + res.status = StatusCode::BadRequest_400; + output_error_log(Error::HTTPParsing, &req); + return write_response(strm, close_connection, req, res); + } + } + + if (req.has_header("Range")) { + const auto &range_header_value = req.get_header_value("Range"); + if (!detail::parse_range_header(range_header_value, req.ranges)) { + connection_closed = true; + res.status = StatusCode::RangeNotSatisfiable_416; + output_error_log(Error::InvalidRangeHeader, &req); + return write_response(strm, close_connection, req, res); + } + } + + if (setup_request) { setup_request(req); } + + if (req.get_header_value("Expect") == "100-continue") { + int status = StatusCode::Continue_100; + if (expect_100_continue_handler_) { + status = expect_100_continue_handler_(req, res); + } + switch (status) { + case StatusCode::Continue_100: + case StatusCode::ExpectationFailed_417: + detail::write_response_line(strm, status); + strm.write("\r\n"); + break; + default: + connection_closed = true; + return write_response(strm, true, req, res); + } + } + + // Setup `is_connection_closed` method + auto sock = strm.socket(); + req.is_connection_closed = [sock]() { + return !detail::is_socket_alive(sock); + }; + + // WebSocket upgrade + // Check pre_routing_handler_ before upgrading so that authentication + // and other middleware can reject the request with an HTTP response + // (e.g., 401) before the protocol switches. + if (detail::is_websocket_upgrade(req)) { + if (pre_routing_handler_ && + pre_routing_handler_(req, res) == HandlerResponse::Handled) { + if (res.status == -1) { res.status = StatusCode::OK_200; } + return write_response(strm, close_connection, req, res); + } + // Find matching WebSocket handler + for (const auto &entry : websocket_handlers_) { + if (entry.matcher->match(req)) { + // Compute accept key + auto client_key = req.get_header_value("Sec-WebSocket-Key"); + auto accept_key = detail::websocket_accept_key(client_key); + + // Negotiate subprotocol + std::string selected_subprotocol; + if (entry.sub_protocol_selector) { + auto protocol_header = req.get_header_value("Sec-WebSocket-Protocol"); + if (!protocol_header.empty()) { + std::vector protocols; + std::istringstream iss(protocol_header); + std::string token; + while (std::getline(iss, token, ',')) { + // Trim whitespace + auto start = token.find_first_not_of(' '); + auto end = token.find_last_not_of(' '); + if (start != std::string::npos) { + protocols.push_back(token.substr(start, end - start + 1)); + } + } + selected_subprotocol = entry.sub_protocol_selector(protocols); + } + } + + // Send 101 Switching Protocols + std::string handshake_response = "HTTP/1.1 101 Switching Protocols\r\n" + "Upgrade: websocket\r\n" + "Connection: Upgrade\r\n" + "Sec-WebSocket-Accept: " + + accept_key + "\r\n"; + if (!selected_subprotocol.empty()) { + if (!detail::fields::is_field_value(selected_subprotocol)) { + return false; + } + handshake_response += + "Sec-WebSocket-Protocol: " + selected_subprotocol + "\r\n"; + } + handshake_response += "\r\n"; + if (strm.write(handshake_response.data(), handshake_response.size()) < + 0) { + return false; + } + + connection_closed = true; + if (websocket_upgraded) { *websocket_upgraded = true; } + + { + // Use WebSocket-specific read timeout instead of HTTP timeout + strm.set_read_timeout(CPPHTTPLIB_WEBSOCKET_READ_TIMEOUT_SECOND, 0); + ws::WebSocket ws(strm, req, true, websocket_ping_interval_sec_, + websocket_max_missed_pongs_); + entry.handler(req, ws); + } + return true; + } + } + // No matching handler - fall through to 404 + } + + // Routing + auto routed = false; +#ifdef CPPHTTPLIB_NO_EXCEPTIONS + routed = routing(req, res, strm); +#else + try { + routed = routing(req, res, strm); + } catch (std::exception &) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + } + } catch (...) { + if (exception_handler_) { + auto ep = std::current_exception(); + exception_handler_(req, res, ep); + routed = true; + } else { + res.status = StatusCode::InternalServerError_500; + } + } +#endif + auto ret = false; + if (routed) { + if (res.status == -1) { + res.status = req.ranges.empty() ? StatusCode::OK_200 + : StatusCode::PartialContent_206; + } + + // Serve file content by using a content provider + auto file_open_error = false; + if (!res.file_content_path_.empty()) { + const auto &path = res.file_content_path_; + auto mm = std::make_shared(path.c_str()); + if (!mm->is_open()) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::NotFound_404; + output_error_log(Error::OpenFile, &req); + file_open_error = true; + } else { + auto content_type = res.file_content_content_type_; + if (content_type.empty()) { + content_type = detail::find_content_type( + path, file_extension_and_mimetype_map_, default_file_mimetype_); + } + + res.set_content_provider( + mm->size(), content_type, + [mm](size_t offset, size_t length, DataSink &sink) -> bool { + sink.write(mm->data() + offset, length); + return true; + }); + } + } + + if (file_open_error) { + ret = write_response(strm, close_connection, req, res); + } else if (detail::range_error(req, res)) { + res.body.clear(); + res.content_length_ = 0; + res.content_provider_ = nullptr; + res.status = StatusCode::RangeNotSatisfiable_416; + ret = write_response(strm, close_connection, req, res); + } else { + ret = write_response_with_content(strm, close_connection, req, res); + } + } else { + if (res.status == -1) { res.status = StatusCode::NotFound_404; } + ret = write_response(strm, close_connection, req, res); + } + + // Drain any unconsumed framed body to prevent request smuggling on + // keep-alive. Without framing there is no body to drain — reading would + // consume the next request (issue #2450). + if (!req.body_consumed_ && detail::has_framed_body(req)) { + int dummy_status; + if (!detail::read_content( + strm, req, payload_max_length_, dummy_status, nullptr, + [](const char *, size_t, size_t, size_t) { return true; }, false)) { + connection_closed = true; + } + } + + return ret; +} + +inline bool Server::is_valid() const { return true; } + +inline bool Server::process_and_close_socket(socket_t sock) { + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + bool websocket_upgraded = false; + auto ret = detail::process_server_socket( + svr_sock_, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request(strm, remote_addr, remote_port, local_addr, + local_port, close_connection, connection_closed, + nullptr, &websocket_upgraded); + }); + + detail::shutdown_socket(sock); + detail::close_socket(sock); + return ret; +} + +inline void Server::output_log(const Request &req, const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +inline void Server::output_pre_compression_log(const Request &req, + const Response &res) const { + if (pre_compression_logger_) { + std::lock_guard guard(logger_mutex_); + pre_compression_logger_(req, res); + } +} + +inline void Server::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } +} + +/* + * Group 5: ClientImpl and Client (Universal) implementation + */ +// HTTP client implementation +inline ClientImpl::ClientImpl(const std::string &host) + : ClientImpl(host, 80, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port) + : ClientImpl(host, port, std::string(), std::string()) {} + +inline ClientImpl::ClientImpl(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : host_(detail::escape_abstract_namespace_unix_domain(host)), port_(port), + client_cert_path_(client_cert_path), client_key_path_(client_key_path) {} + +inline ClientImpl::~ClientImpl() { + // Wait until all the requests in flight are handled. + size_t retry_count = 10; + while (retry_count-- > 0) { + { + std::lock_guard guard(socket_mutex_); + if (socket_requests_in_flight_ == 0) { break; } + } + std::this_thread::sleep_for(std::chrono::milliseconds{1}); + } + + std::lock_guard guard(socket_mutex_); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline bool ClientImpl::is_valid() const { return true; } + +inline void ClientImpl::copy_settings(const ClientImpl &rhs) { + client_cert_path_ = rhs.client_cert_path_; + client_key_path_ = rhs.client_key_path_; + connection_timeout_sec_ = rhs.connection_timeout_sec_; + read_timeout_sec_ = rhs.read_timeout_sec_; + read_timeout_usec_ = rhs.read_timeout_usec_; + write_timeout_sec_ = rhs.write_timeout_sec_; + write_timeout_usec_ = rhs.write_timeout_usec_; + max_timeout_msec_ = rhs.max_timeout_msec_; + basic_auth_username_ = rhs.basic_auth_username_; + basic_auth_password_ = rhs.basic_auth_password_; + bearer_token_auth_token_ = rhs.bearer_token_auth_token_; + keep_alive_ = rhs.keep_alive_; + follow_location_ = rhs.follow_location_; + path_encode_ = rhs.path_encode_; + address_family_ = rhs.address_family_; + tcp_nodelay_ = rhs.tcp_nodelay_; + ipv6_v6only_ = rhs.ipv6_v6only_; + socket_options_ = rhs.socket_options_; + compress_ = rhs.compress_; + decompress_ = rhs.decompress_; + payload_max_length_ = rhs.payload_max_length_; + has_payload_max_length_ = rhs.has_payload_max_length_; + interface_ = rhs.interface_; + proxy_host_ = rhs.proxy_host_; + proxy_port_ = rhs.proxy_port_; + proxy_basic_auth_username_ = rhs.proxy_basic_auth_username_; + proxy_basic_auth_password_ = rhs.proxy_basic_auth_password_; + proxy_bearer_token_auth_token_ = rhs.proxy_bearer_token_auth_token_; + no_proxy_entries_ = rhs.no_proxy_entries_; + logger_ = rhs.logger_; + error_logger_ = rhs.error_logger_; + +#ifdef CPPHTTPLIB_SSL_ENABLED + digest_auth_username_ = rhs.digest_auth_username_; + digest_auth_password_ = rhs.digest_auth_password_; + proxy_digest_auth_username_ = rhs.proxy_digest_auth_username_; + proxy_digest_auth_password_ = rhs.proxy_digest_auth_password_; + ca_cert_file_path_ = rhs.ca_cert_file_path_; + ca_cert_dir_path_ = rhs.ca_cert_dir_path_; + server_certificate_verification_ = rhs.server_certificate_verification_; + server_hostname_verification_ = rhs.server_hostname_verification_; + system_ca_mode_ = rhs.system_ca_mode_; +#endif +} + +inline bool +ClientImpl::is_proxy_enabled_for_host(const std::string &host) const { + if (proxy_host_.empty() || proxy_port_ == -1) { return false; } + if (no_proxy_entries_.empty()) { return true; } + // host_ is const so its normalized form is invariant; cache it. The + // cross-host path (setup_redirect_client passing next_host) re-normalizes. + if (host == host_) { + if (!host_normalized_valid_) { + host_normalized_ = detail::normalize_target(host_); + host_normalized_valid_ = true; + } + return !detail::host_matches_no_proxy(host_normalized_, no_proxy_entries_); + } + auto target = detail::normalize_target(host); + return !detail::host_matches_no_proxy(target, no_proxy_entries_); +} + +inline socket_t ClientImpl::create_client_socket(Error &error) const { + if (is_proxy_enabled_for_host(host_)) { + return detail::create_client_socket( + proxy_host_, std::string(), proxy_port_, address_family_, tcp_nodelay_, + ipv6_v6only_, socket_options_, connection_timeout_sec_, + connection_timeout_usec_, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, interface_, error); + } + + // Check is custom IP specified for host_ + std::string ip; + auto it = addr_map_.find(host_); + if (it != addr_map_.end()) { ip = it->second; } + + return detail::create_client_socket( + host_, ip, port_, address_family_, tcp_nodelay_, ipv6_v6only_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); +} + +inline bool ClientImpl::create_and_connect_socket(Socket &socket, + Error &error) { + auto sock = create_client_socket(error); + if (sock == INVALID_SOCKET) { return false; } + socket.sock = sock; + return true; +} + +inline bool ClientImpl::ensure_socket_connection(Socket &socket, Error &error) { + return create_and_connect_socket(socket, error); +} + +inline bool ClientImpl::setup_proxy_connection( + Socket & /*socket*/, + std::chrono::time_point /*start_time*/, + Response & /*res*/, bool & /*success*/, Error & /*error*/) { + return true; +} + +inline void ClientImpl::shutdown_ssl(Socket & /*socket*/, + bool /*shutdown_gracefully*/) { + // If there are any requests in flight from threads other than us, then it's + // a thread-unsafe race because individual ssl* objects are not thread-safe. + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); +} + +inline void ClientImpl::shutdown_socket(Socket &socket) const { + if (socket.sock == INVALID_SOCKET) { return; } + detail::shutdown_socket(socket.sock); +} + +inline void ClientImpl::close_socket(Socket &socket) { + // If there are requests in flight in another thread, usually closing + // the socket will be fine and they will simply receive an error when + // using the closed socket, but it is still a bug since rarely the OS + // may reassign the socket id to be used for a new socket, and then + // suddenly they will be operating on a live socket that is different + // than the one they intended! + assert(socket_requests_in_flight_ == 0 || + socket_requests_are_from_thread_ == std::this_thread::get_id()); + + // It is also a bug if this happens while SSL is still active +#ifdef CPPHTTPLIB_SSL_ENABLED + assert(socket.ssl == nullptr); +#endif + + if (socket.sock == INVALID_SOCKET) { return; } + detail::close_socket(socket.sock); + socket.sock = INVALID_SOCKET; +} + +inline void ClientImpl::disconnect(bool gracefully) { + shutdown_ssl(socket_, gracefully); + shutdown_socket(socket_); + close_socket(socket_); +} + +inline bool ClientImpl::read_response_line(Stream &strm, const Request &req, + Response &res, + bool skip_100_continue) const { + std::array buf{}; + + detail::stream_line_reader line_reader(strm, buf.data(), buf.size()); + + if (!line_reader.getline()) { return false; } + +#ifdef CPPHTTPLIB_ALLOW_LF_AS_LINE_TERMINATOR + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r?\n"); +#else + thread_local const std::regex re("(HTTP/1\\.[01]) (\\d{3})(?: (.*?))?\r\n"); +#endif + + std::cmatch m; + if (!std::regex_match(line_reader.ptr(), m, re)) { + return req.method == "CONNECT"; + } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + + // Ignore '100 Continue' (only when not using Expect: 100-continue explicitly) + while (skip_100_continue && res.status == StatusCode::Continue_100) { + if (!line_reader.getline()) { return false; } // CRLF + if (!line_reader.getline()) { return false; } // next response line + + if (!std::regex_match(line_reader.ptr(), m, re)) { return false; } + res.version = std::string(m[1]); + res.status = std::stoi(std::string(m[2])); + res.reason = std::string(m[3]); + } + + return true; +} + +inline bool ClientImpl::send(Request &req, Response &res, Error &error) { + std::lock_guard request_mutex_guard(request_mutex_); + auto ret = send_(req, res, error); + if (error == Error::SSLPeerCouldBeClosed_) { + assert(!ret); + ret = send_(req, res, error); + // If still failing with SSLPeerCouldBeClosed_, convert to Read error + if (error == Error::SSLPeerCouldBeClosed_) { error = Error::Read; } + } + return ret; +} + +inline bool ClientImpl::send_(Request &req, Response &res, Error &error) { + { + std::lock_guard guard(socket_mutex_); + + // Set this to false immediately - if it ever gets set to true by the end + // of the request, we know another thread instructed us to close the + // socket. + socket_should_be_closed_when_request_is_done_ = false; + + auto is_alive = false; + if (socket_.is_open()) { + is_alive = detail::is_socket_alive(socket_.sock); + +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_alive && is_ssl()) { + if (tls::is_peer_closed(socket_.ssl, socket_.sock)) { + is_alive = false; + } + } +#endif + + if (!is_alive) { + // Peer seems gone — non-graceful shutdown to avoid SIGPIPE. + disconnect(/*gracefully=*/false); + } + } + + if (!is_alive) { + if (!ensure_socket_connection(socket_, error)) { + output_error_log(error, &req); + return false; + } + + { + auto success = true; + if (!setup_proxy_connection(socket_, req.start_time_, res, success, + error)) { + if (!success) { output_error_log(error, &req); } + return success; + } + } + } + + // Mark the current socket as being in use so that it cannot be closed by + // anyone else while this request is ongoing, even though we will be + // releasing the mutex. + if (socket_requests_in_flight_ > 1) { + assert(socket_requests_are_from_thread_ == std::this_thread::get_id()); + } + socket_requests_in_flight_ += 1; + socket_requests_are_from_thread_ = std::this_thread::get_id(); + } + + for (const auto &header : default_headers_) { + if (req.headers.find(header.first) == req.headers.end()) { + req.headers.insert(header); + } + } + + auto ret = false; + auto close_connection = !keep_alive_; + + auto se = detail::scope_exit([&]() { + // Briefly lock mutex in order to mark that a request is no longer ongoing + std::lock_guard guard(socket_mutex_); + socket_requests_in_flight_ -= 1; + if (socket_requests_in_flight_ <= 0) { + assert(socket_requests_in_flight_ == 0); + socket_requests_are_from_thread_ = std::thread::id(); + } + + if (socket_should_be_closed_when_request_is_done_ || close_connection || + !ret) { + disconnect(/*gracefully=*/true); + } + }); + + ret = process_socket(socket_, req.start_time_, [&](Stream &strm) { + return handle_request(strm, req, res, close_connection, error); + }); + + if (!ret) { + if (error == Error::Success) { + error = Error::Unknown; + output_error_log(error, &req); + } + } + + return ret; +} + +inline Result ClientImpl::send(const Request &req) { + auto req2 = req; + return send_(std::move(req2)); +} + +inline Result ClientImpl::send_(Request &&req) { + auto res = detail::make_unique(); + auto error = Error::Success; + auto ret = send(req, *res, error); +#ifdef CPPHTTPLIB_SSL_ENABLED + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers), + last_ssl_error_, last_backend_error_}; +#else + return Result{ret ? std::move(res) : nullptr, error, std::move(req.headers)}; +#endif +} + +inline void ClientImpl::prepare_default_headers(Request &r, bool for_stream, + const std::string &ct) { + (void)for_stream; + for (const auto &header : default_headers_) { + if (!r.has_header(header.first)) { r.headers.insert(header); } + } + + if (!r.has_header("Host")) { + if (address_family_ == AF_UNIX) { + r.headers.emplace("Host", "localhost"); + } else { + r.headers.emplace( + "Host", detail::make_host_and_port_string(host_, port_, is_ssl())); + } + } + + if (!r.has_header("Accept")) { r.headers.emplace("Accept", "*/*"); } + + if (!r.content_receiver) { + if (!r.has_header("Accept-Encoding")) { + std::string accept_encoding; +#ifdef CPPHTTPLIB_BROTLI_SUPPORT + accept_encoding = "br"; +#endif +#ifdef CPPHTTPLIB_ZLIB_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "gzip, deflate"; +#endif +#ifdef CPPHTTPLIB_ZSTD_SUPPORT + if (!accept_encoding.empty()) { accept_encoding += ", "; } + accept_encoding += "zstd"; +#endif + r.set_header("Accept-Encoding", accept_encoding); + } + +#ifndef CPPHTTPLIB_NO_DEFAULT_USER_AGENT + if (!r.has_header("User-Agent")) { + auto agent = std::string("cpp-httplib/") + CPPHTTPLIB_VERSION; + r.set_header("User-Agent", agent); + } +#endif + } + + if (!r.body.empty()) { + if (!ct.empty() && !r.has_header("Content-Type")) { + r.headers.emplace("Content-Type", ct); + } + if (!r.has_header("Content-Length")) { + r.headers.emplace("Content-Length", std::to_string(r.body.size())); + } + } +} + +inline ClientImpl::StreamHandle +ClientImpl::open_stream(const std::string &method, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, + const std::string &content_type) { + StreamHandle handle; + handle.response = detail::make_unique(); + handle.error = Error::Success; + + auto query_path = params.empty() ? path : append_query_params(path, params); + handle.connection_ = detail::make_unique(); + + { + std::lock_guard guard(socket_mutex_); + + auto is_alive = false; + if (socket_.is_open()) { + is_alive = detail::is_socket_alive(socket_.sock); +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_alive && is_ssl()) { + if (tls::is_peer_closed(socket_.ssl, socket_.sock)) { + is_alive = false; + } + } +#endif + if (!is_alive) { disconnect(/*gracefully=*/false); } + } + + if (!is_alive) { + if (!ensure_socket_connection(socket_, handle.error)) { + handle.response.reset(); + return handle; + } + + { + auto success = true; + auto start_time = std::chrono::steady_clock::now(); + if (!setup_proxy_connection(socket_, start_time, *handle.response, + success, handle.error)) { + if (!success) { handle.response.reset(); } + return handle; + } + } + } + + transfer_socket_ownership_to_handle(handle); + } + +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_ssl() && handle.connection_->session) { + handle.socket_stream_ = detail::make_unique( + handle.connection_->sock, handle.connection_->session, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_); + } else { + handle.socket_stream_ = detail::make_unique( + handle.connection_->sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_); + } +#else + handle.socket_stream_ = detail::make_unique( + handle.connection_->sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_); +#endif + handle.stream_ = handle.socket_stream_.get(); + + Request req; + req.method = method; + req.path = query_path; + req.headers = headers; + req.body = body; + + prepare_default_headers(req, true, content_type); + + auto &strm = *handle.stream_; + if (detail::write_request_line(strm, req.method, req.path) < 0) { + handle.error = Error::Write; + handle.response.reset(); + return handle; + } + + if (!detail::check_and_write_headers(strm, req.headers, header_writer_, + handle.error)) { + handle.response.reset(); + return handle; + } + + if (!body.empty()) { + if (strm.write(body.data(), body.size()) < 0) { + handle.error = Error::Write; + handle.response.reset(); + return handle; + } + } + + if (!read_response_line(strm, req, *handle.response) || + !detail::read_headers(strm, handle.response->headers)) { + handle.error = Error::Read; + handle.response.reset(); + return handle; + } + + handle.body_reader_.stream = handle.stream_; + handle.body_reader_.payload_max_length = payload_max_length_; + + if (handle.response->has_header("Content-Length")) { + bool is_invalid = false; + auto content_length = detail::get_header_value_u64( + handle.response->headers, "Content-Length", 0, 0, is_invalid); + if (is_invalid) { + handle.error = Error::Read; + handle.response.reset(); + return handle; + } + handle.body_reader_.has_content_length = true; + handle.body_reader_.content_length = content_length; + } + + auto transfer_encoding = + handle.response->get_header_value("Transfer-Encoding"); + handle.body_reader_.chunked = (transfer_encoding == "chunked"); + + auto content_encoding = handle.response->get_header_value("Content-Encoding"); + if (!content_encoding.empty()) { + handle.decompressor_ = detail::create_decompressor(content_encoding); + } + + return handle; +} + +inline ssize_t ClientImpl::StreamHandle::read(char *buf, size_t len) { + if (!is_valid() || !response) { return -1; } + + if (decompressor_) { return read_with_decompression(buf, len); } + auto n = detail::read_body_content(stream_, body_reader_, buf, len); + + if (n <= 0 && body_reader_.chunked && !trailers_parsed_ && stream_) { + trailers_parsed_ = true; + if (body_reader_.chunked_decoder) { + if (!body_reader_.chunked_decoder->parse_trailers_into( + response->trailers, response->headers)) { + return n; + } + } else { + detail::ChunkedDecoder dec(*stream_); + if (!dec.parse_trailers_into(response->trailers, response->headers)) { + return n; + } + } + } + + return n; +} + +inline ssize_t ClientImpl::StreamHandle::read_with_decompression(char *buf, + size_t len) { + if (decompress_offset_ < decompress_buffer_.size()) { + auto available = decompress_buffer_.size() - decompress_offset_; + auto to_copy = (std::min)(len, available); + std::memcpy(buf, decompress_buffer_.data() + decompress_offset_, to_copy); + decompress_offset_ += to_copy; + decompressed_bytes_read_ += to_copy; + return static_cast(to_copy); + } + + decompress_buffer_.clear(); + decompress_offset_ = 0; + + constexpr size_t kDecompressionBufferSize = 8192; + char compressed_buf[kDecompressionBufferSize]; + + while (true) { + auto n = detail::read_body_content(stream_, body_reader_, compressed_buf, + sizeof(compressed_buf)); + + if (n <= 0) { return n; } + + bool decompress_ok = decompressor_->decompress( + compressed_buf, static_cast(n), + [this](const char *data, size_t data_len) { + decompress_buffer_.append(data, data_len); + auto limit = body_reader_.payload_max_length; + if (decompressed_bytes_read_ + decompress_buffer_.size() > limit) { + return false; + } + return true; + }); + + if (!decompress_ok) { + body_reader_.last_error = Error::Read; + return -1; + } + + if (!decompress_buffer_.empty()) { break; } + } + + auto to_copy = (std::min)(len, decompress_buffer_.size()); + std::memcpy(buf, decompress_buffer_.data(), to_copy); + decompress_offset_ = to_copy; + decompressed_bytes_read_ += to_copy; + return static_cast(to_copy); +} + +inline void ClientImpl::StreamHandle::parse_trailers_if_needed() { + if (!response || !stream_ || !body_reader_.chunked || trailers_parsed_) { + return; + } + + trailers_parsed_ = true; + + const auto bufsiz = 128; + char line_buf[bufsiz]; + detail::stream_line_reader line_reader(*stream_, line_buf, bufsiz); + + if (!line_reader.getline()) { return; } + + if (!detail::parse_trailers(line_reader, response->trailers, + response->headers)) { + return; + } +} + +namespace detail { + +inline ChunkedDecoder::ChunkedDecoder(Stream &s) : strm(s) {} + +inline ssize_t ChunkedDecoder::read_payload(char *buf, size_t len, + size_t &out_chunk_offset, + size_t &out_chunk_total) { + if (finished) { return 0; } + + if (chunk_remaining == 0) { + stream_line_reader lr(strm, line_buf, sizeof(line_buf)); + if (!lr.getline()) { return -1; } + + // RFC 9112 §7.1: chunk-size = 1*HEXDIG + const char *p = lr.ptr(); + int v = 0; + if (!is_hex(*p, v)) { return -1; } + + size_t chunk_len = 0; + constexpr size_t chunk_len_max = (std::numeric_limits::max)(); + for (; is_hex(*p, v); ++p) { + if (chunk_len > (chunk_len_max >> 4)) { return -1; } + chunk_len = (chunk_len << 4) | static_cast(v); + } + + while (is_space_or_tab(*p)) { + ++p; + } + if (*p != '\0' && *p != ';' && *p != '\r' && *p != '\n') { return -1; } + + if (chunk_len == 0) { + chunk_remaining = 0; + finished = true; + out_chunk_offset = 0; + out_chunk_total = 0; + return 0; + } + + chunk_remaining = chunk_len; + last_chunk_total = chunk_remaining; + last_chunk_offset = 0; + } + + auto to_read = (std::min)(chunk_remaining, len); + auto n = strm.read(buf, to_read); + if (n <= 0) { return -1; } + + auto offset_before = last_chunk_offset; + last_chunk_offset += static_cast(n); + chunk_remaining -= static_cast(n); + + out_chunk_offset = offset_before; + out_chunk_total = last_chunk_total; + + if (chunk_remaining == 0) { + stream_line_reader lr(strm, line_buf, sizeof(line_buf)); + if (!lr.getline()) { return -1; } + if (std::strcmp(lr.ptr(), "\r\n") != 0) { return -1; } + } + + return n; +} + +inline bool ChunkedDecoder::parse_trailers_into(Headers &dest, + const Headers &src_headers) { + stream_line_reader lr(strm, line_buf, sizeof(line_buf)); + if (!lr.getline()) { return false; } + return parse_trailers(lr, dest, src_headers); +} + +} // namespace detail + +inline void +ClientImpl::transfer_socket_ownership_to_handle(StreamHandle &handle) { + handle.connection_->sock = socket_.sock; +#ifdef CPPHTTPLIB_SSL_ENABLED + handle.connection_->session = socket_.ssl; + socket_.ssl = nullptr; +#endif + socket_.sock = INVALID_SOCKET; +} + +inline bool ClientImpl::handle_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + if (req.path.empty()) { + error = Error::Connection; + output_error_log(error, &req); + return false; + } + + auto req_save = req; + + bool ret; + + if (!is_ssl() && is_proxy_enabled_for_host(host_)) { + auto req2 = req; + req2.path = "http://" + + detail::make_host_and_port_string(host_, port_, false) + + req.path; + ret = process_request(strm, req2, res, close_connection, error); + req = std::move(req2); + req.path = req_save.path; + } else { + ret = process_request(strm, req, res, close_connection, error); + } + + if (!ret) { return false; } + + if (res.get_header_value("Connection") == "close" || + (res.version == "HTTP/1.0" && res.reason != "Connection established")) { + // NOTE: this requires a not-entirely-obvious chain of calls to be correct + // for this to be safe. + + // This is safe to call because handle_request is only called by send_ + // which locks the request mutex during the process. It would be a bug + // to call it from a different thread since it's a thread-safety issue + // to do these things to the socket if another thread is using the socket. + std::lock_guard guard(socket_mutex_); + disconnect(/*gracefully=*/true); + } + + if (300 < res.status && res.status < 400 && follow_location_) { + req = std::move(req_save); + ret = redirect(req, res, error); + } + +#ifdef CPPHTTPLIB_SSL_ENABLED + if ((res.status == StatusCode::Unauthorized_401 || + res.status == StatusCode::ProxyAuthenticationRequired_407) && + req.authorization_count_ < 5) { + auto is_proxy = res.status == StatusCode::ProxyAuthenticationRequired_407; + + // Only retry when the 407 actually came from a proxy hop: plain HTTP + // through an enabled proxy. HTTPS via CONNECT tunnels the 407 from the + // origin (#2457); direct/bypassed origins have no proxy hop at all. + if (is_proxy && !(!is_ssl() && is_proxy_enabled_for_host(host_))) { + return ret; + } + + const auto &username = + is_proxy ? proxy_digest_auth_username_ : digest_auth_username_; + const auto &password = + is_proxy ? proxy_digest_auth_password_ : digest_auth_password_; + + if (!username.empty() && !password.empty()) { + std::map auth; + if (detail::parse_www_authenticate(res, auth, is_proxy)) { + Request new_req = req; + new_req.authorization_count_ += 1; + new_req.headers.erase(is_proxy ? "Proxy-Authorization" + : "Authorization"); + new_req.headers.insert(detail::make_digest_authentication_header( + req, auth, new_req.authorization_count_, detail::random_string(10), + username, password, is_proxy)); + + Response new_res; + + ret = send(new_req, new_res, error); + if (ret) { res = std::move(new_res); } + } + } + } +#endif + + return ret; +} + +inline bool ClientImpl::redirect(Request &req, Response &res, Error &error) { + if (req.redirect_count_ == 0) { + error = Error::ExceedRedirectCount; + output_error_log(error, &req); + return false; + } + + auto location = res.get_header_value("location"); + if (location.empty()) { return false; } + + detail::UrlComponents uc; + if (!detail::parse_url(location, uc)) { return false; } + + // Only follow http/https redirects + if (!uc.scheme.empty() && uc.scheme != "http" && uc.scheme != "https") { + return false; + } + + auto scheme = is_ssl() ? "https" : "http"; + + auto next_scheme = std::move(uc.scheme); + auto next_host = std::move(uc.host); + auto port_str = std::move(uc.port); + auto next_path = std::move(uc.path); + auto next_query = std::move(uc.query); + + auto next_port = port_; + if (!port_str.empty()) { + if (!detail::parse_port(port_str, next_port)) { return false; } + } else if (!next_scheme.empty()) { + next_port = next_scheme == "https" ? 443 : 80; + } + + if (next_scheme.empty()) { next_scheme = scheme; } + if (next_host.empty()) { next_host = host_; } + if (next_path.empty()) { next_path = "/"; } + + auto path = decode_path_component(next_path) + next_query; + + // Same host redirect - use current client + if (next_scheme == scheme && next_host == host_ && next_port == port_) { + return detail::redirect(*this, req, res, path, location, error); + } + + // Cross-host/scheme redirect - create new client with robust setup + return create_redirect_client(next_scheme, next_host, next_port, req, res, + path, location, error); +} + +// New method for robust redirect client creation +inline bool ClientImpl::create_redirect_client( + const std::string &scheme, const std::string &host, int port, Request &req, + Response &res, const std::string &path, const std::string &location, + Error &error) { + // Determine if we need SSL + auto need_ssl = (scheme == "https"); + + // Clean up request headers that are host/client specific + // Remove headers that should not be carried over to new host + auto headers_to_remove = + std::vector{"Host", "Proxy-Authorization", "Authorization"}; + + for (const auto &header_name : headers_to_remove) { + auto it = req.headers.find(header_name); + while (it != req.headers.end()) { + it = req.headers.erase(it); + it = req.headers.find(header_name); + } + } + + // Create appropriate client type and handle redirect + if (need_ssl) { +#ifdef CPPHTTPLIB_SSL_ENABLED + // Create SSL client for HTTPS redirect + SSLClient redirect_client(host, port); + + // Setup basic client configuration first + setup_redirect_client(redirect_client); + + redirect_client.enable_server_certificate_verification( + server_certificate_verification_); + redirect_client.enable_server_hostname_verification( + server_hostname_verification_); + redirect_client.system_ca_mode_ = system_ca_mode_; + + // Transfer CA certificate to redirect client + if (!ca_cert_pem_.empty()) { + redirect_client.load_ca_cert_store(ca_cert_pem_.c_str(), + ca_cert_pem_.size()); + } + if (!ca_cert_file_path_.empty()) { + redirect_client.set_ca_cert_path(ca_cert_file_path_, ca_cert_dir_path_); + } + + // Client certificates are set through constructor for SSLClient + // NOTE: SSLClient constructor already takes client_cert_path and + // client_key_path so we need to create it properly if client certs are + // needed + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); +#else + // SSL not supported - set appropriate error + error = Error::SSLConnection; + output_error_log(error, &req); + return false; +#endif + } else { + // HTTP redirect + ClientImpl redirect_client(host, port); + + // Setup client with robust configuration + setup_redirect_client(redirect_client); + + // Execute the redirect + return detail::redirect(redirect_client, req, res, path, location, error); + } +} + +// New method for robust client setup (based on basic_manual_redirect.cpp +// logic) +template +inline void ClientImpl::setup_redirect_client(ClientType &client) { + // Copy basic settings first + client.set_connection_timeout(connection_timeout_sec_); + client.set_read_timeout(read_timeout_sec_, read_timeout_usec_); + client.set_write_timeout(write_timeout_sec_, write_timeout_usec_); + client.set_keep_alive(keep_alive_); + client.set_follow_location( + true); // Enable redirects to handle multi-step redirects + client.set_path_encode(path_encode_); + client.set_compress(compress_); + client.set_decompress(decompress_); + + // NOTE: Authentication credentials (basic auth, bearer token, digest auth) + // are intentionally NOT copied to the redirect client. Per RFC 9110 Section + // 15.4, credentials must not be forwarded when redirecting to a different + // host. This function is only called for cross-host redirects; same-host + // redirects are handled directly in ClientImpl::redirect(). + + // Copy the proxy configuration unconditionally; the per-target bypass is + // re-evaluated at send time, so a later hop to a non-bypassed host can + // still use the proxy. + client.no_proxy_entries_ = no_proxy_entries_; + if (!proxy_host_.empty() && proxy_port_ != -1) { + client.set_proxy(proxy_host_, proxy_port_); + + if (!proxy_basic_auth_username_.empty()) { + client.set_proxy_basic_auth(proxy_basic_auth_username_, + proxy_basic_auth_password_); + } + if (!proxy_bearer_token_auth_token_.empty()) { + client.set_proxy_bearer_token_auth(proxy_bearer_token_auth_token_); + } +#ifdef CPPHTTPLIB_SSL_ENABLED + if (!proxy_digest_auth_username_.empty()) { + client.set_proxy_digest_auth(proxy_digest_auth_username_, + proxy_digest_auth_password_); + } +#endif + } + + // Copy network and socket settings + client.set_address_family(address_family_); + client.set_tcp_nodelay(tcp_nodelay_); + client.set_ipv6_v6only(ipv6_v6only_); + if (socket_options_) { client.set_socket_options(socket_options_); } + if (!interface_.empty()) { client.set_interface(interface_); } + + // Copy logging and headers + if (logger_) { client.set_logger(logger_); } + if (error_logger_) { client.set_error_logger(error_logger_); } + + // NOTE: DO NOT copy default_headers_ as they may contain stale Host headers + // Each new client should generate its own headers based on its target host +} + +inline bool ClientImpl::write_content_with_provider(Stream &strm, + const Request &req, + Error &error) const { + auto is_shutting_down = []() { return false; }; + + if (req.is_chunked_content_provider_) { + auto compressor = compress_ ? detail::create_compressor().first + : std::unique_ptr(); + if (!compressor) { + compressor = detail::make_unique(); + } + + return detail::write_content_chunked(strm, req.content_provider_, + is_shutting_down, *compressor, error); + } else { + return detail::write_content_with_progress( + strm, req.content_provider_, 0, req.content_length_, is_shutting_down, + req.upload_progress, error); + } +} + +inline bool ClientImpl::write_request(Stream &strm, Request &req, + bool close_connection, Error &error, + bool skip_body) { + // Prepare additional headers + if (close_connection) { + if (!req.has_header("Connection")) { + req.set_header("Connection", "close"); + } + } + + std::string ct_for_defaults; + if (!req.has_header("Content-Type") && !req.body.empty()) { + ct_for_defaults = "text/plain"; + } + prepare_default_headers(req, false, ct_for_defaults); + + if (req.body.empty()) { + if (req.content_provider_) { + if (!req.is_chunked_content_provider_) { + if (!req.has_header("Content-Length")) { + auto length = std::to_string(req.content_length_); + req.set_header("Content-Length", length); + } + } + } else { + if (req.method == "POST" || req.method == "PUT" || + req.method == "PATCH") { + req.set_header("Content-Length", "0"); + } + } + } + + if (!basic_auth_password_.empty() || !basic_auth_username_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_basic_authentication_header( + basic_auth_username_, basic_auth_password_, false)); + } + } + + if (!bearer_token_auth_token_.empty()) { + if (!req.has_header("Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + bearer_token_auth_token_, false)); + } + } + + // Proxy-Authorization is only sent when the proxy is actually used for + // this target — otherwise NO_PROXY-matched requests would leak proxy + // credentials directly to the destination server. + if (is_proxy_enabled_for_host(host_)) { + if (!proxy_basic_auth_username_.empty() && + !proxy_basic_auth_password_.empty() && + !req.has_header("Proxy-Authorization")) { + req.headers.insert(make_basic_authentication_header( + proxy_basic_auth_username_, proxy_basic_auth_password_, true)); + } + if (!proxy_bearer_token_auth_token_.empty() && + !req.has_header("Proxy-Authorization")) { + req.headers.insert(make_bearer_token_authentication_header( + proxy_bearer_token_auth_token_, true)); + } + } + + // Request line and headers + { + detail::BufferStream bstrm; + + // Extract path and query from req.path + std::string path_part, query_part; + auto query_pos = req.path.find('?'); + if (query_pos != std::string::npos) { + path_part = req.path.substr(0, query_pos); + query_part = req.path.substr(query_pos + 1); + } else { + path_part = req.path; + query_part = ""; + } + + // Encode path part. If the original `req.path` already contained a + // query component, preserve its raw query string (including parameter + // order) instead of reparsing and reassembling it which may reorder + // parameters due to container ordering (e.g. `Params` uses + // `std::multimap`). When there is no query in `req.path`, fall back to + // building a query from `req.params` so existing callers that pass + // `Params` continue to work. + auto path_with_query = + path_encode_ ? detail::encode_path(path_part) : path_part; + + if (!query_part.empty()) { + // Normalize the query string (decode then re-encode) while preserving + // the original parameter order. + auto normalized = detail::normalize_query_string(query_part); + if (!normalized.empty()) { path_with_query += '?' + normalized; } + + // Still populate req.params for handlers/users who read them. + detail::parse_query_text(query_part, req.params); + } else { + // No query in path; parse any query_part (empty) and append params + // from `req.params` when present (preserves prior behavior for + // callers who provide Params separately). + detail::parse_query_text(query_part, req.params); + if (!req.params.empty()) { + path_with_query = append_query_params(path_with_query, req.params); + } + } + + // Write request line and headers + detail::write_request_line(bstrm, req.method, path_with_query); + if (!detail::check_and_write_headers(bstrm, req.headers, header_writer_, + error)) { + output_error_log(error, &req); + return false; + } + + // Flush buffer + auto &data = bstrm.get_buffer(); + if (!detail::write_data(strm, data.data(), data.size())) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + } + + // After sending request line and headers, wait briefly for an early server + // response (e.g. 4xx) and avoid sending a potentially large request body + // unnecessarily. This workaround is only enabled on Windows because Unix + // platforms surface write errors (EPIPE) earlier; on Windows kernel send + // buffering can accept large writes even when the peer already responded. + // Check the stream first (which covers SSL via `is_readable()`), then + // fall back to select on the socket. Only perform the wait for very large + // request bodies to avoid interfering with normal small requests and + // reduce side-effects. Poll briefly (up to 50ms as default) for an early + // response. Skip this check when using Expect: 100-continue, as the protocol + // handles early responses properly. +#if defined(_WIN32) + if (!skip_body && + req.body.size() > CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_THRESHOLD && + req.path.size() > CPPHTTPLIB_REQUEST_URI_MAX_LENGTH) { + auto start = std::chrono::high_resolution_clock::now(); + + for (;;) { + // Prefer socket-level readiness to avoid SSL_pending() false-positives + // from SSL internals. If the underlying socket is readable, assume an + // early response may be present. + auto sock = strm.socket(); + if (sock != INVALID_SOCKET && detail::select_read(sock, 0, 0) > 0) { + return false; + } + + // Fallback to stream-level check for non-socket streams or when the + // socket isn't reporting readable. Avoid using `is_readable()` for + // SSL, since `SSL_pending()` may report buffered records that do not + // indicate a complete application-level response yet. + if (!is_ssl() && strm.is_readable()) { return false; } + + auto now = std::chrono::high_resolution_clock::now(); + auto elapsed = + std::chrono::duration_cast(now - start) + .count(); + if (elapsed >= CPPHTTPLIB_WAIT_EARLY_SERVER_RESPONSE_TIMEOUT_MSECOND) { + break; + } + + std::this_thread::sleep_for(std::chrono::milliseconds(1)); + } + } +#endif + + // Body + if (skip_body) { return true; } + + return write_request_body(strm, req, error); +} + +inline bool ClientImpl::write_request_body(Stream &strm, Request &req, + Error &error) { + if (req.body.empty()) { + return write_content_with_provider(strm, req, error); + } + + if (req.upload_progress) { + auto body_size = req.body.size(); + size_t written = 0; + auto data = req.body.data(); + + while (written < body_size) { + size_t to_write = (std::min)(CPPHTTPLIB_SEND_BUFSIZ, body_size - written); + if (!detail::write_data(strm, data + written, to_write)) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + written += to_write; + + if (!req.upload_progress(written, body_size)) { + error = Error::Canceled; + output_error_log(error, &req); + return false; + } + } + } else { + if (!detail::write_data(strm, req.body.data(), req.body.size())) { + error = Error::Write; + output_error_log(error, &req); + return false; + } + } + + return true; +} + +inline std::unique_ptr +ClientImpl::send_with_content_provider_and_receiver( + Request &req, const char *body, size_t content_length, + ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + Error &error) { + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + auto enc = compress_ + ? detail::create_compressor() + : std::pair, const char *>( + nullptr, nullptr); + + if (enc.second) { req.set_header("Content-Encoding", enc.second); } + + if (enc.first && !content_provider_without_length) { + auto &compressor = enc.first; + + if (content_provider) { + auto ok = true; + size_t offset = 0; + DataSink data_sink; + + data_sink.write = [&](const char *data, size_t data_len) -> bool { + if (ok) { + auto last = offset + data_len == content_length; + + auto ret = compressor->compress( + data, data_len, last, + [&](const char *compressed_data, size_t compressed_data_len) { + req.body.append(compressed_data, compressed_data_len); + return true; + }); + + if (ret) { + offset += data_len; + } else { + ok = false; + } + } + return ok; + }; + + while (ok && offset < content_length) { + if (!content_provider(offset, content_length - offset, data_sink)) { + error = Error::Canceled; + output_error_log(error, &req); + return nullptr; + } + } + } else { + if (!compressor->compress(body, content_length, true, + [&](const char *data, size_t data_len) { + req.body.append(data, data_len); + return true; + })) { + error = Error::Compression; + output_error_log(error, &req); + return nullptr; + } + } + } else { + if (content_provider) { + req.content_length_ = content_length; + req.content_provider_ = std::move(content_provider); + req.is_chunked_content_provider_ = false; + } else if (content_provider_without_length) { + req.content_length_ = 0; + req.content_provider_ = detail::ContentProviderAdapter( + std::move(content_provider_without_length)); + req.is_chunked_content_provider_ = true; + req.set_header("Transfer-Encoding", "chunked"); + } else { + req.body.assign(body, content_length); + } + } + + if (content_receiver) { + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + } + + auto res = detail::make_unique(); + return send(req, *res, error) ? std::move(res) : nullptr; +} + +inline Result ClientImpl::send_with_content_provider_and_receiver( + const std::string &method, const std::string &path, const Headers &headers, + const char *body, size_t content_length, ContentProvider content_provider, + ContentProviderWithoutLength content_provider_without_length, + const std::string &content_type, ContentReceiver content_receiver, + UploadProgress progress) { + Request req; + req.method = method; + req.headers = headers; + req.path = path; + req.upload_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + auto error = Error::Success; + + auto res = send_with_content_provider_and_receiver( + req, body, content_length, std::move(content_provider), + std::move(content_provider_without_length), content_type, + std::move(content_receiver), error); + +#ifdef CPPHTTPLIB_SSL_ENABLED + return Result{std::move(res), error, std::move(req.headers), last_ssl_error_, + last_backend_error_}; +#else + return Result{std::move(res), error, std::move(req.headers)}; +#endif +} + +inline void ClientImpl::output_log(const Request &req, + const Response &res) const { + if (logger_) { + std::lock_guard guard(logger_mutex_); + logger_(req, res); + } +} + +inline void ClientImpl::output_error_log(const Error &err, + const Request *req) const { + if (error_logger_) { + std::lock_guard guard(logger_mutex_); + error_logger_(err, req); + } +} + +inline bool ClientImpl::process_request(Stream &strm, Request &req, + Response &res, bool close_connection, + Error &error) { + // Auto-add Expect: 100-continue for large bodies + if (CPPHTTPLIB_EXPECT_100_THRESHOLD > 0 && !req.has_header("Expect")) { + auto body_size = req.body.empty() ? req.content_length_ : req.body.size(); + if (body_size >= CPPHTTPLIB_EXPECT_100_THRESHOLD) { + req.set_header("Expect", "100-continue"); + } + } + + // Check for Expect: 100-continue + auto expect_100_continue = req.get_header_value("Expect") == "100-continue"; + + // Send request (skip body if using Expect: 100-continue) + auto write_request_success = + write_request(strm, req, close_connection, error, expect_100_continue); + +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_ssl() && !expect_100_continue) { + auto is_proxy_enabled = is_proxy_enabled_for_host(host_); + if (!is_proxy_enabled) { + if (tls::is_peer_closed(socket_.ssl, socket_.sock)) { + error = Error::SSLPeerCouldBeClosed_; + output_error_log(error, &req); + return false; + } + } + } +#endif + + // Handle Expect: 100-continue. + // + // Wait for an interim/early response by attempting to read the status line + // under a short timeout, instead of trusting raw socket readability. Over + // TLS, post-handshake records (e.g. session tickets) make the socket + // readable without any HTTP response being available; relying on + // `select_read` there caused the body to be withheld forever and the + // request to fail with `Read` (#2458). If no status line arrives within the + // timeout, send the body anyway (matching curl's behavior). + auto status_line_read = false; + if (expect_100_continue && write_request_success) { + if (CPPHTTPLIB_EXPECT_100_TIMEOUT_MSECOND > 0) { + time_t sec = CPPHTTPLIB_EXPECT_100_TIMEOUT_MSECOND / 1000; + time_t usec = (CPPHTTPLIB_EXPECT_100_TIMEOUT_MSECOND % 1000) * 1000; + strm.set_read_timeout(sec, usec); + status_line_read = read_response_line(strm, req, res, false); + strm.set_read_timeout(read_timeout_sec_, read_timeout_usec_); + } + + if (!status_line_read) { + // No interim response within the timeout: send the body and handle the + // response as usual. + if (!write_request_body(strm, req, error)) { return false; } + expect_100_continue = false; // Switch to normal response handling + } + } + + // Receive response and headers + // When using Expect: 100-continue, don't auto-skip `100 Continue` response + if ((!status_line_read && + !read_response_line(strm, req, res, !expect_100_continue)) || + !detail::read_headers(strm, res.headers)) { + if (write_request_success) { error = Error::Read; } + output_error_log(error, &req); + return false; + } + + if (!write_request_success) { return false; } + + // Handle Expect: 100-continue response + if (expect_100_continue) { + if (res.status == StatusCode::Continue_100) { + // Server accepted, send the body + if (!write_request_body(strm, req, error)) { return false; } + + // Read the actual response + res.headers.clear(); + res.body.clear(); + if (!read_response_line(strm, req, res) || + !detail::read_headers(strm, res.headers)) { + error = Error::Read; + output_error_log(error, &req); + return false; + } + } + // If not 100 Continue, server returned an error; proceed with that response + } + + // Body + if ((res.status != StatusCode::NoContent_204) && req.method != "HEAD" && + req.method != "CONNECT") { + auto redirect = 300 < res.status && res.status < 400 && + res.status != StatusCode::NotModified_304 && + follow_location_; + + if (req.response_handler && !redirect) { + if (!req.response_handler(res)) { + error = Error::Canceled; + output_error_log(error, &req); + return false; + } + } + + auto out = + req.content_receiver + ? static_cast( + [&](const char *buf, size_t n, size_t off, size_t len) { + if (redirect) { return true; } + auto ret = req.content_receiver(buf, n, off, len); + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } + return ret; + }) + : static_cast( + [&](const char *buf, size_t n, size_t /*off*/, + size_t /*len*/) { + assert(res.body.size() + n <= res.body.max_size()); + if (payload_max_length_ > 0 && + (res.body.size() >= payload_max_length_ || + n > payload_max_length_ - res.body.size())) { + return false; + } + res.body.append(buf, n); + return true; + }); + + auto progress = [&](size_t current, size_t total) { + if (!req.download_progress || redirect) { return true; } + auto ret = req.download_progress(current, total); + if (!ret) { + error = Error::Canceled; + output_error_log(error, &req); + } + return ret; + }; + + if (res.has_header("Content-Length")) { + if (!req.content_receiver) { + auto len = res.get_header_value_u64("Content-Length"); + if (len > res.body.max_size()) { + error = Error::Read; + output_error_log(error, &req); + return false; + } + // Cap the reservation by payload_max_length_ to avoid OOM when a + // hostile or malformed server sends an enormous Content-Length. + // The actual body read below is bounded by payload_max_length_, + // so reserving more than that is never useful. + auto reserve_len = static_cast(len); + if (payload_max_length_ > 0 && reserve_len > payload_max_length_) { + reserve_len = payload_max_length_; + } + res.body.reserve(reserve_len); + } + } + + if (res.status != StatusCode::NotModified_304) { + int dummy_status; + auto max_length = (!has_payload_max_length_ && req.content_receiver) + ? (std::numeric_limits::max)() + : payload_max_length_; + if (!detail::read_content(strm, res, max_length, dummy_status, + std::move(progress), std::move(out), + decompress_)) { + if (error != Error::Canceled) { error = Error::Read; } + output_error_log(error, &req); + return false; + } + } + } + + // Log + output_log(req, res); + + return true; +} + +inline ContentProviderWithoutLength ClientImpl::get_multipart_content_provider( + const std::string &boundary, const UploadFormDataItems &items, + const FormDataProviderItems &provider_items) const { + size_t cur_item = 0; + size_t cur_start = 0; + // cur_item and cur_start are copied to within the std::function and + // maintain state between successive calls + return [&, cur_item, cur_start](size_t offset, + DataSink &sink) mutable -> bool { + if (!offset && !items.empty()) { + sink.os << detail::serialize_multipart_formdata(items, boundary, false); + return true; + } else if (cur_item < provider_items.size()) { + if (!cur_start) { + const auto &begin = detail::serialize_multipart_formdata_item_begin( + provider_items[cur_item], boundary); + offset += begin.size(); + cur_start = offset; + sink.os << begin; + } + + DataSink cur_sink; + auto has_data = true; + cur_sink.write = sink.write; + cur_sink.done = [&]() { has_data = false; }; + + if (!provider_items[cur_item].provider(offset - cur_start, cur_sink)) { + return false; + } + + if (!has_data) { + sink.os << detail::serialize_multipart_formdata_item_end(); + cur_item++; + cur_start = 0; + } + return true; + } else { + sink.os << detail::serialize_multipart_formdata_finish(boundary); + sink.done(); + return true; + } + }; +} + +inline bool ClientImpl::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + return detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, max_timeout_msec_, start_time, std::move(callback)); +} + +inline bool ClientImpl::is_ssl() const { return false; } + +inline Result ClientImpl::Get(const std::string &path, + DownloadProgress progress) { + return Get(path, Headers(), std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + DownloadProgress progress) { + if (params.empty()) { return Get(path, headers); } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + DownloadProgress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const std::string &path, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, Headers(), nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, Headers(), std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "GET"; + req.path = path; + req.headers = headers; + req.response_handler = std::move(response_handler); + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return Get(path, params, headers, nullptr, std::move(content_receiver), + std::move(progress)); +} + +inline Result ClientImpl::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + if (params.empty()) { + return Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); + } + + std::string path_with_query = append_query_params(path, params); + return Get(path_with_query, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Head(const std::string &path) { + return Head(path, Headers()); +} + +inline Result ClientImpl::Head(const std::string &path, + const Headers &headers) { + Request req; + req.method = "HEAD"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Post(const std::string &path) { + return Post(path, std::string(), std::string()); +} + +inline Result ClientImpl::Post(const std::string &path, + const Headers &headers) { + return Post(path, headers, nullptr, 0, std::string()); +} + +inline Result ClientImpl::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Params ¶ms) { + return Post(path, Headers(), params); +} + +inline Result ClientImpl::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Post(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Post(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Post(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Post(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Post(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Post(path, Headers(), items, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Post(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Post(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), std::move(progress)); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "POST", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "POST"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Put(const std::string &path) { + return Put(path, std::string(), std::string()); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers) { + return Put(path, headers, nullptr, 0, std::string()); +} + +inline Result ClientImpl::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Params ¶ms) { + return Put(path, Headers(), params); +} + +inline Result ClientImpl::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Put(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Put(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Put(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Put(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Put(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Put(path, Headers(), items, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Put(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Put(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "PUT", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PUT"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Patch(const std::string &path) { + return Patch(path, std::string(), std::string()); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + UploadProgress progress) { + return Patch(path, headers, nullptr, 0, std::string(), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), body, content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Params ¶ms) { + return Patch(path, Headers(), params); +} + +inline Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Patch(path, Headers(), content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return Patch(path, Headers(), std::move(content_provider), content_type, + progress); +} + +inline Result ClientImpl::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return Patch(path, Headers(), std::move(content_provider), content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + auto query = detail::params_to_query_str(params); + return Patch(path, headers, query, "application/x-www-form-urlencoded"); +} + +inline Result ClientImpl::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return Patch(path, Headers(), items, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Patch(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + if (!detail::is_multipart_boundary_chars_valid(boundary)) { + return Result{nullptr, Error::UnsupportedMultipartBoundaryChars}; + } + + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + auto content_length = detail::get_multipart_content_length(items, boundary); + return Patch(path, headers, content_length, + detail::make_multipart_content_provider(items, boundary), + content_type, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, body, content_length, nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, body.data(), body.size(), nullptr, nullptr, + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, content_length, + std::move(content_provider), nullptr, content_type, + std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + const auto &boundary = detail::make_multipart_data_boundary(); + const auto &content_type = + detail::serialize_multipart_formdata_get_content_type(boundary); + return send_with_content_provider_and_receiver( + "PATCH", path, headers, nullptr, 0, nullptr, + get_multipart_content_provider(boundary, items, provider_items), + content_type, nullptr, progress); +} + +inline Result ClientImpl::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + Request req; + req.method = "PATCH"; + req.path = path; + req.headers = headers; + req.body = body; + req.content_receiver = + [content_receiver](const char *data, size_t data_length, + size_t /*offset*/, size_t /*total_length*/) { + return content_receiver(data, data_length); + }; + req.download_progress = std::move(progress); + + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + + return send_(std::move(req)); +} + +inline Result ClientImpl::Delete(const std::string &path, + DownloadProgress progress) { + return Delete(path, Headers(), std::string(), std::string(), progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + DownloadProgress progress) { + return Delete(path, headers, std::string(), std::string(), progress); +} + +inline Result ClientImpl::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, Headers(), body, content_length, content_type, progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, Headers(), body.data(), body.size(), content_type, + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return Delete(path, headers, body.data(), body.size(), content_type, + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return Delete(path, Headers(), params, progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const Params ¶ms, + DownloadProgress progress) { + auto query = detail::params_to_query_str(params); + return Delete(path, headers, query, "application/x-www-form-urlencoded", + progress); +} + +inline Result ClientImpl::Delete(const std::string &path, + const Headers &headers, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + Request req; + req.method = "DELETE"; + req.headers = headers; + req.path = path; + req.download_progress = std::move(progress); + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + if (!content_type.empty()) { req.set_header("Content-Type", content_type); } + req.body.assign(body, content_length); + + return send_(std::move(req)); +} + +inline Result ClientImpl::Options(const std::string &path) { + return Options(path, Headers()); +} + +inline Result ClientImpl::Options(const std::string &path, + const Headers &headers) { + Request req; + req.method = "OPTIONS"; + req.headers = headers; + req.path = path; + if (max_timeout_msec_ > 0) { + req.start_time_ = std::chrono::steady_clock::now(); + } + + return send_(std::move(req)); +} + +inline void ClientImpl::stop() { + std::lock_guard guard(socket_mutex_); + + // If there is anything ongoing right now, the ONLY thread-safe thing we can + // do is to shutdown_socket, so that threads using this socket suddenly + // discover they can't read/write any more and error out. Everything else + // (closing the socket, shutting ssl down) is unsafe because these actions + // are not thread-safe. + if (socket_requests_in_flight_ > 0) { + shutdown_socket(socket_); + + // Aside from that, we set a flag for the socket to be closed when we're + // done. + socket_should_be_closed_when_request_is_done_ = true; + return; + } + + disconnect(/*gracefully=*/true); +} + +inline std::string ClientImpl::host() const { return host_; } + +inline int ClientImpl::port() const { return port_; } + +inline size_t ClientImpl::is_socket_open() const { + std::lock_guard guard(socket_mutex_); + return socket_.is_open(); +} + +inline socket_t ClientImpl::socket() const { return socket_.sock; } + +inline void ClientImpl::set_connection_timeout(time_t sec, time_t usec) { + connection_timeout_sec_ = sec; + connection_timeout_usec_ = usec; +} + +inline void ClientImpl::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +inline void ClientImpl::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; +} + +inline void ClientImpl::set_max_timeout(time_t msec) { + max_timeout_msec_ = msec; +} + +inline void ClientImpl::set_basic_auth(const std::string &username, + const std::string &password) { + basic_auth_username_ = username; + basic_auth_password_ = password; +} + +inline void ClientImpl::set_bearer_token_auth(const std::string &token) { + bearer_token_auth_token_ = token; +} + +inline void ClientImpl::set_keep_alive(bool on) { keep_alive_ = on; } + +inline void ClientImpl::set_follow_location(bool on) { follow_location_ = on; } + +inline void ClientImpl::set_path_encode(bool on) { path_encode_ = on; } + +inline void +ClientImpl::set_hostname_addr_map(std::map addr_map) { + addr_map_ = std::move(addr_map); +} + +inline void ClientImpl::set_default_headers(Headers headers) { + default_headers_ = std::move(headers); +} + +inline void ClientImpl::set_header_writer( + std::function const &writer) { + header_writer_ = writer; +} + +inline void ClientImpl::set_address_family(int family) { + address_family_ = family; +} + +inline void ClientImpl::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } + +inline void ClientImpl::set_ipv6_v6only(bool on) { ipv6_v6only_ = on; } + +inline void ClientImpl::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); +} + +inline void ClientImpl::set_compress(bool on) { compress_ = on; } + +inline void ClientImpl::set_decompress(bool on) { decompress_ = on; } + +inline void ClientImpl::set_payload_max_length(size_t length) { + payload_max_length_ = length; + has_payload_max_length_ = true; +} + +inline void ClientImpl::set_interface(const std::string &intf) { + interface_ = intf; +} + +inline void ClientImpl::set_proxy(const std::string &host, int port) { + proxy_host_ = host; + proxy_port_ = port; + std::lock_guard guard(socket_mutex_); + disconnect(/*gracefully=*/true); +} + +inline void ClientImpl::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + proxy_basic_auth_username_ = username; + proxy_basic_auth_password_ = password; +} + +inline void ClientImpl::set_proxy_bearer_token_auth(const std::string &token) { + proxy_bearer_token_auth_token_ = token; +} + +inline void ClientImpl::set_no_proxy(const std::vector &patterns) { + std::vector parsed; + parsed.reserve(patterns.size()); + for (const auto &p : patterns) { + auto trimmed = detail::trim_copy(p); + if (trimmed.empty()) { continue; } + detail::NoProxyEntry entry; + if (detail::parse_no_proxy_entry(trimmed, entry)) { + parsed.push_back(std::move(entry)); + } + } + no_proxy_entries_ = std::move(parsed); + std::lock_guard guard(socket_mutex_); + disconnect(/*gracefully=*/true); +} + +#ifdef CPPHTTPLIB_SSL_ENABLED +inline void ClientImpl::set_digest_auth(const std::string &username, + const std::string &password) { + digest_auth_username_ = username; + digest_auth_password_ = password; +} + +inline void ClientImpl::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + ca_cert_file_path_ = ca_cert_file_path; + ca_cert_dir_path_ = ca_cert_dir_path; +} + +inline void ClientImpl::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + proxy_digest_auth_username_ = username; + proxy_digest_auth_password_ = password; +} + +inline void ClientImpl::enable_server_certificate_verification(bool enabled) { + server_certificate_verification_ = enabled; +} + +inline void ClientImpl::enable_server_hostname_verification(bool enabled) { + server_hostname_verification_ = enabled; +} + +inline void ClientImpl::enable_system_ca(bool enabled) { + system_ca_mode_ = enabled ? SystemCAMode::Enabled : SystemCAMode::Disabled; +} +#endif + +inline void ClientImpl::set_logger(Logger logger) { + logger_ = std::move(logger); +} + +inline void ClientImpl::set_error_logger(ErrorLogger error_logger) { + error_logger_ = std::move(error_logger); +} + +/* + * SSL/TLS Common Implementation + */ + +inline ClientConnection::~ClientConnection() { +#ifdef CPPHTTPLIB_SSL_ENABLED + if (session) { + tls::shutdown(session, true); + tls::free_session(session); + session = nullptr; + } +#endif + + if (sock != INVALID_SOCKET) { + detail::close_socket(sock); + sock = INVALID_SOCKET; + } +} + +// Universal client implementation +inline Client::Client(const std::string &scheme_host_port) + : Client(scheme_host_port, std::string(), std::string()) {} + +inline Client::Client(const std::string &scheme_host_port, + const std::string &client_cert_path, + const std::string &client_key_path) { + detail::UrlComponents uc; + if (detail::parse_url(scheme_host_port, uc) && !uc.host.empty()) { + auto &scheme = uc.scheme; + +#ifdef CPPHTTPLIB_SSL_ENABLED + if (!scheme.empty() && (scheme != "http" && scheme != "https")) { +#else + if (!scheme.empty() && scheme != "http") { +#endif +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "'" + scheme + "' scheme is not supported."; + throw std::invalid_argument(msg); +#endif + return; + } + + auto is_ssl = scheme == "https"; + + auto host = std::move(uc.host); + + auto port = is_ssl ? 443 : 80; + if (!uc.port.empty() && !detail::parse_port(uc.port, port)) { return; } + + if (is_ssl) { +#ifdef CPPHTTPLIB_SSL_ENABLED + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + is_ssl_ = is_ssl; +#endif + } else { + cli_ = detail::make_unique(host, port, client_cert_path, + client_key_path); + } + } else { + // NOTE: Update TEST(UniversalClientImplTest, Ipv6LiteralAddress) + // if port param below changes. + cli_ = detail::make_unique(scheme_host_port, 80, + client_cert_path, client_key_path); + } +} + +inline Client::Client(const std::string &host, int port) + : Client(host, port, std::string(), std::string()) {} + +inline Client::Client(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path) + : cli_(detail::make_unique(host, port, client_cert_path, + client_key_path)) {} + +inline Client::~Client() = default; + +inline bool Client::is_valid() const { + return cli_ != nullptr && cli_->is_valid(); +} + +inline Result Client::Get(const std::string &path, DownloadProgress progress) { + return cli_->Get(path, std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(progress)); +} +inline Result Client::Get(const std::string &path, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(content_receiver), + std::move(progress)); +} +inline Result Client::Get(const std::string &path, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(content_receiver), + std::move(progress)); +} +inline Result Client::Get(const std::string &path, const Params ¶ms, + const Headers &headers, + ResponseHandler response_handler, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Get(path, params, headers, std::move(response_handler), + std::move(content_receiver), std::move(progress)); +} + +inline Result Client::Head(const std::string &path) { return cli_->Head(path); } +inline Result Client::Head(const std::string &path, const Headers &headers) { + return cli_->Head(path, headers); +} + +inline Result Client::Post(const std::string &path) { return cli_->Post(path); } +inline Result Client::Post(const std::string &path, const Headers &headers) { + return cli_->Post(path, headers); +} +inline Result Client::Post(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, body, content_length, content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Post(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, body, content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, body, content_type, progress); +} +inline Result Client::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Post(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Post(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Post(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Post(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Post(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Post(const std::string &path, const Params ¶ms) { + return cli_->Post(path, params); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Post(path, headers, params); +} +inline Result Client::Post(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Post(path, headers, items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Post(path, headers, items, boundary, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Post(path, headers, items, provider_items, progress); +} +inline Result Client::Post(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Post(path, headers, body, content_type, + std::move(content_receiver), progress); +} + +inline Result Client::Put(const std::string &path) { return cli_->Put(path); } +inline Result Client::Put(const std::string &path, const Headers &headers) { + return cli_->Put(path, headers); +} +inline Result Client::Put(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, body, content_length, content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, body, content_length, content_type, progress); +} +inline Result Client::Put(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, body, content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, body, content_type, progress); +} +inline Result Client::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Put(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Put(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Put(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Put(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Put(const std::string &path, const Params ¶ms) { + return cli_->Put(path, params); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Put(path, headers, params); +} +inline Result Client::Put(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Put(path, headers, items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Put(path, headers, items, boundary, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Put(path, headers, items, provider_items, progress); +} +inline Result Client::Put(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Put(path, headers, body, content_type, content_receiver, + progress); +} + +inline Result Client::Patch(const std::string &path) { + return cli_->Patch(path); +} +inline Result Client::Patch(const std::string &path, const Headers &headers) { + return cli_->Patch(path, headers); +} +inline Result Client::Patch(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, body, content_length, content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Patch(const std::string &path, const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, body, content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, body, content_type, progress); +} +inline Result Client::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Patch(const std::string &path, size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, std::move(content_provider), content_type, progress); +} +inline Result Client::Patch(const std::string &path, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + size_t content_length, + ContentProvider content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, headers, content_length, std::move(content_provider), + content_type, std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + UploadProgress progress) { + return cli_->Patch(path, headers, std::move(content_provider), content_type, + progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + ContentProviderWithoutLength content_provider, + const std::string &content_type, + ContentReceiver content_receiver, + UploadProgress progress) { + return cli_->Patch(path, headers, std::move(content_provider), content_type, + std::move(content_receiver), progress); +} +inline Result Client::Patch(const std::string &path, const Params ¶ms) { + return cli_->Patch(path, params); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const Params ¶ms) { + return cli_->Patch(path, headers, params); +} +inline Result Client::Patch(const std::string &path, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const std::string &boundary, + UploadProgress progress) { + return cli_->Patch(path, headers, items, boundary, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const UploadFormDataItems &items, + const FormDataProviderItems &provider_items, + UploadProgress progress) { + return cli_->Patch(path, headers, items, provider_items, progress); +} +inline Result Client::Patch(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + ContentReceiver content_receiver, + DownloadProgress progress) { + return cli_->Patch(path, headers, body, content_type, content_receiver, + progress); +} + +inline Result Client::Delete(const std::string &path, + DownloadProgress progress) { + return cli_->Delete(path, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + DownloadProgress progress) { + return cli_->Delete(path, headers, progress); +} +inline Result Client::Delete(const std::string &path, const char *body, + size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, body, content_length, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const char *body, size_t content_length, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, headers, body, content_length, content_type, + progress); +} +inline Result Client::Delete(const std::string &path, const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, body, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const std::string &body, + const std::string &content_type, + DownloadProgress progress) { + return cli_->Delete(path, headers, body, content_type, progress); +} +inline Result Client::Delete(const std::string &path, const Params ¶ms, + DownloadProgress progress) { + return cli_->Delete(path, params, progress); +} +inline Result Client::Delete(const std::string &path, const Headers &headers, + const Params ¶ms, DownloadProgress progress) { + return cli_->Delete(path, headers, params, progress); +} + +inline Result Client::Options(const std::string &path) { + return cli_->Options(path); +} +inline Result Client::Options(const std::string &path, const Headers &headers) { + return cli_->Options(path, headers); +} + +inline ClientImpl::StreamHandle +Client::open_stream(const std::string &method, const std::string &path, + const Params ¶ms, const Headers &headers, + const std::string &body, const std::string &content_type) { + return cli_->open_stream(method, path, params, headers, body, content_type); +} + +inline bool Client::send(Request &req, Response &res, Error &error) { + return cli_->send(req, res, error); +} + +inline Result Client::send(const Request &req) { return cli_->send(req); } + +inline void Client::stop() { cli_->stop(); } + +inline std::string Client::host() const { return cli_->host(); } + +inline int Client::port() const { return cli_->port(); } + +inline size_t Client::is_socket_open() const { return cli_->is_socket_open(); } + +inline socket_t Client::socket() const { return cli_->socket(); } + +inline void +Client::set_hostname_addr_map(std::map addr_map) { + cli_->set_hostname_addr_map(std::move(addr_map)); +} + +inline void Client::set_default_headers(Headers headers) { + cli_->set_default_headers(std::move(headers)); +} + +inline void Client::set_header_writer( + std::function const &writer) { + cli_->set_header_writer(writer); +} + +inline void Client::set_address_family(int family) { + cli_->set_address_family(family); +} + +inline void Client::set_tcp_nodelay(bool on) { cli_->set_tcp_nodelay(on); } + +inline void Client::set_socket_options(SocketOptions socket_options) { + cli_->set_socket_options(std::move(socket_options)); +} + +inline void Client::set_connection_timeout(time_t sec, time_t usec) { + cli_->set_connection_timeout(sec, usec); +} + +inline void Client::set_read_timeout(time_t sec, time_t usec) { + cli_->set_read_timeout(sec, usec); +} + +inline void Client::set_write_timeout(time_t sec, time_t usec) { + cli_->set_write_timeout(sec, usec); +} + +inline void Client::set_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_basic_auth(username, password); +} +inline void Client::set_bearer_token_auth(const std::string &token) { + cli_->set_bearer_token_auth(token); +} + +inline void Client::set_keep_alive(bool on) { cli_->set_keep_alive(on); } +inline void Client::set_follow_location(bool on) { + cli_->set_follow_location(on); +} + +inline void Client::set_path_encode(bool on) { cli_->set_path_encode(on); } + +inline void Client::set_compress(bool on) { cli_->set_compress(on); } + +inline void Client::set_decompress(bool on) { cli_->set_decompress(on); } + +inline void Client::set_payload_max_length(size_t length) { + cli_->set_payload_max_length(length); +} + +inline void Client::set_interface(const std::string &intf) { + cli_->set_interface(intf); +} + +inline void Client::set_proxy(const std::string &host, int port) { + cli_->set_proxy(host, port); +} +inline void Client::set_proxy_basic_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_basic_auth(username, password); +} +inline void Client::set_proxy_bearer_token_auth(const std::string &token) { + cli_->set_proxy_bearer_token_auth(token); +} +inline void Client::set_no_proxy(const std::vector &patterns) { + cli_->set_no_proxy(patterns); +} + +inline void Client::set_logger(Logger logger) { + cli_->set_logger(std::move(logger)); +} + +inline void Client::set_error_logger(ErrorLogger error_logger) { + cli_->set_error_logger(std::move(error_logger)); +} + +/* + * Group 6: SSL Server and Client implementation + */ + +#ifdef CPPHTTPLIB_SSL_ENABLED + +// SSL HTTP server implementation +inline SSLServer::SSLServer(const char *cert_path, const char *private_key_path, + const char *client_ca_cert_file_path, + const char *client_ca_cert_dir_path, + const char *private_key_password) { + using namespace tls; + + ctx_ = create_server_context(); + if (!ctx_) { return; } + + // Load server certificate and private key + if (!set_server_cert_file(ctx_, cert_path, private_key_path, + private_key_password)) { + last_ssl_error_ = static_cast(get_error()); + free_context(ctx_); + ctx_ = nullptr; + return; + } + + // Load client CA certificates for client authentication + if (client_ca_cert_file_path || client_ca_cert_dir_path) { + if (!set_client_ca_file(ctx_, client_ca_cert_file_path, + client_ca_cert_dir_path)) { + last_ssl_error_ = static_cast(get_error()); + free_context(ctx_); + ctx_ = nullptr; + return; + } + // Enable client certificate verification + set_verify_client(ctx_, true); + } +} + +inline SSLServer::SSLServer(const PemMemory &pem) { + using namespace tls; + ctx_ = create_server_context(); + if (ctx_) { + if (!set_server_cert_pem(ctx_, pem.cert_pem, pem.key_pem, + pem.private_key_password)) { + last_ssl_error_ = static_cast(get_error()); + free_context(ctx_); + ctx_ = nullptr; + } else if (pem.client_ca_pem && pem.client_ca_pem_len > 0) { + if (!load_ca_pem(ctx_, pem.client_ca_pem, pem.client_ca_pem_len)) { + last_ssl_error_ = static_cast(get_error()); + free_context(ctx_); + ctx_ = nullptr; + } else { + set_verify_client(ctx_, true); + } + } + } +} + +inline SSLServer::SSLServer(const tls::ContextSetupCallback &setup_callback) { + using namespace tls; + ctx_ = create_server_context(); + if (ctx_) { + if (!setup_callback(ctx_)) { + free_context(ctx_); + ctx_ = nullptr; + } + } +} + +inline SSLServer::~SSLServer() { + if (ctx_) { tls::free_context(ctx_); } +} + +inline bool SSLServer::is_valid() const { return ctx_ != nullptr; } + +inline bool SSLServer::process_and_close_socket(socket_t sock) { + using namespace tls; + + // Create TLS session with mutex protection + session_t session = nullptr; + { + std::lock_guard guard(ctx_mutex_); + session = create_session(static_cast(ctx_), sock); + } + + if (!session) { + last_ssl_error_ = static_cast(get_error()); + detail::shutdown_socket(sock); + detail::close_socket(sock); + return false; + } + + // Use scope_exit to ensure cleanup on all paths (including exceptions) + bool handshake_done = false; + bool ret = false; + bool websocket_upgraded = false; + auto cleanup = detail::scope_exit([&] { + if (handshake_done) { shutdown(session, !websocket_upgraded && ret); } + free_session(session); + detail::shutdown_socket(sock); + detail::close_socket(sock); + }); + + // Perform TLS accept handshake with timeout + TlsError tls_err; + if (!accept_nonblocking(session, sock, read_timeout_sec_, read_timeout_usec_, + &tls_err)) { +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // Map TlsError to legacy ssl_error for backward compatibility + if (tls_err.code == ErrorCode::WantRead) { + last_ssl_error_ = SSL_ERROR_WANT_READ; + } else if (tls_err.code == ErrorCode::WantWrite) { + last_ssl_error_ = SSL_ERROR_WANT_WRITE; + } else { + last_ssl_error_ = SSL_ERROR_SSL; + } +#else + last_ssl_error_ = static_cast(get_error()); +#endif + return false; + } + + handshake_done = true; + + std::string remote_addr; + int remote_port = 0; + detail::get_remote_ip_and_port(sock, remote_addr, remote_port); + + std::string local_addr; + int local_port = 0; + detail::get_local_ip_and_port(sock, local_addr, local_port); + + ret = detail::process_server_socket_ssl( + svr_sock_, session, sock, keep_alive_max_count_, keep_alive_timeout_sec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, + [&](Stream &strm, bool close_connection, bool &connection_closed) { + return process_request( + strm, remote_addr, remote_port, local_addr, local_port, + close_connection, connection_closed, + [&](Request &req) { req.ssl = session; }, &websocket_upgraded); + }); + + return ret; +} + +inline bool SSLServer::update_certs_pem(const char *cert_pem, + const char *key_pem, + const char *client_ca_pem, + const char *password) { + if (!ctx_) { return false; } + std::lock_guard guard(ctx_mutex_); + if (!tls::update_server_cert(ctx_, cert_pem, key_pem, password)) { + return false; + } + if (client_ca_pem) { + return tls::update_server_client_ca(ctx_, client_ca_pem); + } + return true; +} + +// SSL HTTP client implementation +inline SSLClient::~SSLClient() { + if (ctx_) { tls::free_context(ctx_); } + // Make sure to shut down SSL since shutdown_ssl will resolve to the + // base function rather than the derived function once we get to the + // base class destructor, and won't free the SSL (causing a leak). + shutdown_ssl_impl(socket_, true); +} + +inline bool SSLClient::is_valid() const { return ctx_ != nullptr; } + +inline void SSLClient::shutdown_ssl(Socket &socket, bool shutdown_gracefully) { + shutdown_ssl_impl(socket, shutdown_gracefully); +} + +inline void SSLClient::shutdown_ssl_impl(Socket &socket, + bool shutdown_gracefully) { + if (socket.sock == INVALID_SOCKET) { + assert(socket.ssl == nullptr); + return; + } + if (socket.ssl) { + tls::shutdown(socket.ssl, shutdown_gracefully); + { + std::lock_guard guard(ctx_mutex_); + tls::free_session(socket.ssl); + } + socket.ssl = nullptr; + } + assert(socket.ssl == nullptr); +} + +inline bool SSLClient::process_socket( + const Socket &socket, + std::chrono::time_point start_time, + std::function callback) { + assert(socket.ssl); + return detail::process_client_socket_ssl( + socket.ssl, socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, start_time, + std::move(callback)); +} + +inline bool SSLClient::is_ssl() const { return true; } + +inline bool SSLClient::create_and_connect_socket(Socket &socket, Error &error) { + if (!is_valid()) { + error = Error::SSLConnection; + return false; + } + return ClientImpl::create_and_connect_socket(socket, error); +} + +inline bool SSLClient::setup_proxy_connection( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) { + if (!is_proxy_enabled_for_host(host_)) { return true; } + + if (!connect_with_proxy(socket, start_time, res, success, error)) { + return false; + } + + if (!initialize_ssl(socket, error)) { + success = false; + return false; + } + + return true; +} + +// Assumes that socket_mutex_ is locked and that there are no requests in +// flight +inline bool SSLClient::connect_with_proxy( + Socket &socket, + std::chrono::time_point start_time, + Response &res, bool &success, Error &error) { + success = true; + Response proxy_res; + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req2; + req2.method = "CONNECT"; + req2.path = + detail::make_host_and_port_string_always_port(host_, port_); + if (max_timeout_msec_ > 0) { + req2.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req2, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are no + // requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + + if (proxy_res.status == StatusCode::ProxyAuthenticationRequired_407) { + if (!proxy_digest_auth_username_.empty() && + !proxy_digest_auth_password_.empty()) { + std::map auth; + if (detail::parse_www_authenticate(proxy_res, auth, true)) { + // Close the current socket and create a new one for the authenticated + // request + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + + // Create a new socket for the authenticated CONNECT request + if (!ensure_socket_connection(socket, error)) { + success = false; + output_error_log(error, nullptr); + return false; + } + + proxy_res = Response(); + if (!detail::process_client_socket( + socket.sock, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_, max_timeout_msec_, + start_time, [&](Stream &strm) { + Request req3; + req3.method = "CONNECT"; + req3.path = detail::make_host_and_port_string_always_port( + host_, port_); + req3.headers.insert(detail::make_digest_authentication_header( + req3, auth, 1, detail::random_string(10), + proxy_digest_auth_username_, proxy_digest_auth_password_, + true)); + if (max_timeout_msec_ > 0) { + req3.start_time_ = std::chrono::steady_clock::now(); + } + return process_request(strm, req3, proxy_res, false, error); + })) { + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + success = false; + return false; + } + } + } + } + + // If status code is not 200, proxy request is failed. + // Set error to ProxyConnection and return proxy response + // as the response of the request + if (proxy_res.status != StatusCode::OK_200) { + error = Error::ProxyConnection; + output_error_log(error, nullptr); + res = std::move(proxy_res); + // Thread-safe to close everything because we are assuming there are + // no requests in flight + shutdown_ssl(socket, true); + shutdown_socket(socket); + close_socket(socket); + return false; + } + + return true; +} + +inline bool SSLClient::ensure_socket_connection(Socket &socket, Error &error) { + if (!ClientImpl::ensure_socket_connection(socket, error)) { return false; } + + if (is_proxy_enabled_for_host(host_)) { return true; } + + if (!initialize_ssl(socket, error)) { + shutdown_socket(socket); + close_socket(socket); + return false; + } + + return true; +} + +// SSL HTTP client implementation +inline SSLClient::SSLClient(const std::string &host) + : SSLClient(host, 443, std::string(), std::string()) {} + +inline SSLClient::SSLClient(const std::string &host, int port) + : SSLClient(host, port, std::string(), std::string()) {} + +inline void SSLClient::init_ctx() { + ctx_ = tls::create_client_context(); + if (ctx_) { tls::set_min_version(ctx_, tls::Version::TLS1_2); } +} + +inline void SSLClient::reset_ctx_on_error() { + last_backend_error_ = tls::get_error(); + tls::free_context(ctx_); + ctx_ = nullptr; +} + +inline SSLClient::SSLClient(const std::string &host, int port, + const std::string &client_cert_path, + const std::string &client_key_path, + const std::string &private_key_password) + : ClientImpl(host, port, client_cert_path, client_key_path) { + init_ctx(); + if (!ctx_) { return; } + + if (!client_cert_path.empty() && !client_key_path.empty()) { + const char *password = + private_key_password.empty() ? nullptr : private_key_password.c_str(); + if (!tls::set_client_cert_file(ctx_, client_cert_path.c_str(), + client_key_path.c_str(), password)) { + reset_ctx_on_error(); + } + } +} + +inline SSLClient::SSLClient(const std::string &host, int port, + const PemMemory &pem) + : ClientImpl(host, port) { + init_ctx(); + if (!ctx_) { return; } + + if (pem.cert_pem && pem.key_pem) { + if (!tls::set_client_cert_pem(ctx_, pem.cert_pem, pem.key_pem, + pem.private_key_password)) { + reset_ctx_on_error(); + } + } +} + +inline void SSLClient::set_ca_cert_store(tls::ca_store_t ca_cert_store) { + if (ca_cert_store && ctx_) { + // set_ca_store takes ownership of ca_cert_store + tls::set_ca_store(ctx_, ca_cert_store); + ca_cert_store_set_ = true; + } else if (ca_cert_store) { + tls::free_ca_store(ca_cert_store); + } +} + +inline void +SSLClient::set_server_certificate_verifier(tls::VerifyCallback verifier) { + if (!ctx_) { return; } + tls::set_verify_callback(ctx_, verifier); +} + +inline void SSLClient::set_session_verifier( + std::function verifier) { + session_verifier_ = std::move(verifier); +} + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE +inline void SSLClient::enable_windows_certificate_verification(bool enabled) { + enable_windows_cert_verification_ = enabled; +} +#endif + +inline void SSLClient::load_ca_cert_store(const char *ca_cert, + std::size_t size) { + if (ctx_ && ca_cert && size > 0) { + ca_cert_pem_.assign(ca_cert, size); // Store for redirect transfer + tls::load_ca_pem(ctx_, ca_cert, size); + } +} + +inline bool SSLClient::load_certs() { + auto ret = true; + + std::call_once(initialize_cert_, [&]() { + std::lock_guard guard(ctx_mutex_); + + ret = detail::load_client_ca_config( + ctx_, ca_cert_file_path_, ca_cert_dir_path_, + !ca_cert_pem_.empty() || ca_cert_store_set_, system_ca_mode_, + last_backend_error_); + }); + + return ret; +} + +inline bool SSLClient::initialize_ssl(Socket &socket, Error &error) { + using namespace tls; + + // Load CA certificates if server verification is enabled + if (server_certificate_verification_) { + if (!load_certs()) { + error = Error::SSLLoadingCerts; + output_error_log(error, nullptr); + return false; + } + } + + bool is_ip = detail::is_ip_address(host_); + +#if defined(CPPHTTPLIB_MBEDTLS_SUPPORT) || defined(CPPHTTPLIB_WOLFSSL_SUPPORT) + // MbedTLS/wolfSSL need explicit verification mode (OpenSSL uses + // SSL_VERIFY_NONE by default and performs all verification post-handshake). + // Chain verification happens during the handshake even for IP hosts; the + // certificate identity is verified post-handshake via verify_hostname(). + set_verify_client(ctx_, server_certificate_verification_); +#endif + + // Create TLS session + session_t session = nullptr; + { + std::lock_guard guard(ctx_mutex_); + session = create_session(ctx_, socket.sock); + } + + if (!session) { + error = Error::SSLConnection; + last_backend_error_ = get_error(); + return false; + } + + // Use scope_exit to ensure session is freed on error paths + bool success = false; + auto session_guard = detail::scope_exit([&] { + if (!success) { free_session(session); } + }); + + // Set SNI extension (skip for IP addresses per RFC 6066). + // On MbedTLS, set_sni also enables hostname verification internally. + // On OpenSSL, set_sni only sets SNI; verification is done post-handshake. + if (!is_ip) { + if (!set_sni(session, host_.c_str())) { + error = Error::SSLConnection; + last_backend_error_ = get_error(); + return false; + } + } + + // Perform non-blocking TLS handshake with timeout + TlsError tls_err; + if (!connect_nonblocking(session, socket.sock, connection_timeout_sec_, + connection_timeout_usec_, &tls_err)) { + last_ssl_error_ = static_cast(tls_err.code); + last_backend_error_ = tls_err.backend_code; + if (tls_err.code == ErrorCode::CertVerifyFailed) { + error = Error::SSLServerVerification; + } else if (tls_err.code == ErrorCode::HostnameMismatch) { + error = Error::SSLServerHostnameVerification; + } else { + error = Error::SSLConnection; + } + output_error_log(error, nullptr); + return false; + } + + // Post-handshake session verifier callback + auto verification_status = SSLVerifierResponse::NoDecisionMade; + if (session_verifier_) { verification_status = session_verifier_(session); } + + if (verification_status == SSLVerifierResponse::CertificateRejected) { + last_backend_error_ = get_error(); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + + // Default server certificate verification + if (verification_status == SSLVerifierResponse::NoDecisionMade && + server_certificate_verification_) { + verify_result_ = tls::get_verify_result(session); + if (verify_result_ != 0) { + last_backend_error_ = static_cast(verify_result_); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + + auto server_cert = get_peer_cert(session); + if (!server_cert) { + last_backend_error_ = get_error(); + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + auto cert_guard = detail::scope_exit([&] { free_cert(server_cert); }); + + // Hostname verification (post-handshake for all cases). + // On OpenSSL, verification is always post-handshake (SSL_VERIFY_NONE). + // On MbedTLS, set_sni already enabled hostname verification during + // handshake for non-IP hosts, but this check is still needed for IP + // addresses where SNI is not set. + if (server_hostname_verification_) { + if (!verify_hostname(server_cert, host_.c_str())) { + last_backend_error_ = hostname_mismatch_code(); + error = Error::SSLServerHostnameVerification; + output_error_log(error, nullptr); + return false; + } + } + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE + // Additional Windows Schannel verification. + // This provides real-time certificate validation with Windows Update + // integration, working with both OpenSSL and MbedTLS backends. + // Skip when a custom CA cert is specified, as the Windows certificate + // store would not know about user-provided CA certificates. Also skip + // when system CA trust is explicitly disabled. + if (enable_windows_cert_verification_ && + system_ca_mode_ != SystemCAMode::Disabled && + ca_cert_file_path_.empty() && ca_cert_dir_path_.empty() && + ca_cert_pem_.empty() && !ca_cert_store_set_) { + std::vector der; + if (get_cert_der(server_cert, der)) { + uint64_t wincrypt_error = 0; + if (!detail::verify_cert_with_windows_schannel( + der, host_, server_hostname_verification_, wincrypt_error)) { + last_backend_error_ = wincrypt_error; + error = Error::SSLServerVerification; + output_error_log(error, nullptr); + return false; + } + } + } +#endif + } + + success = true; + socket.ssl = session; + return true; +} + +inline void Client::set_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_digest_auth(username, password); +} + +inline void Client::set_proxy_digest_auth(const std::string &username, + const std::string &password) { + cli_->set_proxy_digest_auth(username, password); +} + +inline void Client::enable_server_certificate_verification(bool enabled) { + cli_->enable_server_certificate_verification(enabled); +} + +inline void Client::enable_server_hostname_verification(bool enabled) { + cli_->enable_server_hostname_verification(enabled); +} + +inline void Client::enable_system_ca(bool enabled) { + cli_->enable_system_ca(enabled); +} + +#ifdef CPPHTTPLIB_WINDOWS_AUTOMATIC_ROOT_CERTIFICATES_UPDATE +inline void Client::enable_windows_certificate_verification(bool enabled) { + if (is_ssl_) { + static_cast(*cli_).enable_windows_certificate_verification( + enabled); + } +} +#endif + +inline void Client::set_ca_cert_path(const std::string &ca_cert_file_path, + const std::string &ca_cert_dir_path) { + cli_->set_ca_cert_path(ca_cert_file_path, ca_cert_dir_path); +} + +inline void Client::set_ca_cert_store(tls::ca_store_t ca_cert_store) { + if (is_ssl_) { + static_cast(*cli_).set_ca_cert_store(ca_cert_store); + } else if (ca_cert_store) { + tls::free_ca_store(ca_cert_store); + } +} + +inline void Client::load_ca_cert_store(const char *ca_cert, std::size_t size) { + if (is_ssl_) { + // Use the PEM-based path so the CA data is retained for redirect transfer + static_cast(*cli_).load_ca_cert_store(ca_cert, size); + } +} + +inline void +Client::set_server_certificate_verifier(tls::VerifyCallback verifier) { + if (is_ssl_) { + static_cast(*cli_).set_server_certificate_verifier( + std::move(verifier)); + } +} + +inline void Client::set_session_verifier( + std::function verifier) { + if (is_ssl_) { + static_cast(*cli_).set_session_verifier(std::move(verifier)); + } +} + +inline tls::ctx_t Client::tls_context() const { + if (is_ssl_) { return static_cast(*cli_).tls_context(); } + return nullptr; +} + +#endif // CPPHTTPLIB_SSL_ENABLED + +/* + * Group 7: TLS abstraction layer - Common API + */ + +#ifdef CPPHTTPLIB_SSL_ENABLED + +namespace tls { + +// Helper for PeerCert construction +inline PeerCert get_peer_cert_from_session(const_session_t session) { + return PeerCert(get_peer_cert(session)); +} + +namespace impl { + +inline VerifyCallback &get_verify_callback() { + static thread_local VerifyCallback callback; + return callback; +} + +inline VerifyCallback &get_mbedtls_verify_callback() { + static thread_local VerifyCallback callback; + return callback; +} + +// Check if a string is an IPv4 address +inline bool is_ipv4_address(const std::string &str) { + int dots = 0; + for (char c : str) { + if (c == '.') { + dots++; + } else if (!isdigit(static_cast(c))) { + return false; + } + } + return dots == 3; +} + +// Parse IPv4 address string to bytes +inline bool parse_ipv4(const std::string &str, unsigned char *out) { + const char *p = str.c_str(); + for (int i = 0; i < 4; i++) { + if (i > 0) { + if (*p != '.') { return false; } + p++; + } + int val = 0; + int digits = 0; + while (*p >= '0' && *p <= '9') { + val = val * 10 + (*p - '0'); + if (val > 255) { return false; } + p++; + digits++; + } + if (digits == 0) { return false; } + // Reject leading zeros (e.g., "01.002.03.04") to prevent ambiguity + if (digits > 1 && *(p - digits) == '0') { return false; } + out[i] = static_cast(val); + } + return *p == '\0'; +} + +// Parse an IP literal (IPv4 or IPv6) into raw network-order bytes. +// `out` must have room for at least 16 bytes. Returns the address length +// (4 for IPv4, 16 for IPv6) on success, or 0 if the string is not an IP +// literal. Used to match a host against iPAddress SANs the same way the +// OpenSSL backend does via X509_check_ip. +inline size_t parse_ip_address(const std::string &str, unsigned char *out) { + if (is_ipv4_address(str)) { return parse_ipv4(str, out) ? 4 : 0; } + struct in6_addr addr6 = {}; + if (inet_pton(AF_INET6, str.c_str(), &addr6) == 1) { + memcpy(out, &addr6, 16); + return 16; + } + return 0; +} + +#ifdef _WIN32 +// Enumerate Windows system certificates and call callback with DER data +template +inline bool enumerate_windows_system_certs(Callback cb) { + bool loaded = false; + static const wchar_t *store_names[] = {L"ROOT", L"CA"}; + for (auto store_name : store_names) { + HCERTSTORE hStore = CertOpenSystemStoreW(0, store_name); + if (hStore) { + PCCERT_CONTEXT pContext = nullptr; + while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != + nullptr) { + if (cb(pContext->pbCertEncoded, pContext->cbCertEncoded)) { + loaded = true; + } + } + CertCloseStore(hStore, 0); + } + } + return loaded; +} +#endif + +#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN +// Enumerate macOS Keychain certificates and call callback with DER data +template +inline bool enumerate_macos_keychain_certs(Callback cb) { + bool loaded = false; + const SecTrustSettingsDomain domains[] = { + kSecTrustSettingsDomainSystem, + kSecTrustSettingsDomainAdmin, + kSecTrustSettingsDomainUser, + }; + for (auto domain : domains) { + CFArrayRef certs = nullptr; + OSStatus status = SecTrustSettingsCopyCertificates(domain, &certs); + if (status != errSecSuccess || !certs) { + if (certs) CFRelease(certs); + continue; + } + CFIndex count = CFArrayGetCount(certs); + for (CFIndex i = 0; i < count; i++) { + SecCertificateRef cert = + (SecCertificateRef)CFArrayGetValueAtIndex(certs, i); + CFDataRef data = SecCertificateCopyData(cert); + if (data) { + if (cb(CFDataGetBytePtr(data), + static_cast(CFDataGetLength(data)))) { + loaded = true; + } + CFRelease(data); + } + } + CFRelease(certs); + } + return loaded; +} +#endif + +#if !defined(_WIN32) && !(defined(__APPLE__) && \ + defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN)) +// Common CA certificate file paths on Linux/Unix +inline const char **system_ca_paths() { + static const char *paths[] = { + "/etc/ssl/certs/ca-certificates.crt", // Debian/Ubuntu + "/etc/pki/tls/certs/ca-bundle.crt", // RHEL/CentOS + "/etc/ssl/ca-bundle.pem", // OpenSUSE + "/etc/pki/tls/cacert.pem", // OpenELEC + "/etc/ssl/cert.pem", // Alpine, FreeBSD + nullptr}; + return paths; +} + +// Common CA certificate directory paths on Linux/Unix +inline const char **system_ca_dirs() { + static const char *dirs[] = {"/etc/ssl/certs", // Debian/Ubuntu + "/etc/pki/tls/certs", // RHEL/CentOS + "/usr/share/ca-certificates", // Other + nullptr}; + return dirs; +} +#endif + +} // namespace impl + +inline bool set_client_ca_file(ctx_t ctx, const char *ca_file, + const char *ca_dir) { + if (!ctx) { return false; } + + bool success = true; + if (ca_file && *ca_file) { + if (!load_ca_file(ctx, ca_file)) { success = false; } + } + if (ca_dir && *ca_dir) { + if (!load_ca_dir(ctx, ca_dir)) { success = false; } + } + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT + // Set CA list for client certificate request (CertificateRequest message) + if (ca_file && *ca_file) { + auto list = SSL_load_client_CA_file(ca_file); + if (list) { SSL_CTX_set_client_CA_list(static_cast(ctx), list); } + } +#endif + + return success; +} + +inline bool set_server_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password) { + return set_client_cert_pem(ctx, cert, key, password); +} + +inline bool set_server_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password) { + return set_client_cert_file(ctx, cert_path, key_path, password); +} + +// PeerCert implementation +inline PeerCert::PeerCert() = default; + +inline PeerCert::PeerCert(cert_t cert) : cert_(cert) {} + +inline PeerCert::PeerCert(PeerCert &&other) noexcept : cert_(other.cert_) { + other.cert_ = nullptr; +} + +inline PeerCert &PeerCert::operator=(PeerCert &&other) noexcept { + if (this != &other) { + if (cert_) { free_cert(cert_); } + cert_ = other.cert_; + other.cert_ = nullptr; + } + return *this; +} + +inline PeerCert::~PeerCert() { + if (cert_) { free_cert(cert_); } +} + +inline PeerCert::operator bool() const { return cert_ != nullptr; } + +inline std::string PeerCert::subject_cn() const { + return cert_ ? get_cert_subject_cn(cert_) : std::string(); +} + +inline std::string PeerCert::issuer_name() const { + return cert_ ? get_cert_issuer_name(cert_) : std::string(); +} + +inline bool PeerCert::check_hostname(const char *hostname) const { + return cert_ ? verify_hostname(cert_, hostname) : false; +} + +inline std::vector PeerCert::sans() const { + std::vector result; + if (cert_) { get_cert_sans(cert_, result); } + return result; +} + +inline bool PeerCert::validity(time_t ¬_before, time_t ¬_after) const { + return cert_ ? get_cert_validity(cert_, not_before, not_after) : false; +} + +inline std::string PeerCert::serial() const { + return cert_ ? get_cert_serial(cert_) : std::string(); +} + +// VerifyContext method implementations +inline std::string VerifyContext::subject_cn() const { + return cert ? get_cert_subject_cn(cert) : std::string(); +} + +inline std::string VerifyContext::issuer_name() const { + return cert ? get_cert_issuer_name(cert) : std::string(); +} + +inline bool VerifyContext::check_hostname(const char *hostname) const { + return cert ? verify_hostname(cert, hostname) : false; +} + +inline std::vector VerifyContext::sans() const { + std::vector result; + if (cert) { get_cert_sans(cert, result); } + return result; +} + +inline bool VerifyContext::validity(time_t ¬_before, + time_t ¬_after) const { + return cert ? get_cert_validity(cert, not_before, not_after) : false; +} + +inline std::string VerifyContext::serial() const { + return cert ? get_cert_serial(cert) : std::string(); +} + +// TlsError static method implementation +inline std::string TlsError::verify_error_to_string(long error_code) { + return verify_error_string(error_code); +} + +} // namespace tls + +// Request::peer_cert() implementation +inline tls::PeerCert Request::peer_cert() const { + return tls::get_peer_cert_from_session(ssl); +} + +// Request::sni() implementation +inline std::string Request::sni() const { + if (!ssl) { return std::string(); } + const char *s = tls::get_sni(ssl); + return s ? std::string(s) : std::string(); +} + +#endif // CPPHTTPLIB_SSL_ENABLED + +/* + * Group 8: TLS abstraction layer - OpenSSL backend + */ + +/* + * OpenSSL Backend Implementation + */ + +#ifdef CPPHTTPLIB_OPENSSL_SUPPORT +namespace tls { + +namespace impl { + +// Helper to map OpenSSL SSL_get_error to ErrorCode +inline ErrorCode map_ssl_error(int ssl_error, int &out_errno) { + switch (ssl_error) { + case SSL_ERROR_NONE: return ErrorCode::Success; + case SSL_ERROR_WANT_READ: return ErrorCode::WantRead; + case SSL_ERROR_WANT_WRITE: return ErrorCode::WantWrite; + case SSL_ERROR_ZERO_RETURN: return ErrorCode::PeerClosed; + case SSL_ERROR_SYSCALL: out_errno = errno; return ErrorCode::SyscallError; + case SSL_ERROR_SSL: + default: return ErrorCode::Fatal; + } +} + +// Helper: Create client CA list from PEM string +// Returns a new STACK_OF(X509_NAME)* or nullptr on failure +// Caller takes ownership of returned list +inline STACK_OF(X509_NAME) * + create_client_ca_list_from_pem(const char *ca_pem) { + if (!ca_pem) { return nullptr; } + + auto ca_list = sk_X509_NAME_new_null(); + if (!ca_list) { return nullptr; } + + BIO *bio = BIO_new_mem_buf(ca_pem, -1); + if (!bio) { + sk_X509_NAME_pop_free(ca_list, X509_NAME_free); + return nullptr; + } + + X509 *cert = nullptr; + while ((cert = PEM_read_bio_X509(bio, nullptr, nullptr, nullptr)) != + nullptr) { + const X509_NAME *name = X509_get_subject_name(cert); + if (name) { + sk_X509_NAME_push(ca_list, X509_NAME_dup(const_cast(name))); + } + X509_free(cert); + } + BIO_free(bio); + + return ca_list; +} + +// OpenSSL verify callback wrapper +inline int openssl_verify_callback(int preverify_ok, X509_STORE_CTX *ctx) { + auto &callback = get_verify_callback(); + if (!callback) { return preverify_ok; } + + // Get SSL object from X509_STORE_CTX + auto ssl = static_cast( + X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx())); + if (!ssl) { return preverify_ok; } + + // Get current certificate and depth + auto cert = X509_STORE_CTX_get_current_cert(ctx); + int depth = X509_STORE_CTX_get_error_depth(ctx); + int error = X509_STORE_CTX_get_error(ctx); + + // Build context + VerifyContext verify_ctx; + verify_ctx.session = static_cast(ssl); + verify_ctx.cert = static_cast(cert); + verify_ctx.depth = depth; + verify_ctx.preverify_ok = (preverify_ok != 0); + verify_ctx.error_code = error; + verify_ctx.error_string = + (error != X509_V_OK) ? X509_verify_cert_error_string(error) : nullptr; + + return callback(verify_ctx) ? 1 : 0; +} + +// X509_STORE_get0_objects is deprecated since OpenSSL 4.0 because it is not +// thread-safe; X509_STORE_get1_objects (OpenSSL 3.3+) returns a snapshot +// that must be released with release_store_objects +#if !defined(OPENSSL_IS_BORINGSSL) && !defined(LIBRESSL_VERSION_NUMBER) && \ + OPENSSL_VERSION_NUMBER >= 0x30300000L +#define CPPHTTPLIB_HAS_X509_STORE_GET1_OBJECTS +#endif + +inline STACK_OF(X509_OBJECT) * get_store_objects(X509_STORE *store) { +#ifdef CPPHTTPLIB_HAS_X509_STORE_GET1_OBJECTS + return X509_STORE_get1_objects(store); +#else + return X509_STORE_get0_objects(store); +#endif +} + +inline void release_store_objects(STACK_OF(X509_OBJECT) * objs) { +#ifdef CPPHTTPLIB_HAS_X509_STORE_GET1_OBJECTS + sk_X509_OBJECT_pop_free(objs, X509_OBJECT_free); +#else + (void)objs; // get0 variant returns an internal pointer; nothing to free +#endif +} + +} // namespace impl + +inline ctx_t create_client_context() { + SSL_CTX *ctx = SSL_CTX_new(TLS_client_method()); + if (ctx) { + // Disable auto-retry to properly handle non-blocking I/O + SSL_CTX_clear_mode(ctx, SSL_MODE_AUTO_RETRY); + // Set minimum TLS version + SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION); + } + return static_cast(ctx); +} + +inline void free_context(ctx_t ctx) { + if (ctx) { SSL_CTX_free(static_cast(ctx)); } +} + +inline bool set_min_version(ctx_t ctx, Version version) { + if (!ctx) return false; + return SSL_CTX_set_min_proto_version(static_cast(ctx), + static_cast(version)) == 1; +} + +inline bool load_ca_pem(ctx_t ctx, const char *pem, size_t len) { + if (!ctx || !pem || len == 0) return false; + + auto ssl_ctx = static_cast(ctx); + auto store = SSL_CTX_get_cert_store(ssl_ctx); + if (!store) return false; + + auto bio = BIO_new_mem_buf(pem, static_cast(len)); + if (!bio) return false; + + bool ok = true; + X509 *cert = nullptr; + while ((cert = PEM_read_bio_X509(bio, nullptr, nullptr, nullptr)) != + nullptr) { + if (X509_STORE_add_cert(store, cert) != 1) { + // Ignore duplicate errors + auto err = ERR_peek_last_error(); + if (ERR_GET_REASON(err) != X509_R_CERT_ALREADY_IN_HASH_TABLE) { + ok = false; + } + } + X509_free(cert); + if (!ok) break; + } + BIO_free(bio); + + // Clear any "no more certificates" errors + ERR_clear_error(); + return ok; +} + +inline bool load_ca_file(ctx_t ctx, const char *file_path) { + if (!ctx || !file_path) return false; + return SSL_CTX_load_verify_locations(static_cast(ctx), file_path, + nullptr) == 1; +} + +inline bool load_ca_dir(ctx_t ctx, const char *dir_path) { + if (!ctx || !dir_path) return false; + return SSL_CTX_load_verify_locations(static_cast(ctx), nullptr, + dir_path) == 1; +} + +inline bool load_system_certs(ctx_t ctx) { + if (!ctx) return false; + auto ssl_ctx = static_cast(ctx); + +#ifdef _WIN32 + // Windows: Load from system certificate store (ROOT and CA) + auto store = SSL_CTX_get_cert_store(ssl_ctx); + if (!store) return false; + + bool loaded_any = false; + static const wchar_t *store_names[] = {L"ROOT", L"CA"}; + for (auto store_name : store_names) { + auto hStore = CertOpenSystemStoreW(NULL, store_name); + if (!hStore) continue; + + PCCERT_CONTEXT pContext = nullptr; + while ((pContext = CertEnumCertificatesInStore(hStore, pContext)) != + nullptr) { + const unsigned char *data = pContext->pbCertEncoded; + auto x509 = d2i_X509(nullptr, &data, pContext->cbCertEncoded); + if (x509) { + if (X509_STORE_add_cert(store, x509) == 1) { loaded_any = true; } + X509_free(x509); + } + } + CertCloseStore(hStore, 0); + } + return loaded_any; + +#elif defined(__APPLE__) +#ifdef CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN + // macOS: Load from Keychain + auto store = SSL_CTX_get_cert_store(ssl_ctx); + if (!store) return false; + + bool loaded_any = false; + const SecTrustSettingsDomain domains[] = { + kSecTrustSettingsDomainSystem, + kSecTrustSettingsDomainAdmin, + kSecTrustSettingsDomainUser, + }; + for (auto domain : domains) { + CFArrayRef certs = nullptr; + if (SecTrustSettingsCopyCertificates(domain, &certs) != errSecSuccess || + !certs) { + if (certs) CFRelease(certs); + continue; + } + auto count = CFArrayGetCount(certs); + for (CFIndex i = 0; i < count; i++) { + auto cert = reinterpret_cast( + const_cast(CFArrayGetValueAtIndex(certs, i))); + CFDataRef der = SecCertificateCopyData(cert); + if (der) { + const unsigned char *data = CFDataGetBytePtr(der); + auto x509 = d2i_X509(nullptr, &data, CFDataGetLength(der)); + if (x509) { + if (X509_STORE_add_cert(store, x509) == 1) { loaded_any = true; } + X509_free(x509); + } + CFRelease(der); + } + } + CFRelease(certs); + } + return loaded_any || SSL_CTX_set_default_verify_paths(ssl_ctx) == 1; +#else + return SSL_CTX_set_default_verify_paths(ssl_ctx) == 1; +#endif + +#else + // Other Unix: use default verify paths + return SSL_CTX_set_default_verify_paths(ssl_ctx) == 1; +#endif +} + +inline bool set_client_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password) { + if (!ctx || !cert || !key) return false; + + auto ssl_ctx = static_cast(ctx); + + // Load certificate + auto cert_bio = BIO_new_mem_buf(cert, -1); + if (!cert_bio) return false; + + auto x509 = PEM_read_bio_X509(cert_bio, nullptr, nullptr, nullptr); + BIO_free(cert_bio); + if (!x509) return false; + + auto cert_ok = SSL_CTX_use_certificate(ssl_ctx, x509) == 1; + X509_free(x509); + if (!cert_ok) return false; + + // Load private key + auto key_bio = BIO_new_mem_buf(key, -1); + if (!key_bio) return false; + + auto pkey = PEM_read_bio_PrivateKey(key_bio, nullptr, nullptr, + password ? const_cast(password) + : nullptr); + BIO_free(key_bio); + if (!pkey) return false; + + auto key_ok = SSL_CTX_use_PrivateKey(ssl_ctx, pkey) == 1; + EVP_PKEY_free(pkey); + + return key_ok && SSL_CTX_check_private_key(ssl_ctx) == 1; +} + +inline bool set_client_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password) { + if (!ctx || !cert_path || !key_path) return false; + + auto ssl_ctx = static_cast(ctx); + + if (password && password[0] != '\0') { + SSL_CTX_set_default_passwd_cb_userdata( + ssl_ctx, reinterpret_cast(const_cast(password))); + } + + return SSL_CTX_use_certificate_chain_file(ssl_ctx, cert_path) == 1 && + SSL_CTX_use_PrivateKey_file(ssl_ctx, key_path, SSL_FILETYPE_PEM) == 1; +} + +inline ctx_t create_server_context() { + SSL_CTX *ctx = SSL_CTX_new(TLS_server_method()); + if (ctx) { + SSL_CTX_set_options(ctx, SSL_OP_NO_COMPRESSION | + SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION); + SSL_CTX_set_min_proto_version(ctx, TLS1_2_VERSION); + } + return static_cast(ctx); +} + +inline void set_verify_client(ctx_t ctx, bool require) { + if (!ctx) return; + SSL_CTX_set_verify(static_cast(ctx), + require + ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) + : SSL_VERIFY_NONE, + nullptr); +} + +inline session_t create_session(ctx_t ctx, socket_t sock) { + if (!ctx || sock == INVALID_SOCKET) return nullptr; + + auto ssl_ctx = static_cast(ctx); + SSL *ssl = SSL_new(ssl_ctx); + if (!ssl) return nullptr; + + // Disable auto-retry for proper non-blocking I/O handling + SSL_clear_mode(ssl, SSL_MODE_AUTO_RETRY); + + auto bio = BIO_new_socket(static_cast(sock), BIO_NOCLOSE); + if (!bio) { + SSL_free(ssl); + return nullptr; + } + + SSL_set_bio(ssl, bio, bio); + return static_cast(ssl); +} + +inline void free_session(session_t session) { + if (session) { SSL_free(static_cast(session)); } +} + +inline bool set_sni(session_t session, const char *hostname) { + if (!session || !hostname) return false; + + auto ssl = static_cast(session); + + // Set SNI (Server Name Indication) only - does not enable verification +#if defined(OPENSSL_IS_BORINGSSL) + return SSL_set_tlsext_host_name(ssl, hostname) == 1; +#else + // Direct call instead of macro to suppress -Wold-style-cast warning + return SSL_ctrl(ssl, SSL_CTRL_SET_TLSEXT_HOSTNAME, TLSEXT_NAMETYPE_host_name, + static_cast(const_cast(hostname))) == 1; +#endif +} + +inline bool set_hostname(session_t session, const char *hostname) { + if (!session || !hostname) return false; + + auto ssl = static_cast(session); + + // Enable hostname verification + auto param = SSL_get0_param(ssl); + if (!param) return false; + + if (detail::is_ip_address(hostname)) { + // RFC 6066: SNI must not be set for IP addresses; verify against the + // certificate's IP SANs instead of its DNS names + if (X509_VERIFY_PARAM_set1_ip_asc(param, hostname) != 1) { return false; } + } else { + // Set SNI (Server Name Indication) + if (!set_sni(session, hostname)) { return false; } + + X509_VERIFY_PARAM_set_hostflags(param, + X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS); + if (X509_VERIFY_PARAM_set1_host(param, hostname, 0) != 1) { return false; } + } + + SSL_set_verify(ssl, SSL_VERIFY_PEER, nullptr); + return true; +} + +inline TlsError connect(session_t session) { + if (!session) { return TlsError(); } + + auto ssl = static_cast(session); + auto ret = SSL_connect(ssl); + + TlsError err; + if (ret == 1) { + err.code = ErrorCode::Success; + } else { + auto ssl_err = SSL_get_error(ssl, ret); + err.code = impl::map_ssl_error(ssl_err, err.sys_errno); + err.backend_code = ERR_get_error(); + } + return err; +} + +inline TlsError accept(session_t session) { + if (!session) { return TlsError(); } + + auto ssl = static_cast(session); + auto ret = SSL_accept(ssl); + + TlsError err; + if (ret == 1) { + err.code = ErrorCode::Success; + } else { + auto ssl_err = SSL_get_error(ssl, ret); + err.code = impl::map_ssl_error(ssl_err, err.sys_errno); + err.backend_code = ERR_get_error(); + } + return err; +} + +inline bool connect_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + if (!session) { + if (err) { err->code = ErrorCode::Fatal; } + return false; + } + + auto ssl = static_cast(session); + auto bio = SSL_get_rbio(ssl); + + // Set non-blocking mode for handshake + detail::set_nonblocking(sock, true); + if (bio) { BIO_set_nbio(bio, 1); } + + auto cleanup = detail::scope_exit([&]() { + // Restore blocking mode after handshake + if (bio) { BIO_set_nbio(bio, 0); } + detail::set_nonblocking(sock, false); + }); + + auto res = 0; + while ((res = SSL_connect(ssl)) != 1) { + auto ssl_err = SSL_get_error(ssl, res); + switch (ssl_err) { + case SSL_ERROR_WANT_READ: + if (detail::select_read(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + break; + case SSL_ERROR_WANT_WRITE: + if (detail::select_write(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + break; + default: break; + } + if (err) { + err->code = impl::map_ssl_error(ssl_err, err->sys_errno); + err->backend_code = ERR_get_error(); + } + return false; + } + if (err) { err->code = ErrorCode::Success; } + return true; +} + +inline bool accept_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + if (!session) { + if (err) { err->code = ErrorCode::Fatal; } + return false; + } + + auto ssl = static_cast(session); + auto bio = SSL_get_rbio(ssl); + + // Set non-blocking mode for handshake + detail::set_nonblocking(sock, true); + if (bio) { BIO_set_nbio(bio, 1); } + + auto cleanup = detail::scope_exit([&]() { + // Restore blocking mode after handshake + if (bio) { BIO_set_nbio(bio, 0); } + detail::set_nonblocking(sock, false); + }); + + auto res = 0; + while ((res = SSL_accept(ssl)) != 1) { + auto ssl_err = SSL_get_error(ssl, res); + switch (ssl_err) { + case SSL_ERROR_WANT_READ: + if (detail::select_read(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + break; + case SSL_ERROR_WANT_WRITE: + if (detail::select_write(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + break; + default: break; + } + if (err) { + err->code = impl::map_ssl_error(ssl_err, err->sys_errno); + err->backend_code = ERR_get_error(); + } + return false; + } + if (err) { err->code = ErrorCode::Success; } + return true; +} + +inline ssize_t read(session_t session, void *buf, size_t len, TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto ssl = static_cast(session); + constexpr auto max_len = + static_cast((std::numeric_limits::max)()); + if (len > max_len) { len = max_len; } + auto ret = SSL_read(ssl, buf, static_cast(len)); + + if (ret > 0) { + err.code = ErrorCode::Success; + return ret; + } + + auto ssl_err = SSL_get_error(ssl, ret); + err.code = impl::map_ssl_error(ssl_err, err.sys_errno); + if (err.code == ErrorCode::PeerClosed) { + return 0; + } // Gracefully handle the peer closed state. + if (err.code == ErrorCode::Fatal) { err.backend_code = ERR_get_error(); } + return -1; +} + +inline ssize_t write(session_t session, const void *buf, size_t len, + TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto ssl = static_cast(session); + auto ret = SSL_write(ssl, buf, static_cast(len)); + + if (ret > 0) { + err.code = ErrorCode::Success; + return ret; + } + + auto ssl_err = SSL_get_error(ssl, ret); + err.code = impl::map_ssl_error(ssl_err, err.sys_errno); + if (err.code == ErrorCode::Fatal) { err.backend_code = ERR_get_error(); } + return -1; +} + +inline int pending(const_session_t session) { + if (!session) return 0; + return SSL_pending(static_cast(const_cast(session))); +} + +inline void shutdown(session_t session, bool graceful) { + if (!session) return; + + auto ssl = static_cast(session); + if (graceful) { + // First call sends close_notify + if (SSL_shutdown(ssl) == 0) { + // Second call waits for peer's close_notify + SSL_shutdown(ssl); + } + } +} + +inline bool is_peer_closed(session_t session, socket_t sock) { + if (!session) return true; + + // Temporarily set socket to non-blocking to avoid blocking on SSL_peek + detail::set_nonblocking(sock, true); + auto se = detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + auto ssl = static_cast(session); + char buf; + auto ret = SSL_peek(ssl, &buf, 1); + if (ret > 0) return false; + + auto err = SSL_get_error(ssl, ret); + return err == SSL_ERROR_ZERO_RETURN; +} + +inline cert_t get_peer_cert(const_session_t session) { + if (!session) return nullptr; + return static_cast(SSL_get1_peer_certificate( + static_cast(const_cast(session)))); +} + +inline void free_cert(cert_t cert) { + if (cert) { X509_free(static_cast(cert)); } +} + +inline bool verify_hostname(cert_t cert, const char *hostname) { + if (!cert || !hostname) return false; + + auto x509 = static_cast(cert); + + // Use X509_check_ip_asc for IP addresses, X509_check_host for DNS names + if (detail::is_ip_address(hostname)) { + return X509_check_ip_asc(x509, hostname, 0) == 1; + } + return X509_check_host(x509, hostname, strlen(hostname), 0, nullptr) == 1; +} + +inline uint64_t hostname_mismatch_code() { + return static_cast(X509_V_ERR_HOSTNAME_MISMATCH); +} + +inline long get_verify_result(const_session_t session) { + if (!session) return X509_V_ERR_UNSPECIFIED; + return SSL_get_verify_result(static_cast(const_cast(session))); +} + +inline std::string get_cert_subject_cn(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + auto subject_name = X509_get_subject_name(x509); + if (!subject_name) return ""; + + // X509_NAME_get_text_by_NID is deprecated since OpenSSL 4.0 + auto idx = X509_NAME_get_index_by_NID(subject_name, NID_commonName, -1); + if (idx < 0) return ""; + + auto entry = X509_NAME_get_entry(subject_name, idx); + if (!entry) return ""; + + auto data = X509_NAME_ENTRY_get_data(entry); + if (!data) return ""; + + return std::string( + reinterpret_cast(ASN1_STRING_get0_data(data)), + static_cast(ASN1_STRING_length(data))); +} + +inline std::string get_cert_issuer_name(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + auto issuer_name = X509_get_issuer_name(x509); + if (!issuer_name) return ""; + + char buf[256]; + X509_NAME_oneline(issuer_name, buf, sizeof(buf)); + return std::string(buf); +} + +inline bool get_cert_sans(cert_t cert, std::vector &sans) { + sans.clear(); + if (!cert) return false; + auto x509 = static_cast(cert); + + auto names = static_cast( + X509_get_ext_d2i(x509, NID_subject_alt_name, nullptr, nullptr)); + if (!names) return true; // No SANs is valid + + auto count = sk_GENERAL_NAME_num(names); + for (decltype(count) i = 0; i < count; i++) { + auto gen = sk_GENERAL_NAME_value(names, i); + if (!gen) continue; + + SanEntry entry; + switch (gen->type) { + case GEN_DNS: + entry.type = SanType::DNS; + if (gen->d.dNSName) { + entry.value = std::string( + reinterpret_cast( + ASN1_STRING_get0_data(gen->d.dNSName)), + static_cast(ASN1_STRING_length(gen->d.dNSName))); + } + break; + case GEN_IPADD: + entry.type = SanType::IP; + if (gen->d.iPAddress) { + auto data = ASN1_STRING_get0_data(gen->d.iPAddress); + auto len = ASN1_STRING_length(gen->d.iPAddress); + if (len == 4) { + // IPv4 + char buf[INET_ADDRSTRLEN]; + inet_ntop(AF_INET, data, buf, sizeof(buf)); + entry.value = buf; + } else if (len == 16) { + // IPv6 + char buf[INET6_ADDRSTRLEN]; + inet_ntop(AF_INET6, data, buf, sizeof(buf)); + entry.value = buf; + } + } + break; + case GEN_EMAIL: + entry.type = SanType::EMAIL; + if (gen->d.rfc822Name) { + entry.value = std::string( + reinterpret_cast( + ASN1_STRING_get0_data(gen->d.rfc822Name)), + static_cast(ASN1_STRING_length(gen->d.rfc822Name))); + } + break; + case GEN_URI: + entry.type = SanType::URI; + if (gen->d.uniformResourceIdentifier) { + entry.value = std::string( + reinterpret_cast( + ASN1_STRING_get0_data(gen->d.uniformResourceIdentifier)), + static_cast( + ASN1_STRING_length(gen->d.uniformResourceIdentifier))); + } + break; + default: entry.type = SanType::OTHER; break; + } + + if (!entry.value.empty()) { sans.push_back(std::move(entry)); } + } + + GENERAL_NAMES_free(names); + return true; +} + +inline bool get_cert_validity(cert_t cert, time_t ¬_before, + time_t ¬_after) { + if (!cert) return false; + auto x509 = static_cast(cert); + + auto nb = X509_get0_notBefore(x509); + auto na = X509_get0_notAfter(x509); + if (!nb || !na) return false; + + ASN1_TIME *epoch = ASN1_TIME_new(); + if (!epoch) return false; + auto se = detail::scope_exit([&] { ASN1_TIME_free(epoch); }); + + if (!ASN1_TIME_set(epoch, 0)) return false; + + int pday, psec; + + if (!ASN1_TIME_diff(&pday, &psec, epoch, nb)) return false; + not_before = 86400 * (time_t)pday + psec; + + if (!ASN1_TIME_diff(&pday, &psec, epoch, na)) return false; + not_after = 86400 * (time_t)pday + psec; + + return true; +} + +inline std::string get_cert_serial(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + auto serial = X509_get_serialNumber(x509); + if (!serial) return ""; + + auto bn = ASN1_INTEGER_to_BN(serial, nullptr); + if (!bn) return ""; + + auto hex = BN_bn2hex(bn); + BN_free(bn); + if (!hex) return ""; + + std::string result(hex); + OPENSSL_free(hex); + return result; +} + +inline bool get_cert_der(cert_t cert, std::vector &der) { + if (!cert) return false; + auto x509 = static_cast(cert); + auto len = i2d_X509(x509, nullptr); + if (len < 0) return false; + der.resize(static_cast(len)); + auto p = der.data(); + i2d_X509(x509, &p); + return true; +} + +inline const char *get_sni(const_session_t session) { + if (!session) return nullptr; + auto ssl = static_cast(const_cast(session)); + return SSL_get_servername(ssl, TLSEXT_NAMETYPE_host_name); +} + +inline uint64_t peek_error() { return ERR_peek_last_error(); } + +inline uint64_t get_error() { return ERR_get_error(); } + +inline std::string error_string(uint64_t code) { + char buf[256]; + ERR_error_string_n(static_cast(code), buf, sizeof(buf)); + return std::string(buf); +} + +inline ca_store_t create_ca_store(const char *pem, size_t len) { + auto mem = BIO_new_mem_buf(pem, static_cast(len)); + if (!mem) { return nullptr; } + auto mem_guard = detail::scope_exit([&] { BIO_free_all(mem); }); + + auto inf = PEM_X509_INFO_read_bio(mem, nullptr, nullptr, nullptr); + if (!inf) { return nullptr; } + + auto store = X509_STORE_new(); + if (store) { + for (auto i = 0; i < static_cast(sk_X509_INFO_num(inf)); i++) { + auto itmp = sk_X509_INFO_value(inf, i); + if (!itmp) { continue; } + if (itmp->x509) { X509_STORE_add_cert(store, itmp->x509); } + if (itmp->crl) { X509_STORE_add_crl(store, itmp->crl); } + } + } + + sk_X509_INFO_pop_free(inf, X509_INFO_free); + return static_cast(store); +} + +inline void free_ca_store(ca_store_t store) { + if (store) { X509_STORE_free(static_cast(store)); } +} + +inline bool set_ca_store(ctx_t ctx, ca_store_t store) { + if (!ctx || !store) { return false; } + auto ssl_ctx = static_cast(ctx); + auto x509_store = static_cast(store); + + // Check if same store is already set + if (SSL_CTX_get_cert_store(ssl_ctx) == x509_store) { return true; } + + // SSL_CTX_set_cert_store takes ownership and frees the old store + SSL_CTX_set_cert_store(ssl_ctx, x509_store); + return true; +} + +inline size_t get_ca_certs(ctx_t ctx, std::vector &certs) { + certs.clear(); + if (!ctx) { return 0; } + auto ssl_ctx = static_cast(ctx); + + auto store = SSL_CTX_get_cert_store(ssl_ctx); + if (!store) { return 0; } + + auto objs = impl::get_store_objects(store); + if (!objs) { return 0; } + auto se = detail::scope_exit([&] { impl::release_store_objects(objs); }); + + auto count = sk_X509_OBJECT_num(objs); + for (decltype(count) i = 0; i < count; i++) { + auto obj = sk_X509_OBJECT_value(objs, i); + if (!obj) { continue; } + if (X509_OBJECT_get_type(obj) == X509_LU_X509) { + auto x509 = X509_OBJECT_get0_X509(obj); + if (x509) { + // Increment reference count so caller can free it + X509_up_ref(x509); + certs.push_back(static_cast(x509)); + } + } + } + return certs.size(); +} + +inline std::vector get_ca_names(ctx_t ctx) { + std::vector names; + if (!ctx) { return names; } + auto ssl_ctx = static_cast(ctx); + + auto store = SSL_CTX_get_cert_store(ssl_ctx); + if (!store) { return names; } + + auto objs = impl::get_store_objects(store); + if (!objs) { return names; } + auto se = detail::scope_exit([&] { impl::release_store_objects(objs); }); + + auto count = sk_X509_OBJECT_num(objs); + for (decltype(count) i = 0; i < count; i++) { + auto obj = sk_X509_OBJECT_value(objs, i); + if (!obj) { continue; } + if (X509_OBJECT_get_type(obj) == X509_LU_X509) { + auto x509 = X509_OBJECT_get0_X509(obj); + if (x509) { + auto subject = X509_get_subject_name(x509); + if (subject) { + char buf[512]; + X509_NAME_oneline(subject, buf, sizeof(buf)); + names.push_back(buf); + } + } + } + } + return names; +} + +inline bool update_server_cert(ctx_t ctx, const char *cert_pem, + const char *key_pem, const char *password) { + if (!ctx || !cert_pem || !key_pem) { return false; } + auto ssl_ctx = static_cast(ctx); + + // Load certificate from PEM + auto cert_bio = BIO_new_mem_buf(cert_pem, -1); + if (!cert_bio) { return false; } + auto cert = PEM_read_bio_X509(cert_bio, nullptr, nullptr, nullptr); + BIO_free(cert_bio); + if (!cert) { return false; } + + // Load private key from PEM + auto key_bio = BIO_new_mem_buf(key_pem, -1); + if (!key_bio) { + X509_free(cert); + return false; + } + auto key = PEM_read_bio_PrivateKey(key_bio, nullptr, nullptr, + password ? const_cast(password) + : nullptr); + BIO_free(key_bio); + if (!key) { + X509_free(cert); + return false; + } + + // Update certificate and key + auto ret = SSL_CTX_use_certificate(ssl_ctx, cert) == 1 && + SSL_CTX_use_PrivateKey(ssl_ctx, key) == 1; + + X509_free(cert); + EVP_PKEY_free(key); + return ret; +} + +inline bool update_server_client_ca(ctx_t ctx, const char *ca_pem) { + if (!ctx || !ca_pem) { return false; } + auto ssl_ctx = static_cast(ctx); + + // Create new X509_STORE from PEM + auto store = create_ca_store(ca_pem, strlen(ca_pem)); + if (!store) { return false; } + + // SSL_CTX_set_cert_store takes ownership + SSL_CTX_set_cert_store(ssl_ctx, static_cast(store)); + + // Set client CA list for client certificate request + auto ca_list = impl::create_client_ca_list_from_pem(ca_pem); + if (ca_list) { + // SSL_CTX_set_client_CA_list takes ownership of ca_list + SSL_CTX_set_client_CA_list(ssl_ctx, ca_list); + } + + return true; +} + +inline bool set_verify_callback(ctx_t ctx, VerifyCallback callback) { + if (!ctx) { return false; } + auto ssl_ctx = static_cast(ctx); + + impl::get_verify_callback() = std::move(callback); + + if (impl::get_verify_callback()) { + SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, impl::openssl_verify_callback); + } else { + SSL_CTX_set_verify(ssl_ctx, SSL_VERIFY_PEER, nullptr); + } + return true; +} + +inline long get_verify_error(const_session_t session) { + if (!session) { return -1; } + auto ssl = static_cast(const_cast(session)); + return SSL_get_verify_result(ssl); +} + +inline std::string verify_error_string(long error_code) { + if (error_code == X509_V_OK) { return ""; } + const char *str = X509_verify_cert_error_string(static_cast(error_code)); + return str ? str : "unknown error"; +} + +} // namespace tls + +#endif // CPPHTTPLIB_OPENSSL_SUPPORT + +/* + * Group 9: TLS abstraction layer - Mbed TLS backend + */ + +/* + * Mbed TLS Backend Implementation + */ + +#ifdef CPPHTTPLIB_MBEDTLS_SUPPORT +namespace tls { + +namespace impl { + +// Mbed TLS session wrapper +struct MbedTlsSession { + mbedtls_ssl_context ssl; + socket_t sock = INVALID_SOCKET; + std::string hostname; // For client: set via set_sni + std::string sni_hostname; // For server: received from client via SNI callback + + MbedTlsSession() { mbedtls_ssl_init(&ssl); } + + ~MbedTlsSession() { mbedtls_ssl_free(&ssl); } + + MbedTlsSession(const MbedTlsSession &) = delete; + MbedTlsSession &operator=(const MbedTlsSession &) = delete; +}; + +// Thread-local error code accessor for Mbed TLS (since it doesn't have an error +// queue) +inline int &mbedtls_last_error() { + static thread_local int err = 0; + return err; +} + +// Helper to map Mbed TLS error to ErrorCode +inline ErrorCode map_mbedtls_error(int ret, int &out_errno) { + if (ret == 0) { return ErrorCode::Success; } + if (ret == MBEDTLS_ERR_SSL_WANT_READ) { return ErrorCode::WantRead; } + if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) { return ErrorCode::WantWrite; } + if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY) { + return ErrorCode::PeerClosed; + } + if (ret == MBEDTLS_ERR_NET_CONN_RESET || ret == MBEDTLS_ERR_NET_SEND_FAILED || + ret == MBEDTLS_ERR_NET_RECV_FAILED) { + out_errno = errno; + return ErrorCode::SyscallError; + } + if (ret == MBEDTLS_ERR_X509_CERT_VERIFY_FAILED) { + return ErrorCode::CertVerifyFailed; + } + return ErrorCode::Fatal; +} + +// BIO-like send callback for Mbed TLS +inline int mbedtls_net_send_cb(void *ctx, const unsigned char *buf, + size_t len) { + auto sock = *static_cast(ctx); +#ifdef _WIN32 + auto ret = + send(sock, reinterpret_cast(buf), static_cast(len), 0); + if (ret == SOCKET_ERROR) { + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK) { return MBEDTLS_ERR_SSL_WANT_WRITE; } + return MBEDTLS_ERR_NET_SEND_FAILED; + } +#else + auto ret = send(sock, buf, len, 0); + if (ret < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return MBEDTLS_ERR_SSL_WANT_WRITE; + } + return MBEDTLS_ERR_NET_SEND_FAILED; + } +#endif + return static_cast(ret); +} + +// BIO-like recv callback for Mbed TLS +inline int mbedtls_net_recv_cb(void *ctx, unsigned char *buf, size_t len) { + auto sock = *static_cast(ctx); +#ifdef _WIN32 + auto ret = + recv(sock, reinterpret_cast(buf), static_cast(len), 0); + if (ret == SOCKET_ERROR) { + int err = WSAGetLastError(); + if (err == WSAEWOULDBLOCK) { return MBEDTLS_ERR_SSL_WANT_READ; } + return MBEDTLS_ERR_NET_RECV_FAILED; + } +#else + auto ret = recv(sock, buf, len, 0); + if (ret < 0) { + if (errno == EAGAIN || errno == EWOULDBLOCK) { + return MBEDTLS_ERR_SSL_WANT_READ; + } + return MBEDTLS_ERR_NET_RECV_FAILED; + } +#endif + if (ret == 0) { return MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY; } + return static_cast(ret); +} + +// MbedTlsContext constructor/destructor implementations +inline MbedTlsContext::MbedTlsContext() { + mbedtls_ssl_config_init(&conf); + mbedtls_entropy_init(&entropy); + mbedtls_ctr_drbg_init(&ctr_drbg); + mbedtls_x509_crt_init(&ca_chain); + mbedtls_x509_crt_init(&own_cert); + mbedtls_pk_init(&own_key); +} + +inline MbedTlsContext::~MbedTlsContext() { + mbedtls_pk_free(&own_key); + mbedtls_x509_crt_free(&own_cert); + mbedtls_x509_crt_free(&ca_chain); + mbedtls_ctr_drbg_free(&ctr_drbg); + mbedtls_entropy_free(&entropy); + mbedtls_ssl_config_free(&conf); +} + +// Thread-local storage for SNI captured during handshake +// This is needed because the SNI callback doesn't have a way to pass +// session-specific data before the session is fully set up +inline std::string &mbedpending_sni() { + static thread_local std::string sni; + return sni; +} + +// SNI callback for Mbed TLS server to capture client's SNI hostname +inline int mbedtls_sni_callback(void *p_ctx, mbedtls_ssl_context *ssl, + const unsigned char *name, size_t name_len) { + (void)p_ctx; + (void)ssl; + + // Store SNI name in thread-local storage + // It will be retrieved and stored in the session after handshake + if (name && name_len > 0) { + mbedpending_sni().assign(reinterpret_cast(name), name_len); + } else { + mbedpending_sni().clear(); + } + return 0; // Accept any SNI +} + +inline int mbedtls_verify_callback(void *data, mbedtls_x509_crt *crt, + int cert_depth, uint32_t *flags); + +// MbedTLS verify callback wrapper +inline int mbedtls_verify_callback(void *data, mbedtls_x509_crt *crt, + int cert_depth, uint32_t *flags) { + auto &callback = get_verify_callback(); + if (!callback) { return 0; } // Continue with default verification + + // data points to the MbedTlsSession + auto *session = static_cast(data); + + // Build context + VerifyContext verify_ctx; + verify_ctx.session = static_cast(session); + verify_ctx.cert = static_cast(crt); + verify_ctx.depth = cert_depth; + verify_ctx.preverify_ok = (*flags == 0); + verify_ctx.error_code = static_cast(*flags); + + // Convert Mbed TLS flags to error string + static thread_local char error_buf[256]; + if (*flags != 0) { + mbedtls_x509_crt_verify_info(error_buf, sizeof(error_buf), "", *flags); + verify_ctx.error_string = error_buf; + } else { + verify_ctx.error_string = nullptr; + } + + bool accepted = callback(verify_ctx); + + if (accepted) { + *flags = 0; // Clear all error flags + return 0; + } + return MBEDTLS_ERR_X509_CERT_VERIFY_FAILED; +} + +} // namespace impl + +inline ctx_t create_client_context() { + auto ctx = new (std::nothrow) impl::MbedTlsContext(); + if (!ctx) { return nullptr; } + + ctx->is_server = false; + + // Seed the random number generator + const char *pers = "httplib_client"; + int ret = mbedtls_ctr_drbg_seed( + &ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy, + reinterpret_cast(pers), strlen(pers)); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + delete ctx; + return nullptr; + } + + // Set up SSL config for client + ret = mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_CLIENT, + MBEDTLS_SSL_TRANSPORT_STREAM, + MBEDTLS_SSL_PRESET_DEFAULT); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + delete ctx; + return nullptr; + } + + // Set random number generator + mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg); + + // Default: verify peer certificate + mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED); + + // Set minimum TLS version to 1.2 +#ifdef CPPHTTPLIB_MBEDTLS_V3 + mbedtls_ssl_conf_min_tls_version(&ctx->conf, MBEDTLS_SSL_VERSION_TLS1_2); +#else + mbedtls_ssl_conf_min_version(&ctx->conf, MBEDTLS_SSL_MAJOR_VERSION_3, + MBEDTLS_SSL_MINOR_VERSION_3); +#endif + + return static_cast(ctx); +} + +inline ctx_t create_server_context() { + auto ctx = new (std::nothrow) impl::MbedTlsContext(); + if (!ctx) { return nullptr; } + + ctx->is_server = true; + + // Seed the random number generator + const char *pers = "httplib_server"; + int ret = mbedtls_ctr_drbg_seed( + &ctx->ctr_drbg, mbedtls_entropy_func, &ctx->entropy, + reinterpret_cast(pers), strlen(pers)); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + delete ctx; + return nullptr; + } + + // Set up SSL config for server + ret = mbedtls_ssl_config_defaults(&ctx->conf, MBEDTLS_SSL_IS_SERVER, + MBEDTLS_SSL_TRANSPORT_STREAM, + MBEDTLS_SSL_PRESET_DEFAULT); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + delete ctx; + return nullptr; + } + + // Set random number generator + mbedtls_ssl_conf_rng(&ctx->conf, mbedtls_ctr_drbg_random, &ctx->ctr_drbg); + + // Default: don't verify client + mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_NONE); + + // Set minimum TLS version to 1.2 +#ifdef CPPHTTPLIB_MBEDTLS_V3 + mbedtls_ssl_conf_min_tls_version(&ctx->conf, MBEDTLS_SSL_VERSION_TLS1_2); +#else + mbedtls_ssl_conf_min_version(&ctx->conf, MBEDTLS_SSL_MAJOR_VERSION_3, + MBEDTLS_SSL_MINOR_VERSION_3); +#endif + + // Set SNI callback to capture client's SNI hostname + mbedtls_ssl_conf_sni(&ctx->conf, impl::mbedtls_sni_callback, nullptr); + + return static_cast(ctx); +} + +inline void free_context(ctx_t ctx) { + if (ctx) { delete static_cast(ctx); } +} + +inline bool set_min_version(ctx_t ctx, Version version) { + if (!ctx) { return false; } + auto mctx = static_cast(ctx); + +#ifdef CPPHTTPLIB_MBEDTLS_V3 + // Mbed TLS 3.x uses mbedtls_ssl_protocol_version enum + mbedtls_ssl_protocol_version min_ver = MBEDTLS_SSL_VERSION_TLS1_2; + if (version >= Version::TLS1_3) { +#if defined(MBEDTLS_SSL_PROTO_TLS1_3) + min_ver = MBEDTLS_SSL_VERSION_TLS1_3; +#endif + } + mbedtls_ssl_conf_min_tls_version(&mctx->conf, min_ver); +#else + // Mbed TLS 2.x uses major/minor version numbers + int major = MBEDTLS_SSL_MAJOR_VERSION_3; + int minor = MBEDTLS_SSL_MINOR_VERSION_3; // TLS 1.2 + if (version >= Version::TLS1_3) { +#if defined(MBEDTLS_SSL_PROTO_TLS1_3) + minor = MBEDTLS_SSL_MINOR_VERSION_4; // TLS 1.3 +#else + minor = MBEDTLS_SSL_MINOR_VERSION_3; // Fall back to TLS 1.2 +#endif + } + mbedtls_ssl_conf_min_version(&mctx->conf, major, minor); +#endif + return true; +} + +inline bool load_ca_pem(ctx_t ctx, const char *pem, size_t len) { + if (!ctx || !pem) { return false; } + auto mctx = static_cast(ctx); + + // mbedtls_x509_crt_parse expects null-terminated string for PEM + // Add null terminator if not present + std::string pem_str(pem, len); + int ret = mbedtls_x509_crt_parse( + &mctx->ca_chain, reinterpret_cast(pem_str.c_str()), + pem_str.size() + 1); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + mbedtls_ssl_conf_ca_chain(&mctx->conf, &mctx->ca_chain, nullptr); + return true; +} + +inline bool load_ca_file(ctx_t ctx, const char *file_path) { + if (!ctx || !file_path) { return false; } + auto mctx = static_cast(ctx); + + int ret = mbedtls_x509_crt_parse_file(&mctx->ca_chain, file_path); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + mbedtls_ssl_conf_ca_chain(&mctx->conf, &mctx->ca_chain, nullptr); + return true; +} + +inline bool load_ca_dir(ctx_t ctx, const char *dir_path) { + if (!ctx || !dir_path) { return false; } + auto mctx = static_cast(ctx); + + int ret = mbedtls_x509_crt_parse_path(&mctx->ca_chain, dir_path); + if (ret < 0) { // Returns number of certs on success, negative on error + impl::mbedtls_last_error() = ret; + return false; + } + + mbedtls_ssl_conf_ca_chain(&mctx->conf, &mctx->ca_chain, nullptr); + return true; +} + +inline bool load_system_certs(ctx_t ctx) { + if (!ctx) { return false; } + auto mctx = static_cast(ctx); + bool loaded = false; + +#ifdef _WIN32 + loaded = impl::enumerate_windows_system_certs( + [&](const unsigned char *data, size_t len) { + return mbedtls_x509_crt_parse_der(&mctx->ca_chain, data, len) == 0; + }); +#elif defined(__APPLE__) && defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) + loaded = impl::enumerate_macos_keychain_certs( + [&](const unsigned char *data, size_t len) { + return mbedtls_x509_crt_parse_der(&mctx->ca_chain, data, len) == 0; + }); +#else + for (auto path = impl::system_ca_paths(); *path; ++path) { + if (mbedtls_x509_crt_parse_file(&mctx->ca_chain, *path) >= 0) { + loaded = true; + break; + } + } + + if (!loaded) { + for (auto dir = impl::system_ca_dirs(); *dir; ++dir) { + if (mbedtls_x509_crt_parse_path(&mctx->ca_chain, *dir) >= 0) { + loaded = true; + break; + } + } + } +#endif + + if (loaded) { + mbedtls_ssl_conf_ca_chain(&mctx->conf, &mctx->ca_chain, nullptr); + } + return loaded; +} + +inline bool set_client_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password) { + if (!ctx || !cert || !key) { return false; } + auto mctx = static_cast(ctx); + + // Parse certificate + std::string cert_str(cert); + int ret = mbedtls_x509_crt_parse( + &mctx->own_cert, + reinterpret_cast(cert_str.c_str()), + cert_str.size() + 1); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Parse private key + std::string key_str(key); + const unsigned char *pwd = + password ? reinterpret_cast(password) : nullptr; + size_t pwd_len = password ? strlen(password) : 0; + +#ifdef CPPHTTPLIB_MBEDTLS_V3 + ret = mbedtls_pk_parse_key( + &mctx->own_key, reinterpret_cast(key_str.c_str()), + key_str.size() + 1, pwd, pwd_len, mbedtls_ctr_drbg_random, + &mctx->ctr_drbg); +#else + ret = mbedtls_pk_parse_key( + &mctx->own_key, reinterpret_cast(key_str.c_str()), + key_str.size() + 1, pwd, pwd_len); +#endif + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Verify that the certificate and private key match +#ifdef CPPHTTPLIB_MBEDTLS_V3 + ret = mbedtls_pk_check_pair(&mctx->own_cert.pk, &mctx->own_key, + mbedtls_ctr_drbg_random, &mctx->ctr_drbg); +#else + ret = mbedtls_pk_check_pair(&mctx->own_cert.pk, &mctx->own_key); +#endif + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + ret = mbedtls_ssl_conf_own_cert(&mctx->conf, &mctx->own_cert, &mctx->own_key); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + return true; +} + +inline bool set_client_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password) { + if (!ctx || !cert_path || !key_path) { return false; } + auto mctx = static_cast(ctx); + + // Parse certificate file + int ret = mbedtls_x509_crt_parse_file(&mctx->own_cert, cert_path); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Parse private key file +#ifdef CPPHTTPLIB_MBEDTLS_V3 + ret = mbedtls_pk_parse_keyfile(&mctx->own_key, key_path, password, + mbedtls_ctr_drbg_random, &mctx->ctr_drbg); +#else + ret = mbedtls_pk_parse_keyfile(&mctx->own_key, key_path, password); +#endif + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Verify that the certificate and private key match +#ifdef CPPHTTPLIB_MBEDTLS_V3 + ret = mbedtls_pk_check_pair(&mctx->own_cert.pk, &mctx->own_key, + mbedtls_ctr_drbg_random, &mctx->ctr_drbg); +#else + ret = mbedtls_pk_check_pair(&mctx->own_cert.pk, &mctx->own_key); +#endif + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + ret = mbedtls_ssl_conf_own_cert(&mctx->conf, &mctx->own_cert, &mctx->own_key); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + return true; +} + +inline void set_verify_client(ctx_t ctx, bool require) { + if (!ctx) { return; } + auto mctx = static_cast(ctx); + mctx->verify_client = require; + if (require) { + mbedtls_ssl_conf_authmode(&mctx->conf, MBEDTLS_SSL_VERIFY_REQUIRED); + } else { + // If a verify callback is set, use OPTIONAL mode to ensure the callback + // is called (matching OpenSSL behavior). Otherwise use NONE. + mbedtls_ssl_conf_authmode(&mctx->conf, mctx->has_verify_callback + ? MBEDTLS_SSL_VERIFY_OPTIONAL + : MBEDTLS_SSL_VERIFY_NONE); + } +} + +inline session_t create_session(ctx_t ctx, socket_t sock) { + if (!ctx || sock == INVALID_SOCKET) { return nullptr; } + auto mctx = static_cast(ctx); + + auto session = new (std::nothrow) impl::MbedTlsSession(); + if (!session) { return nullptr; } + + session->sock = sock; + + int ret = mbedtls_ssl_setup(&session->ssl, &mctx->conf); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + delete session; + return nullptr; + } + + // Explicitly opt out of in-handshake hostname verification by default; + // since Mbed TLS 3.6.4 a client handshake with certificate verification + // fails outright when no hostname was set. set_sni() installs the real + // hostname for DNS hosts; for IP hosts (where SNI must not be set) the + // caller verifies the certificate identity post-handshake via + // verify_hostname(). + mbedtls_ssl_set_hostname(&session->ssl, nullptr); + + // Set BIO callbacks + mbedtls_ssl_set_bio(&session->ssl, &session->sock, impl::mbedtls_net_send_cb, + impl::mbedtls_net_recv_cb, nullptr); + + // Set per-session verify callback with session pointer if callback is + // registered + if (mctx->has_verify_callback) { + mbedtls_ssl_set_verify(&session->ssl, impl::mbedtls_verify_callback, + session); + } + + return static_cast(session); +} + +inline void free_session(session_t session) { + if (session) { delete static_cast(session); } +} + +inline bool set_sni(session_t session, const char *hostname) { + if (!session || !hostname) { return false; } + auto msession = static_cast(session); + + int ret = mbedtls_ssl_set_hostname(&msession->ssl, hostname); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + msession->hostname = hostname; + return true; +} + +inline bool set_hostname(session_t session, const char *hostname) { + // In Mbed TLS, set_hostname also sets up hostname verification + return set_sni(session, hostname); +} + +inline TlsError connect(session_t session) { + TlsError err; + if (!session) { + err.code = ErrorCode::Fatal; + return err; + } + + auto msession = static_cast(session); + int ret = mbedtls_ssl_handshake(&msession->ssl); + + if (ret == 0) { + err.code = ErrorCode::Success; + } else { + err.code = impl::map_mbedtls_error(ret, err.sys_errno); + err.backend_code = static_cast(-ret); + impl::mbedtls_last_error() = ret; + } + + return err; +} + +inline TlsError accept(session_t session) { + // Same as connect for Mbed TLS - handshake works for both client and server + auto result = connect(session); + + // After successful handshake, capture SNI from thread-local storage + if (result.code == ErrorCode::Success && session) { + auto msession = static_cast(session); + msession->sni_hostname = std::move(impl::mbedpending_sni()); + impl::mbedpending_sni().clear(); + } + + return result; +} + +inline bool connect_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + if (!session) { + if (err) { err->code = ErrorCode::Fatal; } + return false; + } + + auto msession = static_cast(session); + + // Set socket to non-blocking mode + detail::set_nonblocking(sock, true); + auto cleanup = + detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + int ret; + while ((ret = mbedtls_ssl_handshake(&msession->ssl)) != 0) { + if (ret == MBEDTLS_ERR_SSL_WANT_READ) { + if (detail::select_read(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } else if (ret == MBEDTLS_ERR_SSL_WANT_WRITE) { + if (detail::select_write(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } + + // TlsError or timeout + if (err) { + err->code = impl::map_mbedtls_error(ret, err->sys_errno); + err->backend_code = static_cast(-ret); + } + impl::mbedtls_last_error() = ret; + return false; + } + + if (err) { err->code = ErrorCode::Success; } + return true; +} + +inline bool accept_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + // Same implementation as connect for Mbed TLS + bool result = + connect_nonblocking(session, sock, timeout_sec, timeout_usec, err); + + // After successful handshake, capture SNI from thread-local storage + if (result && session) { + auto msession = static_cast(session); + msession->sni_hostname = std::move(impl::mbedpending_sni()); + impl::mbedpending_sni().clear(); + } + + return result; +} + +inline ssize_t read(session_t session, void *buf, size_t len, TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto msession = static_cast(session); + int ret = + mbedtls_ssl_read(&msession->ssl, static_cast(buf), len); + + if (ret > 0) { + err.code = ErrorCode::Success; + return static_cast(ret); + } + + if (ret == 0) { + err.code = ErrorCode::PeerClosed; + return 0; + } + + err.code = impl::map_mbedtls_error(ret, err.sys_errno); + err.backend_code = static_cast(-ret); + impl::mbedtls_last_error() = ret; + // mbedTLS signals a clean close_notify via a negative error code rather + // than 0; surface it as a clean EOF the way OpenSSL/wolfSSL do. + if (err.code == ErrorCode::PeerClosed) { return 0; } + return -1; +} + +inline ssize_t write(session_t session, const void *buf, size_t len, + TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto msession = static_cast(session); + int ret = mbedtls_ssl_write(&msession->ssl, + static_cast(buf), len); + + if (ret > 0) { + err.code = ErrorCode::Success; + return static_cast(ret); + } + + if (ret == 0) { + err.code = ErrorCode::PeerClosed; + return 0; + } + + err.code = impl::map_mbedtls_error(ret, err.sys_errno); + err.backend_code = static_cast(-ret); + impl::mbedtls_last_error() = ret; + return -1; +} + +inline int pending(const_session_t session) { + if (!session) { return 0; } + auto msession = + static_cast(const_cast(session)); + return static_cast(mbedtls_ssl_get_bytes_avail(&msession->ssl)); +} + +inline void shutdown(session_t session, bool graceful) { + if (!session) { return; } + auto msession = static_cast(session); + + if (graceful) { + // Try to send close_notify, but don't block forever + int ret; + int attempts = 0; + while ((ret = mbedtls_ssl_close_notify(&msession->ssl)) != 0 && + attempts < 3) { + if (ret != MBEDTLS_ERR_SSL_WANT_READ && + ret != MBEDTLS_ERR_SSL_WANT_WRITE) { + break; + } + attempts++; + } + } +} + +inline bool is_peer_closed(session_t session, socket_t sock) { + if (!session || sock == INVALID_SOCKET) { return true; } + auto msession = static_cast(session); + + // Check if there's already decrypted data available in the TLS buffer + // If so, the connection is definitely alive + if (mbedtls_ssl_get_bytes_avail(&msession->ssl) > 0) { return false; } + + // Set socket to non-blocking to avoid blocking on read + detail::set_nonblocking(sock, true); + auto cleanup = + detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + // Try a 1-byte read to check connection status + // Note: This will consume the byte if data is available, but for the + // purpose of checking if peer is closed, this should be acceptable + // since we're only called when we expect the connection might be closing + unsigned char buf; + int ret = mbedtls_ssl_read(&msession->ssl, &buf, 1); + + // If we got data or WANT_READ (would block), connection is alive + if (ret > 0 || ret == MBEDTLS_ERR_SSL_WANT_READ) { return false; } + + // If we get a peer close notify or a connection reset, the peer is closed + return ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY || + ret == MBEDTLS_ERR_NET_CONN_RESET || ret == 0; +} + +inline cert_t get_peer_cert(const_session_t session) { + if (!session) { return nullptr; } + auto msession = + static_cast(const_cast(session)); + + // Mbed TLS returns a pointer to the internal peer cert chain. + // WARNING: This pointer is only valid while the session is active. + // Do not use the certificate after calling free_session(). + const mbedtls_x509_crt *cert = mbedtls_ssl_get_peer_cert(&msession->ssl); + return const_cast(cert); +} + +inline void free_cert(cert_t cert) { + // Mbed TLS: peer certificate is owned by the SSL context. + // No-op here, but callers should still call this for cross-backend + // portability. + (void)cert; +} + +inline bool verify_hostname(cert_t cert, const char *hostname) { + if (!cert || !hostname) { return false; } + auto mcert = static_cast(cert); + std::string host_str(hostname); + + // Check if hostname is an IP address (IPv4 or IPv6) + unsigned char ip_bytes[16]; + auto ip_len = impl::parse_ip_address(host_str, ip_bytes); + auto is_ip = ip_len > 0; + + // Check Subject Alternative Names (SAN) + // In Mbed TLS 3.x, subject_alt_names contains raw values without ASN.1 tags + // - DNS names: raw string bytes + // - IP addresses: raw IP bytes (4 for IPv4, 16 for IPv6) + const mbedtls_x509_sequence *san = &mcert->subject_alt_names; + while (san != nullptr && san->buf.p != nullptr && san->buf.len > 0) { + const unsigned char *p = san->buf.p; + size_t len = san->buf.len; + + if (is_ip) { + // For an IP host, only a matching iPAddress SAN of the same family + // (4 bytes for IPv4, 16 bytes for IPv6) may authenticate it. + if (len == ip_len && memcmp(p, ip_bytes, ip_len) == 0) { return true; } + } else { + // Check if this SAN is a DNS name (printable ASCII string) + bool is_dns = len > 0; + for (size_t i = 0; i < len && is_dns; i++) { + if (p[i] < 32 || p[i] > 126) { is_dns = false; } + } + if (is_dns) { + std::string san_name(reinterpret_cast(p), len); + if (detail::match_hostname(san_name, host_str)) { return true; } + } + } + san = san->next; + } + + // Fallback: Check Common Name (CN) in subject. Skipped for IP-literal hosts: + // an IP identity is only valid via an iPAddress SAN, never the CN (RFC 9110; + // the OpenSSL backend's X509_check_ip behaves the same way). + if (!is_ip) { + char cn[256]; + int ret = mbedtls_x509_dn_gets(cn, sizeof(cn), &mcert->subject); + if (ret > 0) { + std::string cn_str(cn); + + // Look for "CN=" in the DN string + size_t cn_pos = cn_str.find("CN="); + if (cn_pos != std::string::npos) { + size_t start = cn_pos + 3; + size_t end = cn_str.find(',', start); + std::string cn_value = + cn_str.substr(start, end == std::string::npos ? end : end - start); + + if (detail::match_hostname(cn_value, host_str)) { return true; } + } + } + } + + return false; +} + +inline uint64_t hostname_mismatch_code() { + return static_cast(MBEDTLS_X509_BADCERT_CN_MISMATCH); +} + +inline long get_verify_result(const_session_t session) { + if (!session) { return -1; } + auto msession = + static_cast(const_cast(session)); + uint32_t flags = mbedtls_ssl_get_verify_result(&msession->ssl); + // Return 0 (X509_V_OK equivalent) if verification passed + return flags == 0 ? 0 : static_cast(flags); +} + +inline std::string get_cert_subject_cn(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + // Find the CN in the subject + const mbedtls_x509_name *name = &x509->subject; + while (name != nullptr) { + if (MBEDTLS_OID_CMP(MBEDTLS_OID_AT_CN, &name->oid) == 0) { + return std::string(reinterpret_cast(name->val.p), + name->val.len); + } + name = name->next; + } + return ""; +} + +inline std::string get_cert_issuer_name(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + // Build a human-readable issuer name string + char buf[512]; + int ret = mbedtls_x509_dn_gets(buf, sizeof(buf), &x509->issuer); + if (ret < 0) return ""; + return std::string(buf); +} + +inline bool get_cert_sans(cert_t cert, std::vector &sans) { + sans.clear(); + if (!cert) return false; + auto x509 = static_cast(cert); + + // Parse the Subject Alternative Name extension + const mbedtls_x509_sequence *cur = &x509->subject_alt_names; + while (cur != nullptr) { + if (cur->buf.len > 0) { + // Mbed TLS stores SAN as ASN.1 sequences + // The tag byte indicates the type + const unsigned char *p = cur->buf.p; + size_t len = cur->buf.len; + + // First byte is the tag + unsigned char tag = *p; + p++; + len--; + + // Parse length (simple single-byte length assumed) + if (len > 0 && *p < 0x80) { + size_t value_len = *p; + p++; + len--; + + if (value_len <= len) { + SanEntry entry; + // ASN.1 context tags for GeneralName + switch (tag & 0x1F) { + case 2: // dNSName + entry.type = SanType::DNS; + entry.value = + std::string(reinterpret_cast(p), value_len); + break; + case 7: // iPAddress + entry.type = SanType::IP; + if (value_len == 4) { + // IPv4 + char buf[16]; + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", p[0], p[1], p[2], p[3]); + entry.value = buf; + } else if (value_len == 16) { + // IPv6 + char buf[64]; + snprintf(buf, sizeof(buf), + "%02x%02x:%02x%02x:%02x%02x:%02x%02x:" + "%02x%02x:%02x%02x:%02x%02x:%02x%02x", + p[0], p[1], p[2], p[3], p[4], p[5], p[6], p[7], p[8], + p[9], p[10], p[11], p[12], p[13], p[14], p[15]); + entry.value = buf; + } + break; + case 1: // rfc822Name (email) + entry.type = SanType::EMAIL; + entry.value = + std::string(reinterpret_cast(p), value_len); + break; + case 6: // uniformResourceIdentifier + entry.type = SanType::URI; + entry.value = + std::string(reinterpret_cast(p), value_len); + break; + default: entry.type = SanType::OTHER; break; + } + + if (!entry.value.empty()) { sans.push_back(std::move(entry)); } + } + } + } + cur = cur->next; + } + return true; +} + +inline bool get_cert_validity(cert_t cert, time_t ¬_before, + time_t ¬_after) { + if (!cert) return false; + auto x509 = static_cast(cert); + + // Convert mbedtls_x509_time to time_t + auto to_time_t = [](const mbedtls_x509_time &t) -> time_t { + struct tm tm_time = {}; + tm_time.tm_year = t.year - 1900; + tm_time.tm_mon = t.mon - 1; + tm_time.tm_mday = t.day; + tm_time.tm_hour = t.hour; + tm_time.tm_min = t.min; + tm_time.tm_sec = t.sec; +#ifdef _WIN32 + return _mkgmtime(&tm_time); +#else + return timegm(&tm_time); +#endif + }; + + not_before = to_time_t(x509->valid_from); + not_after = to_time_t(x509->valid_to); + return true; +} + +inline std::string get_cert_serial(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + // Convert serial number to hex string + std::string result; + result.reserve(x509->serial.len * 2); + for (size_t i = 0; i < x509->serial.len; i++) { + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", x509->serial.p[i]); + result += hex; + } + return result; +} + +inline bool get_cert_der(cert_t cert, std::vector &der) { + if (!cert) return false; + auto crt = static_cast(cert); + if (!crt->raw.p || crt->raw.len == 0) return false; + der.assign(crt->raw.p, crt->raw.p + crt->raw.len); + return true; +} + +inline const char *get_sni(const_session_t session) { + if (!session) return nullptr; + auto msession = static_cast(session); + + // For server: return SNI received from client during handshake + if (!msession->sni_hostname.empty()) { + return msession->sni_hostname.c_str(); + } + + // For client: return the hostname set via set_sni + if (!msession->hostname.empty()) { return msession->hostname.c_str(); } + + return nullptr; +} + +inline uint64_t peek_error() { + // Mbed TLS doesn't have an error queue, return the last error + return static_cast(-impl::mbedtls_last_error()); +} + +inline uint64_t get_error() { + // Mbed TLS doesn't have an error queue, return and clear the last error + uint64_t err = static_cast(-impl::mbedtls_last_error()); + impl::mbedtls_last_error() = 0; + return err; +} + +inline std::string error_string(uint64_t code) { + char buf[256]; + mbedtls_strerror(-static_cast(code), buf, sizeof(buf)); + return std::string(buf); +} + +inline ca_store_t create_ca_store(const char *pem, size_t len) { + auto *ca_chain = new (std::nothrow) mbedtls_x509_crt; + if (!ca_chain) { return nullptr; } + + mbedtls_x509_crt_init(ca_chain); + + // mbedtls_x509_crt_parse expects null-terminated PEM + int ret = mbedtls_x509_crt_parse(ca_chain, + reinterpret_cast(pem), + len + 1); // +1 for null terminator + if (ret != 0) { + // Try without +1 in case PEM is already null-terminated + ret = mbedtls_x509_crt_parse( + ca_chain, reinterpret_cast(pem), len); + if (ret != 0) { + mbedtls_x509_crt_free(ca_chain); + delete ca_chain; + return nullptr; + } + } + + return static_cast(ca_chain); +} + +inline void free_ca_store(ca_store_t store) { + if (store) { + auto *ca_chain = static_cast(store); + mbedtls_x509_crt_free(ca_chain); + delete ca_chain; + } +} + +inline bool set_ca_store(ctx_t ctx, ca_store_t store) { + if (!ctx || !store) { return false; } + auto *mbed_ctx = static_cast(ctx); + auto *ca_chain = static_cast(store); + + // Free existing CA chain + mbedtls_x509_crt_free(&mbed_ctx->ca_chain); + mbedtls_x509_crt_init(&mbed_ctx->ca_chain); + + // Copy the CA chain (deep copy) + // Parse from the raw data of the source cert + mbedtls_x509_crt *src = ca_chain; + while (src != nullptr) { + int ret = mbedtls_x509_crt_parse_der(&mbed_ctx->ca_chain, src->raw.p, + src->raw.len); + if (ret != 0) { + free_ca_store(store); + return false; + } + src = src->next; + } + + // This function takes ownership of the store; the chain was deep-copied + // above, so release the source + free_ca_store(store); + + // Update the SSL config to use the new CA chain + mbedtls_ssl_conf_ca_chain(&mbed_ctx->conf, &mbed_ctx->ca_chain, nullptr); + return true; +} + +inline size_t get_ca_certs(ctx_t ctx, std::vector &certs) { + certs.clear(); + if (!ctx) { return 0; } + auto *mbed_ctx = static_cast(ctx); + + // Iterate through the CA chain + mbedtls_x509_crt *cert = &mbed_ctx->ca_chain; + while (cert != nullptr && cert->raw.len > 0) { + // Create a copy of the certificate for the caller + auto *copy = new mbedtls_x509_crt; + mbedtls_x509_crt_init(copy); + int ret = mbedtls_x509_crt_parse_der(copy, cert->raw.p, cert->raw.len); + if (ret == 0) { + certs.push_back(static_cast(copy)); + } else { + mbedtls_x509_crt_free(copy); + delete copy; + } + cert = cert->next; + } + return certs.size(); +} + +inline std::vector get_ca_names(ctx_t ctx) { + std::vector names; + if (!ctx) { return names; } + auto *mbed_ctx = static_cast(ctx); + + // Iterate through the CA chain + mbedtls_x509_crt *cert = &mbed_ctx->ca_chain; + while (cert != nullptr && cert->raw.len > 0) { + char buf[512]; + int ret = mbedtls_x509_dn_gets(buf, sizeof(buf), &cert->subject); + if (ret > 0) { names.push_back(buf); } + cert = cert->next; + } + return names; +} + +inline bool update_server_cert(ctx_t ctx, const char *cert_pem, + const char *key_pem, const char *password) { + if (!ctx || !cert_pem || !key_pem) { return false; } + auto *mbed_ctx = static_cast(ctx); + + // Free existing certificate and key + mbedtls_x509_crt_free(&mbed_ctx->own_cert); + mbedtls_pk_free(&mbed_ctx->own_key); + mbedtls_x509_crt_init(&mbed_ctx->own_cert); + mbedtls_pk_init(&mbed_ctx->own_key); + + // Parse certificate PEM + int ret = mbedtls_x509_crt_parse( + &mbed_ctx->own_cert, reinterpret_cast(cert_pem), + strlen(cert_pem) + 1); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Parse private key PEM +#ifdef CPPHTTPLIB_MBEDTLS_V3 + ret = mbedtls_pk_parse_key( + &mbed_ctx->own_key, reinterpret_cast(key_pem), + strlen(key_pem) + 1, + password ? reinterpret_cast(password) : nullptr, + password ? strlen(password) : 0, mbedtls_ctr_drbg_random, + &mbed_ctx->ctr_drbg); +#else + ret = mbedtls_pk_parse_key( + &mbed_ctx->own_key, reinterpret_cast(key_pem), + strlen(key_pem) + 1, + password ? reinterpret_cast(password) : nullptr, + password ? strlen(password) : 0); +#endif + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Configure SSL to use the new certificate and key + ret = mbedtls_ssl_conf_own_cert(&mbed_ctx->conf, &mbed_ctx->own_cert, + &mbed_ctx->own_key); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + return true; +} + +inline bool update_server_client_ca(ctx_t ctx, const char *ca_pem) { + if (!ctx || !ca_pem) { return false; } + auto *mbed_ctx = static_cast(ctx); + + // Free existing CA chain + mbedtls_x509_crt_free(&mbed_ctx->ca_chain); + mbedtls_x509_crt_init(&mbed_ctx->ca_chain); + + // Parse CA PEM + int ret = mbedtls_x509_crt_parse( + &mbed_ctx->ca_chain, reinterpret_cast(ca_pem), + strlen(ca_pem) + 1); + if (ret != 0) { + impl::mbedtls_last_error() = ret; + return false; + } + + // Update SSL config to use new CA chain + mbedtls_ssl_conf_ca_chain(&mbed_ctx->conf, &mbed_ctx->ca_chain, nullptr); + return true; +} + +inline bool set_verify_callback(ctx_t ctx, VerifyCallback callback) { + if (!ctx) { return false; } + auto *mbed_ctx = static_cast(ctx); + + impl::get_verify_callback() = std::move(callback); + mbed_ctx->has_verify_callback = + static_cast(impl::get_verify_callback()); + + if (mbed_ctx->has_verify_callback) { + // Set OPTIONAL mode to ensure callback is called even when verification + // is disabled (matching OpenSSL behavior where SSL_VERIFY_PEER is set) + mbedtls_ssl_conf_authmode(&mbed_ctx->conf, MBEDTLS_SSL_VERIFY_OPTIONAL); + mbedtls_ssl_conf_verify(&mbed_ctx->conf, impl::mbedtls_verify_callback, + nullptr); + } else { + mbedtls_ssl_conf_verify(&mbed_ctx->conf, nullptr, nullptr); + } + return true; +} + +inline long get_verify_error(const_session_t session) { + if (!session) { return -1; } + auto *msession = + static_cast(const_cast(session)); + return static_cast(mbedtls_ssl_get_verify_result(&msession->ssl)); +} + +inline std::string verify_error_string(long error_code) { + if (error_code == 0) { return ""; } + char buf[256]; + mbedtls_x509_crt_verify_info(buf, sizeof(buf), "", + static_cast(error_code)); + // Remove trailing newline if present + std::string result(buf); + while (!result.empty() && (result.back() == '\n' || result.back() == ' ')) { + result.pop_back(); + } + return result; +} + +} // namespace tls + +#endif // CPPHTTPLIB_MBEDTLS_SUPPORT + +/* + * Group 10: TLS abstraction layer - wolfSSL backend + */ + +/* + * wolfSSL Backend Implementation + */ + +#ifdef CPPHTTPLIB_WOLFSSL_SUPPORT +namespace tls { + +namespace impl { + +// wolfSSL session wrapper +struct WolfSSLSession { + WOLFSSL *ssl = nullptr; + socket_t sock = INVALID_SOCKET; + std::string hostname; // For client: set via set_sni + std::string sni_hostname; // For server: received from client via SNI callback + + WolfSSLSession() = default; + + ~WolfSSLSession() { + if (ssl) { wolfSSL_free(ssl); } + } + + WolfSSLSession(const WolfSSLSession &) = delete; + WolfSSLSession &operator=(const WolfSSLSession &) = delete; +}; + +// Thread-local error code accessor for wolfSSL +inline uint64_t &wolfssl_last_error() { + static thread_local uint64_t err = 0; + return err; +} + +// Helper to map wolfSSL error to ErrorCode. +// ssl_error is the value from wolfSSL_get_error(). +// raw_ret is the raw return value from the wolfSSL call (for low-level error). +inline ErrorCode map_wolfssl_error(WOLFSSL *ssl, int ssl_error, + int &out_errno) { + switch (ssl_error) { + case SSL_ERROR_NONE: return ErrorCode::Success; + case SSL_ERROR_WANT_READ: return ErrorCode::WantRead; + case SSL_ERROR_WANT_WRITE: return ErrorCode::WantWrite; + case SSL_ERROR_ZERO_RETURN: return ErrorCode::PeerClosed; + case SSL_ERROR_SYSCALL: out_errno = errno; return ErrorCode::SyscallError; + default: + if (ssl) { + // wolfSSL stores the low-level error code as a negative value. + // DOMAIN_NAME_MISMATCH (-322) indicates hostname verification failure. + int low_err = ssl_error; // wolfSSL_get_error returns the low-level code + if (low_err == DOMAIN_NAME_MISMATCH) { + return ErrorCode::HostnameMismatch; + } + // Check verify result to distinguish cert verification from generic SSL + // errors. + long vr = wolfSSL_get_verify_result(ssl); + if (vr != 0) { return ErrorCode::CertVerifyFailed; } + } + return ErrorCode::Fatal; + } +} + +// WolfSSLContext constructor/destructor implementations +inline WolfSSLContext::WolfSSLContext() { wolfSSL_Init(); } + +inline WolfSSLContext::~WolfSSLContext() { + if (ctx) { wolfSSL_CTX_free(ctx); } +} + +// Thread-local storage for SNI captured during handshake +inline std::string &wolfssl_pending_sni() { + static thread_local std::string sni; + return sni; +} + +// SNI callback for wolfSSL server to capture client's SNI hostname +inline int wolfssl_sni_callback(WOLFSSL *ssl, int *ret, void *exArg) { + (void)ret; + (void)exArg; + + void *name_data = nullptr; + unsigned short name_len = + wolfSSL_SNI_GetRequest(ssl, WOLFSSL_SNI_HOST_NAME, &name_data); + + if (name_data && name_len > 0) { + wolfssl_pending_sni().assign(static_cast(name_data), + name_len); + } else { + wolfssl_pending_sni().clear(); + } + return 0; // Continue regardless +} + +// wolfSSL verify callback wrapper +inline int wolfssl_verify_callback(int preverify_ok, + WOLFSSL_X509_STORE_CTX *x509_ctx) { + auto &callback = get_verify_callback(); + if (!callback) { return preverify_ok; } + + WOLFSSL_X509 *cert = wolfSSL_X509_STORE_CTX_get_current_cert(x509_ctx); + int depth = wolfSSL_X509_STORE_CTX_get_error_depth(x509_ctx); + int err = wolfSSL_X509_STORE_CTX_get_error(x509_ctx); + + // Get the WOLFSSL object from the X509_STORE_CTX + WOLFSSL *ssl = static_cast(wolfSSL_X509_STORE_CTX_get_ex_data( + x509_ctx, wolfSSL_get_ex_data_X509_STORE_CTX_idx())); + + VerifyContext verify_ctx; + verify_ctx.session = static_cast(ssl); + verify_ctx.cert = static_cast(cert); + verify_ctx.depth = depth; + verify_ctx.preverify_ok = (preverify_ok != 0); + verify_ctx.error_code = static_cast(err); + + if (err != 0) { + verify_ctx.error_string = wolfSSL_X509_verify_cert_error_string(err); + } else { + verify_ctx.error_string = nullptr; + } + + bool accepted = callback(verify_ctx); + return accepted ? 1 : 0; +} + +inline void set_wolfssl_password_cb(WOLFSSL_CTX *ctx, const char *password) { + wolfSSL_CTX_set_default_passwd_cb_userdata(ctx, const_cast(password)); + wolfSSL_CTX_set_default_passwd_cb( + ctx, [](char *buf, int size, int /*rwflag*/, void *userdata) -> int { + auto *pwd = static_cast(userdata); + if (!pwd) return 0; + auto len = static_cast(strlen(pwd)); + if (len > size) len = size; + memcpy(buf, pwd, static_cast(len)); + return len; + }); +} + +} // namespace impl + +inline ctx_t create_client_context() { + auto ctx = new (std::nothrow) impl::WolfSSLContext(); + if (!ctx) { return nullptr; } + + ctx->is_server = false; + + WOLFSSL_METHOD *method = wolfTLSv1_2_client_method(); + if (!method) { + delete ctx; + return nullptr; + } + + ctx->ctx = wolfSSL_CTX_new(method); + if (!ctx->ctx) { + delete ctx; + return nullptr; + } + + // Default: verify peer certificate + wolfSSL_CTX_set_verify(ctx->ctx, SSL_VERIFY_PEER, nullptr); + + return static_cast(ctx); +} + +inline ctx_t create_server_context() { + auto ctx = new (std::nothrow) impl::WolfSSLContext(); + if (!ctx) { return nullptr; } + + ctx->is_server = true; + + WOLFSSL_METHOD *method = wolfTLSv1_2_server_method(); + if (!method) { + delete ctx; + return nullptr; + } + + ctx->ctx = wolfSSL_CTX_new(method); + if (!ctx->ctx) { + delete ctx; + return nullptr; + } + + // Default: don't verify client + wolfSSL_CTX_set_verify(ctx->ctx, SSL_VERIFY_NONE, nullptr); + + // Enable SNI on server + wolfSSL_CTX_SNI_SetOptions(ctx->ctx, WOLFSSL_SNI_HOST_NAME, + WOLFSSL_SNI_CONTINUE_ON_MISMATCH); + wolfSSL_CTX_set_servername_callback(ctx->ctx, impl::wolfssl_sni_callback); + + return static_cast(ctx); +} + +inline void free_context(ctx_t ctx) { + if (ctx) { delete static_cast(ctx); } +} + +inline bool set_min_version(ctx_t ctx, Version version) { + if (!ctx) { return false; } + auto wctx = static_cast(ctx); + + int min_ver = WOLFSSL_TLSV1_2; + if (version >= Version::TLS1_3) { min_ver = WOLFSSL_TLSV1_3; } + + return wolfSSL_CTX_SetMinVersion(wctx->ctx, min_ver) == WOLFSSL_SUCCESS; +} + +inline bool load_ca_pem(ctx_t ctx, const char *pem, size_t len) { + if (!ctx || !pem) { return false; } + auto wctx = static_cast(ctx); + + int ret = wolfSSL_CTX_load_verify_buffer( + wctx->ctx, reinterpret_cast(pem), + static_cast(len), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + wctx->ca_pem_data_.append(pem, len); + return true; +} + +inline bool load_ca_file(ctx_t ctx, const char *file_path) { + if (!ctx || !file_path) { return false; } + auto wctx = static_cast(ctx); + + int ret = wolfSSL_CTX_load_verify_locations(wctx->ctx, file_path, nullptr); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + return true; +} + +inline bool load_ca_dir(ctx_t ctx, const char *dir_path) { + if (!ctx || !dir_path) { return false; } + auto wctx = static_cast(ctx); + + int ret = wolfSSL_CTX_load_verify_locations(wctx->ctx, nullptr, dir_path); + // wolfSSL may fail if the directory doesn't contain properly hashed certs. + // Unlike OpenSSL which lazily loads certs from directories, wolfSSL scans + // immediately. Return true even on failure since the CA file may have + // already been loaded, matching OpenSSL's lenient behavior. + (void)ret; + return true; +} + +inline bool load_system_certs(ctx_t ctx) { + if (!ctx) { return false; } + auto wctx = static_cast(ctx); + bool loaded = false; + +#ifdef _WIN32 + loaded = impl::enumerate_windows_system_certs( + [&](const unsigned char *data, size_t len) { + return wolfSSL_CTX_load_verify_buffer(wctx->ctx, data, + static_cast(len), + SSL_FILETYPE_ASN1) == SSL_SUCCESS; + }); +#elif defined(__APPLE__) && defined(CPPHTTPLIB_USE_CERTS_FROM_MACOSX_KEYCHAIN) + loaded = impl::enumerate_macos_keychain_certs( + [&](const unsigned char *data, size_t len) { + return wolfSSL_CTX_load_verify_buffer(wctx->ctx, data, + static_cast(len), + SSL_FILETYPE_ASN1) == SSL_SUCCESS; + }); +#else + for (auto path = impl::system_ca_paths(); *path; ++path) { + if (wolfSSL_CTX_load_verify_locations(wctx->ctx, *path, nullptr) == + SSL_SUCCESS) { + loaded = true; + break; + } + } + + if (!loaded) { + for (auto dir = impl::system_ca_dirs(); *dir; ++dir) { + if (wolfSSL_CTX_load_verify_locations(wctx->ctx, nullptr, *dir) == + SSL_SUCCESS) { + loaded = true; + break; + } + } + } +#endif + + return loaded; +} + +inline bool set_client_cert_pem(ctx_t ctx, const char *cert, const char *key, + const char *password) { + if (!ctx || !cert || !key) { return false; } + auto wctx = static_cast(ctx); + + // Load certificate + int ret = wolfSSL_CTX_use_certificate_buffer( + wctx->ctx, reinterpret_cast(cert), + static_cast(strlen(cert)), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Set password callback if password is provided + if (password) { impl::set_wolfssl_password_cb(wctx->ctx, password); } + + // Load private key + ret = wolfSSL_CTX_use_PrivateKey_buffer( + wctx->ctx, reinterpret_cast(key), + static_cast(strlen(key)), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Verify that the certificate and private key match + return wolfSSL_CTX_check_private_key(wctx->ctx) == SSL_SUCCESS; +} + +inline bool set_client_cert_file(ctx_t ctx, const char *cert_path, + const char *key_path, const char *password) { + if (!ctx || !cert_path || !key_path) { return false; } + auto wctx = static_cast(ctx); + + // Load certificate file + int ret = + wolfSSL_CTX_use_certificate_file(wctx->ctx, cert_path, SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Set password callback if password is provided + if (password) { impl::set_wolfssl_password_cb(wctx->ctx, password); } + + // Load private key file + ret = wolfSSL_CTX_use_PrivateKey_file(wctx->ctx, key_path, SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Verify that the certificate and private key match + return wolfSSL_CTX_check_private_key(wctx->ctx) == SSL_SUCCESS; +} + +inline void set_verify_client(ctx_t ctx, bool require) { + if (!ctx) { return; } + auto wctx = static_cast(ctx); + wctx->verify_client = require; + if (require) { + wolfSSL_CTX_set_verify( + wctx->ctx, SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT, + wctx->has_verify_callback ? impl::wolfssl_verify_callback : nullptr); + } else { + if (wctx->has_verify_callback) { + wolfSSL_CTX_set_verify(wctx->ctx, SSL_VERIFY_PEER, + impl::wolfssl_verify_callback); + } else { + wolfSSL_CTX_set_verify(wctx->ctx, SSL_VERIFY_NONE, nullptr); + } + } +} + +inline session_t create_session(ctx_t ctx, socket_t sock) { + if (!ctx || sock == INVALID_SOCKET) { return nullptr; } + auto wctx = static_cast(ctx); + + auto session = new (std::nothrow) impl::WolfSSLSession(); + if (!session) { return nullptr; } + + session->sock = sock; + session->ssl = wolfSSL_new(wctx->ctx); + if (!session->ssl) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + delete session; + return nullptr; + } + + wolfSSL_set_fd(session->ssl, static_cast(sock)); + + return static_cast(session); +} + +inline void free_session(session_t session) { + if (session) { delete static_cast(session); } +} + +inline bool set_sni(session_t session, const char *hostname) { + if (!session || !hostname) { return false; } + auto wsession = static_cast(session); + + int ret = wolfSSL_UseSNI(wsession->ssl, WOLFSSL_SNI_HOST_NAME, hostname, + static_cast(strlen(hostname))); + if (ret != WOLFSSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Also set hostname for verification + wolfSSL_check_domain_name(wsession->ssl, hostname); + + wsession->hostname = hostname; + return true; +} + +inline bool set_hostname(session_t session, const char *hostname) { + // In wolfSSL, set_hostname also sets up hostname verification + return set_sni(session, hostname); +} + +inline TlsError connect(session_t session) { + TlsError err; + if (!session) { + err.code = ErrorCode::Fatal; + return err; + } + + auto wsession = static_cast(session); + int ret = wolfSSL_connect(wsession->ssl); + + if (ret == SSL_SUCCESS) { + err.code = ErrorCode::Success; + } else { + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + err.code = impl::map_wolfssl_error(wsession->ssl, ssl_error, err.sys_errno); + err.backend_code = static_cast(ssl_error); + impl::wolfssl_last_error() = err.backend_code; + } + + return err; +} + +inline TlsError accept(session_t session) { + TlsError err; + if (!session) { + err.code = ErrorCode::Fatal; + return err; + } + + auto wsession = static_cast(session); + int ret = wolfSSL_accept(wsession->ssl); + + if (ret == SSL_SUCCESS) { + err.code = ErrorCode::Success; + // Capture SNI from thread-local storage after successful handshake + wsession->sni_hostname = std::move(impl::wolfssl_pending_sni()); + impl::wolfssl_pending_sni().clear(); + } else { + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + err.code = impl::map_wolfssl_error(wsession->ssl, ssl_error, err.sys_errno); + err.backend_code = static_cast(ssl_error); + impl::wolfssl_last_error() = err.backend_code; + } + + return err; +} + +inline bool connect_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + if (!session) { + if (err) { err->code = ErrorCode::Fatal; } + return false; + } + + auto wsession = static_cast(session); + + // Set socket to non-blocking mode + detail::set_nonblocking(sock, true); + auto cleanup = + detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + int ret; + while ((ret = wolfSSL_connect(wsession->ssl)) != SSL_SUCCESS) { + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + if (ssl_error == SSL_ERROR_WANT_READ) { + if (detail::select_read(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } else if (ssl_error == SSL_ERROR_WANT_WRITE) { + if (detail::select_write(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } + + // Error or timeout + if (err) { + err->code = + impl::map_wolfssl_error(wsession->ssl, ssl_error, err->sys_errno); + err->backend_code = static_cast(ssl_error); + } + impl::wolfssl_last_error() = static_cast(ssl_error); + return false; + } + + if (err) { err->code = ErrorCode::Success; } + return true; +} + +inline bool accept_nonblocking(session_t session, socket_t sock, + time_t timeout_sec, time_t timeout_usec, + TlsError *err) { + if (!session) { + if (err) { err->code = ErrorCode::Fatal; } + return false; + } + + auto wsession = static_cast(session); + + // Set socket to non-blocking mode + detail::set_nonblocking(sock, true); + auto cleanup = + detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + int ret; + while ((ret = wolfSSL_accept(wsession->ssl)) != SSL_SUCCESS) { + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + if (ssl_error == SSL_ERROR_WANT_READ) { + if (detail::select_read(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } else if (ssl_error == SSL_ERROR_WANT_WRITE) { + if (detail::select_write(sock, timeout_sec, timeout_usec) > 0) { + continue; + } + } + + // Error or timeout + if (err) { + err->code = + impl::map_wolfssl_error(wsession->ssl, ssl_error, err->sys_errno); + err->backend_code = static_cast(ssl_error); + } + impl::wolfssl_last_error() = static_cast(ssl_error); + return false; + } + + if (err) { err->code = ErrorCode::Success; } + + // Capture SNI from thread-local storage after successful handshake + wsession->sni_hostname = std::move(impl::wolfssl_pending_sni()); + impl::wolfssl_pending_sni().clear(); + + return true; +} + +inline ssize_t read(session_t session, void *buf, size_t len, TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto wsession = static_cast(session); + int ret = wolfSSL_read(wsession->ssl, buf, static_cast(len)); + + if (ret > 0) { + err.code = ErrorCode::Success; + return static_cast(ret); + } + + if (ret == 0) { + err.code = ErrorCode::PeerClosed; + return 0; + } + + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + err.code = impl::map_wolfssl_error(wsession->ssl, ssl_error, err.sys_errno); + err.backend_code = static_cast(ssl_error); + impl::wolfssl_last_error() = err.backend_code; + return -1; +} + +inline ssize_t write(session_t session, const void *buf, size_t len, + TlsError &err) { + if (!session || !buf) { + err.code = ErrorCode::Fatal; + return -1; + } + + auto wsession = static_cast(session); + int ret = wolfSSL_write(wsession->ssl, buf, static_cast(len)); + + if (ret > 0) { + err.code = ErrorCode::Success; + return static_cast(ret); + } + + // wolfSSL_write returns 0 when the peer has sent a close_notify. + // Treat this as an error (return -1) so callers don't spin in a + // write loop adding zero to the offset. + if (ret == 0) { + err.code = ErrorCode::PeerClosed; + return -1; + } + + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + err.code = impl::map_wolfssl_error(wsession->ssl, ssl_error, err.sys_errno); + err.backend_code = static_cast(ssl_error); + impl::wolfssl_last_error() = err.backend_code; + return -1; +} + +inline int pending(const_session_t session) { + if (!session) { return 0; } + auto wsession = + static_cast(const_cast(session)); + return wolfSSL_pending(wsession->ssl); +} + +inline void shutdown(session_t session, bool graceful) { + if (!session) { return; } + auto wsession = static_cast(session); + + if (graceful) { + int ret; + int attempts = 0; + while ((ret = wolfSSL_shutdown(wsession->ssl)) != SSL_SUCCESS && + attempts < 3) { + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + if (ssl_error != SSL_ERROR_WANT_READ && + ssl_error != SSL_ERROR_WANT_WRITE) { + break; + } + attempts++; + } + } else { + wolfSSL_shutdown(wsession->ssl); + } +} + +inline bool is_peer_closed(session_t session, socket_t sock) { + if (!session || sock == INVALID_SOCKET) { return true; } + auto wsession = static_cast(session); + + // Check if there's already decrypted data available + if (wolfSSL_pending(wsession->ssl) > 0) { return false; } + + // Set socket to non-blocking to avoid blocking on read + detail::set_nonblocking(sock, true); + auto cleanup = + detail::scope_exit([&]() { detail::set_nonblocking(sock, false); }); + + // Peek 1 byte to check connection status without consuming data + unsigned char buf; + int ret = wolfSSL_peek(wsession->ssl, &buf, 1); + + // If we got data or WANT_READ (would block), connection is alive + if (ret > 0) { return false; } + + int ssl_error = wolfSSL_get_error(wsession->ssl, ret); + if (ssl_error == SSL_ERROR_WANT_READ) { return false; } + + return ssl_error == SSL_ERROR_ZERO_RETURN || ssl_error == SSL_ERROR_SYSCALL || + ret == 0; +} + +inline cert_t get_peer_cert(const_session_t session) { + if (!session) { return nullptr; } + auto wsession = + static_cast(const_cast(session)); + + WOLFSSL_X509 *cert = wolfSSL_get_peer_certificate(wsession->ssl); + return static_cast(cert); +} + +inline void free_cert(cert_t cert) { + if (cert) { wolfSSL_X509_free(static_cast(cert)); } +} + +inline bool verify_hostname(cert_t cert, const char *hostname) { + if (!cert || !hostname) { return false; } + auto x509 = static_cast(cert); + std::string host_str(hostname); + + // Check if hostname is an IP address (IPv4 or IPv6) + unsigned char ip_bytes[16]; + auto ip_len = impl::parse_ip_address(host_str, ip_bytes); + auto is_ip = ip_len > 0; + + // Check Subject Alternative Names + auto *san_names = static_cast( + wolfSSL_X509_get_ext_d2i(x509, NID_subject_alt_name, nullptr, nullptr)); + + if (san_names) { + int san_count = wolfSSL_sk_num(san_names); + for (int i = 0; i < san_count; i++) { + auto *names = + static_cast(wolfSSL_sk_value(san_names, i)); + if (!names) continue; + + if (!is_ip && names->type == WOLFSSL_GEN_DNS) { + // DNS name + unsigned char *dns_name = nullptr; + int dns_len = wolfSSL_ASN1_STRING_to_UTF8(&dns_name, names->d.dNSName); + if (dns_name && dns_len > 0) { + std::string san_name(reinterpret_cast(dns_name), + static_cast(dns_len)); + XFREE(dns_name, nullptr, DYNAMIC_TYPE_OPENSSL); + if (detail::match_hostname(san_name, host_str)) { + wolfSSL_sk_free(san_names); + return true; + } + } + } else if (is_ip && names->type == WOLFSSL_GEN_IPADD) { + // IP address: only an iPAddress SAN of the same family (4 bytes for + // IPv4, 16 bytes for IPv6) may authenticate the host. + unsigned char *ip_data = wolfSSL_ASN1_STRING_data(names->d.iPAddress); + auto san_ip_len = wolfSSL_ASN1_STRING_length(names->d.iPAddress); + if (ip_data && san_ip_len == static_cast(ip_len) && + memcmp(ip_data, ip_bytes, ip_len) == 0) { + wolfSSL_sk_free(san_names); + return true; + } + } + } + wolfSSL_sk_free(san_names); + } + + // Fallback: Check Common Name (CN) in subject. Skipped for IP-literal hosts: + // an IP identity is only valid via an iPAddress SAN, never the CN (RFC 9110; + // the OpenSSL backend's X509_check_ip behaves the same way). + auto subject = is_ip ? nullptr : wolfSSL_X509_get_subject_name(x509); + if (subject) { + char cn[256] = {}; + int cn_len = wolfSSL_X509_NAME_get_text_by_NID(subject, NID_commonName, cn, + sizeof(cn)); + if (cn_len > 0) { + std::string cn_str(cn, static_cast(cn_len)); + if (detail::match_hostname(cn_str, host_str)) { return true; } + } + } + + return false; +} + +inline uint64_t hostname_mismatch_code() { + return static_cast(DOMAIN_NAME_MISMATCH); +} + +inline long get_verify_result(const_session_t session) { + if (!session) { return -1; } + auto wsession = + static_cast(const_cast(session)); + long result = wolfSSL_get_verify_result(wsession->ssl); + return result; +} + +inline std::string get_cert_subject_cn(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + WOLFSSL_X509_NAME *subject = wolfSSL_X509_get_subject_name(x509); + if (!subject) return ""; + + char cn[256] = {}; + int cn_len = wolfSSL_X509_NAME_get_text_by_NID(subject, NID_commonName, cn, + sizeof(cn)); + if (cn_len <= 0) return ""; + return std::string(cn, static_cast(cn_len)); +} + +inline std::string get_cert_issuer_name(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + WOLFSSL_X509_NAME *issuer = wolfSSL_X509_get_issuer_name(x509); + if (!issuer) return ""; + + char *name_str = wolfSSL_X509_NAME_oneline(issuer, nullptr, 0); + if (!name_str) return ""; + + std::string result(name_str); + XFREE(name_str, nullptr, DYNAMIC_TYPE_OPENSSL); + return result; +} + +inline bool get_cert_sans(cert_t cert, std::vector &sans) { + sans.clear(); + if (!cert) return false; + auto x509 = static_cast(cert); + + auto *san_names = static_cast( + wolfSSL_X509_get_ext_d2i(x509, NID_subject_alt_name, nullptr, nullptr)); + if (!san_names) return true; // No SANs is not an error + + int count = wolfSSL_sk_num(san_names); + for (int i = 0; i < count; i++) { + auto *name = + static_cast(wolfSSL_sk_value(san_names, i)); + if (!name) continue; + + SanEntry entry; + switch (name->type) { + case WOLFSSL_GEN_DNS: { + entry.type = SanType::DNS; + unsigned char *dns_name = nullptr; + int dns_len = wolfSSL_ASN1_STRING_to_UTF8(&dns_name, name->d.dNSName); + if (dns_name && dns_len > 0) { + entry.value = std::string(reinterpret_cast(dns_name), + static_cast(dns_len)); + XFREE(dns_name, nullptr, DYNAMIC_TYPE_OPENSSL); + } + break; + } + case WOLFSSL_GEN_IPADD: { + entry.type = SanType::IP; + unsigned char *ip_data = wolfSSL_ASN1_STRING_data(name->d.iPAddress); + int ip_len = wolfSSL_ASN1_STRING_length(name->d.iPAddress); + if (ip_data && ip_len == 4) { + char buf[16]; + snprintf(buf, sizeof(buf), "%d.%d.%d.%d", ip_data[0], ip_data[1], + ip_data[2], ip_data[3]); + entry.value = buf; + } else if (ip_data && ip_len == 16) { + char buf[64]; + snprintf(buf, sizeof(buf), + "%02x%02x:%02x%02x:%02x%02x:%02x%02x:" + "%02x%02x:%02x%02x:%02x%02x:%02x%02x", + ip_data[0], ip_data[1], ip_data[2], ip_data[3], ip_data[4], + ip_data[5], ip_data[6], ip_data[7], ip_data[8], ip_data[9], + ip_data[10], ip_data[11], ip_data[12], ip_data[13], + ip_data[14], ip_data[15]); + entry.value = buf; + } + break; + } + case WOLFSSL_GEN_EMAIL: + entry.type = SanType::EMAIL; + { + unsigned char *email = nullptr; + int email_len = wolfSSL_ASN1_STRING_to_UTF8(&email, name->d.rfc822Name); + if (email && email_len > 0) { + entry.value = std::string(reinterpret_cast(email), + static_cast(email_len)); + XFREE(email, nullptr, DYNAMIC_TYPE_OPENSSL); + } + } + break; + case WOLFSSL_GEN_URI: + entry.type = SanType::URI; + { + unsigned char *uri = nullptr; + int uri_len = wolfSSL_ASN1_STRING_to_UTF8( + &uri, name->d.uniformResourceIdentifier); + if (uri && uri_len > 0) { + entry.value = std::string(reinterpret_cast(uri), + static_cast(uri_len)); + XFREE(uri, nullptr, DYNAMIC_TYPE_OPENSSL); + } + } + break; + default: entry.type = SanType::OTHER; break; + } + + if (!entry.value.empty()) { sans.push_back(std::move(entry)); } + } + wolfSSL_sk_free(san_names); + return true; +} + +inline bool get_cert_validity(cert_t cert, time_t ¬_before, + time_t ¬_after) { + if (!cert) return false; + auto x509 = static_cast(cert); + + const WOLFSSL_ASN1_TIME *nb = wolfSSL_X509_get_notBefore(x509); + const WOLFSSL_ASN1_TIME *na = wolfSSL_X509_get_notAfter(x509); + + if (!nb || !na) return false; + + // wolfSSL_ASN1_TIME_to_tm is available + struct tm tm_nb = {}, tm_na = {}; + if (wolfSSL_ASN1_TIME_to_tm(nb, &tm_nb) != WOLFSSL_SUCCESS) return false; + if (wolfSSL_ASN1_TIME_to_tm(na, &tm_na) != WOLFSSL_SUCCESS) return false; + +#ifdef _WIN32 + not_before = _mkgmtime(&tm_nb); + not_after = _mkgmtime(&tm_na); +#else + not_before = timegm(&tm_nb); + not_after = timegm(&tm_na); +#endif + return true; +} + +inline std::string get_cert_serial(cert_t cert) { + if (!cert) return ""; + auto x509 = static_cast(cert); + + WOLFSSL_ASN1_INTEGER *serial_asn1 = wolfSSL_X509_get_serialNumber(x509); + if (!serial_asn1) return ""; + + // Get the serial number data + int len = serial_asn1->length; + unsigned char *data = serial_asn1->data; + if (!data || len <= 0) return ""; + + std::string result; + result.reserve(static_cast(len) * 2); + for (int i = 0; i < len; i++) { + char hex[3]; + snprintf(hex, sizeof(hex), "%02X", data[i]); + result += hex; + } + return result; +} + +inline bool get_cert_der(cert_t cert, std::vector &der) { + if (!cert) return false; + auto x509 = static_cast(cert); + + int der_len = 0; + const unsigned char *der_data = wolfSSL_X509_get_der(x509, &der_len); + if (!der_data || der_len <= 0) return false; + + der.assign(der_data, der_data + der_len); + return true; +} + +inline const char *get_sni(const_session_t session) { + if (!session) return nullptr; + auto wsession = static_cast(session); + + // For server: return SNI received from client during handshake + if (!wsession->sni_hostname.empty()) { + return wsession->sni_hostname.c_str(); + } + + // For client: return the hostname set via set_sni + if (!wsession->hostname.empty()) { return wsession->hostname.c_str(); } + + return nullptr; +} + +inline uint64_t peek_error() { + return static_cast(wolfSSL_ERR_peek_last_error()); +} + +inline uint64_t get_error() { + uint64_t err = impl::wolfssl_last_error(); + impl::wolfssl_last_error() = 0; + return err; +} + +inline std::string error_string(uint64_t code) { + char buf[256]; + wolfSSL_ERR_error_string(static_cast(code), buf); + return std::string(buf); +} + +inline ca_store_t create_ca_store(const char *pem, size_t len) { + if (!pem || len == 0) { return nullptr; } + // Validate by attempting to load into a temporary ctx + WOLFSSL_CTX *tmp_ctx = wolfSSL_CTX_new(wolfTLSv1_2_client_method()); + if (!tmp_ctx) { return nullptr; } + int ret = wolfSSL_CTX_load_verify_buffer( + tmp_ctx, reinterpret_cast(pem), + static_cast(len), SSL_FILETYPE_PEM); + wolfSSL_CTX_free(tmp_ctx); + if (ret != SSL_SUCCESS) { return nullptr; } + return static_cast( + new impl::WolfSSLCAStore{std::string(pem, len)}); +} + +inline void free_ca_store(ca_store_t store) { + delete static_cast(store); +} + +inline bool set_ca_store(ctx_t ctx, ca_store_t store) { + if (!ctx || !store) { return false; } + auto *wctx = static_cast(ctx); + auto *ca = static_cast(store); + int ret = wolfSSL_CTX_load_verify_buffer( + wctx->ctx, reinterpret_cast(ca->pem_data.data()), + static_cast(ca->pem_data.size()), SSL_FILETYPE_PEM); + if (ret == SSL_SUCCESS) { wctx->ca_pem_data_ += ca->pem_data; } + // This function takes ownership of the store; the PEM data was copied into + // the context, so release the source + free_ca_store(store); + return ret == SSL_SUCCESS; +} + +inline size_t get_ca_certs(ctx_t ctx, std::vector &certs) { + certs.clear(); + if (!ctx) { return 0; } + auto *wctx = static_cast(ctx); + if (wctx->ca_pem_data_.empty()) { return 0; } + + const std::string &pem = wctx->ca_pem_data_; + const std::string begin_marker = "-----BEGIN CERTIFICATE-----"; + const std::string end_marker = "-----END CERTIFICATE-----"; + size_t pos = 0; + while ((pos = pem.find(begin_marker, pos)) != std::string::npos) { + size_t end_pos = pem.find(end_marker, pos); + if (end_pos == std::string::npos) { break; } + end_pos += end_marker.size(); + std::string cert_pem = pem.substr(pos, end_pos - pos); + WOLFSSL_X509 *x509 = wolfSSL_X509_load_certificate_buffer( + reinterpret_cast(cert_pem.data()), + static_cast(cert_pem.size()), WOLFSSL_FILETYPE_PEM); + if (x509) { certs.push_back(static_cast(x509)); } + pos = end_pos; + } + return certs.size(); +} + +inline std::vector get_ca_names(ctx_t ctx) { + std::vector names; + if (!ctx) { return names; } + auto *wctx = static_cast(ctx); + if (wctx->ca_pem_data_.empty()) { return names; } + + const std::string &pem = wctx->ca_pem_data_; + const std::string begin_marker = "-----BEGIN CERTIFICATE-----"; + const std::string end_marker = "-----END CERTIFICATE-----"; + size_t pos = 0; + while ((pos = pem.find(begin_marker, pos)) != std::string::npos) { + size_t end_pos = pem.find(end_marker, pos); + if (end_pos == std::string::npos) { break; } + end_pos += end_marker.size(); + std::string cert_pem = pem.substr(pos, end_pos - pos); + WOLFSSL_X509 *x509 = wolfSSL_X509_load_certificate_buffer( + reinterpret_cast(cert_pem.data()), + static_cast(cert_pem.size()), WOLFSSL_FILETYPE_PEM); + if (x509) { + WOLFSSL_X509_NAME *subject = wolfSSL_X509_get_subject_name(x509); + if (subject) { + char *name_str = wolfSSL_X509_NAME_oneline(subject, nullptr, 0); + if (name_str) { + names.push_back(name_str); + XFREE(name_str, nullptr, DYNAMIC_TYPE_OPENSSL); + } + } + wolfSSL_X509_free(x509); + } + pos = end_pos; + } + return names; +} + +inline bool update_server_cert(ctx_t ctx, const char *cert_pem, + const char *key_pem, const char *password) { + if (!ctx || !cert_pem || !key_pem) { return false; } + auto *wctx = static_cast(ctx); + + // Load new certificate + int ret = wolfSSL_CTX_use_certificate_buffer( + wctx->ctx, reinterpret_cast(cert_pem), + static_cast(strlen(cert_pem)), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + // Set password if provided + if (password) { impl::set_wolfssl_password_cb(wctx->ctx, password); } + + // Load new private key + ret = wolfSSL_CTX_use_PrivateKey_buffer( + wctx->ctx, reinterpret_cast(key_pem), + static_cast(strlen(key_pem)), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + + return true; +} + +inline bool update_server_client_ca(ctx_t ctx, const char *ca_pem) { + if (!ctx || !ca_pem) { return false; } + auto *wctx = static_cast(ctx); + + int ret = wolfSSL_CTX_load_verify_buffer( + wctx->ctx, reinterpret_cast(ca_pem), + static_cast(strlen(ca_pem)), SSL_FILETYPE_PEM); + if (ret != SSL_SUCCESS) { + impl::wolfssl_last_error() = + static_cast(wolfSSL_ERR_peek_last_error()); + return false; + } + return true; +} + +inline bool set_verify_callback(ctx_t ctx, VerifyCallback callback) { + if (!ctx) { return false; } + auto *wctx = static_cast(ctx); + + impl::get_verify_callback() = std::move(callback); + wctx->has_verify_callback = static_cast(impl::get_verify_callback()); + + if (wctx->has_verify_callback) { + wolfSSL_CTX_set_verify(wctx->ctx, SSL_VERIFY_PEER, + impl::wolfssl_verify_callback); + } else { + wolfSSL_CTX_set_verify( + wctx->ctx, + wctx->verify_client + ? (SSL_VERIFY_PEER | SSL_VERIFY_FAIL_IF_NO_PEER_CERT) + : SSL_VERIFY_NONE, + nullptr); + } + return true; +} + +inline long get_verify_error(const_session_t session) { + if (!session) { return -1; } + auto *wsession = + static_cast(const_cast(session)); + return wolfSSL_get_verify_result(wsession->ssl); +} + +inline std::string verify_error_string(long error_code) { + if (error_code == 0) { return ""; } + const char *str = + wolfSSL_X509_verify_cert_error_string(static_cast(error_code)); + return str ? std::string(str) : std::string(); +} + +} // namespace tls + +#endif // CPPHTTPLIB_WOLFSSL_SUPPORT + +// WebSocket implementation +namespace ws { + +inline bool WebSocket::send_frame(Opcode op, const char *data, size_t len, + bool fin) { + std::lock_guard lock(write_mutex_); + if (closed_) { return false; } + return detail::write_websocket_frame(strm_, op, data, len, fin, !is_server_); +} + +inline ReadResult WebSocket::read(std::string &msg) { + while (!closed_) { + Opcode opcode; + std::string payload; + bool fin; + + if (!impl::read_websocket_frame(strm_, opcode, payload, fin, is_server_, + CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH)) { + closed_ = true; + return Fail; + } + + switch (opcode) { + case Opcode::Ping: { + std::lock_guard lock(write_mutex_); + detail::write_websocket_frame(strm_, Opcode::Pong, payload.data(), + payload.size(), true, !is_server_); + continue; + } + case Opcode::Pong: { + std::lock_guard lock(ping_mutex_); + unacked_pings_ = 0; + continue; + } + case Opcode::Close: { + if (!closed_.exchange(true)) { + // Echo close frame back + std::lock_guard lock(write_mutex_); + detail::write_websocket_frame(strm_, Opcode::Close, payload.data(), + payload.size(), true, !is_server_); + } + return Fail; + } + case Opcode::Text: + case Opcode::Binary: { + auto result = opcode == Opcode::Text ? Text : Binary; + msg = std::move(payload); + + // Handle fragmentation + if (!fin) { + while (true) { + Opcode cont_opcode; + std::string cont_payload; + bool cont_fin; + if (!impl::read_websocket_frame( + strm_, cont_opcode, cont_payload, cont_fin, is_server_, + CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH)) { + closed_ = true; + return Fail; + } + if (cont_opcode == Opcode::Ping) { + std::lock_guard lock(write_mutex_); + detail::write_websocket_frame( + strm_, Opcode::Pong, cont_payload.data(), cont_payload.size(), + true, !is_server_); + continue; + } + if (cont_opcode == Opcode::Pong) { + std::lock_guard lock(ping_mutex_); + unacked_pings_ = 0; + continue; + } + if (cont_opcode == Opcode::Close) { + if (!closed_.exchange(true)) { + std::lock_guard lock(write_mutex_); + detail::write_websocket_frame( + strm_, Opcode::Close, cont_payload.data(), + cont_payload.size(), true, !is_server_); + } + return Fail; + } + // RFC 6455: continuation frames must use opcode 0x0 + if (cont_opcode != Opcode::Continuation) { + closed_ = true; + return Fail; + } + msg += cont_payload; + if (msg.size() > CPPHTTPLIB_WEBSOCKET_MAX_PAYLOAD_LENGTH) { + closed_ = true; + return Fail; + } + if (cont_fin) { break; } + } + } + // RFC 6455 Section 5.6: text frames must contain valid UTF-8 + if (result == Text && !impl::is_valid_utf8(msg)) { + close(CloseStatus::InvalidPayload, "invalid UTF-8"); + return Fail; + } + return result; + } + default: closed_ = true; return Fail; + } + } + return Fail; +} + +inline bool WebSocket::send(const std::string &data) { + return send_frame(Opcode::Text, data.data(), data.size()); +} + +inline bool WebSocket::send(const char *data, size_t len) { + return send_frame(Opcode::Binary, data, len); +} + +inline void WebSocket::close(CloseStatus status, const std::string &reason) { + if (closed_.exchange(true)) { return; } + ping_cv_.notify_all(); + std::string payload; + auto code = static_cast(status); + payload.push_back(static_cast((code >> 8) & 0xFF)); + payload.push_back(static_cast(code & 0xFF)); + // RFC 6455 Section 5.5: control frame payload must not exceed 125 bytes + // Close frame has 2-byte status code, so reason is limited to 123 bytes + payload += reason.substr(0, 123); + { + std::lock_guard lock(write_mutex_); + detail::write_websocket_frame(strm_, Opcode::Close, payload.data(), + payload.size(), true, !is_server_); + } + + // RFC 6455 Section 7.1.1: after sending a Close frame, wait for the peer's + // Close response before closing the TCP connection. Use a short timeout to + // avoid hanging if the peer doesn't respond. + strm_.set_read_timeout(CPPHTTPLIB_WEBSOCKET_CLOSE_TIMEOUT_SECOND, 0); + Opcode op; + std::string resp; + bool fin; + while (impl::read_websocket_frame(strm_, op, resp, fin, is_server_, 125)) { + if (op == Opcode::Close) { break; } + } +} + +inline WebSocket::~WebSocket() { + { + std::lock_guard lock(ping_mutex_); + closed_ = true; + } + ping_cv_.notify_all(); + if (ping_thread_.joinable()) { ping_thread_.join(); } +} + +inline void WebSocket::start_heartbeat() { + if (ping_interval_sec_ == 0) { return; } + ping_thread_ = std::thread([this]() { + std::unique_lock lock(ping_mutex_); + while (!closed_) { + ping_cv_.wait_for(lock, std::chrono::seconds(ping_interval_sec_)); + if (closed_) { break; } + // If the peer has failed to respond to the previous pings, give up. + // RFC 6455 does not define a pong-timeout mechanism; this is an + // opt-in liveness check controlled by max_missed_pongs_. + if (max_missed_pongs_ > 0 && unacked_pings_ >= max_missed_pongs_) { + lock.unlock(); + close(CloseStatus::GoingAway, "pong timeout"); + return; + } + lock.unlock(); + if (!send_frame(Opcode::Ping, nullptr, 0)) { + lock.lock(); + closed_ = true; + break; + } + lock.lock(); + unacked_pings_++; + } + }); +} + +inline const Request &WebSocket::request() const { return req_; } + +inline bool WebSocket::is_open() const { return !closed_; } + +// WebSocketClient implementation +inline WebSocketClient::WebSocketClient( + const std::string &scheme_host_port_path, const Headers &headers) + : headers_(headers) { + detail::UrlComponents uc; + if (detail::parse_url(scheme_host_port_path, uc) && !uc.scheme.empty() && + !uc.host.empty() && !uc.path.empty()) { + auto &scheme = uc.scheme; + +#ifdef CPPHTTPLIB_SSL_ENABLED + if (scheme != "ws" && scheme != "wss") { +#else + if (scheme != "ws") { +#endif +#ifndef CPPHTTPLIB_NO_EXCEPTIONS + std::string msg = "'" + scheme + "' scheme is not supported."; + throw std::invalid_argument(msg); +#endif + return; + } + + auto is_ssl = scheme == "wss"; + + host_ = std::move(uc.host); + + port_ = is_ssl ? 443 : 80; + if (!uc.port.empty() && !detail::parse_port(uc.port, port_)) { return; } + + path_ = std::move(uc.path); + if (!uc.query.empty()) { path_ += uc.query; } + +#ifdef CPPHTTPLIB_SSL_ENABLED + is_ssl_ = is_ssl; + if (is_ssl_) { + // The context lives as long as the client so that CA configuration + // survives reconnects; sessions are created per connection. + tls_ctx_ = tls::create_client_context(); + if (!tls_ctx_) { return; } + } +#else + if (is_ssl) { return; } +#endif + + is_valid_ = true; + } +} + +inline WebSocketClient::~WebSocketClient() { + shutdown_and_close(); +#ifdef CPPHTTPLIB_SSL_ENABLED + if (tls_ctx_) { + tls::free_context(tls_ctx_); + tls_ctx_ = nullptr; + } +#endif +} + +inline bool WebSocketClient::is_valid() const { return is_valid_; } + +inline void WebSocketClient::shutdown_and_close() { +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_ssl_) { + if (tls_session_) { + tls::shutdown(tls_session_, true); + tls::free_session(tls_session_); + tls_session_ = nullptr; + } + } +#endif + if (ws_ && ws_->is_open()) { ws_->close(); } + ws_.reset(); + if (sock_ != INVALID_SOCKET) { + detail::shutdown_socket(sock_); + detail::close_socket(sock_); + sock_ = INVALID_SOCKET; + } +} + +inline bool WebSocketClient::create_stream(std::unique_ptr &strm) { +#ifdef CPPHTTPLIB_SSL_ENABLED + if (is_ssl_) { + if (server_certificate_verification_ && !certs_loaded_) { + uint64_t backend_error = 0; + detail::load_client_ca_config(tls_ctx_, ca_cert_file_path_, std::string(), + custom_ca_loaded_, system_ca_mode_, + backend_error); + certs_loaded_ = true; + } + + if (!detail::setup_client_tls_session(host_, tls_ctx_, tls_session_, sock_, + server_certificate_verification_, + read_timeout_sec_, + read_timeout_usec_)) { + return false; + } + + strm = std::unique_ptr(new detail::SSLSocketStream( + sock_, tls_session_, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_)); + return true; + } +#endif + strm = std::unique_ptr( + new detail::SocketStream(sock_, read_timeout_sec_, read_timeout_usec_, + write_timeout_sec_, write_timeout_usec_)); + return true; +} + +inline bool WebSocketClient::connect() { + if (!is_valid_) { return false; } + shutdown_and_close(); + + // Check is custom IP specified for host_ + std::string ip; + auto it = addr_map_.find(host_); + if (it != addr_map_.end()) { ip = it->second; } + + Error error; + sock_ = detail::create_client_socket( + host_, ip, port_, address_family_, tcp_nodelay_, ipv6_v6only_, + socket_options_, connection_timeout_sec_, connection_timeout_usec_, + read_timeout_sec_, read_timeout_usec_, write_timeout_sec_, + write_timeout_usec_, interface_, error); + + if (sock_ == INVALID_SOCKET) { return false; } + + std::unique_ptr strm; + if (!create_stream(strm)) { + shutdown_and_close(); + return false; + } + + std::string selected_subprotocol; + if (!detail::perform_websocket_handshake(*strm, host_, port_, path_, headers_, + selected_subprotocol)) { + shutdown_and_close(); + return false; + } + subprotocol_ = std::move(selected_subprotocol); + + Request req; + req.method = "GET"; + req.path = path_; + ws_ = std::unique_ptr(new WebSocket(std::move(strm), req, false, + websocket_ping_interval_sec_, + websocket_max_missed_pongs_)); + return true; +} + +inline ReadResult WebSocketClient::read(std::string &msg) { + if (!ws_) { return Fail; } + return ws_->read(msg); +} + +inline bool WebSocketClient::send(const std::string &data) { + if (!ws_) { return false; } + return ws_->send(data); +} + +inline bool WebSocketClient::send(const char *data, size_t len) { + if (!ws_) { return false; } + return ws_->send(data, len); +} + +inline void WebSocketClient::close(CloseStatus status, + const std::string &reason) { + if (ws_) { ws_->close(status, reason); } +} + +inline bool WebSocketClient::is_open() const { return ws_ && ws_->is_open(); } + +inline const std::string &WebSocketClient::subprotocol() const { + return subprotocol_; +} + +inline void WebSocketClient::set_read_timeout(time_t sec, time_t usec) { + read_timeout_sec_ = sec; + read_timeout_usec_ = usec; +} + +inline void WebSocketClient::set_write_timeout(time_t sec, time_t usec) { + write_timeout_sec_ = sec; + write_timeout_usec_ = usec; +} + +inline void WebSocketClient::set_websocket_ping_interval(time_t sec) { + websocket_ping_interval_sec_ = sec; +} + +inline void WebSocketClient::set_websocket_max_missed_pongs(int count) { + websocket_max_missed_pongs_ = count; +} + +inline void WebSocketClient::set_tcp_nodelay(bool on) { tcp_nodelay_ = on; } + +inline void WebSocketClient::set_address_family(int family) { + address_family_ = family; +} + +inline void WebSocketClient::set_ipv6_v6only(bool on) { ipv6_v6only_ = on; } + +inline void WebSocketClient::set_socket_options(SocketOptions socket_options) { + socket_options_ = std::move(socket_options); +} + +inline void WebSocketClient::set_connection_timeout(time_t sec, time_t usec) { + connection_timeout_sec_ = sec; + connection_timeout_usec_ = usec; +} + +inline void WebSocketClient::set_interface(const std::string &intf) { + interface_ = intf; +} + +inline void WebSocketClient::set_hostname_addr_map( + std::map addr_map) { + addr_map_ = std::move(addr_map); +} + +#ifdef CPPHTTPLIB_SSL_ENABLED + +inline void WebSocketClient::set_ca_cert_path(const std::string &path) { + ca_cert_file_path_ = path; +} + +inline void WebSocketClient::set_ca_cert_store(tls::ca_store_t store) { + if (store && tls_ctx_) { + // set_ca_store takes ownership of store + tls::set_ca_store(tls_ctx_, store); + custom_ca_loaded_ = true; + } else if (store) { + tls::free_ca_store(store); + } +} + +inline void WebSocketClient::load_ca_cert_store(const char *ca_cert, + std::size_t size) { + if (tls_ctx_ && ca_cert && size > 0) { + tls::load_ca_pem(tls_ctx_, ca_cert, size); + custom_ca_loaded_ = true; + } +} + +inline void +WebSocketClient::enable_server_certificate_verification(bool enabled) { + server_certificate_verification_ = enabled; +} + +inline void WebSocketClient::enable_system_ca(bool enabled) { + system_ca_mode_ = enabled ? SystemCAMode::Enabled : SystemCAMode::Disabled; +} + +#endif // CPPHTTPLIB_SSL_ENABLED + +} // namespace ws + +// ---------------------------------------------------------------------------- + +} // namespace httplib + +#endif // CPPHTTPLIB_HTTPLIB_H