From 429719b91df34ea91c1b4d687bdfb3cedb833050 Mon Sep 17 00:00:00 2001 From: Justin Kotalik Date: Wed, 12 Dec 2018 16:59:44 -0500 Subject: [PATCH 01/10] Make IISIntegration use Reference instead of PackageReference (and reactionary work) (#4311) --- .azure/pipelines/ci.yml | 6 +- .azure/pipelines/jobs/iisintegration-job.yml | 8 +- .gitignore | 1 + build/artifacts.props | 3 +- build/buildorder.props | 1 - build/repo.props | 4 +- build/submodules.props | 1 - eng/Baseline.Designer.props | 19 + eng/Baseline.xml | 1 + eng/Dependencies.props | 7 +- eng/ProjectReferences.props | 1 + eng/targets/Cpp.Common.targets | 2 + src/IISIntegration/Directory.Build.props | 23 - src/IISIntegration/Directory.Build.targets | 7 - src/IISIntegration/IISIntegration.sln | 300 -- src/IISIntegration/README.md | 3 - src/IISIntegration/build.cmd | 3 - src/IISIntegration/build.sh | 7 - src/IISIntegration/build/build.msbuild | 31 - src/IISIntegration/build/dependencies.props | 55 - src/IISIntegration/build/launchSettings.json | 37 - src/IISIntegration/build/repo.props | 26 - src/IISIntegration/build/repo.targets | 84 - src/IISIntegration/build/sources.props | 17 - src/IISIntegration/build/testsite.props | 92 - src/IISIntegration/korebuild.json | 17 - src/IISIntegration/nuget/AspNetCoreV1.nuspec | 29 - src/IISIntegration/nuget/AspNetCoreV2.nuspec | 31 - .../samples/IISSample/IISSample.csproj | 15 - .../IISSample/Properties/launchSettings.json | 28 - .../NativeIISSample/NativeIISSample.csproj | 20 - .../Properties/launchSettings.json | 37 - .../samples/NativeIISSample/Startup.cs | 88 - .../samples/NativeIISSample/web.config | 9 - .../AspNetCore/AspNetCore.vcxproj | 260 -- .../AspNetCore/Inc/applicationinfo.h | 251 -- .../AspNetCore/Inc/applicationmanager.h | 154 - .../AspNetCore/Inc/appoffline.h | 101 - .../AspNetCore/Inc/filewatcher.h | 127 - .../AspNetCore/Inc/fx_ver.h | 49 - .../AspNetCore/Inc/globalmodule.h | 37 - .../AspNetCore/Inc/proxymodule.h | 64 - .../AspNetCoreModuleV2/AspNetCore/Source.def | 4 - .../AspNetCoreModuleV2/AspNetCore/ancm.mof | 208 -- .../AspNetCore/aspnetcore_schema.xml | 47 - .../AspNetCore/aspnetcoremodule.rc | 120 - .../AspNetCore/src/applicationinfo.cpp | 650 ---- .../AspNetCore/src/applicationmanager.cxx | 458 --- .../AspNetCore/src/dllmain.cpp | 254 -- .../AspNetCore/src/filewatcher.cxx | 497 --- .../AspNetCore/src/globalmodule.cpp | 65 - .../AspNetCore/src/precomp.hxx | 159 - .../AspNetCore/src/proxymodule.cxx | 211 -- .../CommonLib/CommonLib.vcxproj | 226 -- .../CommonLib/SRWLockWrapper.cpp | 13 - .../CommonLib/SRWLockWrapper.h | 9 - .../CommonLib/application.cpp | 50 - .../CommonLib/application.h | 53 - .../CommonLib/aspnetcore_msg.mc | 217 -- .../CommonLib/aspnetcoreconfig.cxx | 609 ---- .../CommonLib/aspnetcoreconfig.h | 332 -- .../AspNetCoreModuleV2/CommonLib/debugutil.h | 81 - .../CommonLib/environmentvariablehash.h | 131 - .../AspNetCoreModuleV2/CommonLib/fx_ver.cxx | 192 -- .../src/AspNetCoreModuleV2/CommonLib/fx_ver.h | 46 - .../CommonLib/hostfxr_utility.cpp | 807 ----- .../CommonLib/hostfxr_utility.h | 78 - .../CommonLib/requesthandler.cxx | 44 - .../CommonLib/requesthandler.h | 59 - .../AspNetCoreModuleV2/CommonLib/resources.h | 47 - .../AspNetCoreModuleV2/CommonLib/stdafx.cpp | 4 - .../src/AspNetCoreModuleV2/CommonLib/stdafx.h | 34 - .../AspNetCoreModuleV2/CommonLib/targetver.h | 8 - .../AspNetCoreModuleV2/CommonLib/utility.cxx | 656 ---- .../AspNetCoreModuleV2/CommonLib/utility.h | 137 - .../AspNetCoreModuleV2/IISLib/IISLib.vcxproj | 201 -- .../src/AspNetCoreModuleV2/IISLib/acache.cxx | 443 --- .../src/AspNetCoreModuleV2/IISLib/acache.h | 115 - .../src/AspNetCoreModuleV2/IISLib/ahutil.cpp | 1671 ---------- .../src/AspNetCoreModuleV2/IISLib/ahutil.h | 258 -- .../src/AspNetCoreModuleV2/IISLib/base64.cpp | 482 --- .../src/AspNetCoreModuleV2/IISLib/base64.h | 42 - .../src/AspNetCoreModuleV2/IISLib/buffer.h | 271 -- .../src/AspNetCoreModuleV2/IISLib/datetime.h | 14 - .../src/AspNetCoreModuleV2/IISLib/dbgutil.h | 102 - .../src/AspNetCoreModuleV2/IISLib/hashfn.h | 325 -- .../src/AspNetCoreModuleV2/IISLib/hashtable.h | 666 ---- .../src/AspNetCoreModuleV2/IISLib/listentry.h | 163 - .../src/AspNetCoreModuleV2/IISLib/macros.h | 63 - .../src/AspNetCoreModuleV2/IISLib/multisz.cpp | 474 --- .../src/AspNetCoreModuleV2/IISLib/multisz.h | 225 -- .../AspNetCoreModuleV2/IISLib/multisza.cpp | 408 --- .../src/AspNetCoreModuleV2/IISLib/multisza.h | 226 -- .../src/AspNetCoreModuleV2/IISLib/ntassert.h | 32 - .../src/AspNetCoreModuleV2/IISLib/percpu.h | 305 -- .../src/AspNetCoreModuleV2/IISLib/precomp.h | 22 - .../src/AspNetCoreModuleV2/IISLib/prime.h | 85 - .../src/AspNetCoreModuleV2/IISLib/pudebug.h | 736 ----- .../src/AspNetCoreModuleV2/IISLib/reftrace.c | 229 -- .../src/AspNetCoreModuleV2/IISLib/reftrace.h | 87 - .../src/AspNetCoreModuleV2/IISLib/rwlock.h | 193 -- .../src/AspNetCoreModuleV2/IISLib/stringa.cpp | 1767 ----------- .../src/AspNetCoreModuleV2/IISLib/stringa.h | 515 --- .../src/AspNetCoreModuleV2/IISLib/stringu.cpp | 1271 -------- .../src/AspNetCoreModuleV2/IISLib/stringu.h | 427 --- .../src/AspNetCoreModuleV2/IISLib/tracelog.c | 235 -- .../src/AspNetCoreModuleV2/IISLib/tracelog.h | 105 - .../src/AspNetCoreModuleV2/IISLib/treehash.h | 850 ----- .../src/AspNetCoreModuleV2/IISLib/util.cxx | 78 - .../RequestHandler/RequestHandler.vcxproj | 259 -- .../RequestHandler/Source.def | 6 - .../RequestHandler/aspnetcore_event.h | 550 ---- .../RequestHandler/disconnectcontext.h | 78 - .../RequestHandler/dllmain.cxx | 369 --- .../environmentvariablehelpers.h | 421 --- .../inprocess/inprocessapplication.cpp | 986 ------ .../inprocess/inprocessapplication.h | 191 -- .../inprocess/inprocesshandler.cpp | 136 - .../inprocess/inprocesshandler.h | 72 - .../RequestHandler/managedexports.cxx | 450 --- .../outofprocess/forwarderconnection.cxx | 52 - .../outofprocess/forwarderconnection.h | 157 - .../outofprocess/forwardinghandler.cpp | 2747 ----------------- .../outofprocess/forwardinghandler.h | 233 -- .../outofprocess/outprocessapplication.cpp | 78 - .../outofprocess/outprocessapplication.h | 30 - .../outofprocess/processmanager.cxx | 274 -- .../outofprocess/processmanager.h | 195 -- .../outofprocess/protocolconfig.cxx | 48 - .../outofprocess/protocolconfig.h | 103 - .../outofprocess/responseheaderhash.cxx | 98 - .../outofprocess/responseheaderhash.h | 108 - .../outofprocess/serverprocess.cxx | 2148 ------------- .../outofprocess/serverprocess.h | 279 -- .../outofprocess/websockethandler.cxx | 1151 ------- .../outofprocess/websockethandler.h | 225 -- .../outofprocess/winhttphelper.cxx | 176 -- .../outofprocess/winhttphelper.h | 91 - .../RequestHandler/precomp.hxx | 120 - .../RequestHandler/requesthandler.rc | 119 - .../RequestHandler/sttimer.h | 279 -- src/IISIntegration/src/Directory.Build.props | 7 - ...ft.AspNetCore.Server.IISIntegration.csproj | 33 - .../AspNetCoreModuleTests.vcxproj | 184 -- .../test/AspNetCoreModuleTests/stdafx.h | 56 - src/IISIntegration/test/Directory.Build.props | 14 - .../IISIntegration.FunctionalTests.csproj | 29 - ...xpressSupportsInProcessHostingAttribute.cs | 62 - .../Utilities/IISTestSiteCollection.cs | 16 - .../Utilities/IISTestSiteFixture.cs | 53 - ...NetCore.Server.IISIntegration.Tests.csproj | 18 - .../test/TestTasks/InjectRequestHandler.cs | 62 - .../test/TestTasks/TestTasks.csproj | 12 - .../InProcessWebSite/InProcessWebSite.csproj | 21 - .../test/WebSites/InProcessWebSite/Program.cs | 26 - .../Properties/launchSettings.json | 37 - .../test/WebSites/InProcessWebSite/Startup.cs | 684 ---- .../test/WebSites/InProcessWebSite/web.config | 16 - .../OutOfProcessWebSite.csproj | 22 - .../Properties/launchSettings.json | 37 - .../OverriddenServerWebSite.csproj | 17 - .../OverriddenServerWebSite/Program.cs | 48 - .../Properties/launchSettings.json | 37 - .../OverriddenServerWebSite/web.config | 9 - .../WebSites/StressTestWebSite/Program.cs | 26 - .../Properties/launchSettings.json | 37 - .../WebSites/StressTestWebSite/Startup.cs | 231 -- .../StressTestWebSite.csproj | 19 - .../StressTestWebSite/WebSockets/Constants.cs | 17 - .../WebSockets/HandshakeHelpers.cs | 42 - src/IISIntegration/version.props | 18 - .../test/FunctionalTests/HttpsTests.cs | 2 +- .../IIS}/.gitignore | 7 +- src/Servers/IIS/IISIntegration.sln | 163 + .../IIS}/LICENSE.txt | 0 .../IIS}/NuGetPackageVerifier.json | 1 - .../IIS}/NuGetPackageVerifier.xplat.json | 0 .../IIS}/build/Build.Settings | 24 +- .../IIS}/build/Config.Definitions.Props | 0 .../IIS}/build/applicationhost.config | 0 .../IIS}/build/applicationhost.iis.config | 0 src/Servers/IIS/build/build.msbuild | 6 + .../IIS}/build/native.targets | 1 - src/Servers/IIS/build/testsite.props | 44 + .../IIS/samples/IISSample/IISSample.csproj | 15 + .../IIS}/samples/IISSample/Startup.cs | 0 .../IIS}/samples/IISSample/web.config | 0 .../AspNetCore/AspNetCore.vcxproj | 1 + .../AspNetCore/Inc/application.h | 0 .../AspNetCore/Inc/applicationmanager.h | 0 .../AspNetCore/Inc/aspnetcoreconfig.h | 0 .../AspNetCore/Inc/debugutil.h | 0 .../AspNetCore/Inc/environmentvariablehash.h | 0 .../AspNetCore/Inc/filewatcher.h | 0 .../AspNetCore/Inc/forwarderconnection.h | 0 .../AspNetCore/Inc/forwardinghandler.h | 0 .../AspNetCoreModuleV1/AspNetCore/Inc/path.h | 0 .../AspNetCore/Inc/processmanager.h | 0 .../AspNetCore/Inc/protocolconfig.h | 0 .../AspNetCore/Inc/proxymodule.h | 0 .../AspNetCore/Inc/resource.h | 0 .../AspNetCore/Inc/responseheaderhash.h | 0 .../AspNetCore/Inc/serverprocess.h | 0 .../AspNetCore/Inc/sttimer.h | 0 .../AspNetCore/Inc/websockethandler.h | 0 .../AspNetCore/Inc/winhttphelper.h | 0 .../AspNetCoreModuleV1/AspNetCore/Source.def | 0 .../AspNetCore/aspnetcore_msg.h | 129 + .../AspNetCore/aspnetcore_msg.mc | 0 .../AspNetCore}/aspnetcore_msg.rc | 0 .../AspNetCore/aspnetcore_schema.xml | 0 .../AspNetCore/aspnetcoremodule.rc | 0 .../AspNetCoreModuleV1/AspNetCore/resource.h | 2 +- .../AspNetCore/src/application.cxx | 0 .../AspNetCore/src/applicationmanager.cxx | 0 .../AspNetCore/src/aspnetcoreconfig.cxx | 0 .../AspNetCore/src/filewatcher.cxx | 0 .../AspNetCore/src/forwarderconnection.cxx | 0 .../AspNetCore/src/forwardinghandler.cxx | 0 .../AspNetCore/src/main.cxx | 0 .../AspNetCore/src/path.cxx | 0 .../AspNetCore/src/precomp.hxx | 0 .../AspNetCore/src/processmanager.cxx | 0 .../AspNetCore/src/protocolconfig.cxx | 0 .../AspNetCore/src/proxymodule.cxx | 0 .../AspNetCore/src/responseheaderhash.cxx | 0 .../AspNetCore/src/serverprocess.cxx | 0 .../AspNetCore/src/websockethandler.cxx | 0 .../AspNetCore/src/winhttphelper.cxx | 0 .../AspNetCoreModuleV1/IISLib/IISLib.vcxproj | 3 + .../src/AspNetCoreModuleV1/IISLib/acache.cxx | 0 .../src/AspNetCoreModuleV1/IISLib/acache.h | 0 .../src/AspNetCoreModuleV1/IISLib/ahutil.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/ahutil.h | 0 .../src/AspNetCoreModuleV1/IISLib/base64.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/base64.h | 0 .../src/AspNetCoreModuleV1/IISLib/buffer.h | 0 .../src/AspNetCoreModuleV1/IISLib/datetime.h | 0 .../src/AspNetCoreModuleV1/IISLib/dbgutil.h | 0 .../src/AspNetCoreModuleV1/IISLib/hashfn.h | 0 .../src/AspNetCoreModuleV1/IISLib/hashtable.h | 0 .../src/AspNetCoreModuleV1/IISLib/listentry.h | 0 .../src/AspNetCoreModuleV1/IISLib/macros.h | 0 .../src/AspNetCoreModuleV1/IISLib/multisz.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/multisz.h | 0 .../AspNetCoreModuleV1/IISLib/multisza.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/multisza.h | 0 .../src/AspNetCoreModuleV1/IISLib/ntassert.h | 0 .../src/AspNetCoreModuleV1/IISLib/percpu.h | 0 .../src/AspNetCoreModuleV1/IISLib/precomp.h | 0 .../src/AspNetCoreModuleV1/IISLib/prime.h | 0 .../src/AspNetCoreModuleV1/IISLib/pudebug.h | 0 .../src/AspNetCoreModuleV1/IISLib/reftrace.c | 0 .../src/AspNetCoreModuleV1/IISLib/reftrace.h | 0 .../src/AspNetCoreModuleV1/IISLib/rwlock.h | 0 .../src/AspNetCoreModuleV1/IISLib/stringa.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/stringa.h | 0 .../src/AspNetCoreModuleV1/IISLib/stringu.cpp | 0 .../src/AspNetCoreModuleV1/IISLib/stringu.h | 0 .../src/AspNetCoreModuleV1/IISLib/tracelog.c | 0 .../src/AspNetCoreModuleV1/IISLib/tracelog.h | 0 .../src/AspNetCoreModuleV1/IISLib/treehash.h | 0 .../src/AspNetCoreModuleV1/IISLib/util.cxx | 0 .../Directory.Build.targets | 34 + ...icrosoft.AspNetCore.AspNetCoreModule.props | 4 +- ...soft.AspNetCore.AspNetCoreModuleV1.pkgproj | 36 + .../lib/netcoreapp2.1/_._ | 0 .../AuthenticationHandler.cs | 0 .../ForwardedTlsConnectionFeature.cs | 0 .../IISDefaults.cs | 0 .../IISHostingStartup.cs | 0 .../IISMiddleware.cs | 0 .../IISOptions.cs | 0 .../IISSetupFilter.cs | 0 ...ft.AspNetCore.Server.IISIntegration.csproj | 42 + .../NativeMethods.cs | 1 + .../Properties/AssemblyInfo.cs | 0 .../WebHostBuilderIISExtensions.cs | 0 .../baseline.netcore.json | 0 .../AppHostConfig/Http.config | 0 .../AppHostConfig/Https.config | 0 .../AppHostConfig/NtlmAuthentation.config | 0 .../WebsocketsNotSupported.config | 0 .../IISIntegration.FunctionalTests.csproj | 20 + .../OutOfProcess/HelloWorldTest.cs | 18 +- .../OutOfProcess/HttpsTest.cs | 52 +- .../OutOfProcess/NtlmAuthentationTest.cs | 20 +- .../Properties/AssemblyInfo.cs | 1 - .../UpgradeFeatureDetectionTests.cs | 10 - .../Utilities/Helpers.cs | 8 +- .../IISExtensionTests.cs | 0 .../IISMiddlewareTests.cs | 0 ...NetCore.Server.IISIntegration.Tests.csproj | 15 + .../OutOfProcessWebSite.csproj | 18 + .../OutOfProcessWebSite/Program.cs | 0 .../OutOfProcessWebSite/StartupHelloWorld.cs | 0 .../StartupHttpsHelloWorld.cs | 0 .../StartupNtlmAuthentication.cs | 2 - .../StartupUpgradeFeatureDetection.cs | 0 .../OutOfProcessWebSite/web.config | 0 .../IIS}/tools/SetupTestEnvironment.ps1 | 0 .../tools/UpdateIISExpressCertificate.ps1 | 0 .../IIS}/tools/certificate.ps1 | 0 .../IIS}/tools/httpsys.ps1 | 0 .../IIS}/tools/installancm.ps1 | 0 .../IIS}/tools/stresstest.ps1 | 0 .../IIS}/tools/update_schema.ps1 | 0 version.props | 6 + 308 files changed, 626 insertions(+), 35826 deletions(-) delete mode 100644 src/IISIntegration/Directory.Build.props delete mode 100644 src/IISIntegration/Directory.Build.targets delete mode 100644 src/IISIntegration/IISIntegration.sln delete mode 100644 src/IISIntegration/README.md delete mode 100644 src/IISIntegration/build.cmd delete mode 100644 src/IISIntegration/build.sh delete mode 100644 src/IISIntegration/build/build.msbuild delete mode 100644 src/IISIntegration/build/dependencies.props delete mode 100644 src/IISIntegration/build/launchSettings.json delete mode 100644 src/IISIntegration/build/repo.props delete mode 100644 src/IISIntegration/build/repo.targets delete mode 100644 src/IISIntegration/build/sources.props delete mode 100644 src/IISIntegration/build/testsite.props delete mode 100644 src/IISIntegration/korebuild.json delete mode 100644 src/IISIntegration/nuget/AspNetCoreV1.nuspec delete mode 100644 src/IISIntegration/nuget/AspNetCoreV2.nuspec delete mode 100644 src/IISIntegration/samples/IISSample/IISSample.csproj delete mode 100644 src/IISIntegration/samples/IISSample/Properties/launchSettings.json delete mode 100644 src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj delete mode 100644 src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json delete mode 100644 src/IISIntegration/samples/NativeIISSample/Startup.cs delete mode 100644 src/IISIntegration/samples/NativeIISSample/web.config delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/appoffline.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/filewatcher.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/globalmodule.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/proxymodule.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema.xml delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/dllmain.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/filewatcher.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/globalmodule.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/environmentvariablehash.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/pudebug.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/Source.def delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/aspnetcore_event.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/disconnectcontext.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/environmentvariablehelpers.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.h delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/requesthandler.rc delete mode 100644 src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/sttimer.h delete mode 100644 src/IISIntegration/src/Directory.Build.props delete mode 100644 src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj delete mode 100644 src/IISIntegration/test/AspNetCoreModuleTests/AspNetCoreModuleTests.vcxproj delete mode 100644 src/IISIntegration/test/AspNetCoreModuleTests/stdafx.h delete mode 100644 src/IISIntegration/test/Directory.Build.props delete mode 100644 src/IISIntegration/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj delete mode 100644 src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISExpressSupportsInProcessHostingAttribute.cs delete mode 100644 src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteCollection.cs delete mode 100644 src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteFixture.cs delete mode 100644 src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj delete mode 100644 src/IISIntegration/test/TestTasks/InjectRequestHandler.cs delete mode 100644 src/IISIntegration/test/TestTasks/TestTasks.csproj delete mode 100644 src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj delete mode 100644 src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs delete mode 100644 src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json delete mode 100644 src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs delete mode 100644 src/IISIntegration/test/WebSites/InProcessWebSite/web.config delete mode 100644 src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj delete mode 100644 src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json delete mode 100644 src/IISIntegration/test/WebSites/OverriddenServerWebSite/OverriddenServerWebSite.csproj delete mode 100644 src/IISIntegration/test/WebSites/OverriddenServerWebSite/Program.cs delete mode 100644 src/IISIntegration/test/WebSites/OverriddenServerWebSite/Properties/launchSettings.json delete mode 100644 src/IISIntegration/test/WebSites/OverriddenServerWebSite/web.config delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/Constants.cs delete mode 100644 src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/HandshakeHelpers.cs delete mode 100644 src/IISIntegration/version.props rename src/{IISIntegration => Servers/IIS}/.gitignore (97%) create mode 100644 src/Servers/IIS/IISIntegration.sln rename src/{IISIntegration => Servers/IIS}/LICENSE.txt (100%) rename src/{IISIntegration => Servers/IIS}/NuGetPackageVerifier.json (80%) rename src/{IISIntegration => Servers/IIS}/NuGetPackageVerifier.xplat.json (100%) rename src/{IISIntegration => Servers/IIS}/build/Build.Settings (92%) rename src/{IISIntegration => Servers/IIS}/build/Config.Definitions.Props (100%) rename src/{IISIntegration => Servers/IIS}/build/applicationhost.config (100%) rename src/{IISIntegration => Servers/IIS}/build/applicationhost.iis.config (100%) create mode 100644 src/Servers/IIS/build/build.msbuild rename src/{IISIntegration => Servers/IIS}/build/native.targets (99%) create mode 100644 src/Servers/IIS/build/testsite.props create mode 100644 src/Servers/IIS/samples/IISSample/IISSample.csproj rename src/{IISIntegration => Servers/IIS}/samples/IISSample/Startup.cs (100%) rename src/{IISIntegration => Servers/IIS}/samples/IISSample/web.config (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj (99%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/Source.def (100%) create mode 100644 src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.h rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc (100%) rename src/{IISIntegration/src/AspNetCoreModuleV2/CommonLib => Servers/IIS/src/AspNetCoreModuleV1/AspNetCore}/aspnetcore_msg.rc (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_schema.xml (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/resource.h (99%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj (99%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/acache.cxx (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/acache.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/ahutil.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/ahutil.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/base64.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/base64.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/buffer.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/datetime.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/dbgutil.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/hashfn.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/hashtable.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/listentry.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/macros.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/multisz.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/multisz.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/multisza.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/multisza.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/ntassert.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/percpu.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/precomp.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/prime.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/pudebug.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/reftrace.c (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/reftrace.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/rwlock.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/stringa.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/stringa.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/stringu.cpp (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/stringu.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/tracelog.c (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/tracelog.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/treehash.h (100%) rename src/{IISIntegration => Servers/IIS}/src/AspNetCoreModuleV1/IISLib/util.cxx (100%) create mode 100644 src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Directory.Build.targets rename src/{IISIntegration/nuget => Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1}/Microsoft.AspNetCore.AspNetCoreModule.props (53%) create mode 100644 src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModuleV1.pkgproj create mode 100644 src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/lib/netcoreapp2.1/_._ rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs (100%) create mode 100644 src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs (92%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs (100%) rename src/{IISIntegration => Servers/IIS}/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json (100%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/AppHostConfig/Http.config (100%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/AppHostConfig/Https.config (100%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/AppHostConfig/NtlmAuthentation.config (100%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/AppHostConfig/WebsocketsNotSupported.config (100%) create mode 100644 src/Servers/IIS/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs (89%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs (85%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs (92%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs (76%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs (90%) rename src/{IISIntegration => Servers/IIS}/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs (90%) rename src/{IISIntegration => Servers/IIS}/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs (100%) rename src/{IISIntegration => Servers/IIS}/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs (100%) create mode 100644 src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj create mode 100644 src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/Program.cs (100%) rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/StartupHelloWorld.cs (100%) rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/StartupHttpsHelloWorld.cs (100%) rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/StartupNtlmAuthentication.cs (96%) rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/StartupUpgradeFeatureDetection.cs (100%) rename src/{IISIntegration/test/WebSites => Servers/IIS/test/testassets}/OutOfProcessWebSite/web.config (100%) rename src/{IISIntegration => Servers/IIS}/tools/SetupTestEnvironment.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/UpdateIISExpressCertificate.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/certificate.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/httpsys.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/installancm.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/stresstest.ps1 (100%) rename src/{IISIntegration => Servers/IIS}/tools/update_schema.ps1 (100%) diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml index a0c24b2d15..7126baae5c 100644 --- a/.azure/pipelines/ci.yml +++ b/.azure/pipelines/ci.yml @@ -14,9 +14,5 @@ jobs: jobDisplayName: "Build and test: Windows" agentOs: Windows beforeBuild: - - powershell: "& ./src/IISIntegration/tools/UpdateIISExpressCertificate.ps1" + - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1" displayName: Setup IISExpress test certificates -- template: jobs/iisintegration-job.yml - parameters: - variables: - _FolderName: IISIntegration diff --git a/.azure/pipelines/jobs/iisintegration-job.yml b/.azure/pipelines/jobs/iisintegration-job.yml index 14c40ebb44..d5b45efca2 100644 --- a/.azure/pipelines/jobs/iisintegration-job.yml +++ b/.azure/pipelines/jobs/iisintegration-job.yml @@ -4,10 +4,10 @@ jobs: jobName: 'IISIntegration' jobDisplayName: 'IISIntegration' beforeBuild: - - powershell: "& ./src/IISIntegration/tools/UpdateIISExpressCertificate.ps1; & ./src/IISIntegration/tools/SetupTestEnvironment.ps1 Setup" + - powershell: "& ./src/servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/servers/IIS/tools/SetupTestEnvironment.ps1 Setup" displayName: Prepare repo afterBuild: - - powershell: "& ./src/IISIntegration/tools/SetupTestEnvironment.ps1 Shutdown" + - powershell: "& ./src/servers/IIS/tools/SetupTestEnvironment.ps1 Shutdown" displayName: Stop AppVerifier condition: always() - task: PublishBuildArtifacts@1 @@ -16,5 +16,5 @@ jobs: inputs: artifactName: logs artifactType: Container - pathtoPublish: src/IISIntegration/artifacts/logs - buildDirectory: src/IISIntegration + pathtoPublish: src/servers/IIS/artifacts/logs + buildDirectory: src/servers/IIS diff --git a/.gitignore b/.gitignore index 39bacfa7c7..d022b0a7df 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,4 @@ scripts/tmp/ .tools/ launchSettings.json korebuild-lock.txt +.gradle/ diff --git a/build/artifacts.props b/build/artifacts.props index 07df0a68e1..9fc0515f87 100644 --- a/build/artifacts.props +++ b/build/artifacts.props @@ -30,8 +30,7 @@ - - + diff --git a/build/buildorder.props b/build/buildorder.props index 21999af70f..2338a88d73 100644 --- a/build/buildorder.props +++ b/build/buildorder.props @@ -9,7 +9,6 @@ - diff --git a/build/repo.props b/build/repo.props index 35e1ed077b..4ee59e96d7 100644 --- a/build/repo.props +++ b/build/repo.props @@ -64,6 +64,7 @@ $(RepositoryRoot)src\Tools\dotnet-watch\test\TestProjects\**\*.csproj " /> + - diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index 03f9802505..c7b8c6bc76 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -296,6 +296,25 @@ + + + 2.1.2 + + + + + + + + + + + + + + + + 2.1.1 diff --git a/eng/Baseline.xml b/eng/Baseline.xml index dc0f2f0b13..4886e244a3 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -43,6 +43,7 @@ + diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 836b443038..b7b342f0e7 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -36,6 +36,7 @@ + @@ -48,12 +49,16 @@ + + - + + + diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index bb785afb7d..0b3bc1f6aa 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -32,6 +32,7 @@ + diff --git a/eng/targets/Cpp.Common.targets b/eng/targets/Cpp.Common.targets index f2cad0d8c0..b81c4e8069 100644 --- a/eng/targets/Cpp.Common.targets +++ b/eng/targets/Cpp.Common.targets @@ -3,4 +3,6 @@ + + diff --git a/src/IISIntegration/Directory.Build.props b/src/IISIntegration/Directory.Build.props deleted file mode 100644 index 5a07124cb6..0000000000 --- a/src/IISIntegration/Directory.Build.props +++ /dev/null @@ -1,23 +0,0 @@ - - - - - - - - - Microsoft ASP.NET Core - https://github.com/aspnet/AspNetCore - git - $(MSBuildThisFileDirectory) - $(MSBuildThisFileDirectory)..\..\eng\AspNetCore.snk - true - true - true - - false - - - diff --git a/src/IISIntegration/Directory.Build.targets b/src/IISIntegration/Directory.Build.targets deleted file mode 100644 index 53b3f6e1da..0000000000 --- a/src/IISIntegration/Directory.Build.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - $(MicrosoftNETCoreApp20PackageVersion) - $(MicrosoftNETCoreApp21PackageVersion) - $(NETStandardLibrary20PackageVersion) - - diff --git a/src/IISIntegration/IISIntegration.sln b/src/IISIntegration/IISIntegration.sln deleted file mode 100644 index 90a9a25db7..0000000000 --- a/src/IISIntegration/IISIntegration.sln +++ /dev/null @@ -1,300 +0,0 @@ - -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27130.2036 -MinimumVisualStudioVersion = 15.0.26730.03 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04B1EDB6-E967-4D25-89B9-E6F8304038CD}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0EF45656-B25D-40D8-959C-726EAF185E60}" - ProjectSection(SolutionItems) = preProject - .editorconfig = .editorconfig - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - NuGet.Config = NuGet.Config - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{EF30B533-D715-421A-92B7-92FEF460AC9C}" - ProjectSection(SolutionItems) = preProject - test\Directory.Build.props = test\Directory.Build.props - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C74B8F36-FD2F-45C9-9B8A-00E7CF0126A9}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IISSample", "samples\IISSample\IISSample.csproj", "{E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{8B3446E8-E6A8-4591-AA63-A95837C6E97C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration.Tests", "test\Microsoft.AspNetCore.Server.IISIntegration.Tests\Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj", "{4106DB10-E09F-480E-9CE6-B39235512EE6}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OutOfProcessWebSite", "test\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj", "{F54715C3-88D8-49E3-A291-C13570FE81FC}" - ProjectSection(ProjectDependencies) = postProject - {D57EA297-6DC2-4BC0-8C91-334863327863} = {D57EA297-6DC2-4BC0-8C91-334863327863} - {439824F9-1455-4CC4-BD79-B44FA0A16552} = {439824F9-1455-4CC4-BD79-B44FA0A16552} - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{7E80C58E-9CC8-450C-8A8D-94FC76428150}" - ProjectSection(SolutionItems) = preProject - build\applicationhost.config = build\applicationhost.config - build\applicationhost.iis.config = build\applicationhost.iis.config - build\dependencies.props = build\dependencies.props - build\native.targets = build\native.targets - build\repo.props = build\repo.props - build\testsite.props = build\testsite.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IISIntegration.FunctionalTests", "test\IISIntegration.FunctionalTests\IISIntegration.FunctionalTests.csproj", "{4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NativeIISSample", "samples\NativeIISSample\NativeIISSample.csproj", "{9BC4AFCB-325D-4C81-8228-8CF301CE2F97}" - ProjectSection(ProjectDependencies) = postProject - {D57EA297-6DC2-4BC0-8C91-334863327863} = {D57EA297-6DC2-4BC0-8C91-334863327863} - {439824F9-1455-4CC4-BD79-B44FA0A16552} = {439824F9-1455-4CC4-BD79-B44FA0A16552} - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "InProcessWebSite", "test\WebSites\InProcessWebSite\InProcessWebSite.csproj", "{679FA2A2-898B-4320-884E-C2D294A97CE1}" - ProjectSection(ProjectDependencies) = postProject - {D57EA297-6DC2-4BC0-8C91-334863327863} = {D57EA297-6DC2-4BC0-8C91-334863327863} - {439824F9-1455-4CC4-BD79-B44FA0A16552} = {439824F9-1455-4CC4-BD79-B44FA0A16552} - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StressTestWebSite", "test\WebSites\StressTestWebSite\StressTestWebSite.csproj", "{13FD8F12-FFBE-4D01-B4AC-444F2994B04F}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "TestTasks", "test\TestTasks\TestTasks.csproj", "{064D860B-4D7C-4B1D-918F-E020F1B99E2A}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "WebSites", "WebSites", "{744ACDC6-F6A0-4FF9-9421-F25C5F2DC520}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OverriddenServerWebSite", "test\WebSites\OverriddenServerWebSite\OverriddenServerWebSite.csproj", "{FC2A97F8-A749-4C04-97D1-97500066A820}" - ProjectSection(ProjectDependencies) = postProject - {D57EA297-6DC2-4BC0-8C91-334863327863} = {D57EA297-6DC2-4BC0-8C91-334863327863} - {439824F9-1455-4CC4-BD79-B44FA0A16552} = {439824F9-1455-4CC4-BD79-B44FA0A16552} - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AspNetCoreModuleV1", "AspNetCoreModuleV1", "{16E521CE-77F1-4B1C-A183-520A41C4F372}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AspNetCoreModuleV2", "AspNetCoreModuleV2", "{06CA2C2B-83B0-4D83-905A-E0C74790009E}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IISLib", "src\AspNetCoreModuleV1\IISLib\IISLib.vcxproj", "{4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AspNetCore", "src\AspNetCoreModuleV1\AspNetCore\AspNetCore.vcxproj", "{439824F9-1455-4CC4-BD79-B44FA0A16552}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AspNetCore", "src\AspNetCoreModuleV2\AspNetCore\AspNetCore.vcxproj", "{EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CommonLib", "src\AspNetCoreModuleV2\CommonLib\CommonLib.vcxproj", "{55494E58-E061-4C4C-A0A8-837008E72F85}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IISLib", "src\AspNetCoreModuleV2\IISLib\IISLib.vcxproj", "{09D9D1D6-2951-4E14-BC35-76A23CF9391A}" -EndProject -Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "RequestHandler", "src\AspNetCoreModuleV2\RequestHandler\RequestHandler.vcxproj", "{D57EA297-6DC2-4BC0-8C91-334863327863}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Debug|x64 = Debug|x64 - Debug|x86 = Debug|x86 - Release|Any CPU = Release|Any CPU - Release|x64 = Release|x64 - Release|x86 = Release|x86 - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.Build.0 = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.ActiveCfg = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.Build.0 = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.ActiveCfg = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.Build.0 = Debug|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.ActiveCfg = Release|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.Build.0 = Release|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.ActiveCfg = Release|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.Build.0 = Release|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.ActiveCfg = Release|Any CPU - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.Build.0 = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.Build.0 = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.ActiveCfg = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.Build.0 = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.ActiveCfg = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.Build.0 = Debug|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.ActiveCfg = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.Build.0 = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.ActiveCfg = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.Build.0 = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.ActiveCfg = Release|Any CPU - {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.Build.0 = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.ActiveCfg = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.Build.0 = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.ActiveCfg = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.Build.0 = Debug|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.Build.0 = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.ActiveCfg = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.Build.0 = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.ActiveCfg = Release|Any CPU - {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.Build.0 = Release|Any CPU - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|Any CPU.ActiveCfg = Debug|x86 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.ActiveCfg = Debug|x64 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.Build.0 = Debug|x64 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.ActiveCfg = Debug|x86 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.Build.0 = Debug|x86 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|Any CPU.ActiveCfg = Release|x86 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.ActiveCfg = Release|x64 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.Build.0 = Release|x64 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.ActiveCfg = Release|x86 - {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.Build.0 = Release|x86 - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.ActiveCfg = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.Build.0 = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.ActiveCfg = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.Build.0 = Debug|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.Build.0 = Release|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.ActiveCfg = Release|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.Build.0 = Release|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.ActiveCfg = Release|Any CPU - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.Build.0 = Release|Any CPU - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|Any CPU.ActiveCfg = Debug|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|Any CPU.Build.0 = Debug|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|x64.ActiveCfg = Debug|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|x64.Build.0 = Debug|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|x86.ActiveCfg = Debug|x86 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Debug|x86.Build.0 = Debug|x86 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|Any CPU.ActiveCfg = Release|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|Any CPU.Build.0 = Release|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|x64.ActiveCfg = Release|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|x64.Build.0 = Release|x64 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|x86.ActiveCfg = Release|x86 - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97}.Release|x86.Build.0 = Release|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Debug|Any CPU.ActiveCfg = Debug|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Debug|x64.ActiveCfg = Debug|x64 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Debug|x64.Build.0 = Debug|x64 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Debug|x86.ActiveCfg = Debug|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Debug|x86.Build.0 = Debug|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Release|Any CPU.ActiveCfg = Release|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Release|x64.ActiveCfg = Release|x64 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Release|x64.Build.0 = Release|x64 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Release|x86.ActiveCfg = Release|x86 - {679FA2A2-898B-4320-884E-C2D294A97CE1}.Release|x86.Build.0 = Release|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Debug|Any CPU.ActiveCfg = Debug|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Debug|x64.ActiveCfg = Debug|x64 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Debug|x64.Build.0 = Debug|x64 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Debug|x86.ActiveCfg = Debug|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Debug|x86.Build.0 = Debug|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Release|Any CPU.ActiveCfg = Release|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Release|x64.ActiveCfg = Release|x64 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Release|x64.Build.0 = Release|x64 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Release|x86.ActiveCfg = Release|x86 - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F}.Release|x86.Build.0 = Release|x86 - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|Any CPU.Build.0 = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|x64.ActiveCfg = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|x64.Build.0 = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|x86.ActiveCfg = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Debug|x86.Build.0 = Debug|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|Any CPU.ActiveCfg = Release|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|Any CPU.Build.0 = Release|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|x64.ActiveCfg = Release|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|x64.Build.0 = Release|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|x86.ActiveCfg = Release|Any CPU - {064D860B-4D7C-4B1D-918F-E020F1B99E2A}.Release|x86.Build.0 = Release|Any CPU - {FC2A97F8-A749-4C04-97D1-97500066A820}.Debug|Any CPU.ActiveCfg = Debug|x86 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Debug|x64.ActiveCfg = Debug|x64 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Debug|x64.Build.0 = Debug|x64 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Debug|x86.ActiveCfg = Debug|x86 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Debug|x86.Build.0 = Debug|x86 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Release|Any CPU.ActiveCfg = Release|x86 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Release|x64.ActiveCfg = Release|x64 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Release|x64.Build.0 = Release|x64 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Release|x86.ActiveCfg = Release|x86 - {FC2A97F8-A749-4C04-97D1-97500066A820}.Release|x86.Build.0 = Release|x86 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x64.ActiveCfg = Debug|x64 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x64.Build.0 = Debug|x64 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x86.ActiveCfg = Debug|Win32 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x86.Build.0 = Debug|Win32 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|Any CPU.ActiveCfg = Release|Win32 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x64.ActiveCfg = Release|x64 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x64.Build.0 = Release|x64 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x86.ActiveCfg = Release|Win32 - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x86.Build.0 = Release|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x64.ActiveCfg = Debug|x64 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x64.Build.0 = Debug|x64 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x86.ActiveCfg = Debug|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x86.Build.0 = Debug|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|Any CPU.ActiveCfg = Release|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x64.ActiveCfg = Release|x64 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x64.Build.0 = Release|x64 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x86.ActiveCfg = Release|Win32 - {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x86.Build.0 = Release|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Debug|x64.ActiveCfg = Debug|x64 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Debug|x64.Build.0 = Debug|x64 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Debug|x86.ActiveCfg = Debug|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Debug|x86.Build.0 = Debug|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Release|Any CPU.ActiveCfg = Release|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Release|x64.ActiveCfg = Release|x64 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Release|x64.Build.0 = Release|x64 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Release|x86.ActiveCfg = Release|Win32 - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}.Release|x86.Build.0 = Release|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Debug|x64.ActiveCfg = Debug|x64 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Debug|x64.Build.0 = Debug|x64 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Debug|x86.ActiveCfg = Debug|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Debug|x86.Build.0 = Debug|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Release|Any CPU.ActiveCfg = Release|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Release|x64.ActiveCfg = Release|x64 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Release|x64.Build.0 = Release|x64 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Release|x86.ActiveCfg = Release|Win32 - {55494E58-E061-4C4C-A0A8-837008E72F85}.Release|x86.Build.0 = Release|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Debug|x64.ActiveCfg = Debug|x64 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Debug|x64.Build.0 = Debug|x64 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Debug|x86.ActiveCfg = Debug|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Debug|x86.Build.0 = Debug|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Release|Any CPU.ActiveCfg = Release|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Release|x64.ActiveCfg = Release|x64 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Release|x64.Build.0 = Release|x64 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Release|x86.ActiveCfg = Release|Win32 - {09D9D1D6-2951-4E14-BC35-76A23CF9391A}.Release|x86.Build.0 = Release|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Debug|Any CPU.ActiveCfg = Debug|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Debug|x64.ActiveCfg = Debug|x64 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Debug|x64.Build.0 = Debug|x64 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Debug|x86.ActiveCfg = Debug|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Debug|x86.Build.0 = Debug|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Release|Any CPU.ActiveCfg = Release|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Release|x64.ActiveCfg = Release|x64 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Release|x64.Build.0 = Release|x64 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Release|x86.ActiveCfg = Release|Win32 - {D57EA297-6DC2-4BC0-8C91-334863327863}.Release|x86.Build.0 = Release|Win32 - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64} = {C74B8F36-FD2F-45C9-9B8A-00E7CF0126A9} - {8B3446E8-E6A8-4591-AA63-A95837C6E97C} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} - {4106DB10-E09F-480E-9CE6-B39235512EE6} = {EF30B533-D715-421A-92B7-92FEF460AC9C} - {F54715C3-88D8-49E3-A291-C13570FE81FC} = {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} - {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA} = {EF30B533-D715-421A-92B7-92FEF460AC9C} - {9BC4AFCB-325D-4C81-8228-8CF301CE2F97} = {C74B8F36-FD2F-45C9-9B8A-00E7CF0126A9} - {679FA2A2-898B-4320-884E-C2D294A97CE1} = {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} - {13FD8F12-FFBE-4D01-B4AC-444F2994B04F} = {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} - {064D860B-4D7C-4B1D-918F-E020F1B99E2A} = {EF30B533-D715-421A-92B7-92FEF460AC9C} - {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} = {EF30B533-D715-421A-92B7-92FEF460AC9C} - {FC2A97F8-A749-4C04-97D1-97500066A820} = {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} - {16E521CE-77F1-4B1C-A183-520A41C4F372} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} - {06CA2C2B-83B0-4D83-905A-E0C74790009E} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} - {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE} = {16E521CE-77F1-4B1C-A183-520A41C4F372} - {439824F9-1455-4CC4-BD79-B44FA0A16552} = {16E521CE-77F1-4B1C-A183-520A41C4F372} - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B} = {06CA2C2B-83B0-4D83-905A-E0C74790009E} - {55494E58-E061-4C4C-A0A8-837008E72F85} = {06CA2C2B-83B0-4D83-905A-E0C74790009E} - {09D9D1D6-2951-4E14-BC35-76A23CF9391A} = {06CA2C2B-83B0-4D83-905A-E0C74790009E} - {D57EA297-6DC2-4BC0-8C91-334863327863} = {06CA2C2B-83B0-4D83-905A-E0C74790009E} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {DB4F868D-E1AE-4FD7-9333-69FA15B268C5} - EndGlobalSection -EndGlobal diff --git a/src/IISIntegration/README.md b/src/IISIntegration/README.md deleted file mode 100644 index f9310e5d9e..0000000000 --- a/src/IISIntegration/README.md +++ /dev/null @@ -1,3 +0,0 @@ -This repo hosts the ASP.NET Core middleware for IIS integration and the ASP.NET Core Module. - -This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. diff --git a/src/IISIntegration/build.cmd b/src/IISIntegration/build.cmd deleted file mode 100644 index f4169ea5e4..0000000000 --- a/src/IISIntegration/build.cmd +++ /dev/null @@ -1,3 +0,0 @@ -@ECHO OFF -SET RepoRoot="%~dp0..\.." -%RepoRoot%\build.cmd -LockFile %RepoRoot%\korebuild-lock.txt -Path %~dp0 %* diff --git a/src/IISIntegration/build.sh b/src/IISIntegration/build.sh deleted file mode 100644 index d5bb0cf631..0000000000 --- a/src/IISIntegration/build.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -repo_root="$DIR/../.." -"$repo_root/build.sh" --path "$DIR" --lockfile "$repo_root/korebuild-lock.txt" "$@" diff --git a/src/IISIntegration/build/build.msbuild b/src/IISIntegration/build/build.msbuild deleted file mode 100644 index 117ed59bec..0000000000 --- a/src/IISIntegration/build/build.msbuild +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/build/dependencies.props b/src/IISIntegration/build/dependencies.props deleted file mode 100644 index c90801a573..0000000000 --- a/src/IISIntegration/build/dependencies.props +++ /dev/null @@ -1,55 +0,0 @@ - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - 2.1.3-rtm-15802 - 15.6.82 - 15.6.82 - 2.0.0 - 2.1.2 - 15.6.1 - 2.0.3 - 4.5.0 - 4.5.0 - 4.5.1 - 4.5.1 - 4.5.0 - 4.5.1 - 4.5.0 - 9.0.1 - 2.3.1 - 2.4.0-beta.1.build3945 - - - - - - - - 2.1.2 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 0.5.1 - 2.1.2 - 2.1.1 - 2.1.0 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - - diff --git a/src/IISIntegration/build/launchSettings.json b/src/IISIntegration/build/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/build/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/build/repo.props b/src/IISIntegration/build/repo.props deleted file mode 100644 index 780afe4e43..0000000000 --- a/src/IISIntegration/build/repo.props +++ /dev/null @@ -1,26 +0,0 @@ - - - - - Microsoft - $(BuildDir)AspNetCoreModule.zip - - - - - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/build/repo.targets b/src/IISIntegration/build/repo.targets deleted file mode 100644 index 97753f2424..0000000000 --- a/src/IISIntegration/build/repo.targets +++ /dev/null @@ -1,84 +0,0 @@ - - - - BuildNativeAssets;$(CompileDependsOn) - $(PackageDependsOn);PackageNativeProjects - $(RepositoryRoot)NuGetPackageVerifier.xplat.json - - - - - -p:Configuration=$(Configuration) -v:m -nologo -clp:NoSummary -p:CommitHash=$(CommitHash) - - - - - - - - - - - - - - - - NuGetPackage - Microsoft.AspNetCore.AspNetCoreModule - $(PackageVersion) - $(RepositoryRoot) - - - - - NuGetPackage - Microsoft.AspNetCore.AspNetCoreModuleV1 - $(PackageVersion) - $(RepositoryRoot) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/build/sources.props b/src/IISIntegration/build/sources.props deleted file mode 100644 index 9215df9751..0000000000 --- a/src/IISIntegration/build/sources.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - - $(DotNetRestoreSources) - - $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; - - - $(RestoreSources); - https://api.nuget.org/v3/index.json; - - - diff --git a/src/IISIntegration/build/testsite.props b/src/IISIntegration/build/testsite.props deleted file mode 100644 index d2f6acea7e..0000000000 --- a/src/IISIntegration/build/testsite.props +++ /dev/null @@ -1,92 +0,0 @@ - - - - win7-x64;win7-x86 - x64;x86 - $(MSBuildThisFileDirectory)applicationhost.config - $(MSBuildThisFileDirectory)applicationhost.iis.config - x64 - $(Platform) - - - - $(MSBuildProgramFiles32)\IIS Express\iisexpress.exe - $(SystemRoot)\SysWOW64\inetsrv\w3wp.exe - Win32 - - - - $(ProgramW6432)\IIS Express\iisexpress.exe - $(SystemRoot)\System32\inetsrv\w3wp.exe - x64 - - - - - $(NativePlatform)\ - - - - - - - - - - - - - - - /config:"$(IISExpressAppHostConfig)" - -h "$(IISAppHostConfig)" - - $(NativePlatform)\aspnetcore.dll - $(NativePlatform)\aspnetcorerh.dll - $(userprofile)\.dotnet\$(NativePlatform)\dotnet.exe - - - - - - - - - - - False - - - - - - - $(MSBuildThisFileDirectory)..\test\TestTasks\bin\$(Configuration)\$(TargetFramework)\TestTasks - - $(InjectDepsAssembly) - "win7-$(NativePlatform)" "$(AncmRHPath)" - - - - $(InjectDepsAssembly).exe - $(InjectDepsAssembly) - - - - $(InjectDepsAssembly).dll - dotnet - $(InjectDepsAssembly) $(InjectDepsArguments) - - - - - - - - - - - - diff --git a/src/IISIntegration/korebuild.json b/src/IISIntegration/korebuild.json deleted file mode 100644 index 663f878233..0000000000 --- a/src/IISIntegration/korebuild.json +++ /dev/null @@ -1,17 +0,0 @@ -{ - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/release/2.1/tools/korebuild.schema.json", - "channel": "release/2.1", - "toolsets": { - "visualstudio": { - "required": ["Windows"], - "includePrerelease": true, - "minVersion": "15.0.26730.03", - "requiredWorkloads": [ - "Microsoft.VisualStudio.Component.VC.Tools.x86.x64", - "Microsoft.VisualStudio.ComponentGroup.NativeDesktop.Win81", - "Microsoft.VisualStudio.Component.VC.ATL", - "Microsoft.VisualStudio.Component.Windows10SDK.15063.Desktop" - ] - } - } - } \ No newline at end of file diff --git a/src/IISIntegration/nuget/AspNetCoreV1.nuspec b/src/IISIntegration/nuget/AspNetCoreV1.nuspec deleted file mode 100644 index f89b7ff754..0000000000 --- a/src/IISIntegration/nuget/AspNetCoreV1.nuspec +++ /dev/null @@ -1,29 +0,0 @@ - - - - Microsoft.AspNetCore.AspNetCoreModuleV1 - Microsoft ASP.NET Core Module - $VERSION$ - Microsoft - Microsoft - https://www.microsoft.com/web/webpi/eula/net_library_eula_ENU.htm - © .NET Foundation. All rights reserved. - https://www.asp.net/ - https://go.microsoft.com/fwlink/?LinkID=288859 - true - ASP.NET Core Module - en-US - Microsoft.AspNetCore.AspNetCoreModuleV1 - - - - - - - - - - - - - diff --git a/src/IISIntegration/nuget/AspNetCoreV2.nuspec b/src/IISIntegration/nuget/AspNetCoreV2.nuspec deleted file mode 100644 index 10745f52c4..0000000000 --- a/src/IISIntegration/nuget/AspNetCoreV2.nuspec +++ /dev/null @@ -1,31 +0,0 @@ - - - - Microsoft.AspNetCore.AspNetCoreModule - Microsoft ASP.NET Core Module - $VERSION$ - Microsoft - Microsoft - https://www.microsoft.com/web/webpi/eula/net_library_eula_ENU.htm - © .NET Foundation. All rights reserved. - https://www.asp.net/ - https://go.microsoft.com/fwlink/?LinkID=288859 - true - ASP.NET Core Module - en-US - Microsoft.AspNetCore.AspNetCoreModule - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/samples/IISSample/IISSample.csproj b/src/IISIntegration/samples/IISSample/IISSample.csproj deleted file mode 100644 index f8dafd69ef..0000000000 --- a/src/IISIntegration/samples/IISSample/IISSample.csproj +++ /dev/null @@ -1,15 +0,0 @@ - - - - netcoreapp2.1;net461 - - - - - - - - - - - diff --git a/src/IISIntegration/samples/IISSample/Properties/launchSettings.json b/src/IISIntegration/samples/IISSample/Properties/launchSettings.json deleted file mode 100644 index 009aa9ab89..0000000000 --- a/src/IISIntegration/samples/IISSample/Properties/launchSettings.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:25334/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development", - "ASPNETCORE_HOSTINGSTARTUPASSEMBLIES": "Microsoft.AspNetCore.Server.IISIntegration" - } - }, - "IISSample": { - "commandName": "Project", - "launchBrowser": true, - "launchUrl": "http://localhost:5000", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - } - } -} \ No newline at end of file diff --git a/src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj b/src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj deleted file mode 100644 index d9bf22ba16..0000000000 --- a/src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj +++ /dev/null @@ -1,20 +0,0 @@ - - - - - - netcoreapp2.1 - - - - - - - - - - - - inprocess - - diff --git a/src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json b/src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/samples/NativeIISSample/Startup.cs b/src/IISIntegration/samples/NativeIISSample/Startup.cs deleted file mode 100644 index d36f26908d..0000000000 --- a/src/IISIntegration/samples/NativeIISSample/Startup.cs +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Linq; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Server.IISIntegration; - -namespace NativeIISSample -{ - public class Startup - { - // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. - public void Configure(IApplicationBuilder app, IHostingEnvironment env, IAuthenticationSchemeProvider authSchemeProvider) - { - app.Run(async (context) => - { - context.Response.ContentType = "text/plain"; - - await context.Response.WriteAsync("Hello World - " + DateTimeOffset.Now + Environment.NewLine); - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Address:" + Environment.NewLine); - await context.Response.WriteAsync("Scheme: " + context.Request.Scheme + Environment.NewLine); - await context.Response.WriteAsync("Host: " + context.Request.Headers["Host"] + Environment.NewLine); - await context.Response.WriteAsync("PathBase: " + context.Request.PathBase.Value + Environment.NewLine); - await context.Response.WriteAsync("Path: " + context.Request.Path.Value + Environment.NewLine); - await context.Response.WriteAsync("Query: " + context.Request.QueryString.Value + Environment.NewLine); - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Connection:" + Environment.NewLine); - await context.Response.WriteAsync("RemoteIp: " + context.Connection.RemoteIpAddress + Environment.NewLine); - await context.Response.WriteAsync("RemotePort: " + context.Connection.RemotePort + Environment.NewLine); - await context.Response.WriteAsync("LocalIp: " + context.Connection.LocalIpAddress + Environment.NewLine); - await context.Response.WriteAsync("LocalPort: " + context.Connection.LocalPort + Environment.NewLine); - await context.Response.WriteAsync("ClientCert: " + context.Connection.ClientCertificate + Environment.NewLine); - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("User: " + context.User.Identity.Name + Environment.NewLine); - var scheme = await authSchemeProvider.GetSchemeAsync(IISDefaults.AuthenticationScheme); - await context.Response.WriteAsync("DisplayName: " + scheme?.DisplayName + Environment.NewLine); - - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Headers:" + Environment.NewLine); - foreach (var header in context.Request.Headers) - { - await context.Response.WriteAsync(header.Key + ": " + header.Value + Environment.NewLine); - } - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Environment Variables:" + Environment.NewLine); - var vars = Environment.GetEnvironmentVariables(); - foreach (var key in vars.Keys.Cast().OrderBy(key => key, StringComparer.OrdinalIgnoreCase)) - { - var value = vars[key]; - await context.Response.WriteAsync(key + ": " + value + Environment.NewLine); - } - await context.Response.WriteAsync(Environment.NewLine); - - // accessing IIS server variables - await context.Response.WriteAsync("Server Variables:" + Environment.NewLine); - - if (context.Features.Get() != null) - { - await context.Response.WriteAsync("Websocket feature is enabled."); - } - else - { - await context.Response.WriteAsync("Websocket feature is disabled."); - } - }); - } - public static void Main(string[] args) - { - var host = new WebHostBuilder() - .UseIISIntegration() - .UseStartup() - .Build(); - - host.Run(); - } - } -} diff --git a/src/IISIntegration/samples/NativeIISSample/web.config b/src/IISIntegration/samples/NativeIISSample/web.config deleted file mode 100644 index 08baab0922..0000000000 --- a/src/IISIntegration/samples/NativeIISSample/web.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj deleted file mode 100644 index 4660054b0b..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj +++ /dev/null @@ -1,260 +0,0 @@ - - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {EC82302F-D2F0-4727-99D1-EABC0DD9DC3B} - Win32Proj - AspNetCoreModule - AspNetCore - aspnetcore - false - 10.0.15063.0 - - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ - - - - NotUsing - Level4 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) - precomp.hxx - $(IntDir)$(TargetName).pch - ..\IISLib;.\Inc - ProgramDatabase - MultiThreadedDebug - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - true - kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - Source.def - - - ..\Commonlib - - - - - NotUsing - Level4 - Disabled - WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) - precomp.hxx - $(IntDir)$(TargetName).pch - ..\IISLib;.\Inc - ProgramDatabase - MultiThreadedDebug - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - true - kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - Source.def - - - ..\Commonlib - - - - - Level4 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) - ..\IISLib;inc - precomp.hxx - MultiThreaded - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - false - true - true - Source.def - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;winhttp.lib;odbc32.lib;ws2_32.lib;odbccp32.lib;wbemuuid.lib;iphlpapi.lib;pdh.lib;rpcrt4.lib;%(AdditionalDependencies) - - - ..\Commonlib - - - - - Level4 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions) - precomp.hxx - ..\IISLib;inc - MultiThreaded - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - false - true - true - Source.def - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - - - ..\Commonlib - - - - - - - - - - - - - - - - - - - - - - {55494e58-e061-4c4c-a0a8-837008e72f85} - - - {09d9d1d6-2951-4e14-bc35-76a23cf9391a} - - - - - - - - - - - - PreserveNewest - - - PreserveNewest - - - - - - - - - - \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h deleted file mode 100644 index f47b51786b..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationinfo.h +++ /dev/null @@ -1,251 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#define API_BUFFER_TOO_SMALL 0x80008098 - -extern BOOL g_fRecycleProcessCalled; - -typedef -HRESULT -(WINAPI * PFN_ASPNETCORE_CREATE_APPLICATION)( - _In_ IHttpServer *pServer, - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ APPLICATION **pApplication - ); - -typedef -HRESULT -(WINAPI * PFN_ASPNETCORE_CREATE_REQUEST_HANDLER)( - _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication, - _Out_ REQUEST_HANDLER **pRequestHandler - ); -// -// The key used for hash-table lookups, consists of the port on which the http process is created. -// -class APPLICATION_INFO_KEY -{ -public: - - APPLICATION_INFO_KEY( - VOID - ) : INLINE_STRU_INIT(m_struKey) - { - } - - HRESULT - Initialize( - _In_ LPCWSTR pszKey - ) - { - return m_struKey.Copy(pszKey); - } - - BOOL - GetIsEqual( - const APPLICATION_INFO_KEY * key2 - ) const - { - return m_struKey.Equals(key2->m_struKey); - } - - DWORD CalcKeyHash() const - { - return Hash(m_struKey.QueryStr()); - } - -private: - - INLINE_STRU(m_struKey, 1024); -}; - - -class APPLICATION_INFO -{ -public: - - APPLICATION_INFO(IHttpServer *pServer) : - m_pServer(pServer), - m_cRefs(1), m_fAppOfflineFound(FALSE), - m_pAppOfflineHtm(NULL), m_pFileWatcherEntry(NULL), - m_pConfiguration(NULL), - m_pfnAspNetCoreCreateApplication(NULL), - m_pfnAspNetCoreCreateRequestHandler(NULL) - { - InitializeSRWLock(&m_srwLock); - } - - APPLICATION_INFO_KEY * - QueryApplicationInfoKey() - { - return &m_applicationInfoKey; - } - - virtual - ~APPLICATION_INFO(); - - HRESULT - Initialize( - _In_ ASPNETCORE_CONFIG *pConfiguration, - _In_ FILE_WATCHER *pFileWatcher - ); - - VOID - ReferenceApplicationInfo() const - { - InterlockedIncrement(&m_cRefs); - } - - VOID - DereferenceApplicationInfo() const - { - if (InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - } - } - - APP_OFFLINE_HTM* QueryAppOfflineHtm() - { - return m_pAppOfflineHtm; - } - - BOOL - AppOfflineFound() - { - return m_fAppOfflineFound; - } - - VOID - UpdateAppOfflineFileHandle(); - - HRESULT - StartMonitoringAppOffline(); - - ASPNETCORE_CONFIG* - QueryConfig() - { - return m_pConfiguration; - } - - // - // ExtractApplication will increase the reference counter of the application - // Caller is responsible for dereference the application. - // Otherwise memory leak - // - VOID - ExtractApplication(APPLICATION** ppApplication) - { - AcquireSRWLockShared(&m_srwLock); - if (m_pApplication != NULL) - { - m_pApplication->ReferenceApplication(); - } - *ppApplication = m_pApplication; - ReleaseSRWLockShared(&m_srwLock); - } - - VOID - RecycleApplication(); - - VOID - ShutDownApplication(); - - HRESULT - EnsureApplicationCreated(); - - PFN_ASPNETCORE_CREATE_REQUEST_HANDLER - QueryCreateRequestHandler() - { - return m_pfnAspNetCoreCreateRequestHandler; - } - -private: - HRESULT FindRequestHandlerAssembly(); - HRESULT FindNativeAssemblyFromGlobalLocation(STRU* struFilename); - HRESULT FindNativeAssemblyFromHostfxr(STRU* struFilename); - - static VOID DoRecycleApplication(LPVOID lpParam); - - mutable LONG m_cRefs; - APPLICATION_INFO_KEY m_applicationInfoKey; - BOOL m_fAppOfflineFound; - APP_OFFLINE_HTM *m_pAppOfflineHtm; - FILE_WATCHER_ENTRY *m_pFileWatcherEntry; - ASPNETCORE_CONFIG *m_pConfiguration; - APPLICATION *m_pApplication; - SRWLOCK m_srwLock; - IHttpServer *m_pServer; - PFN_ASPNETCORE_CREATE_APPLICATION m_pfnAspNetCoreCreateApplication; - PFN_ASPNETCORE_CREATE_REQUEST_HANDLER m_pfnAspNetCoreCreateRequestHandler; -}; - -class APPLICATION_INFO_HASH : - public HASH_TABLE -{ - -public: - - APPLICATION_INFO_HASH() - {} - - APPLICATION_INFO_KEY * - ExtractKey( - APPLICATION_INFO *pApplicationInfo - ) - { - return pApplicationInfo->QueryApplicationInfoKey(); - } - - DWORD - CalcKeyHash( - APPLICATION_INFO_KEY *key - ) - { - return key->CalcKeyHash(); - } - - BOOL - EqualKeys( - APPLICATION_INFO_KEY *key1, - APPLICATION_INFO_KEY *key2 - ) - { - return key1->GetIsEqual(key2); - } - - VOID - ReferenceRecord( - APPLICATION_INFO *pApplicationInfo - ) - { - pApplicationInfo->ReferenceApplicationInfo(); - } - - VOID - DereferenceRecord( - APPLICATION_INFO *pApplicationInfo - ) - { - pApplicationInfo->DereferenceApplicationInfo(); - } - - static - VOID - ReferenceCopyToTable( - APPLICATION_INFO * pEntry, - PVOID pvData - ) - { - APPLICATION_INFO_HASH *pHash = static_cast(pvData); - DBG_ASSERT(pHash); - pHash->InsertRecord(pEntry); - } - -private: - - APPLICATION_INFO_HASH(const APPLICATION_INFO_HASH &); - void operator=(const APPLICATION_INFO_HASH &); -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h deleted file mode 100644 index 7201d7de49..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/applicationmanager.h +++ /dev/null @@ -1,154 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define DEFAULT_HASH_BUCKETS 17 - -// -// This class will manage the lifecycle of all Asp.Net Core applciation -// It should be global singleton. -// Should always call GetInstance to get the object instance -// - -struct CONFIG_CHANGE_CONTEXT -{ - PCWSTR pstrPath; - MULTISZ MultiSz; -}; - -class APPLICATION_MANAGER -{ -public: - - static - APPLICATION_MANAGER* - GetInstance( - VOID - ) - { - if ( sm_pApplicationManager == NULL ) - { - sm_pApplicationManager = new APPLICATION_MANAGER(); - } - - return sm_pApplicationManager; - } - - static - VOID - Cleanup( - VOID - ) - { - if(sm_pApplicationManager != NULL) - { - delete sm_pApplicationManager; - sm_pApplicationManager = NULL; - } - } - - static - BOOL - FindConfigChangedApplication( - _In_ APPLICATION_INFO * pEntry, - _In_ PVOID pvContext - ); - - static - VOID - ShutdownApplication( - _In_ APPLICATION_INFO * pEntry, - _In_ PVOID pvContext - ); - - HRESULT - GetOrCreateApplicationInfo( - _In_ IHttpServer* pServer, - _In_ ASPNETCORE_CONFIG* pConfig, - _Out_ APPLICATION_INFO ** ppApplicationInfo - ); - - HRESULT - RecycleApplicationFromManager( - _In_ LPCWSTR pszApplicationId - ); - - VOID - ShutDown(); - - ~APPLICATION_MANAGER() - { - if (m_pFileWatcher != NULL) - { - delete m_pFileWatcher; - m_pFileWatcher = NULL; - } - - if(m_pApplicationInfoHash != NULL) - { - m_pApplicationInfoHash->Clear(); - delete m_pApplicationInfoHash; - m_pApplicationInfoHash = NULL; - } - } - - FILE_WATCHER* - GetFileWatcher() - { - return m_pFileWatcher; - } - - HRESULT Initialize() - { - HRESULT hr = S_OK; - - if(m_pApplicationInfoHash == NULL) - { - m_pApplicationInfoHash = new APPLICATION_INFO_HASH(); - if(m_pApplicationInfoHash == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = m_pApplicationInfoHash->Initialize(DEFAULT_HASH_BUCKETS); - if(FAILED(hr)) - { - goto Finished; - } - } - - if( m_pFileWatcher == NULL ) - { - m_pFileWatcher = new FILE_WATCHER; - if(m_pFileWatcher == NULL) - { - hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); - goto Finished; - } - - m_pFileWatcher->Create(); - } - - Finished: - return hr; - } - -private: - // - // we currently limit the size of m_pstrErrorInfo to 5000, be careful if you want to change its payload - // - APPLICATION_MANAGER() : m_pApplicationInfoHash(NULL), - m_pFileWatcher(NULL), - m_hostingModel(HOSTING_UNKNOWN) - { - InitializeSRWLock(&m_srwLock); - } - - FILE_WATCHER *m_pFileWatcher; - APPLICATION_INFO_HASH *m_pApplicationInfoHash; - static APPLICATION_MANAGER *sm_pApplicationManager; - SRWLOCK m_srwLock; - APP_HOSTING_MODEL m_hostingModel; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/appoffline.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/appoffline.h deleted file mode 100644 index 85b6c13ea8..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/appoffline.h +++ /dev/null @@ -1,101 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -class APP_OFFLINE_HTM -{ -public: - APP_OFFLINE_HTM(LPCWSTR pszPath) : m_cRefs(1) - { - m_Path.Copy(pszPath); - } - - VOID - ReferenceAppOfflineHtm() const - { - InterlockedIncrement(&m_cRefs); - } - - VOID - DereferenceAppOfflineHtm() const - { - if (InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - } - } - - BOOL - Load( - VOID - ) - { - BOOL fResult = TRUE; - LARGE_INTEGER li = { 0 }; - CHAR *pszBuff = NULL; - HANDLE handle = INVALID_HANDLE_VALUE; - - handle = CreateFile(m_Path.QueryStr(), - GENERIC_READ, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (handle == INVALID_HANDLE_VALUE) - { - if (HRESULT_FROM_WIN32(GetLastError()) == ERROR_FILE_NOT_FOUND) - { - fResult = FALSE; - } - - // This Load() member function is supposed be called only when the change notification event of file creation or file modification happens. - // If file is currenlty locked exclusively by other processes, we might get INVALID_HANDLE_VALUE even though the file exists. In that case, we should return TRUE here. - goto Finished; - } - - if (!GetFileSizeEx(handle, &li)) - { - goto Finished; - } - - if (li.HighPart != 0) - { - // > 4gb file size not supported - // todo: log a warning at event log - goto Finished; - } - - DWORD bytesRead = 0; - - if (li.LowPart > 0) - { - pszBuff = new CHAR[li.LowPart + 1]; - - if (ReadFile(handle, pszBuff, li.LowPart, &bytesRead, NULL)) - { - m_Contents.Copy(pszBuff, bytesRead); - } - } - - Finished: - if (handle != INVALID_HANDLE_VALUE) - { - CloseHandle(handle); - handle = INVALID_HANDLE_VALUE; - } - - if (pszBuff != NULL) - { - delete[] pszBuff; - pszBuff = NULL; - } - - return fResult; - } - - mutable LONG m_cRefs; - STRA m_Contents; - STRU m_Path; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/filewatcher.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/filewatcher.h deleted file mode 100644 index d8bde448a7..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/filewatcher.h +++ /dev/null @@ -1,127 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define FILE_WATCHER_SHUTDOWN_KEY (ULONG_PTR)(-1) -#define FILE_WATCHER_ENTRY_BUFFER_SIZE 4096 -#ifndef CONTAINING_RECORD -// -// Calculate the address of the base of the structure given its type, and an -// address of a field within the structure. -// - -#define CONTAINING_RECORD(address, type, field) \ - ((type *)((PCHAR)(address)-(ULONG_PTR)(&((type *)0)->field))) - -#endif // !CONTAINING_RECORD -#define FILE_NOTIFY_VALID_MASK 0x00000fff -#define FILE_WATCHER_ENTRY_SIGNATURE ((DWORD) 'FWES') -#define FILE_WATCHER_ENTRY_SIGNATURE_FREE ((DWORD) 'sewf') - -class APPLICATION_INFO; - -class FILE_WATCHER{ -public: - - FILE_WATCHER(); - - ~FILE_WATCHER(); - - HRESULT Create(); - - HANDLE - QueryCompletionPort( - VOID - ) const - { - return m_hCompletionPort; - } - - static - DWORD - WINAPI ChangeNotificationThread(LPVOID); - - static - void - WINAPI FileWatcherCompletionRoutine - ( - DWORD dwCompletionStatus, - DWORD cbCompletion, - OVERLAPPED * pOverlapped - ); - -private: - HANDLE m_hCompletionPort; - HANDLE m_hChangeNotificationThread; - volatile BOOL m_fThreadExit; -}; - -class FILE_WATCHER_ENTRY -{ -public: - FILE_WATCHER_ENTRY(FILE_WATCHER * pFileMonitor); - - OVERLAPPED _overlapped; - - HRESULT - Create( - _In_ PCWSTR pszDirectoryToMonitor, - _In_ PCWSTR pszFileNameToMonitor, - _In_ APPLICATION_INFO* pApplicationInfo, - _In_ HANDLE hImpersonationToken - ); - - VOID - ReferenceFileWatcherEntry() const - { - InterlockedIncrement(&_cRefs); - } - - VOID - DereferenceFileWatcherEntry() const - { - if (InterlockedDecrement(&_cRefs) == 0) - { - delete this; - } - } - - BOOL - QueryIsValid() const - { - return _fIsValid; - } - - VOID - MarkEntryInValid() - { - _fIsValid = FALSE; - } - - HRESULT Monitor(); - - VOID StopMonitor(); - - HRESULT - HandleChangeCompletion( - _In_ DWORD dwCompletionStatus, - _In_ DWORD cbCompletion - ); - -private: - virtual ~FILE_WATCHER_ENTRY(); - - DWORD _dwSignature; - BUFFER _buffDirectoryChanges; - HANDLE _hImpersonationToken; - HANDLE _hDirectory; - FILE_WATCHER* _pFileMonitor; - APPLICATION_INFO* _pApplicationInfo; - STRU _strFileName; - STRU _strDirectoryName; - LONG _lStopMonitorCalled; - mutable LONG _cRefs; - BOOL _fIsValid; - SRWLOCK _srwLock; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h deleted file mode 100644 index f485ba5a6e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/fx_ver.h +++ /dev/null @@ -1,49 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -#ifndef __FX_VER_H__ -#define __FX_VER_H__ -#include - -// Note: This is not SemVer (esp., in comparing pre-release part, fx_ver_t does not -// compare multiple dot separated identifiers individually.) ex: 1.0.0-beta.2 vs. 1.0.0-beta.11 -struct fx_ver_t -{ - fx_ver_t(int major, int minor, int patch); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre, const std::wstring& build); - - int get_major() const { return m_major; } - int get_minor() const { return m_minor; } - int get_patch() const { return m_patch; } - - void set_major(int m) { m_major = m; } - void set_minor(int m) { m_minor = m; } - void set_patch(int p) { m_patch = p; } - - bool is_prerelease() const { return !m_pre.empty(); } - - std::wstring as_str() const; - std::wstring prerelease_glob() const; - std::wstring patch_glob() const; - - bool operator ==(const fx_ver_t& b) const; - bool operator !=(const fx_ver_t& b) const; - bool operator <(const fx_ver_t& b) const; - bool operator >(const fx_ver_t& b) const; - bool operator <=(const fx_ver_t& b) const; - bool operator >=(const fx_ver_t& b) const; - - static bool parse(const std::wstring& ver, fx_ver_t* fx_ver, bool parse_only_production = false); - -private: - int m_major; - int m_minor; - int m_patch; - std::wstring m_pre; - std::wstring m_build; - - static int compare(const fx_ver_t&a, const fx_ver_t& b); -}; - -#endif // __FX_VER_H__ \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/globalmodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/globalmodule.h deleted file mode 100644 index aca1857051..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/globalmodule.h +++ /dev/null @@ -1,37 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -class ASPNET_CORE_GLOBAL_MODULE : public CGlobalModule -{ - -public: - - ASPNET_CORE_GLOBAL_MODULE( - APPLICATION_MANAGER* pApplicationManager - ); - - ~ASPNET_CORE_GLOBAL_MODULE() - { - } - - VOID Terminate() - { - // Remove the class from memory. - delete this; - } - - GLOBAL_NOTIFICATION_STATUS - OnGlobalStopListening( - _In_ IGlobalStopListeningProvider * pProvider - ); - - GLOBAL_NOTIFICATION_STATUS - OnGlobalConfigurationChange( - _In_ IGlobalConfigurationChangeProvider * pProvider - ); - -private: - APPLICATION_MANAGER * m_pApplicationManager; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/proxymodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/proxymodule.h deleted file mode 100644 index 7e5f30a8eb..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Inc/proxymodule.h +++ /dev/null @@ -1,64 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -extern HTTP_MODULE_ID g_pModuleId; -extern IHttpServer *g_pHttpServer; -extern HMODULE g_hAspnetCoreRH; - -class ASPNET_CORE_PROXY_MODULE : public CHttpModule -{ - public: - - ASPNET_CORE_PROXY_MODULE(); - - ~ASPNET_CORE_PROXY_MODULE(); - - void * operator new(size_t size, IModuleAllocator * pPlacement) - { - return pPlacement->AllocateMemory(static_cast(size)); - } - - VOID - operator delete( - void * - ) - {} - - __override - REQUEST_NOTIFICATION_STATUS - OnExecuteRequestHandler( - IHttpContext * pHttpContext, - IHttpEventProvider * pProvider - ); - - __override - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - IHttpContext * pHttpContext, - DWORD dwNotification, - BOOL fPostNotification, - IHttpEventProvider * pProvider, - IHttpCompletionInfo * pCompletionInfo - ); - - private: - - APPLICATION_INFO *m_pApplicationInfo; - APPLICATION *m_pApplication; - REQUEST_HANDLER *m_pHandler; -}; - -class ASPNET_CORE_PROXY_MODULE_FACTORY : public IHttpModuleFactory -{ - public: - HRESULT - GetHttpModule( - CHttpModule ** ppModule, - IModuleAllocator * pAllocator - ); - - VOID - Terminate(); -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def deleted file mode 100644 index 9aae10ab5d..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def +++ /dev/null @@ -1,4 +0,0 @@ -LIBRARY aspnetcore - -EXPORTS - RegisterModule diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof deleted file mode 100644 index 5a50b19914..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof +++ /dev/null @@ -1,208 +0,0 @@ -#pragma classflags("forceupdate") -#pragma namespace ("\\\\.\\Root\\WMI") -#pragma autorecover - -/* - * AspNetCore module trace events layout - * Uncomment the following class to run mof2trace to generate header file - * comment it back before checking it in */ -[Dynamic, - Description("IIS: WWW Server"), - Guid("{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}"), - locale("MS\\0x409")] -class IIS_Trace:EventTrace -{ - [Description ("Enable Flags") : amended, - ValueDescriptions{ - "AspNetCore module events" } : amended, - DefineValues{ - "ETW_IIS_ANCM" }, - Values{ - "ANCM" }, - ValueMap{ - "0x10000" } - ] - uint32 Flags; - - [Description ("Levels") : amended, - ValueDescriptions{ - "Abnormal exit or termination", - "Severe errors", - "Warnings", - "Information", - "Detailed information" } : amended, - DefineValues{ - "TRACE_LEVEL_FATAL", - "TRACE_LEVEL_ERROR", - "TRACE_LEVEL_WARNING", - "TRACE_LEVEL_INFORMATION", - "TRACE_LEVEL_VERBOSE" }, - Values{ - "Fatal", - "Error", - "Warning", - "Information", - "Verbose" }, - ValueMap{ - "0x1", - "0x2", - "0x3", - "0x4", - "0x5" }, - ValueType("index") - ] - uint32 Level; -}; -*/ - -[Dynamic, - Description("ANCM runtime events") : amended, - Guid("{82ADEAD7-12B2-4781-BDCA-5A4B6C757191}"), - EventVersion(1), - DisplayName("ANCM"), - EventANCMRuntime, - locale("MS\\0x409") -] -class ANCM_Events:IIS_Trace -{ -}; - -[Dynamic, - Description("Start application success") : amended, - EventType(1), - EventLevel(4), - EventTypeName("ANCM_START_APPLICATION_SUCCESS") : amended -] -class ANCMAppStart:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; - [WmiDataId(2), - Description("Application Description") : amended, - StringTermination("NullTerminated"), - format("w"), - read] - string AppDescription; -}; - -[Dynamic, - Description("Start application failed") : amended, - EventType(2), - EventLevel(2), - EventTypeName("ANCM_START_APPLICATION_FAIL") : amended -] -class ANCMAppStartFail:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; - [WmiDataId(2), - Description("Application Start Failure Description") : amended, - StringTermination("NullTerminated"), - format("w"), - read] - string FailureDescription; -}; - -[Dynamic, - Description("Start forwarding request") : amended, - EventType(3), - EventLevel(4), - EventTypeName("ANCM_REQUEST_FORWARD_START") : amended -] -class ANCMForwardStart:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; -}; - -[Dynamic, - Description("Finish forwarding request") : amended, - EventType(4), - EventLevel(4), - EventTypeName("ANCM_REQUEST_FORWARD_END") : amended -] -class ANCMForwardEnd:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; -}; - -[Dynamic, - Description("Forwarding request failure") : amended, - EventType(5), - EventLevel(2), - EventTypeName("ANCM_REQUEST_FORWARD_FAIL") : amended -] -class ANCMForwardFail:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; - [WmiDataId(2), - Description("Error code") : amended, - format("x"), - read] - uint32 ErrorCode; -}; - -[Dynamic, - Description("Receiving callback from WinHttp") : amended, - EventType(6), - EventLevel(4), - EventTypeName("ANCM_WINHTTP_CALLBACK") : amended -] -class ANCMWinHttpCallBack:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; - [WmiDataId(2), - Description("InternetStatus") : amended, - format("x"), - read] - uint32 InternetStatus; -}; - -[Dynamic, - Description("Inprocess executing request failure") : amended, - EventType(7), - EventLevel(2), - EventTypeName("ANCM_EXECUTE_REQUEST_FAIL") : amended -] -class ANCMExecuteFailed:ANCM_Events -{ - [WmiDataId(1), - Description("Context ID") : amended, - extension("Guid"), - ActivityID, - read] - object ContextId; - [WmiDataId(2), - Description("InternetStatus") : amended, - format("x"), - read] - uint32 ErrorCode; -}; - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema.xml b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema.xml deleted file mode 100644 index d65be07195..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc deleted file mode 100644 index 9d0dfa7f83..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc +++ /dev/null @@ -1,120 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include -#include "version.h" -#include "..\CommonLib\Aspnetcore_msg.rc" -#include "..\CommonLib\resources.h" -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#define FileDescription "IIS AspNetCore Module. Commit: " CommitHash - -///////////////////////////////////////////////////////////////////////////// -// -// 11 -// - -//1 11 -//BEGIN -// 0x0001, 0x0000, 0x03e8, 0x0000, 0x03ed, 0x0000, 0x0010, 0x0000, 0x0010, -// 0x0001, 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, -// 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, -// 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, -// 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d, -// 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d, 0x000a, -// 0x0000, 0x0000 -//END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "..\CommonLib\resources.h\0" -END - -2 TEXTINCLUDE -BEGIN - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION FileVersion - PRODUCTVERSION ProductVersion - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft Corporation" - VALUE "FileDescription", FileDescription - VALUE "FileVersion", FileVersionStr - VALUE "InternalName", "aspnetcore" - VALUE "LegalCopyright", "Copyright (C) Microsoft Corporation" - VALUE "OriginalFilename", "aspnetcore.dll" - VALUE "ProductName", "ASP.NET Core Module" - VALUE "ProductVersion", ProductVersionStr - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_INVALID_PROPERTY "Property name '%s' in system.webServer/aspNetCore section has invalid value '%s' which does not conform to the prescribed format" - IDS_SERVER_ERROR "There was a connection error while trying to route the request." -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp deleted file mode 100644 index 63efb9e889..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationinfo.cpp +++ /dev/null @@ -1,650 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.hxx" - -APPLICATION_INFO::~APPLICATION_INFO() -{ - if (m_pAppOfflineHtm != NULL) - { - m_pAppOfflineHtm->DereferenceAppOfflineHtm(); - m_pAppOfflineHtm = NULL; - } - - if (m_pFileWatcherEntry != NULL) - { - // Mark the entry as invalid, - // StopMonitor will close the file handle and trigger a FCN - // the entry will delete itself when processing this FCN - m_pFileWatcherEntry->MarkEntryInValid(); - m_pFileWatcherEntry->StopMonitor(); - m_pFileWatcherEntry->DereferenceFileWatcherEntry(); - m_pFileWatcherEntry = NULL; - } - - if (m_pApplication != NULL) - { - // shutdown the application - m_pApplication->ShutDown(); - m_pApplication->DereferenceApplication(); - m_pApplication = NULL; - } - - // configuration should be dereferenced after application shutdown - // since the former will use it during shutdown - if (m_pConfiguration != NULL) - { - // Need to dereference the configuration instance - m_pConfiguration->DereferenceConfiguration(); - m_pConfiguration = NULL; - } -} - -HRESULT -APPLICATION_INFO::Initialize( - _In_ ASPNETCORE_CONFIG *pConfiguration, - _In_ FILE_WATCHER *pFileWatcher -) -{ - HRESULT hr = S_OK; - - DBG_ASSERT(pConfiguration); - DBG_ASSERT(pFileWatcher); - - m_pConfiguration = pConfiguration; - - // reference the configuration instance to prevent it will be not release - // earlier in case of configuration change and shutdown - m_pConfiguration->ReferenceConfiguration(); - - hr = m_applicationInfoKey.Initialize(pConfiguration->QueryConfigPath()->QueryStr()); - if (FAILED(hr)) - { - goto Finished; - } - - if (m_pFileWatcherEntry == NULL) - { - m_pFileWatcherEntry = new FILE_WATCHER_ENTRY(pFileWatcher); - if (m_pFileWatcherEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - } - - UpdateAppOfflineFileHandle(); - -Finished: - return hr; -} - -HRESULT -APPLICATION_INFO::StartMonitoringAppOffline() -{ - HRESULT hr = S_OK; - if (m_pFileWatcherEntry != NULL) - { - hr = m_pFileWatcherEntry->Create(m_pConfiguration->QueryApplicationPhysicalPath()->QueryStr(), L"app_offline.htm", this, NULL); - } - return hr; -} - -// -// Called by the file watcher when the app_offline.htm's file status has been changed. -// If it finds it, we will call recycle on the application. -// -VOID -APPLICATION_INFO::UpdateAppOfflineFileHandle() -{ - STRU strFilePath; - UTILITY::ConvertPathToFullPath(L".\\app_offline.htm", - m_pConfiguration->QueryApplicationPhysicalPath()->QueryStr(), - &strFilePath); - APP_OFFLINE_HTM *pOldAppOfflineHtm = NULL; - APP_OFFLINE_HTM *pNewAppOfflineHtm = NULL; - - ReferenceApplicationInfo(); - - if (INVALID_FILE_ATTRIBUTES == GetFileAttributes(strFilePath.QueryStr()) && - GetLastError() == ERROR_FILE_NOT_FOUND) - { - // Check if app offline was originally present. - // if it was, log that app_offline has been dropped. - if (m_fAppOfflineFound) - { - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_REMOVED_MSG))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_REMOVED, - strEventMsg.QueryStr()); - } - } - - m_fAppOfflineFound = FALSE; - } - else - { - pNewAppOfflineHtm = new APP_OFFLINE_HTM(strFilePath.QueryStr()); - - if (pNewAppOfflineHtm != NULL) - { - if (pNewAppOfflineHtm->Load()) - { - // - // loaded the new app_offline.htm - // - pOldAppOfflineHtm = (APP_OFFLINE_HTM *)InterlockedExchangePointer((VOID**)&m_pAppOfflineHtm, pNewAppOfflineHtm); - - if (pOldAppOfflineHtm != NULL) - { - pOldAppOfflineHtm->DereferenceAppOfflineHtm(); - pOldAppOfflineHtm = NULL; - } - } - else - { - // ignored the new app_offline file because the file does not exist. - pNewAppOfflineHtm->DereferenceAppOfflineHtm(); - pNewAppOfflineHtm = NULL; - } - } - - m_fAppOfflineFound = TRUE; - - // recycle the application - if (m_pApplication != NULL) - { - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG, - m_pApplication->QueryConfig()->QueryApplicationPath()->QueryStr()))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_RECYCLE_APPOFFLINE, - strEventMsg.QueryStr()); - } - - RecycleApplication(); - } - } - - DereferenceApplicationInfo(); -} - -HRESULT -APPLICATION_INFO::EnsureApplicationCreated() -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - APPLICATION* pApplication = NULL; - STACK_STRU(struFileName, 300); // >MAX_PATH - STRU struHostFxrDllLocation; - - if (m_pApplication != NULL) - { - goto Finished; - } - - if (m_pApplication == NULL) - { - AcquireSRWLockExclusive(&m_srwLock); - fLocked = TRUE; - if (m_pApplication != NULL) - { - goto Finished; - } - - // - // in case of app offline, we don't want to create a new application now - // - if (!m_fAppOfflineFound) - { - - // Move the request handler check inside of the lock - // such that only one request finds and loads it. - // FindRequestHandlerAssembly obtains a global lock, but after releasing the lock, - // there is a period where we could call - - hr = FindRequestHandlerAssembly(); - if (FAILED(hr)) - { - goto Finished; - } - - if (m_pfnAspNetCoreCreateApplication == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_FUNCTION); - goto Finished; - } - - hr = m_pfnAspNetCoreCreateApplication(m_pServer, m_pConfiguration, &pApplication); - if (FAILED(hr)) - { - goto Finished; - } - m_pApplication = pApplication; - } - } - -Finished: - if (fLocked) - { - ReleaseSRWLockExclusive(&m_srwLock); - } - return hr; -} - -HRESULT -APPLICATION_INFO::FindRequestHandlerAssembly() -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - STACK_STRU(struFileName, 256); - - if (g_fAspnetcoreRHLoadedError) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - goto Finished; - } - else if (!g_fAspnetcoreRHAssemblyLoaded) - { - AcquireSRWLockExclusive(&g_srwLock); - fLocked = TRUE; - if (g_fAspnetcoreRHLoadedError) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - goto Finished; - } - if (g_fAspnetcoreRHAssemblyLoaded) - { - goto Finished; - } - - if (m_pConfiguration->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) - { - if (FAILED(hr = FindNativeAssemblyFromHostfxr(&struFileName))) - { - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_INPROCESS_RH_MISSING, - strEventMsg.QueryStr()); - } - - goto Finished; - } - } - else - { - if (FAILED(hr = FindNativeAssemblyFromGlobalLocation(&struFileName))) - { - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING, - strEventMsg.QueryStr()); - } - - goto Finished; - } - } - - g_hAspnetCoreRH = LoadLibraryW(struFileName.QueryStr()); - if (g_hAspnetCoreRH == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - g_pfnAspNetCoreCreateApplication = (PFN_ASPNETCORE_CREATE_APPLICATION) - GetProcAddress(g_hAspnetCoreRH, "CreateApplication"); - if (g_pfnAspNetCoreCreateApplication == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - g_pfnAspNetCoreCreateRequestHandler = (PFN_ASPNETCORE_CREATE_REQUEST_HANDLER) - GetProcAddress(g_hAspnetCoreRH, "CreateRequestHandler"); - if (g_pfnAspNetCoreCreateRequestHandler == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - g_fAspnetcoreRHAssemblyLoaded = TRUE; - } - -Finished: - // - // Question: we remember the load failure so that we will not try again. - // User needs to check whether the fuction pointer is NULL - // - m_pfnAspNetCoreCreateApplication = g_pfnAspNetCoreCreateApplication; - m_pfnAspNetCoreCreateRequestHandler = g_pfnAspNetCoreCreateRequestHandler; - if (!g_fAspnetcoreRHLoadedError && FAILED(hr)) - { - g_fAspnetcoreRHLoadedError = TRUE; - } - - if (fLocked) - { - ReleaseSRWLockExclusive(&g_srwLock); - } - return hr; -} - -HRESULT -APPLICATION_INFO::FindNativeAssemblyFromGlobalLocation(STRU* struFilename) -{ - HRESULT hr = S_OK; - DWORD dwSize = MAX_PATH; - BOOL fDone = FALSE; - DWORD dwPosition = 0; - - // Though we could call LoadLibrary(L"aspnetcorerh.dll") relying the OS to solve - // the path (the targeted dll is the same folder of w3wp.exe/iisexpress) - // let's still load with full path to avoid security issue - if (FAILED(hr = struFilename->Resize(dwSize + 20))) - { - goto Finished; - } - - while (!fDone) - { - DWORD dwReturnedSize = GetModuleFileNameW(g_hModule, struFilename->QueryStr(), dwSize); - if (dwReturnedSize == 0) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - fDone = TRUE; - goto Finished; - } - else if ((dwReturnedSize == dwSize) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) - { - dwSize *= 2; // smaller buffer. increase the buffer and retry - if (FAILED(hr = struFilename->Resize(dwSize + 20))) // + 20 for aspnetcorerh.dll - { - goto Finished; - } - } - else - { - fDone = TRUE; - } - } - - if (FAILED(hr = struFilename->SyncWithBuffer())) - { - goto Finished; - } - dwPosition = struFilename->LastIndexOf(L'\\', 0); - struFilename->QueryStr()[dwPosition] = L'\0'; - - if (FAILED(hr = struFilename->SyncWithBuffer()) || - FAILED(hr = struFilename->Append(L"\\")) || - FAILED(hr = struFilename->Append(g_pwzAspnetcoreRequestHandlerName))) - { - goto Finished; - } - -Finished: - return hr; -} - -// -// Tries to find aspnetcorerh.dll from the application -// Calls into hostfxr.dll to find it. -// Will leave hostfxr.dll loaded as it will be used again to call hostfxr_main. -// -HRESULT -APPLICATION_INFO::FindNativeAssemblyFromHostfxr( - STRU* struFilename -) -{ - HRESULT hr = S_OK; - STRU struApplicationFullPath; - STRU struNativeSearchPaths; - STRU struNativeDllLocation; - HMODULE hmHostFxrDll = NULL; - INT intHostFxrExitCode = 0; - INT intIndex = -1; - INT intPrevIndex = 0; - BOOL fFound = FALSE; - DWORD dwBufferSize = 1024 * 10; - DWORD dwRequiredBufferSize = 0; - - DBG_ASSERT(struFileName != NULL); - - hmHostFxrDll = LoadLibraryW(m_pConfiguration->QueryHostFxrFullPath()); - - if (hmHostFxrDll == NULL) - { - // Could not load hostfxr - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - hostfxr_get_native_search_directories_fn pFnHostFxrSearchDirectories = (hostfxr_get_native_search_directories_fn) - GetProcAddress(hmHostFxrDll, "hostfxr_get_native_search_directories"); - - if (pFnHostFxrSearchDirectories == NULL) - { - // Host fxr version is incorrect (need a higher version). - // TODO log error - hr = E_FAIL; - goto Finished; - } - - if (FAILED(hr = struNativeSearchPaths.Resize(dwBufferSize))) - { - goto Finished; - } - - while (TRUE) - { - intHostFxrExitCode = pFnHostFxrSearchDirectories( - m_pConfiguration->QueryHostFxrArgCount(), - m_pConfiguration->QueryHostFxrArguments(), - struNativeSearchPaths.QueryStr(), - dwBufferSize, - &dwRequiredBufferSize - ); - - if (intHostFxrExitCode == 0) - { - break; - } - else if (dwRequiredBufferSize > dwBufferSize) - { - dwBufferSize = dwRequiredBufferSize + 1; // for null terminator - - if (FAILED(hr = struNativeSearchPaths.Resize(dwBufferSize))) - { - goto Finished; - } - } - else - { - hr = E_FAIL; - // Log "Error finding native search directories from aspnetcore application. - goto Finished; - } - } - - if (FAILED(hr = struNativeSearchPaths.SyncWithBuffer())) - { - goto Finished; - } - - fFound = FALSE; - - // The native search directories are semicolon delimited. - // Split on semicolons, append aspnetcorerh.dll, and check if the file exists. - while ((intIndex = struNativeSearchPaths.IndexOf(L";", intPrevIndex)) != -1) - { - if (FAILED(hr = struNativeDllLocation.Copy(&struNativeSearchPaths.QueryStr()[intPrevIndex], intIndex - intPrevIndex))) - { - goto Finished; - } - - if (!struNativeDllLocation.EndsWith(L"\\")) - { - if (FAILED(hr = struNativeDllLocation.Append(L"\\"))) - { - goto Finished; - } - } - - if (FAILED(hr = struNativeDllLocation.Append(g_pwzAspnetcoreRequestHandlerName))) - { - goto Finished; - } - - if (UTILITY::CheckIfFileExists(struNativeDllLocation.QueryStr())) - { - if (FAILED(hr = struFilename->Copy(struNativeDllLocation))) - { - goto Finished; - } - fFound = TRUE; - break; - } - - intPrevIndex = intIndex + 1; - } - - if (!fFound) - { - hr = E_FAIL; - goto Finished; - } - -Finished: - if (FAILED(hr) && hmHostFxrDll != NULL) - { - FreeLibrary(hmHostFxrDll); - } - return hr; -} - -VOID -APPLICATION_INFO::RecycleApplication() -{ - APPLICATION* pApplication = NULL; - HANDLE hThread = INVALID_HANDLE_VALUE; - BOOL fLockAcquired = FALSE; - - if (m_pApplication != NULL) - { - AcquireSRWLockExclusive(&m_srwLock); - fLockAcquired = TRUE; - if (m_pApplication != NULL) - { - pApplication = m_pApplication; - if (pApplication->QueryConfig()->QueryHostingModel() == HOSTING_OUT_PROCESS) - { - // - // For inprocess, need to set m_pApplication to NULL first to - // avoid mapping new request to the recycled application. - // Outofprocess application instance will be created for new request - // For inprocess, as recycle will lead to shutdown later, leave m_pApplication - // to not block incoming requests till worker process shutdown - // - m_pApplication = NULL; - } - else - { - // - // For inprocess, need hold the application till shutdown is called - // Bump the reference counter as DoRecycleApplication will do dereference - // - pApplication->ReferenceApplication(); - } - - hThread = CreateThread( - NULL, // default security attributes - 0, // default stack size - (LPTHREAD_START_ROUTINE)DoRecycleApplication, - pApplication, // thread function arguments - 0, // default creation flags - NULL); // receive thread identifier - } - - if (hThread == NULL) - { - if (!g_fRecycleProcessCalled) - { - g_fRecycleProcessCalled = TRUE; - g_pHttpServer->RecycleProcess(L"On Demand by AspNetCore Module for recycle application failure"); - } - } - else - { - // Closing a thread handle does not terminate the associated thread or remove the thread object. - CloseHandle(hThread); - } - - if (fLockAcquired) - { - ReleaseSRWLockExclusive(&m_srwLock); - } - } -} - - -VOID -APPLICATION_INFO::DoRecycleApplication( - LPVOID lpParam) -{ - APPLICATION* pApplication = static_cast(lpParam); - - // No lock required - - if (pApplication != NULL) - { - // Recycle will call shutdown for out of process - pApplication->Recycle(); - - // Decrement the ref count as we reference it in RecycleApplication. - pApplication->DereferenceApplication(); - } -} - - -VOID -APPLICATION_INFO::ShutDownApplication() -{ - APPLICATION* pApplication = NULL; - BOOL fLockAcquired = FALSE; - - // pApplication can be NULL due to app_offline - if (m_pApplication != NULL) - { - AcquireSRWLockExclusive(&m_srwLock); - fLockAcquired = TRUE; - if (m_pApplication != NULL) - { - pApplication = m_pApplication; - - // Set m_pApplication to NULL first to prevent anyone from using it - m_pApplication = NULL; - pApplication->ShutDown(); - pApplication->DereferenceApplication(); - } - - if (fLockAcquired) - { - ReleaseSRWLockExclusive(&m_srwLock); - } - } -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx deleted file mode 100644 index fd83a19818..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/applicationmanager.cxx +++ /dev/null @@ -1,458 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.hxx" - -// The application manager is a singleton across ANCM. -APPLICATION_MANAGER* APPLICATION_MANAGER::sm_pApplicationManager = NULL; - -// -// Retrieves the application info from the application manager -// Will create the application info if it isn't initalized -// -HRESULT -APPLICATION_MANAGER::GetOrCreateApplicationInfo( - _In_ IHttpServer* pServer, - _In_ ASPNETCORE_CONFIG* pConfig, - _Out_ APPLICATION_INFO ** ppApplicationInfo -) -{ - HRESULT hr = S_OK; - APPLICATION_INFO *pApplicationInfo = NULL; - APPLICATION_INFO_KEY key; - BOOL fExclusiveLock = FALSE; - BOOL fMixedHostingModelError = FALSE; - BOOL fDuplicatedInProcessApp = FALSE; - PCWSTR pszApplicationId = NULL; - STACK_STRU ( strEventMsg, 256 ); - - DBG_ASSERT(pServer); - DBG_ASSERT(pConfig); - DBG_ASSERT(ppApplicationInfo); - - *ppApplicationInfo = NULL; - - // The configuration path is unique for each application and is used for the - // key in the applicationInfoHash. - pszApplicationId = pConfig->QueryConfigPath()->QueryStr(); - hr = key.Initialize(pszApplicationId); - if (FAILED(hr)) - { - goto Finished; - } - - // When accessing the m_pApplicationInfoHash, we need to acquire the application manager - // lock to avoid races on setting state. - AcquireSRWLockShared(&m_srwLock); - if (g_fInShutdown) - { - ReleaseSRWLockShared(&m_srwLock); - hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); - goto Finished; - } - m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); - ReleaseSRWLockShared(&m_srwLock); - - if (*ppApplicationInfo == NULL) - { - // Check which hosting model we want to support - switch (pConfig->QueryHostingModel()) - { - case HOSTING_IN_PROCESS: - if (m_pApplicationInfoHash->Count() > 0) - { - // Only one inprocess app is allowed per IIS worker process - fDuplicatedInProcessApp = TRUE; - hr = HRESULT_FROM_WIN32(ERROR_APP_INIT_FAILURE); - goto Finished; - } - break; - - case HOSTING_OUT_PROCESS: - break; - - default: - hr = E_UNEXPECTED; - goto Finished; - } - pApplicationInfo = new APPLICATION_INFO(pServer); - if (pApplicationInfo == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - AcquireSRWLockExclusive(&m_srwLock); - fExclusiveLock = TRUE; - if (g_fInShutdown) - { - // Already in shuting down. No need to create the application - hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); - goto Finished; - } - m_pApplicationInfoHash->FindKey(&key, ppApplicationInfo); - - if (*ppApplicationInfo != NULL) - { - // someone else created the application - delete pApplicationInfo; - pApplicationInfo = NULL; - goto Finished; - } - - // hosting model check. We do not allow mixed scenario for now - // could be changed in the future - if (m_hostingModel != HOSTING_UNKNOWN) - { - if (m_hostingModel != pConfig->QueryHostingModel()) - { - // hosting model does not match, error out - fMixedHostingModelError = TRUE; - hr = HRESULT_FROM_WIN32(ERROR_APP_INIT_FAILURE); - goto Finished; - } - } - - hr = pApplicationInfo->Initialize(pConfig, m_pFileWatcher); - if (FAILED(hr)) - { - goto Finished; - } - - hr = m_pApplicationInfoHash->InsertRecord( pApplicationInfo ); - if (FAILED(hr)) - { - goto Finished; - } - - // - // first application will decide which hosting model allowed by this process - // - if (m_hostingModel == HOSTING_UNKNOWN) - { - m_hostingModel = pConfig->QueryHostingModel(); - } - - *ppApplicationInfo = pApplicationInfo; - pApplicationInfo->StartMonitoringAppOffline(); - - // Release the locko after starting to monitor for app offline to avoid races with it being dropped. - ReleaseSRWLockExclusive(&m_srwLock); - - fExclusiveLock = FALSE; - pApplicationInfo = NULL; - } - -Finished: - - if (fExclusiveLock) - { - ReleaseSRWLockExclusive(&m_srwLock); - } - - if (pApplicationInfo != NULL) - { - pApplicationInfo->DereferenceApplicationInfo(); - pApplicationInfo = NULL; - } - - if (FAILED(hr)) - { - if (fDuplicatedInProcessApp) - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP_MSG, - pszApplicationId))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP, - strEventMsg.QueryStr()); - } - } - else if (fMixedHostingModelError) - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR_MSG, - pszApplicationId, - pConfig->QueryHostingModel()))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR, - strEventMsg.QueryStr()); - } - } - else - { - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_ADD_APPLICATION_ERROR_MSG, - pszApplicationId, - hr))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_ADD_APPLICATION_ERROR, - strEventMsg.QueryStr()); - } - } - } - - return hr; -} - - -// -// If the application's configuration was changed, -// append the configuration path to the config change context. -// -BOOL -APPLICATION_MANAGER::FindConfigChangedApplication( - _In_ APPLICATION_INFO * pEntry, - _In_ PVOID pvContext) -{ - DBG_ASSERT(pEntry); - DBG_ASSERT(pvContext); - - // Config Change context contains the original config path that changed - // and a multiStr containing - CONFIG_CHANGE_CONTEXT* pContext = static_cast(pvContext); - STRU* pstruConfigPath = pEntry->QueryConfig()->QueryConfigPath(); - - // check if the application path contains our app/subapp by seeing if the config path - // starts with the notification path. - BOOL fChanged = pstruConfigPath->StartsWith(pContext->pstrPath, true); - if (fChanged) - { - DWORD dwLen = (DWORD)wcslen(pContext->pstrPath); - WCHAR wChar = pstruConfigPath->QueryStr()[dwLen]; - - // We need to check that the last character of the config path - // is either a null terminator or a slash. - // This checks the case where the config path was - // MACHINE/WEBROOT/site and your site path is MACHINE/WEBROOT/siteTest - if (wChar != L'\0' && wChar != L'/') - { - // not current app or sub app - fChanged = FALSE; - } - else - { - pContext->MultiSz.Append(*pstruConfigPath); - } - } - return fChanged; -} - -// -// Finds any applications affected by a configuration change and calls Recycle on them -// InProcess: Triggers g_httpServer->RecycleProcess() and keep the application inside of the manager. -// This will cause a shutdown event to occur through the global stop listening event. -// OutOfProcess: Removes all applications in the application manager and calls Recycle, which will call Shutdown, -// on each application. -// -HRESULT -APPLICATION_MANAGER::RecycleApplicationFromManager( - _In_ LPCWSTR pszApplicationId -) -{ - HRESULT hr = S_OK; - APPLICATION_INFO_KEY key; - DWORD dwPreviousCounter = 0; - APPLICATION_INFO_HASH* table = NULL; - CONFIG_CHANGE_CONTEXT context; - BOOL fKeepTable = FALSE; - - if (g_fInShutdown) - { - // We are already shutting down, ignore this event as a global configuration change event - // can occur after global stop listening for some reason. - return hr; - } - - AcquireSRWLockExclusive(&m_srwLock); - if (g_fInShutdown) - { - ReleaseSRWLockExclusive(&m_srwLock); - return hr; - } - - hr = key.Initialize(pszApplicationId); - if (FAILED(hr)) - { - goto Finished; - } - // Make a shallow copy of existing hashtable as we may need to remove nodes - // This will be used for finding differences in which applications are affected by a config change. - table = new APPLICATION_INFO_HASH(); - - if (table == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // few application expected, small bucket size for hash table - if (FAILED(hr = table->Initialize(17 /*prime*/))) - { - goto Finished; - } - - context.pstrPath = pszApplicationId; - - // Keep track of the preview count of applications to know whether there are applications to delete - dwPreviousCounter = m_pApplicationInfoHash->Count(); - - // We don't want to hold the application manager lock for long time as it will block all incoming requests - // Don't call application shutdown inside the lock - m_pApplicationInfoHash->Apply(APPLICATION_INFO_HASH::ReferenceCopyToTable, static_cast(table)); - DBG_ASSERT(dwPreviousCounter == table->Count()); - - // Removed the applications which are impacted by the configurtion change - m_pApplicationInfoHash->DeleteIf(FindConfigChangedApplication, (PVOID)&context); - - if (dwPreviousCounter != m_pApplicationInfoHash->Count()) - { - if (m_hostingModel == HOSTING_IN_PROCESS) - { - // When we are inprocess, we need to keep the application the - // application manager that is being deleted. This is because we will always need to recycle the worker - // process and any requests that hit this worker process must be rejected (while out of process can - // start a new dotnet process). We will immediately call Recycle after this call. - DBG_ASSERT(m_pApplicationInfoHash->Count() == 0); - delete m_pApplicationInfoHash; - - // We don't want to delete the table as m_pApplicationInfoHash = table - fKeepTable = TRUE; - m_pApplicationInfoHash = table; - } - } - - if (m_pApplicationInfoHash->Count() == 0) - { - m_hostingModel = HOSTING_UNKNOWN; - } - - ReleaseSRWLockExclusive(&m_srwLock); - - // If we receive a request at this point. - // OutOfProcess: we will create a new application with new configuration - // InProcess: the request would have to be rejected, as we are about to call g_HttpServer->RecycleProcess - // on the worker proocess - if (!context.MultiSz.IsEmpty()) - { - PCWSTR path = context.MultiSz.First(); - // Iterate through each of the paths that were shut down, - // calling RecycleApplication on each of them. - while (path != NULL) - { - APPLICATION_INFO* pRecord; - - // Application got recycled. Log an event - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_RECYCLE_CONFIGURATION_MSG, - path))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_RECYCLE_CONFIGURATION, - strEventMsg.QueryStr()); - } - - hr = key.Initialize(path); - if (FAILED(hr)) - { - goto Finished; - } - - table->FindKey(&key, &pRecord); - DBG_ASSERT(pRecord != NULL); - - // RecycleApplication is called on a separate thread. - pRecord->RecycleApplication(); - pRecord->DereferenceApplicationInfo(); - path = context.MultiSz.Next(path); - } - } - -Finished: - if (table != NULL && !fKeepTable) - { - table->Clear(); - delete table; - } - - if (FAILED(hr)) - { - // Failed to recycle an application. Log an event - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_RECYCLE_FAILURE_CONFIGURATION_MSG, - pszApplicationId))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_RECYCLE_APP_FAILURE, - strEventMsg.QueryStr()); - } - // Need to recycle the process as we cannot recycle the application - if (!g_fRecycleProcessCalled) - { - g_fRecycleProcessCalled = TRUE; - g_pHttpServer->RecycleProcess(L"AspNetCore Recycle Process on Demand Due Application Recycle Error"); - } - } - - return hr; -} - -// -// Shutsdown all applications in the application hashtable -// Only called by OnGlobalStopListening. -// -VOID -APPLICATION_MANAGER::ShutDown() -{ - // We are guaranteed to only have one outstanding OnGlobalStopListening event at a time - // However, it is possible to receive multiple OnGlobalStopListening events - // Protect against this by checking if we already shut down. - g_fInShutdown = TRUE; - if (m_pApplicationInfoHash != NULL) - { - if (m_pFileWatcher != NULL) - { - delete m_pFileWatcher; - m_pFileWatcher = NULL; - } - - DBG_ASSERT(m_pApplicationInfoHash); - // During shutdown we lock until we delete the application - AcquireSRWLockExclusive(&m_srwLock); - - // Call shutdown on each application in the application manager - m_pApplicationInfoHash->Apply(ShutdownApplication, NULL); - m_pApplicationInfoHash->Clear(); - delete m_pApplicationInfoHash; - m_pApplicationInfoHash = NULL; - - ReleaseSRWLockExclusive(&m_srwLock); - } -} - -// -// Calls shutdown on each application. ApplicationManager's lock is held for duration of -// each shutdown call, guaranteeing another application cannot be created. -// -// static -VOID -APPLICATION_MANAGER::ShutdownApplication( - _In_ APPLICATION_INFO * pEntry, - _In_ PVOID pvContext -) -{ - UNREFERENCED_PARAMETER(pvContext); - DBG_ASSERT(pEntry != NULL); - - pEntry->ShutDownApplication(); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/dllmain.cpp deleted file mode 100644 index 2e4f87e542..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/dllmain.cpp +++ /dev/null @@ -1,254 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.hxx" -#include - -HTTP_MODULE_ID g_pModuleId = NULL; -IHttpServer * g_pHttpServer = NULL; -HANDLE g_hEventLog = NULL; -BOOL g_fRecycleProcessCalled = FALSE; -PCWSTR g_pszModuleName = NULL; -HINSTANCE g_hModule; -HMODULE g_hAspnetCoreRH = NULL; -BOOL g_fAspnetcoreRHAssemblyLoaded = FALSE; -BOOL g_fAspnetcoreRHLoadedError = FALSE; -BOOL g_fInShutdown = FALSE; -DWORD g_dwAspNetCoreDebugFlags = 0; -DWORD g_dwActiveServerProcesses = 0; -SRWLOCK g_srwLock; -DWORD g_dwDebugFlags = 0; -PCSTR g_szDebugLabel = "ASPNET_CORE_MODULE"; -PCWSTR g_pwzAspnetcoreRequestHandlerName = L"aspnetcorerh.dll"; -PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; -PFN_ASPNETCORE_CREATE_REQUEST_HANDLER g_pfnAspNetCoreCreateRequestHandler; - -VOID -StaticCleanup() -{ - APPLICATION_MANAGER::Cleanup(); - if (g_hEventLog != NULL) - { - DeregisterEventSource(g_hEventLog); - g_hEventLog = NULL; - } -} - -BOOL WINAPI DllMain(HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved - ) -{ - UNREFERENCED_PARAMETER(lpReserved); - - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - g_hModule = hModule; - DisableThreadLibraryCalls(hModule); - break; - case DLL_PROCESS_DETACH: - // IIS can cause dll detach to occur before we receive global notifications - // For example, when we switch the bitness of the worker process, - // this is a bug in IIS. To try to avoid AVs, we will set a global flag - g_fInShutdown = TRUE; - StaticCleanup(); - default: - break; - } - - return TRUE; -} - -HRESULT -__stdcall -RegisterModule( -DWORD dwServerVersion, -IHttpModuleRegistrationInfo * pModuleInfo, -IHttpServer * pHttpServer -) -/*++ - -Routine description: - -Function called by IIS immediately after loading the module, used to let -IIS know what notifications the module is interested in - -Arguments: - -dwServerVersion - IIS version the module is being loaded on -pModuleInfo - info regarding this module -pHttpServer - callback functions which can be used by the module at -any point - -Return value: - -HRESULT - ---*/ -{ - HRESULT hr = S_OK; - HKEY hKey; - BOOL fDisableANCM = FALSE; - ASPNET_CORE_PROXY_MODULE_FACTORY * pFactory = NULL; - ASPNET_CORE_GLOBAL_MODULE * pGlobalModule = NULL; - APPLICATION_MANAGER * pApplicationManager = NULL; - - UNREFERENCED_PARAMETER(dwServerVersion); - -#ifdef DEBUG - CREATE_DEBUG_PRINT_OBJECT("Asp.Net Core Module"); - g_dwDebugFlags = DEBUG_FLAGS_ANY; -#endif // DEBUG - - CREATE_DEBUG_PRINT_OBJECT; - - //LoadGlobalConfiguration(); - - InitializeSRWLock(&g_srwLock); - - g_pModuleId = pModuleInfo->GetId(); - g_pszModuleName = pModuleInfo->GetName(); - g_pHttpServer = pHttpServer; - - if (g_pHttpServer->IsCommandLineLaunch()) - { - g_hEventLog = RegisterEventSource(NULL, ASPNETCORE_IISEXPRESS_EVENT_PROVIDER); - } - else - { - g_hEventLog = RegisterEventSource(NULL, ASPNETCORE_EVENT_PROVIDER); - } - - // check whether the feature is disabled due to security reason - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - L"SOFTWARE\\Microsoft\\IIS Extensions\\IIS AspNetCore Module\\Parameters", - 0, - KEY_READ, - &hKey) == NO_ERROR) - { - DWORD dwType; - DWORD dwData; - DWORD cbData; - - cbData = sizeof(dwData); - if ((RegQueryValueEx(hKey, - L"DisableANCM", - NULL, - &dwType, - (LPBYTE)&dwData, - &cbData) == NO_ERROR) && - (dwType == REG_DWORD)) - { - fDisableANCM = (dwData != 0); - } - - cbData = sizeof(dwData); - if ((RegQueryValueEx(hKey, - L"DebugFlags", - NULL, - &dwType, - (LPBYTE)&dwData, - &cbData) == NO_ERROR) && - (dwType == REG_DWORD)) - { - g_dwAspNetCoreDebugFlags = dwData; - } - - RegCloseKey(hKey); - } - - if (fDisableANCM) - { - // Logging - STACK_STRU(strEventMsg, 256); - if (SUCCEEDED(strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_MODULE_DISABLED_MSG))) - { - UTILITY::LogEvent(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_MODULE_DISABLED, - strEventMsg.QueryStr()); - } - // this will return 500 error to client - // as we did not register the module - goto Finished; - } - - // - // Create the factory before any static initialization. - // The ASPNET_CORE_PROXY_MODULE_FACTORY::Terminate method will clean any - // static object initialized. - // - pFactory = new ASPNET_CORE_PROXY_MODULE_FACTORY; - - if (pFactory == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pModuleInfo->SetRequestNotifications( - pFactory, - RQ_EXECUTE_REQUEST_HANDLER, - 0); - if (FAILED(hr)) - { - goto Finished; - } - - pFactory = NULL; - pApplicationManager = APPLICATION_MANAGER::GetInstance(); - if(pApplicationManager == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pApplicationManager->Initialize(); - if(FAILED(hr)) - { - goto Finished; - } - pGlobalModule = NULL; - - pGlobalModule = new ASPNET_CORE_GLOBAL_MODULE(pApplicationManager); - if (pGlobalModule == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pModuleInfo->SetGlobalNotifications( - pGlobalModule, - GL_CONFIGURATION_CHANGE | // Configuration change trigers IIS application stop - GL_STOP_LISTENING); // worker process stop or recycle - - if (FAILED(hr)) - { - goto Finished; - } - pGlobalModule = NULL; - - hr = ALLOC_CACHE_HANDLER::StaticInitialize(); - if (FAILED(hr)) - { - goto Finished; - } - -Finished: - if (pGlobalModule != NULL) - { - delete pGlobalModule; - pGlobalModule = NULL; - } - - if (pFactory != NULL) - { - pFactory->Terminate(); - pFactory = NULL; - } - - return hr; -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/filewatcher.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/filewatcher.cxx deleted file mode 100644 index 4d3174937f..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/filewatcher.cxx +++ /dev/null @@ -1,497 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.hxx" - -FILE_WATCHER::FILE_WATCHER() : - m_hCompletionPort(NULL), - m_hChangeNotificationThread(NULL), - m_fThreadExit(FALSE) -{ -} - -FILE_WATCHER::~FILE_WATCHER() -{ - if (m_hChangeNotificationThread != NULL) - { - DWORD dwRetryCounter = 20; // totally wait for 1s - DWORD dwExitCode = STILL_ACTIVE; - - // signal the file watch thread to exit - PostQueuedCompletionStatus(m_hCompletionPort, 0, FILE_WATCHER_SHUTDOWN_KEY, NULL); - while (!m_fThreadExit && dwRetryCounter > 0) - { - if (GetExitCodeThread(m_hChangeNotificationThread, &dwExitCode)) - { - if (dwExitCode == STILL_ACTIVE) - { - // the file watcher thread will set m_fThreadExit before exit - WaitForSingleObject(m_hChangeNotificationThread, 50); - } - } - else - { - // fail to get thread status - // call terminitethread - TerminateThread(m_hChangeNotificationThread, 1); - m_fThreadExit = TRUE; - } - dwRetryCounter--; - } - - if (!m_fThreadExit) - { - TerminateThread(m_hChangeNotificationThread, 1); - } - - CloseHandle(m_hChangeNotificationThread); - m_hChangeNotificationThread = NULL; - } - - if (NULL != m_hCompletionPort) - { - CloseHandle(m_hCompletionPort); - m_hCompletionPort = NULL; - } -} - -HRESULT -FILE_WATCHER::Create( - VOID -) -{ - HRESULT hr = S_OK; - - m_hCompletionPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, - NULL, - 0, - 0); - - if (m_hCompletionPort == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - m_hChangeNotificationThread = CreateThread(NULL, - 0, - ChangeNotificationThread, - this, - 0, - NULL); - - if (m_hChangeNotificationThread == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - - CloseHandle(m_hCompletionPort); - m_hCompletionPort = NULL; - - goto Finished; - } - -Finished: - return hr; -} - -DWORD -WINAPI -FILE_WATCHER::ChangeNotificationThread( - LPVOID pvArg -) -/*++ - -Routine Description: - -IO completion thread - -Arguments: - -None - -Return Value: - -Win32 error - ---*/ -{ - FILE_WATCHER * pFileMonitor; - BOOL fSuccess = FALSE; - DWORD cbCompletion = 0; - OVERLAPPED * pOverlapped = NULL; - DWORD dwErrorStatus; - ULONG_PTR completionKey; - - pFileMonitor = (FILE_WATCHER*)pvArg; - DBG_ASSERT(pFileMonitor != NULL); - - while (TRUE) - { - fSuccess = GetQueuedCompletionStatus( - pFileMonitor->m_hCompletionPort, - &cbCompletion, - &completionKey, - &pOverlapped, - INFINITE); - - DBG_ASSERT(fSuccess); - dwErrorStatus = fSuccess ? ERROR_SUCCESS : GetLastError(); - - if (completionKey == FILE_WATCHER_SHUTDOWN_KEY) - { - break; - } - - DBG_ASSERT(pOverlapped != NULL); - if (pOverlapped != NULL) - { - FileWatcherCompletionRoutine( - dwErrorStatus, - cbCompletion, - pOverlapped); - } - pOverlapped = NULL; - cbCompletion = 0; - } - - pFileMonitor->m_fThreadExit = TRUE; - ExitThread(0); -} - -VOID -WINAPI -FILE_WATCHER::FileWatcherCompletionRoutine( - DWORD dwCompletionStatus, - DWORD cbCompletion, - OVERLAPPED * pOverlapped -) -/*++ - -Routine Description: - -Called when ReadDirectoryChangesW() completes - -Arguments: - -dwCompletionStatus - Error of completion -cbCompletion - Bytes of completion -pOverlapped - State of completion - -Return Value: - -None - ---*/ -{ - FILE_WATCHER_ENTRY * pMonitorEntry; - pMonitorEntry = CONTAINING_RECORD(pOverlapped, FILE_WATCHER_ENTRY, _overlapped); - - DBG_ASSERT(pMonitorEntry != NULL); - - pMonitorEntry->HandleChangeCompletion(dwCompletionStatus, cbCompletion); - - if (pMonitorEntry->QueryIsValid()) - { - // - // Continue monitoring - // - pMonitorEntry->Monitor(); - } - // - // Deference the counter not matter whether the monitor is valid - // Valid: Monitor increases the counter, need to reduce one - // InValid: Reduce the counter to free the entry - // - pMonitorEntry->DereferenceFileWatcherEntry(); - -} - - -FILE_WATCHER_ENTRY::FILE_WATCHER_ENTRY(FILE_WATCHER * pFileMonitor) : - _pFileMonitor(pFileMonitor), - _hDirectory(INVALID_HANDLE_VALUE), - _hImpersonationToken(NULL), - _pApplicationInfo(NULL), - _lStopMonitorCalled(0), - _cRefs(1), - _fIsValid(TRUE) -{ - _dwSignature = FILE_WATCHER_ENTRY_SIGNATURE; - InitializeSRWLock(&_srwLock); -} - -FILE_WATCHER_ENTRY::~FILE_WATCHER_ENTRY() -{ - _dwSignature = FILE_WATCHER_ENTRY_SIGNATURE_FREE; - - if (_hDirectory != INVALID_HANDLE_VALUE) - { - CloseHandle(_hDirectory); - _hDirectory = INVALID_HANDLE_VALUE; - } - - if (_hImpersonationToken != NULL) - { - CloseHandle(_hImpersonationToken); - _hImpersonationToken = NULL; - } -} - -#pragma warning(disable:4100) - -HRESULT -FILE_WATCHER_ENTRY::HandleChangeCompletion( - _In_ DWORD dwCompletionStatus, - _In_ DWORD cbCompletion -) -/*++ - -Routine Description: - -Handle change notification (see if any of associated config files -need to be flushed) - -Arguments: - -dwCompletionStatus - Completion status -cbCompletion - Bytes of completion - -Return Value: - -HRESULT - ---*/ -{ - HRESULT hr = S_OK; - FILE_NOTIFY_INFORMATION * pNotificationInfo; - BOOL fFileChanged = FALSE; - - AcquireSRWLockExclusive(&_srwLock); - if (!_fIsValid) - { - goto Finished; - } - - // When directory handle is closed then HandleChangeCompletion - // happens with cbCompletion = 0 and dwCompletionStatus = 0 - // From documentation it is not clear if that combination - // of return values is specific to closing handles or whether - // it could also mean an error condition. Hence we will maintain - // explicit flag that will help us determine if entry - // is being shutdown (StopMonitor() called) - // - if (_lStopMonitorCalled) - { - goto Finished; - } - - // - // There could be a FCN overflow - // Let assume the file got changed instead of checking files - // Othersie we have to cache the file info - // - if (cbCompletion == 0) - { - fFileChanged = TRUE; - } - else - { - pNotificationInfo = (FILE_NOTIFY_INFORMATION*)_buffDirectoryChanges.QueryPtr(); - DBG_ASSERT(pNotificationInfo != NULL); - - while (pNotificationInfo != NULL) - { - // - // check whether the monitored file got changed - // - if (_wcsnicmp(pNotificationInfo->FileName, - _strFileName.QueryStr(), - pNotificationInfo->FileNameLength / sizeof(WCHAR)) == 0) - { - fFileChanged = TRUE; - break; - } - // - // Advance to next notification - // - if (pNotificationInfo->NextEntryOffset == 0) - { - pNotificationInfo = NULL; - } - else - { - pNotificationInfo = (FILE_NOTIFY_INFORMATION*) - ((PBYTE)pNotificationInfo + - pNotificationInfo->NextEntryOffset); - } - } - } - - if (fFileChanged) - { - // - // so far we only monitoring app_offline - // - _pApplicationInfo->UpdateAppOfflineFileHandle(); - } - -Finished: - ReleaseSRWLockExclusive(&_srwLock); - return hr; -} - -#pragma warning( error : 4100 ) - -HRESULT -FILE_WATCHER_ENTRY::Monitor(VOID) -{ - HRESULT hr = S_OK; - DWORD cbRead; - - AcquireSRWLockExclusive(&_srwLock); - ReferenceFileWatcherEntry(); - ZeroMemory(&_overlapped, sizeof(_overlapped)); - - if (!ReadDirectoryChangesW(_hDirectory, - _buffDirectoryChanges.QueryPtr(), - _buffDirectoryChanges.QuerySize(), - FALSE, // Watching sub dirs. Set to False now as only monitoring app_offline - FILE_NOTIFY_VALID_MASK & ~FILE_NOTIFY_CHANGE_LAST_ACCESS, - &cbRead, - &_overlapped, - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - DereferenceFileWatcherEntry(); - } - - ReleaseSRWLockExclusive(&_srwLock); - return hr; -} - -VOID -FILE_WATCHER_ENTRY::StopMonitor(VOID) -{ - // - // Flag that monitoring is being stopped so that - // we know that HandleChangeCompletion() call - // can be ignored - // - InterlockedExchange(&_lStopMonitorCalled, 1); - - if (_hDirectory != INVALID_HANDLE_VALUE) - { - AcquireSRWLockExclusive(&_srwLock); - if (_hDirectory != INVALID_HANDLE_VALUE) - { - CloseHandle(_hDirectory); - _hDirectory = INVALID_HANDLE_VALUE; - DereferenceFileWatcherEntry(); - } - ReleaseSRWLockExclusive(&_srwLock); - } -} - -HRESULT -FILE_WATCHER_ENTRY::Create( - _In_ PCWSTR pszDirectoryToMonitor, - _In_ PCWSTR pszFileNameToMonitor, - _In_ APPLICATION_INFO* pApplicationInfo, - _In_ HANDLE hImpersonationToken -) -{ - HRESULT hr = S_OK; - BOOL fRet = FALSE; - - if (pszDirectoryToMonitor == NULL || - pszFileNameToMonitor == NULL || - pApplicationInfo == NULL) - { - DBG_ASSERT(FALSE); - hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - goto Finished; - } - - // - //remember the application - // - _pApplicationInfo = pApplicationInfo; - - if (FAILED(hr = _strFileName.Copy(pszFileNameToMonitor))) - { - goto Finished; - } - - if (FAILED(hr = _strDirectoryName.Copy(pszDirectoryToMonitor))) - { - goto Finished; - } - - // - // Resize change buffer to something "reasonable" - // - if (!_buffDirectoryChanges.Resize(FILE_WATCHER_ENTRY_BUFFER_SIZE)) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Finished; - } - - if (hImpersonationToken != NULL) - { - fRet = DuplicateHandle(GetCurrentProcess(), - hImpersonationToken, - GetCurrentProcess(), - &_hImpersonationToken, - 0, - FALSE, - DUPLICATE_SAME_ACCESS); - - if (!fRet) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - else - { - if (_hImpersonationToken != NULL) - { - CloseHandle(_hImpersonationToken); - _hImpersonationToken = NULL; - } - } - - _hDirectory = CreateFileW( - _strDirectoryName.QueryStr(), - FILE_LIST_DIRECTORY, - FILE_SHARE_READ | FILE_SHARE_WRITE | FILE_SHARE_DELETE, - NULL, - OPEN_EXISTING, - FILE_FLAG_BACKUP_SEMANTICS | FILE_FLAG_OVERLAPPED, - NULL); - - if (_hDirectory == INVALID_HANDLE_VALUE) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (CreateIoCompletionPort( - _hDirectory, - _pFileMonitor->QueryCompletionPort(), - NULL, - 0) == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // - // Start monitoring - // - hr = Monitor(); - -Finished: - - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/globalmodule.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/globalmodule.cpp deleted file mode 100644 index f4c6257bb4..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/globalmodule.cpp +++ /dev/null @@ -1,65 +0,0 @@ -#include "precomp.hxx" - -ASPNET_CORE_GLOBAL_MODULE::ASPNET_CORE_GLOBAL_MODULE( - APPLICATION_MANAGER* pApplicationManager) -{ - m_pApplicationManager = pApplicationManager; -} - -// -// Is called when IIS decided to terminate worker process -// Shut down all core apps -// -GLOBAL_NOTIFICATION_STATUS -ASPNET_CORE_GLOBAL_MODULE::OnGlobalStopListening( - _In_ IGlobalStopListeningProvider * pProvider -) -{ - UNREFERENCED_PARAMETER(pProvider); - - if (g_fInShutdown) - { - // Avoid receiving two shutudown notifications. - return GL_NOTIFICATION_CONTINUE; - } - - DBG_ASSERT(m_pApplicationManager); - // we should let application manager to shutdown all allication - // and dereference it as some requests may still reference to application manager - m_pApplicationManager->ShutDown(); - m_pApplicationManager = NULL; - - // Return processing to the pipeline. - return GL_NOTIFICATION_CONTINUE; -} - -// -// Is called when configuration changed -// Recycled the corresponding core app if its configuration changed -// -GLOBAL_NOTIFICATION_STATUS -ASPNET_CORE_GLOBAL_MODULE::OnGlobalConfigurationChange( - _In_ IGlobalConfigurationChangeProvider * pProvider -) -{ - if (g_fInShutdown) - { - return GL_NOTIFICATION_CONTINUE; - } - // Retrieve the path that has changed. - PCWSTR pwszChangePath = pProvider->GetChangePath(); - - // Test for an error. - if (NULL != pwszChangePath && - _wcsicmp(pwszChangePath, L"MACHINE") != 0 && - _wcsicmp(pwszChangePath, L"MACHINE/WEBROOT") != 0) - { - if (m_pApplicationManager != NULL) - { - m_pApplicationManager->RecycleApplicationFromManager(pwszChangePath); - } - } - - // Return processing to the pipeline. - return GL_NOTIFICATION_CONTINUE; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx deleted file mode 100644 index 574244ba35..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/precomp.hxx +++ /dev/null @@ -1,159 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#pragma warning( disable : 4091) - -// -// System related headers -// -#define _WINSOCKAPI_ - -#define NTDDI_VERSION 0x06010000 -#define WINVER 0x0601 -#define _WIN32_WINNT 0x0601 - -#include -#include -#include - -//#include -#include -#include - -// This should remove our issue of compiling for win7 without header files. -// We force the Windows 8 version check logic in iiswebsocket.h to succeed even though we're compiling for Windows 7. -// Then, we set the version defines back to Windows 7 to for the remainder of the compilation. -#undef NTDDI_VERSION -#undef WINVER -#undef _WIN32_WINNT -#define NTDDI_VERSION 0x06020000 -#define WINVER 0x0602 -#define _WIN32_WINNT 0x0602 -#include -#undef NTDDI_VERSION -#undef WINVER -#undef _WIN32_WINNT - -#define NTDDI_VERSION 0x06010000 -#define WINVER 0x0601 -#define _WIN32_WINNT 0x0601 - -#include -#include - -#include -#include -#include - -// -// Option available starting Windows 8. -// 111 is the value in SDK on May 15, 2012. -// -#ifndef WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS -#define WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS 111 -#endif - -#ifdef max -#undef max -template inline T max(T a, T b) -{ - return a > b ? a : b; -} -#endif - -#ifdef min -#undef min -template inline T min(T a, T b) -{ - return a < b ? a : b; -} -#endif - -inline bool IsSpace(char ch) -{ - switch(ch) - { - case 32: // ' ' - case 9: // '\t' - case 10: // '\n' - case 13: // '\r' - case 11: // '\v' - case 12: // '\f' - return true; - default: - return false; - } -} - -#include -#include -#include "stringa.h" -#include "stringu.h" -#include "dbgutil.h" -#include "ahutil.h" -#include "multisz.h" -#include "multisza.h" -#include "base64.h" -#include -#include -#include -#include -#include - -#include "..\..\CommonLib\environmentvariablehash.h" -#include "..\..\CommonLib\aspnetcoreconfig.h" -#include "..\..\CommonLib\hostfxr_utility.h" -#include "..\..\CommonLib\application.h" -#include "..\..\CommonLib\utility.h" -#include "..\..\CommonLib\debugutil.h" -#include "..\..\CommonLib\requesthandler.h" -#include "..\..\CommonLib\resources.h" -#include "..\..\CommonLib\aspnetcore_msg.h" -//#include "aspnetcore_event.h" -#include "appoffline.h" -#include "filewatcher.h" -#include "applicationinfo.h" -#include "applicationmanager.h" -#include "globalmodule.h" -#include "proxymodule.h" -#include "applicationinfo.h" - - -FORCEINLINE -DWORD -WIN32_FROM_HRESULT( - HRESULT hr -) -{ - if ((FAILED(hr)) && - (HRESULT_FACILITY(hr) == FACILITY_WIN32)) - { - return HRESULT_CODE(hr); - } - return hr; -} - -FORCEINLINE -HRESULT -HRESULT_FROM_GETLASTERROR() -{ - return ( GetLastError() != NO_ERROR ) - ? HRESULT_FROM_WIN32( GetLastError() ) - : E_FAIL; -} - -extern PVOID g_pModuleId; -extern BOOL g_fAspnetcoreRHAssemblyLoaded; -extern BOOL g_fAspnetcoreRHLoadedError; -extern BOOL g_fInShutdown; -extern BOOL g_fEnableReferenceCountTracing; -extern DWORD g_dwActiveServerProcesses; -extern HINSTANCE g_hModule; -extern HMODULE g_hAspnetCoreRH; -extern SRWLOCK g_srwLock; -extern PCWSTR g_pwzAspnetcoreRequestHandlerName; -extern HANDLE g_hEventLog; -extern PFN_ASPNETCORE_CREATE_APPLICATION g_pfnAspNetCoreCreateApplication; -extern PFN_ASPNETCORE_CREATE_REQUEST_HANDLER g_pfnAspNetCoreCreateRequestHandler; -#pragma warning( error : 4091) diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx deleted file mode 100644 index 8ab880339a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/src/proxymodule.cxx +++ /dev/null @@ -1,211 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.hxx" - -__override -HRESULT -ASPNET_CORE_PROXY_MODULE_FACTORY::GetHttpModule( - CHttpModule ** ppModule, - IModuleAllocator * pAllocator -) -{ - ASPNET_CORE_PROXY_MODULE *pModule = new (pAllocator) ASPNET_CORE_PROXY_MODULE(); - if (pModule == NULL) - { - return E_OUTOFMEMORY; - } - - *ppModule = pModule; - return S_OK; -} - -__override -VOID -ASPNET_CORE_PROXY_MODULE_FACTORY::Terminate( - VOID -) -/*++ - -Routine description: - - Function called by IIS for global (non-request-specific) notifications - -Arguments: - - None. - -Return value: - - None - ---*/ -{ - /* FORWARDING_HANDLER::StaticTerminate(); - - WEBSOCKET_HANDLER::StaticTerminate();*/ - - ALLOC_CACHE_HANDLER::StaticTerminate(); - - delete this; -} - -ASPNET_CORE_PROXY_MODULE::ASPNET_CORE_PROXY_MODULE( -) : m_pApplicationInfo(NULL), m_pHandler(NULL) -{ -} - -ASPNET_CORE_PROXY_MODULE::~ASPNET_CORE_PROXY_MODULE() -{ - if (m_pApplicationInfo != NULL) - { - m_pApplicationInfo->DereferenceApplicationInfo(); - m_pApplicationInfo = NULL; - } - - if (m_pHandler != NULL) - { - m_pHandler->DereferenceRequestHandler(); - m_pHandler = NULL; - } -} - -__override -REQUEST_NOTIFICATION_STATUS -ASPNET_CORE_PROXY_MODULE::OnExecuteRequestHandler( - IHttpContext * pHttpContext, - IHttpEventProvider * -) -{ - HRESULT hr = S_OK; - ASPNETCORE_CONFIG *pConfig = NULL; - APPLICATION_MANAGER *pApplicationManager = NULL; - REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; - APPLICATION* pApplication = NULL; - STACK_STRU(struFileName, 256); - if (g_fInShutdown) - { - hr = HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS); - goto Finished; - } - - hr = ASPNETCORE_CONFIG::GetConfig(g_pHttpServer, g_pModuleId, pHttpContext, g_hEventLog, &pConfig); - if (FAILED(hr)) - { - goto Finished; - } - - pApplicationManager = APPLICATION_MANAGER::GetInstance(); - if (pApplicationManager == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pApplicationManager->GetOrCreateApplicationInfo( - g_pHttpServer, - pConfig, - &m_pApplicationInfo); - if (FAILED(hr)) - { - goto Finished; - } - - // app_offline check to avoid loading aspnetcorerh.dll unnecessarily - if (m_pApplicationInfo->AppOfflineFound()) - { - // servicing app_offline - HTTP_DATA_CHUNK DataChunk; - IHttpResponse *pResponse = NULL; - APP_OFFLINE_HTM *pAppOfflineHtm = NULL; - - pResponse = pHttpContext->GetResponse(); - pAppOfflineHtm = m_pApplicationInfo->QueryAppOfflineHtm(); - DBG_ASSERT(pAppOfflineHtm); - DBG_ASSERT(pResponse); - - // Ignore failure hresults as nothing we can do - // Set fTrySkipCustomErrors to true as we want client see the offline content - pResponse->SetStatus(503, "Service Unavailable", 0, hr, NULL, TRUE); - pResponse->SetHeader("Content-Type", - "text/html", - (USHORT)strlen("text/html"), - FALSE - ); - - DataChunk.DataChunkType = HttpDataChunkFromMemory; - DataChunk.FromMemory.pBuffer = (PVOID)pAppOfflineHtm->m_Contents.QueryStr(); - DataChunk.FromMemory.BufferLength = pAppOfflineHtm->m_Contents.QueryCB(); - pResponse->WriteEntityChunkByReference(&DataChunk); - - retVal = RQ_NOTIFICATION_FINISH_REQUEST; - goto Finished; - } - - // make sure assmebly is loaded and application is created - hr = m_pApplicationInfo->EnsureApplicationCreated(); - if (FAILED(hr)) - { - goto Finished; - } - - m_pApplicationInfo->ExtractApplication(&pApplication); - - // make sure application is in running state - // cannot recreate the application as we cannot reload clr for inprocess - if (pApplication != NULL && - pApplication->QueryStatus() != APPLICATION_STATUS::RUNNING && - pApplication->QueryStatus() != APPLICATION_STATUS::STARTING) - { - hr = HRESULT_FROM_WIN32(ERROR_SERVER_DISABLED); - goto Finished; - } - - // Create RequestHandler and process the request - hr = m_pApplicationInfo->QueryCreateRequestHandler()(pHttpContext, - (HTTP_MODULE_ID*) &g_pModuleId, - pApplication, - &m_pHandler); - - if (FAILED(hr)) - { - goto Finished; - } - - retVal = m_pHandler->OnExecuteRequestHandler(); - -Finished: - if (FAILED(hr)) - { - retVal = RQ_NOTIFICATION_FINISH_REQUEST; - if (hr == HRESULT_FROM_WIN32(ERROR_SERVER_SHUTDOWN_IN_PROGRESS)) - { - pHttpContext->GetResponse()->SetStatus(503, "Service Unavailable", 0, hr); - } - else - { - pHttpContext->GetResponse()->SetStatus(500, "Internal Server Error", 0, hr); - } - } - - if (pApplication != NULL) - { - pApplication->DereferenceApplication(); - } - return retVal; -} - -__override -REQUEST_NOTIFICATION_STATUS -ASPNET_CORE_PROXY_MODULE::OnAsyncCompletion( - IHttpContext *, - DWORD, - BOOL, - IHttpEventProvider *, - IHttpCompletionInfo * pCompletionInfo -) -{ - return m_pHandler->OnAsyncCompletion( - pCompletionInfo->GetCompletionBytes(), - pCompletionInfo->GetCompletionStatus()); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj deleted file mode 100644 index 1ab1ef971c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj +++ /dev/null @@ -1,226 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {55494E58-E061-4C4C-A0A8-837008E72F85} - Win32Proj - NewCommon - 10.0.15063.0 - - - - StaticLibrary - true - v141 - Unicode - - - StaticLibrary - false - v141 - true - Unicode - - - StaticLibrary - true - v141 - Unicode - - - StaticLibrary - false - v141 - false - Unicode - - - - - - - - - - - - - - - - - - - - - true - - - true - - - false - - - false - C:\AspNetCoreModule\src\IISLib;$(IncludePath) - - - - Use - Level4 - true - Disabled - false - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreadedDebug - false - ProgramDatabase - - - Windows - true - - - - - Use - Level4 - true - Disabled - false - _DEBUG;_LIB;%(PreprocessorDefinitions) - true - ProgramDatabase - false - MultiThreadedDebug - false - - - Windows - true - - - - - Use - Level4 - true - MaxSpeed - true - true - false - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreaded - false - - - Windows - true - true - true - - - - - Use - Level4 - true - MaxSpeed - true - true - false - NDEBUG;_LIB;%(PreprocessorDefinitions) - true - - - - - MultiThreaded - false - - - Windows - true - true - true - - - ..\iislib - - - - - - - - - - - - - - - - - - - - - - - - - Create - Create - Create - Create - - - - - - {4787a64f-9a3e-4867-a55a-70cb4b2b2ffe} - - - - - Document - mc %(FullPath) - Compiling Event Messages ... - %(Filename).rc;%(Filename).h;MSG0409.bin - mc %(FullPath) - Compiling Event Messages ... - %(Filename).rc;%(Filename).h;MSG0409.bin - mc %(FullPath) - Compiling Event Messages ... - %(Filename).rc;%(Filename).h;MSG0409.bin - mc %(FullPath) - Compiling Event Messages ... - %(Filename).rc;%(Filename).h;MSG0409.bin - - - - - - \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp deleted file mode 100644 index 3fd0be51f4..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.cpp +++ /dev/null @@ -1,13 +0,0 @@ -#include "stdafx.h" -#include "SRWLockWrapper.h" - -SRWLockWrapper::SRWLockWrapper(const SRWLOCK& lock) - : m_lock(lock) -{ - AcquireSRWLockExclusive(const_cast(&m_lock)); -} - -SRWLockWrapper::~SRWLockWrapper() -{ - ReleaseSRWLockExclusive(const_cast(&m_lock)); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h deleted file mode 100644 index 2ae57cb2f8..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWLockWrapper.h +++ /dev/null @@ -1,9 +0,0 @@ -#pragma once -class SRWLockWrapper -{ -public: - SRWLockWrapper(const SRWLOCK& lock); - ~SRWLockWrapper(); -private: - const SRWLOCK& m_lock; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.cpp deleted file mode 100644 index b68c093266..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.cpp +++ /dev/null @@ -1,50 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "stdafx.h" - -APPLICATION::APPLICATION( - _In_ IHttpServer* pHttpServer, - _In_ ASPNETCORE_CONFIG* pConfig) : - m_cRefs(1), - m_pConfig(pConfig), - m_status(APPLICATION_STATUS::UNKNOWN) -{ - UNREFERENCED_PARAMETER(pHttpServer); -} - -APPLICATION::~APPLICATION() -{ -} - -APPLICATION_STATUS -APPLICATION::QueryStatus() -{ - return m_status; -} - -ASPNETCORE_CONFIG* -APPLICATION::QueryConfig() -{ - return m_pConfig; -} - -VOID -APPLICATION::ReferenceApplication() -const -{ - InterlockedIncrement(&m_cRefs); -} - -VOID -APPLICATION::DereferenceApplication() -const -{ - DBG_ASSERT(m_cRefs != 0); - - LONG cRefs = 0; - if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) - { - delete this; - } -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h deleted file mode 100644 index 43c9dafd0c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -enum APPLICATION_STATUS -{ - UNKNOWN = 0, - STARTING, - RUNNING, - SHUTDOWN, - FAIL -}; - -class ASPNETCORE_CONFIG; - -class APPLICATION -{ -public: - APPLICATION( - _In_ IHttpServer* pHttpServer, - _In_ ASPNETCORE_CONFIG* pConfig); - - virtual - VOID - ShutDown() = 0; - - virtual - VOID - Recycle() = 0; - - virtual - ~APPLICATION(); - - APPLICATION_STATUS - QueryStatus(); - - ASPNETCORE_CONFIG* - QueryConfig(); - - VOID - ReferenceApplication() - const; - - VOID - DereferenceApplication() - const; - -protected: - mutable LONG m_cRefs; - volatile APPLICATION_STATUS m_status; - ASPNETCORE_CONFIG* m_pConfig; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc deleted file mode 100644 index 96cf5fec0c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc +++ /dev/null @@ -1,217 +0,0 @@ -;/*++ -; -; Copyright (c) .NET Foundation. All rights reserved. -; Licensed under the MIT License. See License.txt in the project root for license information. -; -;Module Name: -; -; aspnetcore_msg.mc -; -;Abstract: -; -; Asp.Net Core Module localizable messages. -; -;--*/ -; -; -;#ifndef _ASPNETCORE_MSG_H_ -;#define _ASPNETCORE_MSG_H_ -; - -SeverityNames=(Success=0x0 - Informational=0x1 - Warning=0x2 - Error=0x3 - ) - -MessageIdTypedef=DWORD - -Messageid=1000 -SymbolicName=ASPNETCORE_EVENT_PROCESS_START_ERROR -Language=English -%1 -. - -Messageid=1001 -SymbolicName=ASPNETCORE_EVENT_PROCESS_START_SUCCESS -Language=English -%1 -. - -Messageid=1002 -SymbolicName=ASPNETCORE_EVENT_PROCESS_CRASH -Language=English -%1 -. - -Messageid=1003 -SymbolicName=ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED -Language=English -%1 -. - -Messageid=1004 -SymbolicName=ASPNETCORE_EVENT_CONFIG_ERROR -Language=English -%1 -. - -Messageid=1005 -SymbolicName=ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE -Language=English -%1 -. - -Messageid=1006 -SymbolicName=ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST -Language=English -%1 -. - -Messageid=1007 -SymbolicName=ASPNETCORE_EVENT_LOAD_CLR_FALIURE -Language=English -%1 -. - -Messageid=1008 -SymbolicName=ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP -Language=English -%1 -. - -Messageid=1009 -SymbolicName=ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR -Language=English -%1 -. - -Messageid=1010 -SymbolicName=ASPNETCORE_EVENT_ADD_APPLICATION_ERROR -Language=English -%1 -. - -Messageid=1011 -SymbolicName=ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT -Language=English -%1 -. - -Messageid=1012 -SymbolicName=ASPNETCORE_EVENT_RECYCLE_APPOFFLINE -Language=English -%1 -. - -Messageid=1013 -SymbolicName=ASPNETCORE_EVENT_MODULE_DISABLED -Language=English -%1 -. - -Messageid=1014 -SymbolicName=ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP -Language=English -%1 -. - -Messageid=1015 -SymbolicName=ASPNETCORE_EVENT_PORTABLE_APP_DOTNET_MISSING -Language=English -%1 -. - -Messageid=1016 -SymbolicName=ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND -Language=English -%1 -. - -Messageid=1017 -SymbolicName=ASPNETCORE_EVENT_HOSTFXR_DLL_NOT_FOUND -Language=English -%1 -. - -Messageid=1018 -SymbolicName=ASPNETCORE_EVENT_INPROCESS_THREAD_EXCEPTION -Language=English -%1 -. - -Messageid=1019 -SymbolicName=ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND -Language=English -%1 -. - -Messageid=1020 -SymbolicName=ASPNETCORE_EVENT_PROCESS_START_FAILURE -Language=English -%1 -. - -Messageid=1021 -SymbolicName=ASPNETCORE_EVENT_RECYCLE_CONFIGURATION -Language=English -%1 -. - -Messageid=1022 -SymbolicName=ASPNETCORE_EVENT_RECYCLE_APP_FAILURE -Language=English -%1 -. - -Messageid=1023 -SymbolicName=ASPNETCORE_EVENT_APP_IN_SHUTDOWN -Language=English -%1 -. - -Messageid=1024 -SymbolicName=ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_REMOVED -Language=English -%1 -. - -Messageid=1025 -SymbolicName=ASPNETCORE_EVENT_GENERAL_INFO_MSG -Language=English -%1 -. - -Messageid=1026 -SymbolicName=ASPNETCORE_EVENT_GENERAL_WARNING_MSG -Language=English -%1 -. - -Messageid=1027 -SymbolicName=ASPNETCORE_EVENT_GENERAL_ERROR_MSG -Language=English -%1 -. - -Messageid=1028 -SymbolicName=ASPNETCORE_EVENT_INPROCESS_RH_MISSING -Language=English -%1 -. - -Messageid=1029 -SymbolicName=ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING -Language=English -%1 -. - -Messageid=1030 -SymbolicName=ASPNETCORE_EVENT_PROCESS_SHUTDOWN -Language=English -%1 -. - -; -;#endif // _ASPNETCORE_MODULE_MSG_H_ -; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx deleted file mode 100644 index 97a7d0c63e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.cxx +++ /dev/null @@ -1,609 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "stdafx.h" -#include "aspnetcoreconfig.h" -#include "debugutil.h" - -ASPNETCORE_CONFIG::~ASPNETCORE_CONFIG() -{ - if (m_ppStrArguments != NULL) - { - delete[] m_ppStrArguments; - m_ppStrArguments = NULL; - } - - if (m_pEnvironmentVariables != NULL) - { - m_pEnvironmentVariables->Clear(); - delete m_pEnvironmentVariables; - m_pEnvironmentVariables = NULL; - } -} - -VOID -ASPNETCORE_CONFIG::ReferenceConfiguration( - VOID -) const -{ - InterlockedIncrement(&m_cRefs); -} - -VOID -ASPNETCORE_CONFIG::DereferenceConfiguration( - VOID -) const -{ - DBG_ASSERT(m_cRefs != 0); - LONG cRefs = 0; - if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) - { - delete this; - } -} - -HRESULT -ASPNETCORE_CONFIG::GetConfig( - _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpContext *pHttpContext, - _In_ HANDLE hEventLog, - _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig -) -{ - HRESULT hr = S_OK; - IHttpApplication *pHttpApplication = pHttpContext->GetApplication(); - ASPNETCORE_CONFIG *pAspNetCoreConfig = NULL; - STRU struHostFxrDllLocation; - PWSTR* pwzArgv; - DWORD dwArgCount; - - if (ppAspNetCoreConfig == NULL) - { - hr = E_INVALIDARG; - goto Finished; - } - - *ppAspNetCoreConfig = NULL; - - // potential bug if user sepcific config at virtual dir level - pAspNetCoreConfig = (ASPNETCORE_CONFIG*) - pHttpApplication->GetModuleContextContainer()->GetModuleContext(pModuleId); - - if (pAspNetCoreConfig != NULL) - { - *ppAspNetCoreConfig = pAspNetCoreConfig; - pAspNetCoreConfig = NULL; - goto Finished; - } - - pAspNetCoreConfig = new ASPNETCORE_CONFIG; - if (pAspNetCoreConfig == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pAspNetCoreConfig->Populate(pHttpServer, pHttpContext); - if (FAILED(hr)) - { - goto Finished; - } - - // Modify config for inprocess. - if (pAspNetCoreConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) - { - if (FAILED(hr = HOSTFXR_UTILITY::GetHostFxrParameters( - hEventLog, - pAspNetCoreConfig->QueryProcessPath()->QueryStr(), - pAspNetCoreConfig->QueryApplicationPhysicalPath()->QueryStr(), - pAspNetCoreConfig->QueryArguments()->QueryStr(), - &struHostFxrDllLocation, - &dwArgCount, - &pwzArgv))) - { - goto Finished; - } - - if (FAILED(hr = pAspNetCoreConfig->SetHostFxrFullPath(struHostFxrDllLocation.QueryStr()))) - { - goto Finished; - } - - pAspNetCoreConfig->SetHostFxrArguments(dwArgCount, pwzArgv); - } - - hr = pHttpApplication->GetModuleContextContainer()-> - SetModuleContext(pAspNetCoreConfig, pModuleId); - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED)) - { - delete pAspNetCoreConfig; - - pAspNetCoreConfig = (ASPNETCORE_CONFIG*)pHttpApplication-> - GetModuleContextContainer()-> - GetModuleContext(pModuleId); - - _ASSERT(pAspNetCoreConfig != NULL); - - hr = S_OK; - } - else - { - goto Finished; - } - } - else - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "ASPNETCORE_CONFIG::GetConfig, set config to ModuleContext"); - // set appliction info here instead of inside Populate() - // as the destructor will delete the backend process - hr = pAspNetCoreConfig->QueryApplicationPath()->Copy(pHttpApplication->GetApplicationId()); - if (FAILED(hr)) - { - goto Finished; - } - } - - *ppAspNetCoreConfig = pAspNetCoreConfig; - pAspNetCoreConfig = NULL; - -Finished: - - if (pAspNetCoreConfig != NULL) - { - delete pAspNetCoreConfig; - pAspNetCoreConfig = NULL; - } - - return hr; -} - -HRESULT -ASPNETCORE_CONFIG::Populate( - IHttpServer *pHttpServer, - IHttpContext *pHttpContext -) -{ - STACK_STRU(strHostingModel, 300); - HRESULT hr = S_OK; - STRU strEnvName; - STRU strEnvValue; - STRU strExpandedEnvValue; - STRU strApplicationFullPath; - IAppHostAdminManager *pAdminManager = NULL; - IAppHostElement *pAspNetCoreElement = NULL; - IAppHostElement *pWindowsAuthenticationElement = NULL; - IAppHostElement *pBasicAuthenticationElement = NULL; - IAppHostElement *pAnonymousAuthenticationElement = NULL; - IAppHostElement *pWebSocketElement = NULL; - IAppHostElement *pEnvVarList = NULL; - IAppHostElement *pEnvVar = NULL; - IAppHostElementCollection *pEnvVarCollection = NULL; - ULONGLONG ullRawTimeSpan = 0; - ENUM_INDEX index; - ENVIRONMENT_VAR_ENTRY* pEntry = NULL; - DWORD dwCounter = 0; - DWORD dwPosition = 0; - WCHAR* pszPath = NULL; - BSTR bstrWindowAuthSection = NULL; - BSTR bstrBasicAuthSection = NULL; - BSTR bstrAnonymousAuthSection = NULL; - BSTR bstrAspNetCoreSection = NULL; - BSTR bstrWebsocketSection = NULL; - - m_pEnvironmentVariables = new ENVIRONMENT_VAR_HASH(); - if (m_pEnvironmentVariables == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - if (FAILED(hr = m_pEnvironmentVariables->Initialize(37 /*prime*/))) - { - delete m_pEnvironmentVariables; - m_pEnvironmentVariables = NULL; - goto Finished; - } - - pAdminManager = pHttpServer->GetAdminManager(); - hr = m_struConfigPath.Copy(pHttpContext->GetApplication()->GetAppConfigPath()); - if (FAILED(hr)) - { - goto Finished; - } - - hr = m_struApplicationPhysicalPath.Copy(pHttpContext->GetApplication()->GetApplicationPhysicalPath()); - if (FAILED(hr)) - { - goto Finished; - } - - pszPath = m_struConfigPath.QueryStr(); - while (pszPath[dwPosition] != NULL) - { - if (pszPath[dwPosition] == '/') - { - dwCounter++; - if (dwCounter == 4) - break; - } - dwPosition++; - } - - if (dwCounter == 4) - { - hr = m_struApplicationVirtualPath.Copy(pszPath + dwPosition); - } - else - { - hr = m_struApplicationVirtualPath.Copy(L"/"); - } - - // Will setup the application virtual path. - if (FAILED(hr)) - { - goto Finished; - } - - bstrWindowAuthSection = SysAllocString(CS_WINDOWS_AUTHENTICATION_SECTION); - if (bstrWindowAuthSection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pAdminManager->GetAdminSection(bstrWindowAuthSection, - m_struConfigPath.QueryStr(), - &pWindowsAuthenticationElement); - if (FAILED(hr)) - { - // assume the corresponding authen was not enabled - // as the section may get deleted by user in some HWC case - // ToDo: log a warning to event log - m_fWindowsAuthEnabled = FALSE; - } - else - { - hr = GetElementBoolProperty(pWindowsAuthenticationElement, - CS_ENABLED, - &m_fWindowsAuthEnabled); - if (FAILED(hr)) - { - goto Finished; - } - } - - bstrBasicAuthSection = SysAllocString(CS_BASIC_AUTHENTICATION_SECTION); - if (bstrBasicAuthSection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - hr = pAdminManager->GetAdminSection(bstrBasicAuthSection, - m_struConfigPath.QueryStr(), - &pBasicAuthenticationElement); - if (FAILED(hr)) - { - m_fBasicAuthEnabled = FALSE; - } - else - { - hr = GetElementBoolProperty(pBasicAuthenticationElement, - CS_ENABLED, - &m_fBasicAuthEnabled); - if (FAILED(hr)) - { - goto Finished; - } - } - bstrAnonymousAuthSection = SysAllocString(CS_ANONYMOUS_AUTHENTICATION_SECTION); - if (bstrAnonymousAuthSection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - hr = pAdminManager->GetAdminSection(bstrAnonymousAuthSection, - m_struConfigPath.QueryStr(), - &pAnonymousAuthenticationElement); - if (FAILED(hr)) - { - m_fAnonymousAuthEnabled = FALSE; - } - else - { - hr = GetElementBoolProperty(pAnonymousAuthenticationElement, - CS_ENABLED, - &m_fAnonymousAuthEnabled); - if (FAILED(hr)) - { - goto Finished; - } - } - - bstrWebsocketSection = SysAllocString(CS_WEBSOCKET_SECTION); - if (bstrWebsocketSection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = pAdminManager->GetAdminSection(bstrWebsocketSection, - m_struConfigPath.QueryStr(), - &pWebSocketElement); - if (FAILED(hr)) - { - m_fWebSocketEnabled = FALSE; - } - else - { - hr = GetElementBoolProperty(pWebSocketElement, - CS_ENABLED, - &m_fWebSocketEnabled); - if (FAILED(hr)) - { - goto Finished; - } - } - - bstrAspNetCoreSection = SysAllocString(CS_ASPNETCORE_SECTION); - if (bstrAspNetCoreSection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - hr = pAdminManager->GetAdminSection(bstrAspNetCoreSection, - m_struConfigPath.QueryStr(), - &pAspNetCoreElement); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementStringProperty(pAspNetCoreElement, - CS_ASPNETCORE_PROCESS_EXE_PATH, - &m_struProcessPath); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementStringProperty(pAspNetCoreElement, - CS_ASPNETCORE_HOSTING_MODEL, - &strHostingModel); - if (FAILED(hr)) - { - // Swallow this error for backward compatability - // Use default behavior for empty string - hr = S_OK; - } - - if (strHostingModel.IsEmpty() || strHostingModel.Equals(L"outofprocess", TRUE)) - { - m_hostingModel = HOSTING_OUT_PROCESS; - } - else if (strHostingModel.Equals(L"inprocess", TRUE)) - { - m_hostingModel = HOSTING_IN_PROCESS; - } - else - { - // block unknown hosting value - hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - goto Finished; - } - - hr = GetElementStringProperty(pAspNetCoreElement, - CS_ASPNETCORE_PROCESS_ARGUMENTS, - &m_struArguments); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementDWORDProperty(pAspNetCoreElement, - CS_ASPNETCORE_RAPID_FAILS_PER_MINUTE, - &m_dwRapidFailsPerMinute); - if (FAILED(hr)) - { - goto Finished; - } - - // - // rapidFailsPerMinute cannot be greater than 100. - // - if (m_dwRapidFailsPerMinute > MAX_RAPID_FAILS_PER_MINUTE) - { - m_dwRapidFailsPerMinute = MAX_RAPID_FAILS_PER_MINUTE; - } - - hr = GetElementDWORDProperty(pAspNetCoreElement, - CS_ASPNETCORE_PROCESSES_PER_APPLICATION, - &m_dwProcessesPerApplication); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementDWORDProperty( - pAspNetCoreElement, - CS_ASPNETCORE_PROCESS_STARTUP_TIME_LIMIT, - &m_dwStartupTimeLimitInMS - ); - if (FAILED(hr)) - { - goto Finished; - } - - m_dwStartupTimeLimitInMS *= MILLISECONDS_IN_ONE_SECOND; - - hr = GetElementDWORDProperty( - pAspNetCoreElement, - CS_ASPNETCORE_PROCESS_SHUTDOWN_TIME_LIMIT, - &m_dwShutdownTimeLimitInMS - ); - if (FAILED(hr)) - { - goto Finished; - } - m_dwShutdownTimeLimitInMS *= MILLISECONDS_IN_ONE_SECOND; - - hr = GetElementBoolProperty(pAspNetCoreElement, - CS_ASPNETCORE_FORWARD_WINDOWS_AUTH_TOKEN, - &m_fForwardWindowsAuthToken); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementBoolProperty(pAspNetCoreElement, - CS_ASPNETCORE_DISABLE_START_UP_ERROR_PAGE, - &m_fDisableStartUpErrorPage); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementRawTimeSpanProperty( - pAspNetCoreElement, - CS_ASPNETCORE_WINHTTP_REQUEST_TIMEOUT, - &ullRawTimeSpan - ); - if (FAILED(hr)) - { - goto Finished; - } - - m_dwRequestTimeoutInMS = (DWORD)TIMESPAN_IN_MILLISECONDS(ullRawTimeSpan); - - hr = GetElementBoolProperty(pAspNetCoreElement, - CS_ASPNETCORE_STDOUT_LOG_ENABLED, - &m_fStdoutLogEnabled); - if (FAILED(hr)) - { - goto Finished; - } - hr = GetElementStringProperty(pAspNetCoreElement, - CS_ASPNETCORE_STDOUT_LOG_FILE, - &m_struStdoutLogFile); - if (FAILED(hr)) - { - goto Finished; - } - - hr = GetElementChildByName(pAspNetCoreElement, - CS_ASPNETCORE_ENVIRONMENT_VARIABLES, - &pEnvVarList); - if (FAILED(hr)) - { - goto Finished; - } - - hr = pEnvVarList->get_Collection(&pEnvVarCollection); - if (FAILED(hr)) - { - goto Finished; - } - - for (hr = FindFirstElement(pEnvVarCollection, &index, &pEnvVar); - SUCCEEDED(hr); - hr = FindNextElement(pEnvVarCollection, &index, &pEnvVar)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - if (FAILED(hr = GetElementStringProperty(pEnvVar, - CS_ASPNETCORE_ENVIRONMENT_VARIABLE_NAME, - &strEnvName)) || - FAILED(hr = GetElementStringProperty(pEnvVar, - CS_ASPNETCORE_ENVIRONMENT_VARIABLE_VALUE, - &strEnvValue)) || - FAILED(hr = strEnvName.Append(L"=")) || - FAILED(hr = STRU::ExpandEnvironmentVariables(strEnvValue.QueryStr(), &strExpandedEnvValue))) - { - goto Finished; - } - - pEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if (FAILED(hr = pEntry->Initialize(strEnvName.QueryStr(), strExpandedEnvValue.QueryStr())) || - FAILED(hr = m_pEnvironmentVariables->InsertRecord(pEntry))) - { - goto Finished; - } - strEnvName.Reset(); - strEnvValue.Reset(); - strExpandedEnvValue.Reset(); - pEnvVar->Release(); - pEnvVar = NULL; - pEntry->Dereference(); - pEntry = NULL; - } - -Finished: - - if (pAspNetCoreElement != NULL) - { - pAspNetCoreElement->Release(); - pAspNetCoreElement = NULL; - } - - if (pWebSocketElement != NULL) - { - pWebSocketElement->Release(); - pWebSocketElement = NULL; - } - - if (pWindowsAuthenticationElement != NULL) - { - pWindowsAuthenticationElement->Release(); - pWindowsAuthenticationElement = NULL; - } - - if (pAnonymousAuthenticationElement != NULL) - { - pAnonymousAuthenticationElement->Release(); - pAnonymousAuthenticationElement = NULL; - } - - if (pBasicAuthenticationElement != NULL) - { - pBasicAuthenticationElement->Release(); - pBasicAuthenticationElement = NULL; - } - - if (pEnvVarList != NULL) - { - pEnvVarList->Release(); - pEnvVarList = NULL; - } - - if (pEnvVar != NULL) - { - pEnvVar->Release(); - pEnvVar = NULL; - } - - if (pEnvVarCollection != NULL) - { - pEnvVarCollection->Release(); - pEnvVarCollection = NULL; - } - - if (pEntry != NULL) - { - pEntry->Dereference(); - pEntry = NULL; - } - - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h deleted file mode 100644 index 655dcdc385..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcoreconfig.h +++ /dev/null @@ -1,332 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#define CS_ROOTWEB_CONFIG L"MACHINE/WEBROOT/APPHOST/" -#define CS_ROOTWEB_CONFIG_LEN _countof(CS_ROOTWEB_CONFIG)-1 -#define CS_ASPNETCORE_SECTION L"system.webServer/aspNetCore" -#define CS_WINDOWS_AUTHENTICATION_SECTION L"system.webServer/security/authentication/windowsAuthentication" -#define CS_BASIC_AUTHENTICATION_SECTION L"system.webServer/security/authentication/basicAuthentication" -#define CS_ANONYMOUS_AUTHENTICATION_SECTION L"system.webServer/security/authentication/anonymousAuthentication" -#define CS_WEBSOCKET_SECTION L"system.webServer/webSocket" -#define CS_ENABLED L"enabled" -#define CS_ASPNETCORE_PROCESS_EXE_PATH L"processPath" -#define CS_ASPNETCORE_PROCESS_ARGUMENTS L"arguments" -#define CS_ASPNETCORE_PROCESS_STARTUP_TIME_LIMIT L"startupTimeLimit" -#define CS_ASPNETCORE_PROCESS_SHUTDOWN_TIME_LIMIT L"shutdownTimeLimit" -#define CS_ASPNETCORE_WINHTTP_REQUEST_TIMEOUT L"requestTimeout" -#define CS_ASPNETCORE_RAPID_FAILS_PER_MINUTE L"rapidFailsPerMinute" -#define CS_ASPNETCORE_STDOUT_LOG_ENABLED L"stdoutLogEnabled" -#define CS_ASPNETCORE_STDOUT_LOG_FILE L"stdoutLogFile" -#define CS_ASPNETCORE_ENVIRONMENT_VARIABLES L"environmentVariables" -#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE L"environmentVariable" -#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE_NAME L"name" -#define CS_ASPNETCORE_ENVIRONMENT_VARIABLE_VALUE L"value" -#define CS_ASPNETCORE_PROCESSES_PER_APPLICATION L"processesPerApplication" -#define CS_ASPNETCORE_FORWARD_WINDOWS_AUTH_TOKEN L"forwardWindowsAuthToken" -#define CS_ASPNETCORE_DISABLE_START_UP_ERROR_PAGE L"disableStartUpErrorPage" -#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE L"recycleOnFileChange" -#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE_FILE L"file" -#define CS_ASPNETCORE_RECYCLE_ON_FILE_CHANGE_FILE_PATH L"path" -#define CS_ASPNETCORE_HOSTING_MODEL L"hostingModel" - -#define MAX_RAPID_FAILS_PER_MINUTE 100 -#define MILLISECONDS_IN_ONE_SECOND 1000 -#define MIN_PORT 1025 -#define MAX_PORT 48000 - -#define TIMESPAN_IN_MILLISECONDS(x) ((x)/((LONGLONG)(10000))) -#define TIMESPAN_IN_SECONDS(x) ((TIMESPAN_IN_MILLISECONDS(x))/((LONGLONG)(1000))) -#define TIMESPAN_IN_MINUTES(x) ((TIMESPAN_IN_SECONDS(x))/((LONGLONG)(60))) - -//#define HEX_TO_ASCII(c) ((CHAR)(((c) < 10) ? ((c) + '0') : ((c) + 'a' - 10))) - -#include "stdafx.h" - -enum APP_HOSTING_MODEL -{ - HOSTING_UNKNOWN = 0, - HOSTING_IN_PROCESS, - HOSTING_OUT_PROCESS -}; - -class ASPNETCORE_CONFIG : IHttpStoredContext -{ -public: - - virtual - ~ASPNETCORE_CONFIG(); - - VOID - CleanupStoredContext() - { - DereferenceConfiguration(); - } - - static - HRESULT - GetConfig( - _In_ IHttpServer *pHttpServer, - _In_ HTTP_MODULE_ID pModuleId, - _In_ IHttpContext *pHttpContext, - _In_ HANDLE hEventLog, - _Out_ ASPNETCORE_CONFIG **ppAspNetCoreConfig - ); - - ENVIRONMENT_VAR_HASH* - QueryEnvironmentVariables( - VOID - ) - { - return m_pEnvironmentVariables; - } - - DWORD - QueryRapidFailsPerMinute( - VOID - ) - { - return m_dwRapidFailsPerMinute; - } - - DWORD - QueryStartupTimeLimitInMS( - VOID - ) - { - return m_dwStartupTimeLimitInMS; - } - - DWORD - QueryShutdownTimeLimitInMS( - VOID - ) - { - return m_dwShutdownTimeLimitInMS; - } - - DWORD - QueryProcessesPerApplication( - VOID - ) - { - return m_dwProcessesPerApplication; - } - - DWORD - QueryRequestTimeoutInMS( - VOID - ) - { - return m_dwRequestTimeoutInMS; - } - - STRU* - QueryArguments( - VOID - ) - { - return &m_struArguments; - } - - STRU* - QueryApplicationPath( - VOID - ) - { - return &m_struApplication; - } - - STRU* - QueryApplicationPhysicalPath( - VOID - ) - { - return &m_struApplicationPhysicalPath; - } - - STRU* - QueryApplicationVirtualPath( - VOID - ) - { - return &m_struApplicationVirtualPath; - } - - STRU* - QueryProcessPath( - VOID - ) - { - return &m_struProcessPath; - } - - APP_HOSTING_MODEL - QueryHostingModel( - VOID - ) - { - return m_hostingModel; - } - - BOOL - QueryStdoutLogEnabled() - { - return m_fStdoutLogEnabled; - } - - BOOL - QueryWebSocketEnabled() - { - return m_fWebSocketEnabled; - } - - BOOL - QueryForwardWindowsAuthToken() - { - return m_fForwardWindowsAuthToken; - } - - BOOL - QueryWindowsAuthEnabled() - { - return m_fWindowsAuthEnabled; - } - - BOOL - QueryBasicAuthEnabled() - { - return m_fBasicAuthEnabled; - } - - BOOL - QueryAnonymousAuthEnabled() - { - return m_fAnonymousAuthEnabled; - } - - BOOL - QueryDisableStartUpErrorPage() - { - return m_fDisableStartUpErrorPage; - } - - STRU* - QueryStdoutLogFile() - { - return &m_struStdoutLogFile; - } - - STRU* - QueryConfigPath() - { - return &m_struConfigPath; - } - - CONST - PCWSTR* - QueryHostFxrArguments( - VOID - ) - { - return m_ppStrArguments; - } - - CONST - DWORD - QueryHostFxrArgCount( - VOID - ) - { - return m_dwArgc; - } - - CONST - PCWSTR - QueryHostFxrFullPath( - VOID - ) - { - return m_struHostFxrLocation.QueryStr(); - } - - HRESULT - SetHostFxrFullPath( - PCWSTR pStrHostFxrFullPath - ) - { - return m_struHostFxrLocation.Copy(pStrHostFxrFullPath); - } - - VOID - SetHostFxrArguments( - DWORD dwArgc, - PWSTR* ppStrArguments - ) - { - if (m_ppStrArguments != NULL) - { - delete[] m_ppStrArguments; - } - - m_dwArgc = dwArgc; - m_ppStrArguments = ppStrArguments; - } - - VOID - ReferenceConfiguration( - VOID - ) const; - - VOID - DereferenceConfiguration( - VOID - ) const; - -private: - - // - // private constructor - // - ASPNETCORE_CONFIG(): - m_fStdoutLogEnabled( FALSE ), - m_pEnvironmentVariables( NULL ), - m_cRefs( 1 ), - m_hostingModel( HOSTING_UNKNOWN ), - m_ppStrArguments(NULL) - { - } - - HRESULT - Populate( - IHttpServer *pHttpServer, - IHttpContext *pHttpContext - ); - - mutable LONG m_cRefs; - - DWORD m_dwRequestTimeoutInMS; - DWORD m_dwStartupTimeLimitInMS; - DWORD m_dwShutdownTimeLimitInMS; - DWORD m_dwRapidFailsPerMinute; - DWORD m_dwProcessesPerApplication; - STRU m_struArguments; - STRU m_struProcessPath; - STRU m_struStdoutLogFile; - STRU m_struApplication; - STRU m_struApplicationPhysicalPath; - STRU m_struApplicationVirtualPath; - STRU m_struConfigPath; - BOOL m_fStdoutLogEnabled; - BOOL m_fForwardWindowsAuthToken; - BOOL m_fDisableStartUpErrorPage; - BOOL m_fWindowsAuthEnabled; - BOOL m_fBasicAuthEnabled; - BOOL m_fAnonymousAuthEnabled; - BOOL m_fWebSocketEnabled; - APP_HOSTING_MODEL m_hostingModel; - ENVIRONMENT_VAR_HASH* m_pEnvironmentVariables; - STRU m_struHostFxrLocation; - PWSTR* m_ppStrArguments; - DWORD m_dwArgc; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h deleted file mode 100644 index 16fce88edd..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h +++ /dev/null @@ -1,81 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#define ASPNETCORE_DEBUG_FLAG_INFO 0x00000001 -#define ASPNETCORE_DEBUG_FLAG_WARNING 0x00000002 -#define ASPNETCORE_DEBUG_FLAG_ERROR 0x00000004 - -extern DWORD g_dwAspNetCoreDebugFlags; - -static -BOOL -IfDebug( - DWORD dwFlag - ) -{ - return ( dwFlag & g_dwAspNetCoreDebugFlags ); -} - -static -VOID -DebugPrint( - DWORD dwFlag, - LPCSTR szString - ) -{ - STACK_STRA (strOutput, 256); - HRESULT hr = S_OK; - - if ( IfDebug( dwFlag ) ) - { - hr = strOutput.SafeSnprintf( - "[aspnetcore.dll] %s\r\n", - szString ); - - if (FAILED (hr)) - { - goto Finished; - } - - OutputDebugStringA( strOutput.QueryStr() ); - } - -Finished: - - return; -} - -static -VOID -DebugPrintf( -DWORD dwFlag, -LPCSTR szFormat, -... -) -{ - STACK_STRA (strCooked,256); - - va_list args; - HRESULT hr = S_OK; - - if ( IfDebug( dwFlag ) ) - { - va_start( args, szFormat ); - - hr = strCooked.SafeVsnprintf(szFormat, args ); - - va_end( args ); - - if (FAILED (hr)) - { - goto Finished; - } - - DebugPrint( dwFlag, strCooked.QueryStr() ); - } - -Finished: - return; -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/environmentvariablehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/environmentvariablehash.h deleted file mode 100644 index 8fa054f2a9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/environmentvariablehash.h +++ /dev/null @@ -1,131 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define HOSTING_STARTUP_ASSEMBLIES_ENV_STR L"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES" -#define HOSTING_STARTUP_ASSEMBLIES_NAME L"ASPNETCORE_HOSTINGSTARTUPASSEMBLIES=" -#define HOSTING_STARTUP_ASSEMBLIES_VALUE L"Microsoft.AspNetCore.Server.IISIntegration" -#define ASPNETCORE_IIS_AUTH_ENV_STR L"ASPNETCORE_IIS_HTTPAUTH=" -#define ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED_ENV_STR L"ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED=" -#define ASPNETCORE_IIS_AUTH_WINDOWS L"windows;" -#define ASPNETCORE_IIS_AUTH_BASIC L"basic;" -#define ASPNETCORE_IIS_AUTH_ANONYMOUS L"anonymous;" -#define ASPNETCORE_IIS_AUTH_NONE L"none" - -// -// The key used for hash-table lookups, consists of the port on which the http process is created. -// - -class ENVIRONMENT_VAR_ENTRY -{ -public: - ENVIRONMENT_VAR_ENTRY(): - _cRefs(1) - { - } - - HRESULT - Initialize( - PCWSTR pszName, - PCWSTR pszValue - ) - { - HRESULT hr = S_OK; - if (FAILED(hr = _strName.Copy(pszName)) || - FAILED(hr = _strValue.Copy(pszValue))) - { - } - return hr; - } - - VOID - Reference() const - { - InterlockedIncrement(&_cRefs); - } - - VOID - Dereference() const - { - if (InterlockedDecrement(&_cRefs) == 0) - { - delete this; - } - } - - PWSTR const - QueryName() - { - return _strName.QueryStr(); - } - - PWSTR const - QueryValue() - { - return _strValue.QueryStr(); - } - -private: - ~ENVIRONMENT_VAR_ENTRY() - { - } - - STRU _strName; - STRU _strValue; - mutable LONG _cRefs; -}; - -class ENVIRONMENT_VAR_HASH : public HASH_TABLE -{ -public: - ENVIRONMENT_VAR_HASH() - { - } - - PWSTR - ExtractKey( - ENVIRONMENT_VAR_ENTRY * pEntry - ) - { - return pEntry->QueryName(); - } - - DWORD - CalcKeyHash( - PWSTR pszName - ) - { - return HashStringNoCase(pszName); - } - - BOOL - EqualKeys( - PWSTR pszName1, - PWSTR pszName2 - ) - { - return (_wcsicmp(pszName1, pszName2) == 0); - } - - VOID - ReferenceRecord( - ENVIRONMENT_VAR_ENTRY * pEntry - ) - { - pEntry->Reference(); - } - - VOID - DereferenceRecord( - ENVIRONMENT_VAR_ENTRY * pEntry - ) - { - pEntry->Dereference(); - } - - -private: - ENVIRONMENT_VAR_HASH(const ENVIRONMENT_VAR_HASH &); - void operator=(const ENVIRONMENT_VAR_HASH &); -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cxx deleted file mode 100644 index 7aeb0999c0..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cxx +++ /dev/null @@ -1,192 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -#include "stdafx.h" - -fx_ver_t::fx_ver_t(int major, int minor, int patch, const std::wstring& pre, const std::wstring& build) - : m_major(major) - , m_minor(minor) - , m_patch(patch) - , m_pre(pre) - , m_build(build) -{ -} - -fx_ver_t::fx_ver_t(int major, int minor, int patch, const std::wstring& pre) - : fx_ver_t(major, minor, patch, pre, TEXT("")) -{ -} - -fx_ver_t::fx_ver_t(int major, int minor, int patch) - : fx_ver_t(major, minor, patch, TEXT(""), TEXT("")) -{ -} - -bool fx_ver_t::operator ==(const fx_ver_t& b) const -{ - return compare(*this, b) == 0; -} - -bool fx_ver_t::operator !=(const fx_ver_t& b) const -{ - return !operator ==(b); -} - -bool fx_ver_t::operator <(const fx_ver_t& b) const -{ - return compare(*this, b) < 0; -} - -bool fx_ver_t::operator >(const fx_ver_t& b) const -{ - return compare(*this, b) > 0; -} - -bool fx_ver_t::operator <=(const fx_ver_t& b) const -{ - return compare(*this, b) <= 0; -} - -bool fx_ver_t::operator >=(const fx_ver_t& b) const -{ - return compare(*this, b) >= 0; -} - -std::wstring fx_ver_t::as_str() const -{ - std::wstringstream stream; - stream << m_major << TEXT(".") << m_minor << TEXT(".") << m_patch; - if (!m_pre.empty()) - { - stream << m_pre; - } - if (!m_build.empty()) - { - stream << TEXT("+") << m_build; - } - return stream.str(); -} - -/* static */ -int fx_ver_t::compare(const fx_ver_t&a, const fx_ver_t& b) -{ - // compare(u.v.w-p+b, x.y.z-q+c) - if (a.m_major != b.m_major) - { - return (a.m_major > b.m_major) ? 1 : -1; - } - - if (a.m_minor != b.m_minor) - { - return (a.m_minor > b.m_minor) ? 1 : -1; - } - - if (a.m_patch != b.m_patch) - { - return (a.m_patch > b.m_patch) ? 1 : -1; - } - - if (a.m_pre.empty() != b.m_pre.empty()) - { - // Either a is empty or b is empty - return a.m_pre.empty() ? 1 : -1; - } - - // Either both are empty or both are non-empty (may be equal) - int pre_cmp = a.m_pre.compare(b.m_pre); - if (pre_cmp != 0) - { - return pre_cmp; - } - - return a.m_build.compare(b.m_build); -} - -bool try_stou(const std::wstring& str, unsigned* num) -{ - if (str.empty()) - { - return false; - } - if (str.find_first_not_of(TEXT("0123456789")) != std::wstring::npos) - { - return false; - } - *num = (unsigned)std::stoul(str); - return true; -} - -bool parse_internal(const std::wstring& ver, fx_ver_t* fx_ver, bool parse_only_production) -{ - size_t maj_start = 0; - size_t maj_sep = ver.find(TEXT('.')); - if (maj_sep == std::wstring::npos) - { - return false; - } - unsigned major = 0; - if (!try_stou(ver.substr(maj_start, maj_sep), &major)) - { - return false; - } - - size_t min_start = maj_sep + 1; - size_t min_sep = ver.find(TEXT('.'), min_start); - if (min_sep == std::wstring::npos) - { - return false; - } - - unsigned minor = 0; - if (!try_stou(ver.substr(min_start, min_sep - min_start), &minor)) - { - return false; - } - - unsigned patch = 0; - size_t pat_start = min_sep + 1; - size_t pat_sep = ver.find_first_not_of(TEXT("0123456789"), pat_start); - if (pat_sep == std::wstring::npos) - { - if (!try_stou(ver.substr(pat_start), &patch)) - { - return false; - } - - *fx_ver = fx_ver_t(major, minor, patch); - return true; - } - - if (parse_only_production) - { - // This is a prerelease or has build suffix. - return false; - } - - if (!try_stou(ver.substr(pat_start, pat_sep - pat_start), &patch)) - { - return false; - } - - size_t pre_start = pat_sep; - size_t pre_sep = ver.find(TEXT('+'), pre_start); - if (pre_sep == std::wstring::npos) - { - *fx_ver = fx_ver_t(major, minor, patch, ver.substr(pre_start)); - return true; - } - else - { - size_t build_start = pre_sep + 1; - *fx_ver = fx_ver_t(major, minor, patch, ver.substr(pre_start, pre_sep - pre_start), ver.substr(build_start)); - return true; - } -} - -/* static */ -bool fx_ver_t::parse(const std::wstring& ver, fx_ver_t* fx_ver, bool parse_only_production) -{ - bool valid = parse_internal(ver, fx_ver, parse_only_production); - assert(!valid || fx_ver->as_str() == ver); - return valid; -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h deleted file mode 100644 index 1626b2697c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h +++ /dev/null @@ -1,46 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -#pragma once - -// Note: This is not SemVer (esp., in comparing pre-release part, fx_ver_t does not -// compare multiple dot separated identifiers individually.) ex: 1.0.0-beta.2 vs. 1.0.0-beta.11 -struct fx_ver_t -{ - fx_ver_t(int major, int minor, int patch); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre); - fx_ver_t(int major, int minor, int patch, const std::wstring& pre, const std::wstring& build); - - int get_major() const { return m_major; } - int get_minor() const { return m_minor; } - int get_patch() const { return m_patch; } - - void set_major(int m) { m_major = m; } - void set_minor(int m) { m_minor = m; } - void set_patch(int p) { m_patch = p; } - - bool is_prerelease() const { return !m_pre.empty(); } - - std::wstring as_str() const; - std::wstring prerelease_glob() const; - std::wstring patch_glob() const; - - bool operator ==(const fx_ver_t& b) const; - bool operator !=(const fx_ver_t& b) const; - bool operator <(const fx_ver_t& b) const; - bool operator >(const fx_ver_t& b) const; - bool operator <=(const fx_ver_t& b) const; - bool operator >=(const fx_ver_t& b) const; - - static bool parse(const std::wstring& ver, fx_ver_t* fx_ver, bool parse_only_production = false); - -private: - int m_major; - int m_minor; - int m_patch; - std::wstring m_pre; - std::wstring m_build; - - static int compare(const fx_ver_t&a, const fx_ver_t& b); -}; - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp deleted file mode 100644 index 1ad02feba2..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp +++ /dev/null @@ -1,807 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "stdafx.h" - -HOSTFXR_UTILITY::HOSTFXR_UTILITY() -{ -} - -HOSTFXR_UTILITY::~HOSTFXR_UTILITY() -{ -} - -// -// Runs a standalone appliction. -// The folder structure looks like this: -// Application/ -// hostfxr.dll -// Application.exe -// Application.dll -// etc. -// We get the full path to hostfxr.dll and Application.dll and run hostfxr_main, -// passing in Application.dll. -// Assuming we don't need Application.exe as the dll is the actual application. -// -HRESULT -HOSTFXR_UTILITY::GetStandaloneHostfxrParameters( - PCWSTR pwzExeAbsolutePath, // includes .exe file extension. - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - HANDLE hEventLog, - _Inout_ STRU* struHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ PWSTR** ppwzArgv -) -{ - HRESULT hr = S_OK; - STRU struDllPath; - STRU struArguments; - STRU struHostFxrPath; - STRU struRuntimeConfigLocation; - DWORD dwPosition; - - // Obtain the app name from the processPath section. - if ( FAILED( hr = struDllPath.Copy( pwzExeAbsolutePath ) ) ) - { - goto Finished; - } - - dwPosition = struDllPath.LastIndexOf( L'.', 0 ); - if ( dwPosition == -1 ) - { - hr = E_FAIL; - goto Finished; - } - - hr = UTILITY::ConvertPathToFullPath( L".\\hostfxr.dll", pcwzApplicationPhysicalPath, &struHostFxrPath ); - if ( FAILED( hr ) ) - { - goto Finished; - } - - struDllPath.QueryStr()[dwPosition] = L'\0'; - if (FAILED(hr = struDllPath.SyncWithBuffer())) - { - goto Finished; - } - - if ( !UTILITY::CheckIfFileExists( struHostFxrPath.QueryStr() ) ) - { - // Most likely a full framework app. - // Check that the runtime config file doesn't exist in the folder as another heuristic. - if (FAILED(hr = struRuntimeConfigLocation.Copy(struDllPath)) || - FAILED(hr = struRuntimeConfigLocation.Append( L".runtimeconfig.json" ))) - { - goto Finished; - } - if (!UTILITY::CheckIfFileExists(struRuntimeConfigLocation.QueryStr())) - { - - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP, - ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG, - pcwzApplicationPhysicalPath, - hr); - } - else - { - // If a runtime config file does exist, report a file not found on the app.exe - hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND, - ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND_MSG, - pcwzApplicationPhysicalPath, - hr); - } - - goto Finished; - } - - if (FAILED(hr = struHostFxrDllLocation->Copy(struHostFxrPath))) - { - goto Finished; - } - - - if (FAILED(hr = struDllPath.Append(L".dll"))) - { - goto Finished; - } - - if (!UTILITY::CheckIfFileExists(struDllPath.QueryStr())) - { - // Treat access issue as File not found - hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND); - goto Finished; - } - - if (FAILED(hr = struArguments.Copy(struDllPath)) || - FAILED(hr = struArguments.Append(L" ")) || - FAILED(hr = struArguments.Append(pcwzArguments))) - { - goto Finished; - } - - if (FAILED(hr = ParseHostfxrArguments( - struArguments.QueryStr(), - pwzExeAbsolutePath, - pcwzApplicationPhysicalPath, - hEventLog, - pdwArgCount, - ppwzArgv))) - { - goto Finished; - } - -Finished: - - return hr; -} - -HRESULT -HOSTFXR_UTILITY::GetHostFxrParameters( - HANDLE hEventLog, - PCWSTR pcwzProcessPath, - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - _Inout_ STRU* struHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** pbstrArgv -) -{ - HRESULT hr = S_OK; - STRU struSystemPathVariable; - STRU struAbsolutePathToHostFxr; - STRU struAbsolutePathToDotnet; - STRU struEventMsg; - STACK_STRU(struExpandedProcessPath, MAX_PATH); - STACK_STRU(struExpandedArguments, MAX_PATH); - - // Copy and Expand the processPath and Arguments. - if (FAILED(hr = struExpandedProcessPath.CopyAndExpandEnvironmentStrings(pcwzProcessPath)) - || FAILED(hr = struExpandedArguments.CopyAndExpandEnvironmentStrings(pcwzArguments))) - { - goto Finished; - } - - // Convert the process path an absolute path to our current application directory. - // If the path is already an absolute path, it will be unchanged. - hr = UTILITY::ConvertPathToFullPath( - struExpandedProcessPath.QueryStr(), - pcwzApplicationPhysicalPath, - &struAbsolutePathToDotnet - ); - - if (FAILED(hr)) - { - goto Finished; - } - - // Check if the absolute path is to dotnet or not. - if (struAbsolutePathToDotnet.EndsWith(L"dotnet.exe") || struAbsolutePathToDotnet.EndsWith(L"dotnet")) - { - // - // The processPath ends with dotnet.exe or dotnet - // like: C:\Program Files\dotnet\dotnet.exe, C:\Program Files\dotnet\dotnet, dotnet.exe, or dotnet. - // Get the absolute path to dotnet. If the path is already an absolute path, it will return that path - // - if (FAILED(hr = HOSTFXR_UTILITY::GetAbsolutePathToDotnet(&struAbsolutePathToDotnet))) // Make sure to append the dotnet.exe path correctly here (pass in regular path)? - { - goto Finished; - } - - if (FAILED(hr = GetAbsolutePathToHostFxr(&struAbsolutePathToDotnet, hEventLog, &struAbsolutePathToHostFxr))) - { - goto Finished; - } - - if (FAILED(hr = ParseHostfxrArguments( - struExpandedArguments.QueryStr(), - struAbsolutePathToDotnet.QueryStr(), - pcwzApplicationPhysicalPath, - hEventLog, - pdwArgCount, - pbstrArgv))) - { - goto Finished; - } - - if (FAILED(hr = struHostFxrDllLocation->Copy(struAbsolutePathToHostFxr))) - { - goto Finished; - } - } - else - { - // - // The processPath is a path to the application executable - // like: C:\test\MyApp.Exe or MyApp.Exe - // Check if the file exists, and if it does, get the parameters for a standalone application - // - if (UTILITY::CheckIfFileExists(struAbsolutePathToDotnet.QueryStr())) - { - hr = GetStandaloneHostfxrParameters( - struAbsolutePathToDotnet.QueryStr(), - pcwzApplicationPhysicalPath, - struExpandedArguments.QueryStr(), - hEventLog, - struHostFxrDllLocation, - pdwArgCount, - pbstrArgv); - } - else - { - // - // If the processPath file does not exist and it doesn't include dotnet.exe or dotnet - // then it is an invalid argument. - // - hr = HRESULT_FROM_WIN32(ERROR_FILE_NOT_FOUND);; - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_GENERAL_ERROR_MSG, - ASPNETCORE_EVENT_INVALID_PROCESS_PATH_MSG, - struExpandedProcessPath.QueryStr(), - hr); - } - } - -Finished: - - return hr; -} - -// -// Forms the argument list in HOSTFXR_PARAMETERS. -// Sets the ArgCount and Arguments. -// Arg structure: -// argv[0] = Path to exe activating hostfxr. -// argv[1] = L"exec" -// argv[2] = absolute path to dll. -// -HRESULT -HOSTFXR_UTILITY::ParseHostfxrArguments( - PCWSTR pwzArgumentsFromConfig, - PCWSTR pwzExePath, - PCWSTR pcwzApplicationPhysicalPath, - HANDLE hEventLog, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** pbstrArgv -) -{ - UNREFERENCED_PARAMETER( hEventLog ); // TODO use event log to set errors. - - DBG_ASSERT(dwArgCount != NULL); - DBG_ASSERT(pwzArgv != NULL); - - HRESULT hr = S_OK; - INT argc = 0; - BSTR* argv = NULL; - LPWSTR* pwzArgs = NULL; - STRU struTempPath; - INT intArgsProcessed = 0; - - // If we call CommandLineToArgvW with an empty string, argc is 5 for some interesting reason. - // Protectively guard against this by check if the string is null or empty. - if (pwzArgumentsFromConfig == NULL || wcscmp(pwzArgumentsFromConfig, L"") == 0) - { - hr = E_INVALIDARG; - goto Finished; - } - - pwzArgs = CommandLineToArgvW(pwzArgumentsFromConfig, &argc); - - if (pwzArgs == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - - argv = new BSTR[argc + 1]; - if (argv == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - - argv[0] = SysAllocString(pwzExePath); - - if (argv[0] == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - - // Try to convert the application dll from a relative to an absolute path - // Don't record this failure as pwzArgs[0] may already be an absolute path to the dll. - for (intArgsProcessed = 0; intArgsProcessed < argc; intArgsProcessed++) - { - struTempPath.Copy(pwzArgs[intArgsProcessed]); - if (struTempPath.EndsWith(L".dll")) - { - if (SUCCEEDED(UTILITY::ConvertPathToFullPath(pwzArgs[intArgsProcessed], pcwzApplicationPhysicalPath, &struTempPath))) - { - argv[intArgsProcessed + 1] = SysAllocString(struTempPath.QueryStr()); - } - else - { - argv[intArgsProcessed + 1] = SysAllocString(pwzArgs[intArgsProcessed]); - } - if (argv[intArgsProcessed + 1] == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - } - else - { - argv[intArgsProcessed + 1] = SysAllocString(pwzArgs[intArgsProcessed]); - if (argv[intArgsProcessed + 1] == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - } - } - - *pbstrArgv = argv; - *pdwArgCount = argc + 1; - - goto Finished; - -Failure: - if (argv != NULL) - { - // intArgsProcess - 1 here as if we fail to allocated the ith string - // we don't want to free it. - for (INT i = 0; i < intArgsProcessed - 1; i++) - { - SysFreeString(argv[i]); - } - } - - delete[] argv; - -Finished: - if (pwzArgs != NULL) - { - LocalFree(pwzArgs); - DBG_ASSERT(pwzArgs == NULL); - } - return hr; -} - -HRESULT -HOSTFXR_UTILITY::GetAbsolutePathToDotnet( - _Inout_ STRU* pStruAbsolutePathToDotnet -) -{ - HRESULT hr = S_OK; - - // - // If we are given an absolute path to dotnet.exe, we are done - // - if (UTILITY::CheckIfFileExists(pStruAbsolutePathToDotnet->QueryStr())) - { - goto Finished; - } - - // - // If the path was C:\Program Files\dotnet\dotnet - // We need to try appending .exe and check if the file exists too. - // - if (FAILED(hr = pStruAbsolutePathToDotnet->Append(L".exe"))) - { - goto Finished; - } - - if (UTILITY::CheckIfFileExists(pStruAbsolutePathToDotnet->QueryStr())) - { - goto Finished; - } - - // At this point, we are calling where.exe to find dotnet. - // If we encounter any failures, try getting dotnet.exe from the - // backup location. - if (!InvokeWhereToFindDotnet(pStruAbsolutePathToDotnet)) - { - hr = GetAbsolutePathToDotnetFromProgramFiles(pStruAbsolutePathToDotnet); - } - -Finished: - - return hr; -} - -HRESULT -HOSTFXR_UTILITY::GetAbsolutePathToHostFxr( - STRU* pStruAbsolutePathToDotnet, - HANDLE hEventLog, - STRU* pStruAbsolutePathToHostfxr -) -{ - HRESULT hr = S_OK; - STRU struHostFxrPath; - STRU struHostFxrSearchExpression; - STRU struHighestDotnetVersion; - STRU struEventMsg; - std::vector vVersionFolders; - DWORD dwPosition = 0; - - if (FAILED(hr = struHostFxrPath.Copy(pStruAbsolutePathToDotnet))) - { - goto Finished; - } - - dwPosition = struHostFxrPath.LastIndexOf(L'\\', 0); - if (dwPosition == -1) - { - hr = E_FAIL; - goto Finished; - } - - struHostFxrPath.QueryStr()[dwPosition] = L'\0'; - - if (FAILED(hr = struHostFxrPath.SyncWithBuffer()) || - FAILED(hr = struHostFxrPath.Append(L"\\"))) - { - goto Finished; - } - - hr = struHostFxrPath.Append(L"host\\fxr"); - if (FAILED(hr)) - { - goto Finished; - } - - if (!UTILITY::DirectoryExists(&struHostFxrPath)) - { - hr = ERROR_BAD_ENVIRONMENT; - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND, - struEventMsg.QueryStr(), - ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND_MSG, - struHostFxrPath.QueryStr(), - hr); - goto Finished; - } - - // Find all folders under host\\fxr\\ for version numbers. - hr = struHostFxrSearchExpression.Copy(struHostFxrPath); - if (FAILED(hr)) - { - goto Finished; - } - - hr = struHostFxrSearchExpression.Append(L"\\*"); - if (FAILED(hr)) - { - goto Finished; - } - - // As we use the logic from core-setup, we are opting to use std here. - UTILITY::FindDotNetFolders(struHostFxrSearchExpression.QueryStr(), &vVersionFolders); - - if (vVersionFolders.size() == 0) - { - hr = HRESULT_FROM_WIN32(ERROR_BAD_ENVIRONMENT); - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND, - ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND_MSG, - struHostFxrPath.QueryStr(), - hr); - goto Finished; - } - - hr = UTILITY::FindHighestDotNetVersion(vVersionFolders, &struHighestDotnetVersion); - if (FAILED(hr)) - { - goto Finished; - } - - if (FAILED(hr = struHostFxrPath.Append(L"\\")) - || FAILED(hr = struHostFxrPath.Append(struHighestDotnetVersion.QueryStr())) - || FAILED(hr = struHostFxrPath.Append(L"\\hostfxr.dll"))) - { - goto Finished; - } - - if (!UTILITY::CheckIfFileExists(struHostFxrPath.QueryStr())) - { - // ASPNETCORE_EVENT_HOSTFXR_DLL_NOT_FOUND_MSG - hr = HRESULT_FROM_WIN32(ERROR_FILE_INVALID); - UTILITY::LogEventF(hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_HOSTFXR_DLL_NOT_FOUND, - ASPNETCORE_EVENT_HOSTFXR_DLL_NOT_FOUND_MSG, - struHostFxrPath.QueryStr(), - hr); - goto Finished; - } - - if (FAILED(hr = pStruAbsolutePathToHostfxr->Copy(struHostFxrPath))) - { - goto Finished; - } - -Finished: - return hr; -} - -// -// Tries to call where.exe to find the location of dotnet.exe. -// Will check that the bitness of dotnet matches the current -// worker process bitness. -// Returns true if a valid dotnet was found, else false. -// -BOOL -HOSTFXR_UTILITY::InvokeWhereToFindDotnet( - _Inout_ STRU* pStruAbsolutePathToDotnet -) -{ - HRESULT hr = S_OK; - // Arguments to call where.exe - STARTUPINFOW startupInfo = { 0 }; - PROCESS_INFORMATION processInformation = { 0 }; - SECURITY_ATTRIBUTES securityAttributes; - - CHAR pzFileContents[READ_BUFFER_SIZE]; - HANDLE hStdOutReadPipe = INVALID_HANDLE_VALUE; - HANDLE hStdOutWritePipe = INVALID_HANDLE_VALUE; - LPWSTR pwzDotnetName = NULL; - DWORD dwFilePointer; - BOOL fIsWow64Process; - BOOL fIsCurrentProcess64Bit; - DWORD dwExitCode; - STRU struDotnetSubstring; - STRU struDotnetLocationsString; - DWORD dwNumBytesRead; - DWORD dwBinaryType; - INT index = 0; - INT prevIndex = 0; - BOOL fProcessCreationResult = FALSE; - BOOL fResult = FALSE; - - // Set the security attributes for the read/write pipe - securityAttributes.nLength = sizeof(securityAttributes); - securityAttributes.lpSecurityDescriptor = NULL; - securityAttributes.bInheritHandle = TRUE; - - // Reset the path to dotnet as we will be using whether the string is - // empty or not as state - pStruAbsolutePathToDotnet->Reset(); - - // Create a read/write pipe that will be used for reading the result of where.exe - if (!CreatePipe(&hStdOutReadPipe, &hStdOutWritePipe, &securityAttributes, 0)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - if (!SetHandleInformation(hStdOutReadPipe, HANDLE_FLAG_INHERIT, 0)) - { - hr = ERROR_FILE_INVALID; - goto Finished; - } - - // Set the stdout and err pipe to the write pipes. - startupInfo.cb = sizeof(startupInfo); - startupInfo.dwFlags |= STARTF_USESTDHANDLES; - startupInfo.hStdOutput = hStdOutWritePipe; - startupInfo.hStdError = hStdOutWritePipe; - - // CreateProcess requires a mutable string to be passed to commandline - // See https://blogs.msdn.microsoft.com/oldnewthing/20090601-00/?p=18083/ - pwzDotnetName = SysAllocString(L"\"where.exe\" dotnet.exe"); - if (pwzDotnetName == NULL) - { - goto Finished; - } - - // Create a process to invoke where.exe - fProcessCreationResult = CreateProcessW(NULL, - pwzDotnetName, - NULL, - NULL, - TRUE, - CREATE_NO_WINDOW, - NULL, - NULL, - &startupInfo, - &processInformation - ); - - if (!fProcessCreationResult) - { - goto Finished; - } - - // Wait for where.exe to return, waiting 2 seconds. - if (WaitForSingleObject(processInformation.hProcess, 2000) != WAIT_OBJECT_0) - { - // Timeout occured, terminate the where.exe process and return. - TerminateProcess(processInformation.hProcess, 2); - hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT); - goto Finished; - } - - // - // where.exe will return 0 on success, 1 if the file is not found - // and 2 if there was an error. Check if the exit code is 1 and set - // a new hr result saying it couldn't find dotnet.exe - // - if (!GetExitCodeProcess(processInformation.hProcess, &dwExitCode)) - { - goto Finished; - } - - // - // In this block, if anything fails, we will goto our fallback of - // looking in C:/Program Files/ - // - if (dwExitCode != 0) - { - goto Finished; - } - - // Where succeeded. - // Reset file pointer to the beginning of the file. - dwFilePointer = SetFilePointer(hStdOutReadPipe, 0, NULL, FILE_BEGIN); - if (dwFilePointer == INVALID_SET_FILE_POINTER) - { - goto Finished; - } - - // - // As the call to where.exe succeeded (dotnet.exe was found), ReadFile should not hang. - // TODO consider putting ReadFile in a separate thread with a timeout to guarantee it doesn't block. - // - if (!ReadFile(hStdOutReadPipe, pzFileContents, READ_BUFFER_SIZE, &dwNumBytesRead, NULL)) - { - goto Finished; - } - - if (dwNumBytesRead >= READ_BUFFER_SIZE) - { - // This shouldn't ever be this large. We could continue to call ReadFile in a loop, - // however if someone had this many dotnet.exes on their machine. - goto Finished; - } - - hr = HRESULT_FROM_WIN32(GetLastError()); - if (FAILED(hr = struDotnetLocationsString.CopyA(pzFileContents, dwNumBytesRead))) - { - goto Finished; - } - - // Check the bitness of the currently running process - // matches the dotnet.exe found. - if (!IsWow64Process(GetCurrentProcess(), &fIsWow64Process)) - { - // Calling IsWow64Process failed - goto Finished; - } - if (fIsWow64Process) - { - // 32 bit mode - fIsCurrentProcess64Bit = FALSE; - } - else - { - // Check the SystemInfo to see if we are currently 32 or 64 bit. - SYSTEM_INFO systemInfo; - GetNativeSystemInfo(&systemInfo); - fIsCurrentProcess64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64; - } - - while (TRUE) - { - index = struDotnetLocationsString.IndexOf(L"\r\n", prevIndex); - if (index == -1) - { - break; - } - if (FAILED(hr = struDotnetSubstring.Copy(&struDotnetLocationsString.QueryStr()[prevIndex], index - prevIndex))) - { - goto Finished; - } - // \r\n is two wchars, so add 2 here. - prevIndex = index + 2; - - if (GetBinaryTypeW(struDotnetSubstring.QueryStr(), &dwBinaryType) && - fIsCurrentProcess64Bit == (dwBinaryType == SCS_64BIT_BINARY)) - { - // The bitness of dotnet matched with the current worker process bitness. - if (FAILED(hr = pStruAbsolutePathToDotnet->Copy(struDotnetSubstring))) - { - goto Finished; - } - fResult = TRUE; - break; - } - } - -Finished: - - if (hStdOutReadPipe != INVALID_HANDLE_VALUE) - { - CloseHandle(hStdOutReadPipe); - } - if (hStdOutWritePipe != INVALID_HANDLE_VALUE) - { - CloseHandle(hStdOutWritePipe); - } - if (processInformation.hProcess != INVALID_HANDLE_VALUE) - { - CloseHandle(processInformation.hProcess); - } - if (processInformation.hThread != INVALID_HANDLE_VALUE) - { - CloseHandle(processInformation.hThread); - } - if (pwzDotnetName != NULL) - { - SysFreeString(pwzDotnetName); - } - - return fResult; -} - - -HRESULT -HOSTFXR_UTILITY::GetAbsolutePathToDotnetFromProgramFiles( - _Inout_ STRU* pStruAbsolutePathToDotnet -) -{ - HRESULT hr = S_OK; - BOOL fFound = FALSE; - DWORD dwNumBytesRead = 0; - DWORD dwPathSize = MAX_PATH; - STRU struDotnetSubstring; - - while (!fFound) - { - if (FAILED(hr = struDotnetSubstring.Resize(dwPathSize))) - { - goto Finished; - } - - dwNumBytesRead = GetEnvironmentVariable(L"ProgramFiles", struDotnetSubstring.QueryStr(), dwPathSize); - if (dwNumBytesRead == 0) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - else if (dwNumBytesRead >= dwPathSize) - { - // - // The path to ProgramFiles should never be this long, but resize and try again. - dwPathSize *= 2 + 30; // for dotnet substring - } - else - { - if (FAILED(hr = struDotnetSubstring.SyncWithBuffer()) || - FAILED(hr = struDotnetSubstring.Append(L"\\dotnet\\dotnet.exe"))) - { - goto Finished; - } - if (!UTILITY::CheckIfFileExists(struDotnetSubstring.QueryStr())) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - if (FAILED(hr = pStruAbsolutePathToDotnet->Copy(struDotnetSubstring))) - { - goto Finished; - } - fFound = TRUE; - } - } - -Finished: - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h deleted file mode 100644 index e7703c5bfa..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -typedef INT(*hostfxr_get_native_search_directories_fn) (CONST INT argc, CONST PCWSTR* argv, PWSTR buffer, DWORD buffer_size, DWORD* required_buffer_size); -typedef INT(*hostfxr_main_fn) (CONST DWORD argc, CONST PCWSTR argv[]); - -#define READ_BUFFER_SIZE 4096 - -class HOSTFXR_UTILITY -{ -public: - HOSTFXR_UTILITY(); - ~HOSTFXR_UTILITY(); - - static - HRESULT - GetHostFxrParameters( - HANDLE hEventLog, - PCWSTR pcwzProcessPath, - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - _Inout_ STRU* pStruHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** ppwzArgv - ); - - static - HRESULT - GetStandaloneHostfxrParameters( - PCWSTR pwzExeAbsolutePath, // includes .exe file extension. - PCWSTR pcwzApplicationPhysicalPath, - PCWSTR pcwzArguments, - HANDLE hEventLog, - _Inout_ STRU* pStruHostFxrDllLocation, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** ppwzArgv - ); - - static - HRESULT - ParseHostfxrArguments( - PCWSTR pwzArgumentsFromConfig, - PCWSTR pwzExePath, - PCWSTR pcwzApplicationPhysicalPath, - HANDLE hEventLog, - _Out_ DWORD* pdwArgCount, - _Out_ BSTR** ppwzArgv - ); - - static - HRESULT - GetAbsolutePathToDotnet( - STRU* pStruAbsolutePathToDotnet - ); - - static - HRESULT - GetAbsolutePathToHostFxr( - _In_ STRU* pStruAbsolutePathToDotnet, - _In_ HANDLE hEventLog, - _Out_ STRU* pStruAbsolutePathToHostfxr - ); - - static - BOOL - InvokeWhereToFindDotnet( - _Inout_ STRU* pStruAbsolutePathToDotnet - ); - - static - HRESULT - GetAbsolutePathToDotnetFromProgramFiles( - _Inout_ STRU* pStruAbsolutePathToDotnet - ); -}; - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.cxx deleted file mode 100644 index bcf1887d35..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.cxx +++ /dev/null @@ -1,44 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "stdafx.h" - -REQUEST_HANDLER::REQUEST_HANDLER( - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication) - : m_cRefs(1) -{ - m_pW3Context = pW3Context; - m_pApplication = pApplication; - m_pModuleId = *pModuleId; -} - - -REQUEST_HANDLER::~REQUEST_HANDLER() -{ -} - -VOID -REQUEST_HANDLER::ReferenceRequestHandler( - VOID -) const -{ - InterlockedIncrement(&m_cRefs); -} - - -VOID -REQUEST_HANDLER::DereferenceRequestHandler( - VOID -) const -{ - DBG_ASSERT(m_cRefs != 0); - - LONG cRefs = 0; - if ((cRefs = InterlockedDecrement(&m_cRefs)) == 0) - { - delete this; - } - -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h deleted file mode 100644 index 28f4fb725e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h +++ /dev/null @@ -1,59 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "stdafx.h" -#include "application.h" - -// -// Abstract class -// -class REQUEST_HANDLER -{ -public: - REQUEST_HANDLER( - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication - ); - - virtual - REQUEST_NOTIFICATION_STATUS - OnExecuteRequestHandler() = 0; - - virtual - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus - ) = 0; - - virtual - VOID - TerminateRequest( - bool fClientInitiated - ) = 0; - - virtual - ~REQUEST_HANDLER( - VOID - ); - - VOID - ReferenceRequestHandler( - VOID - ) const; - - virtual - VOID - DereferenceRequestHandler( - VOID - ) const; - -protected: - mutable LONG m_cRefs; - IHttpContext* m_pW3Context; - APPLICATION* m_pApplication; - HTTP_MODULE_ID m_pModuleId; -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h deleted file mode 100644 index 140a573f3f..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h +++ /dev/null @@ -1,47 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define IDS_INVALID_PROPERTY 1000 -#define IDS_SERVER_ERROR 1001 - -#define ASPNETCORE_EVENT_PROVIDER L"IIS AspNetCore Module" -#define ASPNETCORE_IISEXPRESS_EVENT_PROVIDER L"IIS Express AspNetCore Module" - -#define ASPNETCORE_EVENT_MSG_BUFFER_SIZE 256 -#define ASPNETCORE_EVENT_PROCESS_START_SUCCESS_MSG L"Application '%s' started process '%d' successfully and process '%d' is listening on port '%d'." -#define ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED_MSG L"Maximum rapid fail count per minute of '%d' exceeded." -#define ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s' at stage '%s', ErrorCode = '0x%x', assigned port %d, retryCounter '%d'." -#define ASPNETCORE_EVENT_PROCESS_START_FAILURE_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s' with multiple retries. The last try of listening port is '%d'. See pervious warnings for details." -#define ASPNETCORE_EVENT_PROCESS_START_STATUS_ERROR_MSG L"Application '%s' with physical root '%s' failed to start process with commandline '%s' , ErrorCode = '0x%x', processId '%d', processStatus '%d'." -#define ASPNETCORE_EVENT_PROCESS_START_PORTSETUP_ERROR_MSG L"Application '%s' with physical root '%s' failed to choose listen port '%d' given port rang '%d - %d', EorrorCode = '0x%x'. If environment variable 'ASPNETCORE_PORT' was set, try removing it such that a random port is selected instead." -#define ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but failed to listen on the given port '%d'" -#define ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG L"Application '%s' with physical root '%s' created process with commandline '%s' but either crashed or did not respond or did not listen on the given port '%d', ErrorCode = '0x%x'" -#define ASPNETCORE_EVENT_PROCESS_SHUTDOWN_MSG L"Application '%s' with physical root '%s' shut down process with Id '%d' listening on port '%d'" -#define ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG L"Warning: Could not create stdoutLogFile %s, ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE_MSG L"Failed to gracefully shutdown process '%d'." -#define ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST_MSG L"Sent shutdown HTTP message to process '%d' and received http status '%d'." -#define ASPNETCORE_EVENT_APP_SHUTDOWN_FAILURE_MSG L"Failed to gracefully shutdown application '%s'." -#define ASPNETCORE_EVENT_LOAD_CLR_FALIURE_MSG L"Application '%s' with physical root '%s' failed to load clr and managed application, ErrorCode = '0x%x." -#define ASPNETCORE_EVENT_DUPLICATED_INPROCESS_APP_MSG L"Only one inprocess application is allowed per IIS application pool. Please assign the application '%s' to a different IIS application pool." -#define ASPNETCORE_EVENT_MIXED_HOSTING_MODEL_ERROR_MSG L"Mixed hosting model is not supported. Application '%s' configured with different hostingModel value '%d' other than the one of running application(s)." -#define ASPNETCORE_EVENT_ADD_APPLICATION_ERROR_MSG L"Failed to start application '%s', ErrorCode '0x%x'." -#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDERR_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. First 4KB characters of captured stderr logs on startup:\r\n%s" -#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDOUT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Last 4KB characters of captured stdout and stderr logs:\r\n%s" -#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_MSG L"Application '%s' with physical root '%s' hit unexpected managed background thread exit, ErrorCode = '0x%x. Please check the stderr logs for more information." -#define ASPNETCORE_EVENT_APP_IN_SHUTDOWN_MSG L"Application shutting down." -#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_MSG L"Application '%s' was recycled after detecting the app_offline file." -#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE_REMOVED_MSG L"App_offline.htm has been removed from the application. Application will be recycled." -#define ASPNETCORE_EVENT_RECYCLE_CONFIGURATION_MSG L"Application '%s' was recycled due to configuration change" -#define ASPNETCORE_EVENT_RECYCLE_FAILURE_CONFIGURATION_MSG L"Failed to recycle application due to a configuration change at '%s'. Recycling worker process." -#define ASPNETCORE_EVENT_MODULE_DISABLED_MSG L"AspNetCore Module is disabled" -#define ASPNETCORE_EVENT_INPROCESS_FULL_FRAMEWORK_APP_MSG L"Application '%s' was compiled for .NET Framework. Please compile for .NET core to run the inprocess application or change the process mode to out of process. ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_PORTABLE_APP_DOTNET_MISSING_MSG L"Could not find dotnet.exe on the system PATH environment variable for portable application '%s'. Check that a valid path to dotnet is on the PATH and the bitness of dotnet matches the bitness of the IIS worker process. ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_HOSTFXR_DIRECTORY_NOT_FOUND_MSG L"Could not find the hostfxr directory '%s' in the dotnet directory. ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_HOSTFXR_DLL_NOT_FOUND_MSG L"Could not find hostfxr.dll in '%s'. ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_APPLICATION_EXE_NOT_FOUND_MSG L"Could not find application executable in '%s'. ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_INPROCESS_THREAD_EXCEPTION_MSG L"Application '%s' with physical root '%s' hit unexpected managed exception, ErrorCode = '0x%x. Please check the stderr logs for more information." -#define ASPNETCORE_EVENT_INVALID_PROCESS_PATH_MSG L"Invalid or unknown processPath provided in web.config: processPath = %s, ErrorCode = '0x%x'." -#define ASPNETCORE_EVENT_INPROCESS_RH_MISSING_MSG L"Could not find the aspnetcorerh.dll for in-process application. Please confirm the Microsoft.AspNetCore.Server.IIS package is referenced in your application." -#define ASPNETCORE_EVENT_OUT_OF_PROCESS_RH_MISSING_MSG L"Could not find the aspnetcorerh.dll for out-of-process application. Please confirm the aspnetcorerh.dll is installed in installed globally for IIS or IISExpress." diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp deleted file mode 100644 index 0351feb240..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp +++ /dev/null @@ -1,4 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "stdafx.h" diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h deleted file mode 100644 index 69ad058f1f..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h +++ /dev/null @@ -1,34 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers - -#include -#include -#include -#include -#include -#include -#include "Shlwapi.h" -#include "..\IISLib\hashtable.h" -#include "..\IISLib\stringu.h" -#include "..\IISLib\stringa.h" -#include "..\IISLib\multisz.h" -#include "..\IISLib\dbgutil.h" -#include "..\IISLib\ahutil.h" -#include "..\IISLib\hashfn.h" -#include "SRWLockWrapper.h" -#include "environmentvariablehash.h" -#include "utility.h" -#include "aspnetcoreconfig.h" -#include "application.h" -#include "requesthandler.h" -#include "fx_ver.h" -#include "hostfxr_utility.h" -#include "resources.h" -#include "aspnetcore_msg.h" - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h deleted file mode 100644 index 5b1f29cad0..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h +++ /dev/null @@ -1,8 +0,0 @@ -#pragma once - -// Including SDKDDKVer.h defines the highest available Windows platform. - -// If you wish to build your application for a previous Windows platform, include WinSDKVer.h and -// set the _WIN32_WINNT macro to the platform you wish to support before including SDKDDKVer.h. - -#include \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.cxx deleted file mode 100644 index cb762f21bc..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.cxx +++ /dev/null @@ -1,656 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include"stdafx.h" - -// static -HRESULT -UTILITY::SplitUrl( - PCWSTR pszDestinationUrl, - BOOL *pfSecure, - STRU *pstrDestination, - STRU *pstrUrl -) -/*++ - -Routine Description: - - Split the URL specified for forwarding into its specific components - The format of the URL looks like - http[s]://destination[:port]/path - when port is omitted, the default port for that specific protocol is used - when host is omitted, it gets the same value as the destination - -Arguments: - - pszDestinationUrl - the url to be split up - pfSecure - SSL to be used in forwarding? - pstrDestination - destination - pDestinationPort - port - pstrUrl - URL - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr; - - // - // First determine if the target is secure - // - if (_wcsnicmp(pszDestinationUrl, L"http://", 7) == 0) - { - *pfSecure = FALSE; - pszDestinationUrl += 7; - } - else if (_wcsnicmp(pszDestinationUrl, L"https://", 8) == 0) - { - *pfSecure = TRUE; - pszDestinationUrl += 8; - } - else - { - return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); - } - - if (*pszDestinationUrl == L'\0') - { - return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); - } - - // - // Find the 3rd slash corresponding to the url - // - LPCWSTR pszSlash = wcschr(pszDestinationUrl, L'/'); - if (pszSlash == NULL) - { - if (FAILED(hr = pstrUrl->Copy(L"/", 1)) || - FAILED(hr = pstrDestination->Copy(pszDestinationUrl))) - { - return hr; - } - } - else - { - if (FAILED(hr = pstrUrl->Copy(pszSlash)) || - FAILED(hr = pstrDestination->Copy(pszDestinationUrl, - (DWORD)(pszSlash - pszDestinationUrl)))) - { - return hr; - } - } - - return S_OK; -} - -// Change a hexadecimal digit to its numerical equivalent -#define TOHEX( ch ) \ - ((ch) > L'9' ? \ - (ch) >= L'a' ? \ - (ch) - L'a' + 10 : \ - (ch) - L'A' + 10 \ - : (ch) - L'0') - -// static -HRESULT -UTILITY::UnEscapeUrl( - PCWSTR pszUrl, - DWORD cchUrl, - bool fCopyQuery, - STRA * pstrResult -) -{ - HRESULT hr; - CHAR pch[2]; - pch[1] = '\0'; - DWORD cchStart = 0; - DWORD index = 0; - - while (index < cchUrl && - (fCopyQuery || pszUrl[index] != L'?')) - { - switch (pszUrl[index]) - { - case L'%': - if (iswxdigit(pszUrl[index+1]) && iswxdigit(pszUrl[index+2])) - { - if (index > cchStart && - FAILED(hr = pstrResult->AppendW(pszUrl + cchStart, - index - cchStart))) - { - return hr; - } - cchStart = index+3; - - pch[0] = static_cast(TOHEX(pszUrl[index+1]) * 16 + - TOHEX(pszUrl[index+2])); - if (FAILED(hr = pstrResult->Append(pch, 1))) - { - return hr; - } - index += 3; - break; - } - - __fallthrough; - default: - index++; - } - } - - if (index > cchStart) - { - return pstrResult->AppendW(pszUrl + cchStart, - index - cchStart); - } - - return S_OK; -} - -// static -HRESULT -UTILITY::UnEscapeUrl( - PCWSTR pszUrl, - DWORD cchUrl, - STRU * pstrResult -) -{ - HRESULT hr; - WCHAR pch[2]; - pch[1] = L'\0'; - DWORD cchStart = 0; - DWORD index = 0; - bool fInQuery = FALSE; - - while (index < cchUrl) - { - switch (pszUrl[index]) - { - case L'%': - if (iswxdigit(pszUrl[index+1]) && iswxdigit(pszUrl[index+2])) - { - if (index > cchStart && - FAILED(hr = pstrResult->Append(pszUrl + cchStart, - index - cchStart))) - { - return hr; - } - cchStart = index+3; - - pch[0] = static_cast(TOHEX(pszUrl[index+1]) * 16 + - TOHEX(pszUrl[index+2])); - if (FAILED(hr = pstrResult->Append(pch, 1))) - { - return hr; - } - index += 3; - if (pch[0] == L'?') - { - fInQuery = TRUE; - } - break; - } - - index++; - break; - - case L'/': - if (fInQuery) - { - if (index > cchStart && - FAILED(hr = pstrResult->Append(pszUrl + cchStart, - index - cchStart))) - { - return hr; - } - cchStart = index+1; - - if (FAILED(hr = pstrResult->Append(L"\\", 1))) - { - return hr; - } - index += 1; - break; - } - - __fallthrough; - default: - index++; - } - } - - if (index > cchStart) - { - return pstrResult->Append(pszUrl + cchStart, - index - cchStart); - } - - return S_OK; -} - -HRESULT -UTILITY::EscapeAbsPath( - IHttpRequest * pRequest, - STRU * strEscapedUrl -) -{ - HRESULT hr = S_OK; - STRU strAbsPath; - LPCWSTR pszAbsPath = NULL; - LPCWSTR pszFindStr = NULL; - - hr = strAbsPath.Copy( pRequest->GetRawHttpRequest()->CookedUrl.pAbsPath, - pRequest->GetRawHttpRequest()->CookedUrl.AbsPathLength / sizeof(WCHAR) ); - if(FAILED(hr)) - { - goto Finished; - } - - pszAbsPath = strAbsPath.QueryStr(); - pszFindStr = wcschr(pszAbsPath, L'?'); - - while(pszFindStr != NULL) - { - strEscapedUrl->Append( pszAbsPath, pszFindStr - pszAbsPath); - strEscapedUrl->Append(L"%3F"); - pszAbsPath = pszFindStr + 1; - pszFindStr = wcschr(pszAbsPath, L'?'); - } - - strEscapedUrl->Append(pszAbsPath); - strEscapedUrl->Append(pRequest->GetRawHttpRequest()->CookedUrl.pQueryString, - pRequest->GetRawHttpRequest()->CookedUrl.QueryStringLength / sizeof(WCHAR)); - -Finished: - return hr; -} - -// static -bool -UTILITY::IsValidAttributeNameChar( - WCHAR ch -) -{ - // - // Values based on ASP.NET rendering for cookie names. RFC 2965 is not clear - // what the non-special characters are. - // - return ch == L'\t' || (ch > 31 && ch < 127); -} - -// static -bool -UTILITY::FindInMultiString( - PCWSTR pszMultiString, - PCWSTR pszStringToFind -) -{ - while (*pszMultiString != L'\0') - { - if (wcscmp(pszMultiString, pszStringToFind) == 0) - { - return TRUE; - } - pszMultiString += wcslen(pszMultiString) + 1; - } - - return FALSE; -} - -// static -bool -UTILITY::IsValidQueryStringName( - PCWSTR pszName -) -{ - while (*pszName != L'\0') - { - WCHAR c = *pszName; - if (c != L'-' && c != L'_' && c != L'+' && - c != L'.' && c != L'*' && c != L'$' && c != L'%' && c != L',' && - !iswalnum(c)) - { - return FALSE; - } - pszName++; - } - - return TRUE; -} - -// static -bool -UTILITY::IsValidHeaderName( - PCWSTR pszName -) -{ - while (*pszName != L'\0') - { - WCHAR c = *pszName; - if (c != L'-' && c != L'_' && c != L'+' && - c != L'.' && c != L'*' && c != L'$' && c != L'%' - && !iswalnum(c)) - { - return FALSE; - } - pszName++; - } - - return TRUE; -} - -HRESULT -UTILITY::IsPathUnc( - __in LPCWSTR pszPath, - __out BOOL * pfIsUnc -) -{ - HRESULT hr = S_OK; - STRU strTempPath; - - if ( pszPath == NULL || pfIsUnc == NULL ) - { - hr = E_INVALIDARG; - goto Finished; - } - - hr = MakePathCanonicalizationProof( (LPWSTR) pszPath, &strTempPath ); - if ( FAILED(hr) ) - { - goto Finished; - } - - // - // MakePathCanonicalizationProof will map \\?\UNC, \\.\UNC and \\ to \\?\UNC - // - (*pfIsUnc) = ( _wcsnicmp( strTempPath.QueryStr(), L"\\\\?\\UNC\\", 8 /* sizeof \\?\UNC\ */) == 0 ); - -Finished: - - return hr; -} - -HRESULT -UTILITY::ConvertPathToFullPath( - _In_ LPCWSTR pszPath, - _In_ LPCWSTR pszRootPath, - _Out_ STRU* pStruFullPath -) -{ - HRESULT hr = S_OK; - STRU strFileFullPath; - LPWSTR pszFullPath = NULL; - - // if relative path, prefix with root path and then convert to absolute path. - if ( PathIsRelative(pszPath) ) - { - hr = strFileFullPath.Copy(pszRootPath); - if(FAILED(hr)) - { - goto Finished; - } - - if(!strFileFullPath.EndsWith(L"\\")) - { - hr = strFileFullPath.Append(L"\\"); - if(FAILED(hr)) - { - goto Finished; - } - } - } - - hr = strFileFullPath.Append( pszPath ); - if (FAILED(hr)) - { - goto Finished; - } - - pszFullPath = new WCHAR[ strFileFullPath.QueryCCH() + 1]; - if ( pszFullPath == NULL ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if(_wfullpath( pszFullPath, - strFileFullPath.QueryStr(), - strFileFullPath.QueryCCH() + 1 ) == NULL ) - { - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - // convert to canonical path - hr = MakePathCanonicalizationProof( pszFullPath, pStruFullPath ); - if (FAILED(hr)) - { - goto Finished; - } - -Finished: - - if ( pszFullPath != NULL ) - { - delete[] pszFullPath; - pszFullPath = NULL; - } - - return hr; -} - -HRESULT -UTILITY::EnsureDirectoryPathExist( - _In_ LPCWSTR pszPath -) -{ - HRESULT hr = S_OK; - STRU struPath; - DWORD dwPosition = 0; - BOOL fDone = FALSE; - BOOL fUnc = FALSE; - - struPath.Copy(pszPath); - hr = IsPathUnc(pszPath, &fUnc); - if (FAILED(hr)) - { - goto Finished; - } - if (fUnc) - { - // "\\?\UNC\" - dwPosition = 8; - } - else if (struPath.IndexOf(L'?', 0) != -1) - { - // sceanrio "\\?\" - dwPosition = 4; - } - while (!fDone) - { - dwPosition = struPath.IndexOf(L'\\', dwPosition + 1); - if (dwPosition == -1) - { - // not found '/' - fDone = TRUE; - goto Finished; - } - else if (dwPosition ==0) - { - hr = ERROR_INTERNAL_ERROR; - goto Finished; - } - else if (struPath.QueryStr()[dwPosition-1] == L':') - { - // skip volume case - continue; - } - else - { - struPath.QueryStr()[dwPosition] = L'\0'; - } - - if (!CreateDirectory(struPath.QueryStr(), NULL) && - ERROR_ALREADY_EXISTS != GetLastError()) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - fDone = TRUE; - goto Finished; - } - struPath.QueryStr()[dwPosition] = L'\\'; - } - -Finished: - return hr; -} - -HRESULT -UTILITY::FindHighestDotNetVersion( - _In_ std::vector vFolders, - _Out_ STRU *pstrResult -) -{ - HRESULT hr = S_OK; - fx_ver_t max_ver(-1, -1, -1); - for (const auto& dir : vFolders) - { - fx_ver_t fx_ver(-1, -1, -1); - if (fx_ver_t::parse(dir, &fx_ver, false)) - { - // TODO using max instead of std::max works - max_ver = max(max_ver, fx_ver); - } - } - - hr = pstrResult->Copy(max_ver.as_str().c_str()); - - // we check FAILED(hr) outside of function - return hr; -} - -BOOL -UTILITY::DirectoryExists( - _In_ STRU *pstrPath -) -{ - WIN32_FILE_ATTRIBUTE_DATA data; - - if (pstrPath->IsEmpty()) - { - return false; - } - - return GetFileAttributesExW(pstrPath->QueryStr(), GetFileExInfoStandard, &data); -} - -VOID -UTILITY::FindDotNetFolders( - _In_ PCWSTR pszPath, - _Out_ std::vector *pvFolders -) -{ - HANDLE handle = NULL; - WIN32_FIND_DATAW data = { 0 }; - - handle = FindFirstFileExW(pszPath, FindExInfoStandard, &data, FindExSearchNameMatch, NULL, 0); - if (handle == INVALID_HANDLE_VALUE) - { - return; - } - - do - { - std::wstring folder(data.cFileName); - pvFolders->push_back(folder); - } while (FindNextFileW(handle, &data)); - - FindClose(handle); -} - -BOOL -UTILITY::CheckIfFileExists( - _In_ PCWSTR pszFilePath -) -{ - HANDLE hFileHandle = INVALID_HANDLE_VALUE; - SECURITY_ATTRIBUTES saAttr; - BOOL fFileExists = FALSE; - - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - hFileHandle = CreateFile(pszFilePath, - GENERIC_READ, - FILE_SHARE_READ, - &saAttr, - OPEN_EXISTING, - FILE_ATTRIBUTE_NORMAL, - NULL); - - fFileExists = hFileHandle != INVALID_HANDLE_VALUE || GetLastError() == ERROR_SHARING_VIOLATION; - - if (fFileExists) - { - CloseHandle(hFileHandle); - } - - return fFileExists; -} - -VOID -UTILITY::LogEvent( - _In_ HANDLE hEventLog, - _In_ WORD dwEventInfoType, - _In_ DWORD dwEventId, - _In_ LPCWSTR pstrMsg -) -{ - if (hEventLog != NULL) - { - ReportEventW(hEventLog, - dwEventInfoType, - 0, // wCategory - dwEventId, - NULL, // lpUserSid - 1, // wNumStrings - 0, // dwDataSize, - &pstrMsg, - NULL // lpRawData - ); - } - - if (dwEventInfoType == EVENTLOG_ERROR_TYPE) - { - fwprintf(stderr, L"ERROR: %s\n", pstrMsg); - } -} - -VOID -UTILITY::LogEventF( - _In_ HANDLE hEventLog, - _In_ WORD dwEventInfoType, - _In_ DWORD dwEventId, - _In_ LPCWSTR pstrMsg, - ... -) -{ - va_list argsList; - va_start(argsList, pstrMsg); - - STACK_STRU ( strEventMsg, 256 ); - - if (SUCCEEDED(strEventMsg.SafeVsnwprintf( - pstrMsg, - argsList))) - { - UTILITY::LogEvent(hEventLog, - dwEventInfoType, - dwEventId, - strEventMsg.QueryStr()); - } - - va_end( argsList ); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.h deleted file mode 100644 index 830c2a0613..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/utility.h +++ /dev/null @@ -1,137 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -class UTILITY -{ -public: - - static - HRESULT - SplitUrl( - PCWSTR pszDestinationUrl, - BOOL *pfSecure, - STRU *pstrDestination, - STRU *pstrUrl - ); - - static - HRESULT - UnEscapeUrl( - PCWSTR pszUrl, - DWORD cchUrl, - bool fCopyQuery, - STRA * pstrResult - ); - - static - HRESULT - UnEscapeUrl( - PCWSTR pszUrl, - DWORD cchUrl, - STRU * pstrResult - ); - - static HRESULT - EscapeAbsPath( - IHttpRequest * pRequest, - STRU * strEscapedUrl - ); - - static - bool - IsValidAttributeNameChar( - WCHAR ch - ); - - static - bool - IsValidQueryStringName( - PCWSTR pszName - ); - - static - bool - IsValidHeaderName( - PCWSTR pszName - ); - - static - bool - FindInMultiString( - PCWSTR pszMultiString, - PCWSTR pszStringToFind - ); - - static - HRESULT - IsPathUnc( - __in LPCWSTR pszPath, - __out BOOL * pfIsUnc - ); - - static - HRESULT - ConvertPathToFullPath( - _In_ LPCWSTR pszPath, - _In_ LPCWSTR pszRootPath, - _Out_ STRU* pStrFullPath - ); - - static - HRESULT - EnsureDirectoryPathExist( - _In_ LPCWSTR pszPath - ); - - static - BOOL - DirectoryExists( - _In_ STRU *pstrPath - ); - - static - VOID - FindDotNetFolders( - _In_ PCWSTR pszPath, - _Out_ std::vector *pvFolders - ); - - static - HRESULT - FindHighestDotNetVersion( - _In_ std::vector vFolders, - _Out_ STRU *pstrResult - ); - - static - BOOL - CheckIfFileExists( - PCWSTR pszFilePath - ); - - static - VOID - LogEvent( - _In_ HANDLE hEventLog, - _In_ WORD dwEventInfoType, - _In_ DWORD dwEventId, - _In_ LPCWSTR pstrMsg - ); - - static - VOID - LogEventF( - _In_ HANDLE hEventLog, - _In_ WORD dwEventInfoType, - _In_ DWORD dwEventId, - __in PCWSTR pstrMsg, - ... - ); - -private: - - UTILITY() {} - ~UTILITY() {} -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj deleted file mode 100644 index 7c0cca6626..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj +++ /dev/null @@ -1,201 +0,0 @@ - - - - - Debug - Win32 - - - Debug - x64 - - - Release - Win32 - - - Release - x64 - - - - {09D9D1D6-2951-4E14-BC35-76A23CF9391A} - Win32Proj - IISLib - IISLib - 10.0.15063.0 - - - - StaticLibrary - true - v141 - Unicode - - - StaticLibrary - true - v141 - Unicode - - - StaticLibrary - false - v141 - true - Unicode - - - StaticLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ - - - $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ - - - $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ - - - $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ - - - - - - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - ProgramDatabase - MultiThreadedDebug - false - true - - - Windows - true - - - - - - - Level3 - Disabled - WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) - true - ProgramDatabase - MultiThreadedDebug - false - true - - - Windows - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreaded - false - true - - - Windows - true - true - true - - - - - Level3 - - - MaxSpeed - true - true - WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) - true - MultiThreaded - false - true - - - Windows - true - true - true - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cxx deleted file mode 100644 index d68813edbc..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cxx +++ /dev/null @@ -1,443 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.h" - -LONG ALLOC_CACHE_HANDLER::sm_nFillPattern = 0xACA50000; -HANDLE ALLOC_CACHE_HANDLER::sm_hHeap; - -// -// This class is used to implement the free list. We cast the free'd -// memory block to a FREE_LIST_HEADER*. The signature is used to guard against -// double deletion. We also fill memory with a pattern. -// -class FREE_LIST_HEADER -{ -public: - SLIST_ENTRY ListEntry; - DWORD dwSignature; - - enum - { - FREE_SIGNATURE = (('A') | ('C' << 8) | ('a' << 16) | (('$' << 24) | 0x80)), - }; -}; - -ALLOC_CACHE_HANDLER::ALLOC_CACHE_HANDLER( - VOID -) : m_nThreshold(0), - m_cbSize(0), - m_pFreeLists(NULL), - m_nTotal(0) -{ -} - -ALLOC_CACHE_HANDLER::~ALLOC_CACHE_HANDLER( - VOID -) -{ - if (m_pFreeLists != NULL) - { - CleanupLookaside(); - m_pFreeLists->Dispose(); - m_pFreeLists = NULL; - } -} - -HRESULT -ALLOC_CACHE_HANDLER::Initialize( - DWORD cbSize, - LONG nThreshold -) -{ - HRESULT hr = S_OK; - - m_nThreshold = nThreshold; - if ( m_nThreshold > 0xffff) - { - // - // This will be compared against QueryDepthSList return value (USHORT). - // - m_nThreshold = 0xffff; - } - - if ( IsPageheapEnabled() ) - { - // - // Disable acache. - // - m_nThreshold = 0; - } - - // - // Make sure the block is big enough to hold a FREE_LIST_HEADER. - // - m_cbSize = cbSize; - m_cbSize = max(m_cbSize, sizeof(FREE_LIST_HEADER)); - - // - // Round up the block size to a multiple of the size of a LONG (for - // the fill pattern in Free()). - // - m_cbSize = (m_cbSize + sizeof(LONG) - 1) & ~(sizeof(LONG) - 1); - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Init = [] (SLIST_HEADER* pHead) - { - InitializeSListHead(pHead); - }; -#else - class Functor - { - public: - void operator()(SLIST_HEADER* pHead) - { - InitializeSListHead(pHead); - } - } Init; -#endif - - hr = PER_CPU::Create(Init, - &m_pFreeLists ); - if (FAILED(hr)) - { - goto Finished; - } - - m_nFillPattern = InterlockedIncrement(&sm_nFillPattern); - -Finished: - - return hr; -} - -// static -HRESULT -ALLOC_CACHE_HANDLER::StaticInitialize( - VOID -) -{ - // - // Since the memory allocated is fixed size, - // a heap is not really needed, allocations can be done - // using VirtualAllocEx[Numa]. For now use Windows Heap. - // - // Be aware that creating one private heap consumes more - // virtual address space for the worker process. - // - sm_hHeap = GetProcessHeap(); - return S_OK; -} - - -// static -VOID -ALLOC_CACHE_HANDLER::StaticTerminate( - VOID -) -{ - sm_hHeap = NULL; -} - -VOID -ALLOC_CACHE_HANDLER::CleanupLookaside( - VOID -) -/*++ - Description: - This function cleans up the lookaside list by removing storage space. - - Arguments: - None. - - Returns: - None ---*/ -{ - // - // Free up all the entries in the list. - // Don't use InterlockedFlushSList, in order to work - // memory must be 16 bytes aligned and currently it is 64. - // - -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Predicate = [=] (SLIST_HEADER * pListHeader) - { - PSLIST_ENTRY pl; - LONG NodesToDelete = QueryDepthSList( pListHeader ); - - pl = InterlockedPopEntrySList( pListHeader ); - while ( pl != NULL && --NodesToDelete >= 0 ) - { - InterlockedDecrement( &m_nTotal); - - ::HeapFree( sm_hHeap, 0, pl ); - - pl = InterlockedPopEntrySList(pListHeader); - } - }; -#else - class Functor - { - public: - explicit Functor(ALLOC_CACHE_HANDLER * pThis) : _pThis(pThis) - { - } - void operator()(SLIST_HEADER * pListHeader) - { - PSLIST_ENTRY pl; - LONG NodesToDelete = QueryDepthSList( pListHeader ); - - pl = InterlockedPopEntrySList( pListHeader ); - while ( pl != NULL && --NodesToDelete >= 0 ) - { - InterlockedDecrement( &_pThis->m_nTotal); - - ::HeapFree( sm_hHeap, 0, pl ); - - pl = InterlockedPopEntrySList(pListHeader); - } - } - private: - ALLOC_CACHE_HANDLER * _pThis; - } Predicate(this); -#endif - - m_pFreeLists ->ForEach(Predicate); -} - -LPVOID -ALLOC_CACHE_HANDLER::Alloc( - VOID -) -{ - LPVOID pMemory = NULL; - - if ( m_nThreshold > 0 ) - { - SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal(); - pMemory = (LPVOID) InterlockedPopEntrySList(pListHeader); // get the real object - - if (pMemory != NULL) - { - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - // - // If the signature is wrong then somebody's been scribbling - // on memory that they've freed. - // - DBG_ASSERT(pfl->dwSignature == FREE_LIST_HEADER::FREE_SIGNATURE); - } - } - - if ( pMemory == NULL ) - { - // - // No free entry. Need to alloc a new object. - // - pMemory = (LPVOID) ::HeapAlloc( sm_hHeap, - 0, - m_cbSize ); - - if ( pMemory != NULL ) - { - // - // Update counters. - // - m_nTotal++; - } - } - - if ( pMemory == NULL ) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - } - else - { - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - pfl->dwSignature = 0; // clear; just in case caller never overwrites - } - - return pMemory; -} - -VOID -ALLOC_CACHE_HANDLER::Free( - __in LPVOID pMemory -) -{ - // - // Assume that this is allocated using the Alloc() function. - // - DBG_ASSERT(NULL != pMemory); - - // - // Use a signature to check against double deletions. - // - FREE_LIST_HEADER* pfl = (FREE_LIST_HEADER*) pMemory; - DBG_ASSERT(pfl->dwSignature != FREE_LIST_HEADER::FREE_SIGNATURE); - - // - // Start filling the space beyond the portion overlaid by the initial - // FREE_LIST_HEADER. Fill at most 6 DWORDS. - // - LONG* pl = (LONG*) (pfl+1); - - for (LONG cb = (LONG)min(6 * sizeof(LONG),m_cbSize) - sizeof(FREE_LIST_HEADER); - cb > 0; - cb -= sizeof(LONG)) - { - *pl++ = m_nFillPattern; - } - - // - // Now, set the signature. - // - pfl->dwSignature = FREE_LIST_HEADER::FREE_SIGNATURE; - - // - // Store the items in the alloc cache. - // - SLIST_HEADER * pListHeader = m_pFreeLists ->GetLocal(); - - if ( QueryDepthSList(pListHeader) >= m_nThreshold ) - { - // - // Threshold for free entries is exceeded. Free the object to - // process pool. - // - ::HeapFree( sm_hHeap, 0, pMemory ); - } - else - { - // - // Store the given pointer in the single linear list - // - InterlockedPushEntrySList(pListHeader, &pfl->ListEntry); - } -} - -DWORD -ALLOC_CACHE_HANDLER::QueryDepthForAllSLists( - VOID -) -/*++ - -Description: - - Aggregates the total count of elements in all lists. - -Arguments: - - None. - -Return Value: - - Total count (snapshot). - ---*/ -{ - DWORD Count = 0; - - if (m_pFreeLists != NULL) - { -#if defined(_MSC_VER) && _MSC_VER >= 1600 // VC10 - auto Predicate = [&Count] (SLIST_HEADER * pListHeader) - { - Count += QueryDepthSList(pListHeader); - }; -#else - class Functor - { - public: - explicit Functor(DWORD& Count) : _Count(Count) - { - } - void operator()(SLIST_HEADER * pListHeader) - { - _Count += QueryDepthSList(pListHeader); - } - private: - DWORD& _Count; - } Predicate(Count); -#endif - // - // [&Count] means that the method can modify local variable Count. - // - m_pFreeLists ->ForEach(Predicate); - } - - return Count; -} - -// static -BOOL -ALLOC_CACHE_HANDLER::IsPageheapEnabled( - VOID -) -{ - BOOL fRet = FALSE; - BOOL fLockedHeap = FALSE; - HMODULE hModule = NULL; - HANDLE hHeap = NULL; - PROCESS_HEAP_ENTRY heapEntry = {0}; - - // - // If verifier.dll is loaded - we are running under app verifier == pageheap is enabled - // - hModule = GetModuleHandle( L"verifier.dll" ); - if ( hModule != NULL ) - { - hModule = NULL; - fRet = TRUE; - goto Finished; - } - - // - // Create a heap for calling heapwalk - // otherwise HeapWalk turns off lookasides for a useful heap - // - hHeap = ::HeapCreate( 0, 0, 0 ); - if ( hHeap == NULL ) - { - fRet = FALSE; - goto Finished; - } - - fRet = ::HeapLock( hHeap ); - if ( !fRet ) - { - goto Finished; - } - fLockedHeap = TRUE; - - // - // If HeapWalk is unsupported -> then running page heap - // - fRet = ::HeapWalk( hHeap, &heapEntry ); - if ( !fRet ) - { - if ( GetLastError() == ERROR_INVALID_FUNCTION ) - { - fRet = TRUE; - goto Finished; - } - } - - fRet = FALSE; - -Finished: - - if ( fLockedHeap ) - { - fLockedHeap = FALSE; - DBG_REQUIRE( ::HeapUnlock( hHeap ) ); - } - - if ( hHeap ) - { - DBG_REQUIRE( ::HeapDestroy( hHeap ) ); - hHeap = NULL; - } - - return fRet; -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h deleted file mode 100644 index 048df2b507..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h +++ /dev/null @@ -1,115 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "percpu.h" - -class ALLOC_CACHE_HANDLER -{ -public: - - ALLOC_CACHE_HANDLER( - VOID - ); - - ~ALLOC_CACHE_HANDLER( - VOID - ); - - HRESULT - Initialize( - DWORD cbSize, - LONG nThreshold - ); - - LPVOID - Alloc( - VOID - ); - - VOID - Free( - __in LPVOID pMemory - ); - - -private: - - VOID - CleanupLookaside( - VOID - ); - - DWORD - QueryDepthForAllSLists( - VOID - ); - - LONG m_nThreshold; - DWORD m_cbSize; - - PER_CPU * m_pFreeLists; - - // - // Total heap allocations done over the lifetime. - // Note that this is not interlocked, it is just a hint for debugging. - // - volatile LONG m_nTotal; - - LONG m_nFillPattern; - -public: - - static - HRESULT - StaticInitialize( - VOID - ); - - static - VOID - StaticTerminate( - VOID - ); - - static - BOOL - IsPageheapEnabled(); - -private: - - static LONG sm_nFillPattern; - static HANDLE sm_hHeap; -}; - - -// You can use ALLOC_CACHE_HANDLER as a per-class allocator -// in your C++ classes. Add the following to your class definition: -// -// protected: -// static ALLOC_CACHE_HANDLER* sm_palloc; -// public: -// static void* operator new(size_t s) -// { -// IRTLASSERT(s == sizeof(C)); -// IRTLASSERT(sm_palloc != NULL); -// return sm_palloc->Alloc(); -// } -// static void operator delete(void* pv) -// { -// IRTLASSERT(pv != NULL); -// if (sm_palloc != NULL) -// sm_palloc->Free(pv); -// } -// -// Obviously, you must initialize sm_palloc before you can allocate -// any objects of this class. -// -// Note that if you derive a class from this base class, the derived class -// must also provide its own operator new and operator delete. If not, the -// base class's allocator will be called, but the size of the derived -// object will almost certainly be larger than that of the base object. -// Furthermore, the allocator will not be used for arrays of objects -// (override operator new[] and operator delete[]), but this is a -// harder problem since the allocator works with one fixed size. diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp deleted file mode 100644 index dae2027f33..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp +++ /dev/null @@ -1,1671 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.h" - -HRESULT -SetElementProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST VARIANT * varPropValue - ) -{ - HRESULT hr = NOERROR; - - CComPtr pPropElement; - - BSTR bstrPropName = SysAllocString( szPropName ); - - if( !bstrPropName ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, - &pPropElement ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pPropElement->put_Value( *varPropValue ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if( bstrPropName ) - { - SysFreeString( bstrPropName ); - bstrPropName = NULL; - } - - return hr; -} - -HRESULT -SetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST WCHAR * szPropValue - ) -{ - HRESULT hr; - VARIANT varPropValue; - VariantInit(&varPropValue); - - hr = VariantAssign(&varPropValue, szPropValue); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = SetElementProperty(pElement, szPropName, &varPropValue); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - VariantClear(&varPropValue); - return hr; -} - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT BSTR * pbstrPropValue - ) -{ - HRESULT hr = S_OK; - BSTR bstrPropName = SysAllocString( szPropName ); - IAppHostProperty* pProperty = NULL; - - *pbstrPropValue = NULL; - - if (!bstrPropName) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, &pProperty ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pProperty->get_StringValue( pbstrPropValue ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if (pProperty) - { - pProperty->Release(); - } - - if (bstrPropName) - { - SysFreeString( bstrPropName ); - } - - return hr; -} - - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT STRU * pstrPropValue - ) -{ - HRESULT hr = S_OK; - BSTR bstrPropName = SysAllocString( szPropName ); - IAppHostProperty* pProperty = NULL; - BSTR bstrPropValue = NULL; - - if (!bstrPropName) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = pElement->GetPropertyByName( bstrPropName, &pProperty ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pProperty->get_StringValue( &bstrPropValue ); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - - hr = pstrPropValue->Copy(bstrPropValue); - if (FAILED(hr)) - { - DBGERROR_HR( hr ); - goto exit; - } - -exit: - - if (pProperty) - { - pProperty->Release(); - } - - if (bstrPropValue) - { - SysFreeString( bstrPropValue ); - } - - if (bstrPropName) - { - SysFreeString( bstrPropName ); - } - - return hr; -} - -HRESULT -GetElementChildByName( - IN IAppHostElement * pElement, - IN LPCWSTR pszElementName, - OUT IAppHostElement ** ppChildElement -) -{ - BSTR bstrElementName = SysAllocString(pszElementName); - if (bstrElementName == NULL) - { - return E_OUTOFMEMORY; - } - HRESULT hr = pElement->GetElementByName(bstrElementName, - ppChildElement); - SysFreeString(bstrElementName); - return hr; -} - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT bool * pBool -) -{ - BOOL fValue; - HRESULT hr = GetElementBoolProperty(pElement, - pszPropertyName, - &fValue); - if (SUCCEEDED(hr)) - { - *pBool = !!fValue; - } - return hr; -} - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT BOOL * pBool -) -{ - HRESULT hr = S_OK; - BSTR bstrPropertyName = NULL; - IAppHostProperty * pProperty = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrPropertyName = SysAllocString( pszPropertyName ); - if ( bstrPropertyName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - // Now ask for the property and if it succeeds it is returned directly back. - hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - // Now let's get the property and then extract it from the Variant. - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_BOOL ); - if ( FAILED ( hr ) ) - { - goto exit; - } - - // extract the value - *pBool = ( V_BOOL( &varValue ) == VARIANT_TRUE ); - -exit: - - VariantClear( &varValue ); - - if ( bstrPropertyName != NULL ) - { - SysFreeString( bstrPropertyName ); - bstrPropertyName = NULL; - } - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - return hr; - -} - -HRESULT -GetElementDWORDProperty( - IN IAppHostElement * pSitesCollectionEntry, - IN LPCWSTR pwszName, - OUT DWORD * pdwValue -) -{ - HRESULT hr = S_OK; - IAppHostProperty * pProperty = NULL; - BSTR bstrName = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrName = SysAllocString( pwszName ); - if ( bstrName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto error; - } - - hr = pSitesCollectionEntry->GetPropertyByName( bstrName, - &pProperty ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_UI4 ); - if ( FAILED ( hr ) ) - { - goto error; - } - - // extract the value - *pdwValue = varValue.ulVal; - -error: - - VariantClear( &varValue ); - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - if ( bstrName != NULL ) - { - SysFreeString( bstrName ); - bstrName = NULL; - } - - return hr; -} - -HRESULT -GetElementLONGLONGProperty( - IN IAppHostElement * pSitesCollectionEntry, - IN LPCWSTR pwszName, - OUT LONGLONG * pllValue -) -{ - HRESULT hr = S_OK; - IAppHostProperty * pProperty = NULL; - BSTR bstrName = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrName = SysAllocString( pwszName ); - if ( bstrName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto error; - } - - hr = pSitesCollectionEntry->GetPropertyByName( bstrName, - &pProperty ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto error; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_I8 ); - if ( FAILED ( hr ) ) - { - goto error; - } - - // extract the value - *pllValue = varValue.ulVal; - -error: - - VariantClear( &varValue ); - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - if ( bstrName != NULL ) - { - SysFreeString( bstrName ); - bstrName = NULL; - } - - return hr; -} - -HRESULT -GetElementRawTimeSpanProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT ULONGLONG * pulonglong -) -{ - HRESULT hr = S_OK; - BSTR bstrPropertyName = NULL; - IAppHostProperty * pProperty = NULL; - VARIANT varValue; - - VariantInit( &varValue ); - - bstrPropertyName = SysAllocString( pszPropertyName ); - if ( bstrPropertyName == NULL ) - { - hr = HRESULT_FROM_WIN32( ERROR_NOT_ENOUGH_MEMORY ); - goto Finished; - } - - // Now ask for the property and if it succeeds it is returned directly back - hr = pElement->GetPropertyByName( bstrPropertyName, &pProperty ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - // Now let's get the property and then extract it from the Variant. - hr = pProperty->get_Value( &varValue ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - hr = VariantChangeType( &varValue, &varValue, 0, VT_UI8 ); - if ( FAILED ( hr ) ) - { - goto Finished; - } - - // extract the value - *pulonglong = varValue.ullVal; - - -Finished: - - VariantClear( &varValue ); - - if ( bstrPropertyName != NULL ) - { - SysFreeString( bstrPropertyName ); - bstrPropertyName = NULL; - } - - if ( pProperty != NULL ) - { - pProperty->Release(); - pProperty = NULL; - } - - return hr; - -} // end of Config_GetRawTimeSpanProperty - -HRESULT -DeleteElementFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - BOOL * pfDeleted - ) -{ - HRESULT hr = NOERROR; - ULONG index; - - VARIANT varIndex; - VariantInit( &varIndex ); - - *pfDeleted = FALSE; - - hr = FindElementInCollection( - pCollection, - szKeyName, - szKeyValue, - BehaviorFlags, - &index - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (hr == S_FALSE) - { - // - // Not found. - // - - goto exit; - } - - varIndex.vt = VT_UI4; - varIndex.ulVal = index; - - hr = pCollection->DeleteElement( varIndex ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - *pfDeleted = TRUE; - -exit: - - return hr; -} - -HRESULT -DeleteAllElementsFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - UINT * pNumDeleted - ) -{ - HRESULT hr = S_OK; - UINT numDeleted = 0; - BOOL fDeleted = TRUE; - - while (fDeleted) - { - hr = DeleteElementFromCollection( - pCollection, - szKeyName, - szKeyValue, - BehaviorFlags, - &fDeleted - ); - - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - break; - } - - if (fDeleted) - { - numDeleted++; - } - } - - *pNumDeleted = numDeleted; - return hr; -} - -BOOL -FindCompareCaseSensitive( - CONST WCHAR * szLookupValue, - CONST WCHAR * szKeyValue - ) -{ - return !wcscmp(szLookupValue, szKeyValue); -} - -BOOL -FindCompareCaseInsensitive( - CONST WCHAR * szLookupValue, - CONST WCHAR * szKeyValue - ) -{ - return !_wcsicmp(szLookupValue, szKeyValue); -} - -typedef -BOOL -(*PFN_FIND_COMPARE_PROC)( - CONST WCHAR *szLookupValue, - CONST WCHAR *szKeyValue - ); - -HRESULT -FindElementInCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - OUT ULONG * pIndex - ) -{ - HRESULT hr = NOERROR; - - CComPtr pElement; - CComPtr pKeyProperty; - - VARIANT varIndex; - VariantInit( &varIndex ); - - VARIANT varKeyValue; - VariantInit( &varKeyValue ); - - DWORD count; - DWORD i; - - BSTR bstrKeyName = NULL; - PFN_FIND_COMPARE_PROC compareProc; - - compareProc = (BehaviorFlags & FIND_ELEMENT_CASE_INSENSITIVE) - ? &FindCompareCaseInsensitive - : &FindCompareCaseSensitive; - - bstrKeyName = SysAllocString( szKeyName ); - if( !bstrKeyName ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pCollection->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - hr = pCollection->get_Item( varIndex, - &pElement ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - hr = pElement->GetPropertyByName( bstrKeyName, - &pKeyProperty ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - hr = pKeyProperty->get_Value( &varKeyValue ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto tryNext; - } - - if ((compareProc)(szKeyValue, varKeyValue.bstrVal)) - { - *pIndex = i; - break; - } - -tryNext: - - pElement.Release(); - pKeyProperty.Release(); - - VariantClear( &varKeyValue ); - } - - if (i >= count) - { - hr = S_FALSE; - } - -exit: - - SysFreeString( bstrKeyName ); - VariantClear( &varKeyValue ); - - return hr; -} - -HRESULT -VariantAssign( - IN OUT VARIANT * pv, - IN CONST WCHAR * sz - ) -{ - if( !pv || !sz ) - { - return E_INVALIDARG; - } - - HRESULT hr = NOERROR; - - BSTR bstr = SysAllocString( sz ); - if( !bstr ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR( hr ); - goto exit; - } - - hr = VariantClear( pv ); - if( FAILED(hr) ) - { - DBGERROR_HR( hr ); - goto exit; - } - - pv->vt = VT_BSTR; - pv->bstrVal = bstr; - bstr = NULL; - -exit: - - SysFreeString( bstr ); - - return hr; -} - -HRESULT -GetLocationFromFile( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szLocationPath, - OUT IAppHostConfigLocation ** ppLocation, - OUT BOOL * pFound - ) -{ - HRESULT hr = NOERROR; - - CComPtr pLocationCollection; - CComPtr pLocation; - - BSTR bstrLocationPath = NULL; - - *ppLocation = NULL; - *pFound = FALSE; - - hr = GetLocationCollection( pAdminMgr, - szConfigPath, - &pLocationCollection ); - - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - DWORD count; - DWORD i; - VARIANT varIndex; - VariantInit( &varIndex ); - - hr = pLocationCollection->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - hr = pLocationCollection->get_Item( varIndex, - &pLocation ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pLocation->get_Path( &bstrLocationPath ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szLocationPath, bstrLocationPath ) ) - { - *pFound = TRUE; - *ppLocation = pLocation.Detach(); - break; - } - - - pLocation.Release(); - - SysFreeString( bstrLocationPath ); - bstrLocationPath = NULL; - } - -exit: - - SysFreeString( bstrLocationPath ); - - return hr; -} - -HRESULT -GetSectionFromLocation( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szSectionName, - OUT IAppHostElement ** ppSectionElement, - OUT BOOL * pFound - ) -{ - HRESULT hr = NOERROR; - - CComPtr pSectionElement; - - DWORD count; - DWORD i; - - VARIANT varIndex; - VariantInit( &varIndex ); - - BSTR bstrSectionName = NULL; - - *pFound = FALSE; - *ppSectionElement = NULL; - - hr = pLocation->get_Count( &count ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - for( i = 0; i < count; i++ ) - { - varIndex.vt = VT_UI4; - varIndex.ulVal = i; - - - hr = pLocation->get_Item( varIndex, - &pSectionElement ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pSectionElement->get_Name( &bstrSectionName ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szSectionName, bstrSectionName ) ) - { - *pFound = TRUE; - *ppSectionElement = pSectionElement.Detach(); - break; - } - - pSectionElement.Release(); - - SysFreeString( bstrSectionName ); - bstrSectionName = NULL; - } - -exit: - - SysFreeString( bstrSectionName ); - - return hr; -} - - -HRESULT -GetAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName, - OUT IAppHostElement ** pElement -) -{ - HRESULT hr = S_OK; - BSTR bstrConfigPath = NULL; - BSTR bstrElementName = NULL; - - bstrConfigPath = SysAllocString(szConfigPath); - bstrElementName = SysAllocString(szElementName); - - if (bstrConfigPath == NULL || bstrElementName == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminMgr->GetAdminSection( bstrElementName, - bstrConfigPath, - pElement ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - if ( bstrElementName != NULL ) - { - SysFreeString(bstrElementName); - bstrElementName = NULL; - } - if ( bstrConfigPath != NULL ) - { - SysFreeString(bstrConfigPath); - bstrConfigPath = NULL; - } - - return hr; -} - - -HRESULT -ClearAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pElement; - - hr = GetAdminElement( - pAdminMgr, - szConfigPath, - szElementName, - &pElement - ); - - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND)) - { - hr = S_OK; - } - else - { - DBGERROR_HR(hr); - } - - goto exit; - } - - hr = pElement->Clear(); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - return hr; -} - - -HRESULT -ClearElementFromAllSites( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pSitesCollection; - CComPtr pSiteElement; - CComPtr pChildCollection; - ENUM_INDEX index; - BOOL found; - - // - // Enumerate the sites, remove the specified elements. - // - - hr = GetSitesCollection( - pAdminMgr, - szConfigPath, - &pSitesCollection - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - for (hr = FindFirstElement(pSitesCollection, &index, &pSiteElement) ; - SUCCEEDED(hr) ; - hr = FindNextElement(pSitesCollection, &index, &pSiteElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = pSiteElement->get_ChildElements(&pChildCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (pChildCollection) - { - hr = ClearChildElementsByName( - pChildCollection, - szElementName, - &found - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - } - - pSiteElement.Release(); - } - -exit: - - return hr; - -} - - -HRESULT -ClearElementFromAllLocations( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pLocationCollection; - CComPtr pLocation; - CComPtr pChildCollection; - ENUM_INDEX index; - - // - // Enum the tags, remove the specified elements. - // - - hr = GetLocationCollection( - pAdminMgr, - szConfigPath, - &pLocationCollection - ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - for (hr = FindFirstLocation(pLocationCollection, &index, &pLocation) ; - SUCCEEDED(hr) ; - hr = FindNextLocation(pLocationCollection, &index, &pLocation)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = ClearLocationElements(pLocation, szElementName); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - pLocation.Release(); - } - -exit: - - return hr; - -} - -HRESULT -ClearLocationElements( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szElementName - ) -{ - HRESULT hr; - CComPtr pElement; - ENUM_INDEX index; - BOOL matched; - - for (hr = FindFirstLocationElement(pLocation, &index, &pElement) ; - SUCCEEDED(hr) ; - hr = FindNextLocationElement(pLocation, &index, &pElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = CompareElementName(pElement, szElementName, &matched); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (matched) - { - pElement->Clear(); - } - - pElement.Release(); - } - -exit: - - return hr; -} - -HRESULT -CompareElementName( - IN IAppHostElement * pElement, - IN CONST WCHAR * szNameToMatch, - OUT BOOL * pMatched - ) -{ - HRESULT hr; - BSTR bstrElementName = NULL; - - *pMatched = FALSE; // until proven otherwise - - hr = pElement->get_Name(&bstrElementName); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if( 0 == wcscmp ( szNameToMatch, bstrElementName ) ) - { - *pMatched = TRUE; - } - -exit: - - SysFreeString(bstrElementName); - return hr; -} - - -HRESULT -ClearChildElementsByName( - IN IAppHostChildElementCollection * pCollection, - IN CONST WCHAR * szElementName, - OUT BOOL * pFound - ) -{ - HRESULT hr; - CComPtr pElement; - ENUM_INDEX index; - BOOL matched; - - *pFound = FALSE; - - for (hr = FindFirstChildElement(pCollection, &index, &pElement) ; - SUCCEEDED(hr) ; - hr = FindNextChildElement(pCollection, &index, &pElement)) - { - if (hr == S_FALSE) - { - hr = S_OK; - break; - } - - hr = CompareElementName(pElement, szElementName, &matched); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - if (matched) - { - hr = pElement->Clear(); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - *pFound = TRUE; - } - - pElement.Release(); - } - -exit: - - return hr; -} - - -HRESULT -GetSitesCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostElementCollection ** pSitesCollection - ) -{ - HRESULT hr; - CComPtr pSitesElement; - BSTR bstrConfigPath; - BSTR bstrSitesSectionName; - - bstrConfigPath = SysAllocString(szConfigPath); - bstrSitesSectionName = SysAllocString(L"system.applicationHost/sites"); - *pSitesCollection = NULL; - - if (bstrConfigPath == NULL || bstrSitesSectionName == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - // - // Chase down the sites collection. - // - - hr = pAdminMgr->GetAdminSection( bstrSitesSectionName, - bstrConfigPath, - &pSitesElement ); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pSitesElement->get_Collection(pSitesCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - SysFreeString(bstrSitesSectionName); - SysFreeString(bstrConfigPath); - return hr; -} - - -HRESULT -GetLocationCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostConfigLocationCollection ** pLocationCollection - ) -{ - HRESULT hr; - BSTR bstrConfigPath; - CComPtr pConfigMgr; - CComPtr pConfigFile; - - bstrConfigPath = SysAllocString(szConfigPath); - *pLocationCollection = NULL; - - if (bstrConfigPath == NULL) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminMgr->get_ConfigManager(&pConfigMgr); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pConfigMgr->GetConfigFile(bstrConfigPath, &pConfigFile); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pConfigFile->get_Locations(pLocationCollection); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - goto exit; - } - -exit: - - SysFreeString(bstrConfigPath); - return hr; -} - - -HRESULT -FindFirstElement( - IN IAppHostElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextElement(pCollection, pIndex, pElement); -} - -HRESULT -FindNextElement( - IN IAppHostElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstChildElement( - IN IAppHostChildElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextChildElement(pCollection, pIndex, pElement); -} - -HRESULT -FindNextChildElement( - IN IAppHostChildElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstLocation( - IN IAppHostConfigLocationCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ) -{ - HRESULT hr; - - hr = pCollection->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextLocation(pCollection, pIndex, pLocation); -} - -HRESULT -FindNextLocation( - IN IAppHostConfigLocationCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ) -{ - HRESULT hr; - - *pLocation = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pCollection->get_Item(pIndex->Index, pLocation); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -FindFirstLocationElement( - IN IAppHostConfigLocation * pLocation, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - hr = pLocation->get_Count(&pIndex->Count); - - if (FAILED(hr)) - { - DBGERROR_HR(hr); - return hr; - } - - VariantInit(&pIndex->Index); - pIndex->Index.vt = VT_UI4; - pIndex->Index.ulVal = 0; - - return FindNextLocationElement(pLocation, pIndex, pElement); -} - -HRESULT -FindNextLocationElement( - IN IAppHostConfigLocation * pLocation, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ) -{ - HRESULT hr; - - *pElement = NULL; - - if (pIndex->Index.ulVal >= pIndex->Count) - { - return S_FALSE; - } - - hr = pLocation->get_Item(pIndex->Index, pElement); - - if (SUCCEEDED(hr)) - { - pIndex->Index.ulVal++; - } - - return hr; -} - -HRESULT -GetSharedConfigEnabled( - BOOL * pfIsSharedConfig -) -/*++ - -Routine Description: - Search the configuration for the shared configuration property. - -Arguments: - - pfIsSharedConfig - true if shared configuration is enabled - -Return Value: - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - IAppHostAdminManager *pAdminManager = NULL; - - BSTR bstrSectionName = NULL; - BSTR bstrConfigPath = NULL; - - IAppHostElement * pConfigRedirSection = NULL; - - - bstrSectionName = SysAllocString( L"configurationRedirection" ); - - if ( bstrSectionName == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - bstrConfigPath = SysAllocString( L"MACHINE/REDIRECTION" ); - if ( bstrConfigPath == NULL ) - { - hr = E_OUTOFMEMORY; - DBGERROR_HR(hr); - goto exit; - } - - hr = CoCreateInstance( CLSID_AppHostAdminManager, - NULL, - CLSCTX_INPROC_SERVER, - IID_IAppHostAdminManager, - (VOID **)&pAdminManager ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = pAdminManager->GetAdminSection( bstrSectionName, - bstrConfigPath, - &pConfigRedirSection ); - if( FAILED(hr) ) - { - DBGERROR_HR(hr); - goto exit; - } - - hr = GetElementBoolProperty( pConfigRedirSection, - L"enabled", - pfIsSharedConfig ); - - if ( FAILED( hr ) ) - { - DBGERROR_HR(hr); - goto exit; - } - - pConfigRedirSection->Release(); - pConfigRedirSection = NULL; - - -exit: - - // - // dump config exception to setup log file (if available) - // - - if ( pConfigRedirSection != NULL ) - { - pConfigRedirSection->Release(); - } - - if ( pAdminManager != NULL ) - { - pAdminManager->Release(); - } - - if ( bstrConfigPath != NULL ) - { - SysFreeString( bstrConfigPath ); - } - - if ( bstrSectionName != NULL ) - { - SysFreeString( bstrSectionName ); - } - - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h deleted file mode 100644 index 5694b21b7e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h +++ /dev/null @@ -1,258 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#include - -HRESULT -SetElementProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST VARIANT * varPropValue - ); - -HRESULT -SetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - IN CONST WCHAR * szPropValue - ); - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT BSTR * pbstrPropValue - ); - -HRESULT -GetElementStringProperty( - IN IAppHostElement * pElement, - IN CONST WCHAR * szPropName, - OUT STRU * pstrPropValue - ); - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT BOOL * pBool - ); - -HRESULT -GetElementBoolProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT bool * pBool - ); - -HRESULT -GetElementChildByName( - IN IAppHostElement * pElement, - IN LPCWSTR pszElementName, - OUT IAppHostElement ** ppChildElement - ); - -HRESULT -GetElementDWORDProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT DWORD * pdwValue - ); - -HRESULT -GetElementLONGLONGProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT LONGLONG * pllValue -); - - -HRESULT -GetElementRawTimeSpanProperty( - IN IAppHostElement * pElement, - IN LPCWSTR pszPropertyName, - OUT ULONGLONG * pulonglong - ); - -#define FIND_ELEMENT_CASE_SENSITIVE 0x00000000 -#define FIND_ELEMENT_CASE_INSENSITIVE 0x00000001 - -HRESULT -DeleteElementFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - BOOL * pfDeleted - ); - -HRESULT -DeleteAllElementsFromCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - UINT * pNumDeleted - ); - -HRESULT -FindElementInCollection( - IAppHostElementCollection *pCollection, - CONST WCHAR * szKeyName, - CONST WCHAR * szKeyValue, - ULONG BehaviorFlags, - OUT ULONG * pIndex - ); - -HRESULT -VariantAssign( - IN OUT VARIANT * pv, - IN CONST WCHAR * sz - ); - -HRESULT -GetLocationFromFile( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szLocationPath, - OUT IAppHostConfigLocation ** ppLocation, - OUT BOOL * pFound - ); - -HRESULT -GetSectionFromLocation( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szSectionName, - OUT IAppHostElement ** ppSectionElement, - OUT BOOL * pFound - ); - -HRESULT -GetAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName, - OUT IAppHostElement ** pElement - ); - -HRESULT -ClearAdminElement( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ); - -HRESULT -ClearElementFromAllSites( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ); - -HRESULT -ClearElementFromAllLocations( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - IN CONST WCHAR * szElementName - ); - -HRESULT -ClearLocationElements( - IN IAppHostConfigLocation * pLocation, - IN CONST WCHAR * szElementName - ); - -HRESULT -CompareElementName( - IN IAppHostElement * pElement, - IN CONST WCHAR * szNameToMatch, - OUT BOOL * pMatched - ); - -HRESULT -ClearChildElementsByName( - IN IAppHostChildElementCollection * pCollection, - IN CONST WCHAR * szElementName, - OUT BOOL * pFound - ); - -HRESULT -GetSitesCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostElementCollection ** pSitesCollection - ); - -HRESULT -GetLocationCollection( - IN IAppHostAdminManager * pAdminMgr, - IN CONST WCHAR * szConfigPath, - OUT IAppHostConfigLocationCollection ** pLocationCollection - ); - -struct ENUM_INDEX -{ - VARIANT Index; - ULONG Count; -}; - -HRESULT -FindFirstElement( - IN IAppHostElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT -FindNextElement( - IN IAppHostElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT -FindFirstChildElement( - IN IAppHostChildElementCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT -FindNextChildElement( - IN IAppHostChildElementCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT -FindFirstLocation( - IN IAppHostConfigLocationCollection * pCollection, - OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ); - -HRESULT -FindNextLocation( - IN IAppHostConfigLocationCollection * pCollection, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostConfigLocation ** pLocation - ); - -HRESULT -FindFirstLocationElement( - IN IAppHostConfigLocation * pLocation, - OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT -FindNextLocationElement( - IN IAppHostConfigLocation * pLocation, - IN OUT ENUM_INDEX * pIndex, - OUT IAppHostElement ** pElement - ); - -HRESULT GetSharedConfigEnabled( - BOOL * pfIsSharedConfig -); \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp deleted file mode 100644 index b8b6a0bf74..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp +++ /dev/null @@ -1,482 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.h" - -DWORD -Base64Encode( - __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt(cchEncodedStringSize) PWSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pDecodedBuffer (IN) - buffer to encode. - cbDecodedBufferSize (IN) - size of buffer to encode. - cchEncodedStringSize (IN) - size of the buffer for the encoded string. - pszEncodedString (OUT) = the encoded string. - pcchEncoded (OUT) - size in characters of the encoded string. - -Return Values: - - 0 - success. - E_OUTOFMEMORY - ---*/ -{ - static WCHAR rgchEncodeTable[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - DWORD ib; - DWORD ich; - DWORD cchEncoded; - BYTE b0, b1, b2; - BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer; - - // Calculate encoded string size. - cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4; - - if (NULL != pcchEncoded) { - *pcchEncoded = cchEncoded; - } - - if (cchEncodedStringSize == 0 && pszEncodedString == NULL) { - return ERROR_SUCCESS; - } - - if (cchEncodedStringSize < cchEncoded) { - // Given buffer is too small to hold encoded string. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Encode data byte triplets into four-byte clusters. - ib = ich = 0; - while (ib < cbDecodedBufferSize) { - b0 = pbDecodedBuffer[ib++]; - b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - - // - // The checks below for buffer overflow seems redundant to me. - // But it's the only way I can find to keep OACR quiet so it - // will have to do. - // - - pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - } - - // Pad the last cluster as necessary to indicate the number of data bytes - // it represents. - switch (cbDecodedBufferSize % 3) { - case 0: - break; - case 1: - pszEncodedString[ich - 2] = '='; - __fallthrough; - case 2: - pszEncodedString[ich - 1] = '='; - break; - } - - // Null-terminate the encoded string. - pszEncodedString[ich++] = '\0'; - - DBG_ASSERT(ich == cchEncoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Decode( - __in PCWSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pszEncodedString (IN) - base64-encoded string to decode. - cbDecodeBufferSize (IN) - size in bytes of the decode buffer. - pbDecodeBuffer (OUT) - holds the decoded data. - pcbDecoded (OUT) - number of data bytes in the decoded data (if success or - STATUS_BUFFER_TOO_SMALL). - -Return Values: - - 0 - success. - E_OUTOFMEMORY - E_INVALIDARG - ---*/ -{ -#define NA (255) -#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA) - - static BYTE rgbDecodeTable[128] = { - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63 - NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95 - NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127 - }; - - DWORD cbDecoded; - DWORD cchEncodedSize; - DWORD ich; - DWORD ib; - BYTE b0, b1, b2, b3; - BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer; - - cchEncodedSize = (DWORD)wcslen(pszEncodedString); - if (NULL != pcbDecoded) { - *pcbDecoded = 0; - } - - if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) { - // Input string is not sized correctly to be base64. - return ERROR_INVALID_PARAMETER; - } - - // Calculate decoded buffer size. - cbDecoded = (cchEncodedSize + 3) / 4 * 3; - if (pszEncodedString[cchEncodedSize-1] == '=') { - if (pszEncodedString[cchEncodedSize-2] == '=') { - // Only one data byte is encoded in the last cluster. - cbDecoded -= 2; - } - else { - // Only two data bytes are encoded in the last cluster. - cbDecoded -= 1; - } - } - - if (NULL != pcbDecoded) { - *pcbDecoded = cbDecoded; - } - - if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) { - return ERROR_SUCCESS; - } - - if (cbDecoded > cbDecodeBufferSize) { - // Supplied buffer is too small. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Decode each four-byte cluster into the corresponding three data bytes. - ich = ib = 0; - while (ich < cchEncodedSize) { - b0 = DECODE(pszEncodedString[ich]); ich++; - b1 = DECODE(pszEncodedString[ich]); ich++; - b2 = DECODE(pszEncodedString[ich]); ich++; - b3 = DECODE(pszEncodedString[ich]); ich++; - - if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) { - // Contents of input string are not base64. - return ERROR_INVALID_PARAMETER; - } - - pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b2 << 6) | b3; - } - } - } - - DBG_ASSERT(ib == cbDecoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Encode( - __in_bcount(cbDecodedBufferSize) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt(cchEncodedStringSize) PSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pDecodedBuffer (IN) - buffer to encode. - cbDecodedBufferSize (IN) - size of buffer to encode. - cchEncodedStringSize (IN) - size of the buffer for the encoded string. - pszEncodedString (OUT) = the encoded string. - pcchEncoded (OUT) - size in characters of the encoded string. - -Return Values: - - 0 - success. - E_OUTOFMEMORY - ---*/ -{ - static CHAR rgchEncodeTable[64] = { - 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', - 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', - 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', - 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', - '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/' - }; - - DWORD ib; - DWORD ich; - DWORD cchEncoded; - BYTE b0, b1, b2; - BYTE * pbDecodedBuffer = (BYTE *) pDecodedBuffer; - - // Calculate encoded string size. - cchEncoded = 1 + (cbDecodedBufferSize + 2) / 3 * 4; - - if (NULL != pcchEncoded) { - *pcchEncoded = cchEncoded; - } - - if (cchEncodedStringSize == 0 && pszEncodedString == NULL) { - return ERROR_SUCCESS; - } - - if (cchEncodedStringSize < cchEncoded) { - // Given buffer is too small to hold encoded string. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Encode data byte triplets into four-byte clusters. - ib = ich = 0; - while (ib < cbDecodedBufferSize) { - b0 = pbDecodedBuffer[ib++]; - b1 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - b2 = (ib < cbDecodedBufferSize) ? pbDecodedBuffer[ib++] : 0; - - // - // The checks below for buffer overflow seems redundant to me. - // But it's the only way I can find to keep OACR quiet so it - // will have to do. - // - - pszEncodedString[ich++] = rgchEncodeTable[b0 >> 2]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b0 << 4) & 0x30) | ((b1 >> 4) & 0x0f)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[((b1 << 2) & 0x3c) | ((b2 >> 6) & 0x03)]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - - pszEncodedString[ich++] = rgchEncodeTable[b2 & 0x3f]; - if ( ich >= cchEncodedStringSize ) - { - DBG_ASSERT( FALSE ); - return ERROR_BUFFER_OVERFLOW; - } - } - - // Pad the last cluster as necessary to indicate the number of data bytes - // it represents. - switch (cbDecodedBufferSize % 3) { - case 0: - break; - case 1: - pszEncodedString[ich - 2] = '='; - __fallthrough; - case 2: - pszEncodedString[ich - 1] = '='; - break; - } - - // Null-terminate the encoded string. - pszEncodedString[ich++] = '\0'; - - DBG_ASSERT(ich == cchEncoded); - - return ERROR_SUCCESS; -} - - -DWORD -Base64Decode( - __in PCSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ) -/*++ - -Routine Description: - - Decode a base64-encoded string. - -Arguments: - - pszEncodedString (IN) - base64-encoded string to decode. - cbDecodeBufferSize (IN) - size in bytes of the decode buffer. - pbDecodeBuffer (OUT) - holds the decoded data. - pcbDecoded (OUT) - number of data bytes in the decoded data (if success or - STATUS_BUFFER_TOO_SMALL). - -Return Values: - - 0 - success. - E_OUTOFMEMORY - E_INVALIDARG - ---*/ -{ -#define NA (255) -#define DECODE(x) (((ULONG)(x) < sizeof(rgbDecodeTable)) ? rgbDecodeTable[x] : NA) - - static BYTE rgbDecodeTable[128] = { - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 0-15 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, // 16-31 - NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, 62, NA, NA, NA, 63, // 32-47 - 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, NA, NA, NA, 0, NA, NA, // 48-63 - NA, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, // 64-79 - 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, NA, NA, NA, NA, NA, // 80-95 - NA, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, // 96-111 - 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, NA, NA, NA, NA, NA, // 112-127 - }; - - DWORD cbDecoded; - DWORD cchEncodedSize; - DWORD ich; - DWORD ib; - BYTE b0, b1, b2, b3; - BYTE * pbDecodeBuffer = (BYTE *) pDecodeBuffer; - - cchEncodedSize = (DWORD)strlen(pszEncodedString); - if (NULL != pcbDecoded) { - *pcbDecoded = 0; - } - - if ((0 == cchEncodedSize) || (0 != (cchEncodedSize % 4))) { - // Input string is not sized correctly to be base64. - return ERROR_INVALID_PARAMETER; - } - - // Calculate decoded buffer size. - cbDecoded = (cchEncodedSize + 3) / 4 * 3; - if (pszEncodedString[cchEncodedSize-1] == '=') { - if (pszEncodedString[cchEncodedSize-2] == '=') { - // Only one data byte is encoded in the last cluster. - cbDecoded -= 2; - } - else { - // Only two data bytes are encoded in the last cluster. - cbDecoded -= 1; - } - } - - if (NULL != pcbDecoded) { - *pcbDecoded = cbDecoded; - } - - if (cbDecodeBufferSize == 0 && pDecodeBuffer == NULL) { - return ERROR_SUCCESS; - } - - if (cbDecoded > cbDecodeBufferSize) { - // Supplied buffer is too small. - return ERROR_INSUFFICIENT_BUFFER; - } - - // Decode each four-byte cluster into the corresponding three data bytes. - ich = ib = 0; - while (ich < cchEncodedSize) { - b0 = DECODE(pszEncodedString[ich]); ich++; - b1 = DECODE(pszEncodedString[ich]); ich++; - b2 = DECODE(pszEncodedString[ich]); ich++; - b3 = DECODE(pszEncodedString[ich]); ich++; - - if ((NA == b0) || (NA == b1) || (NA == b2) || (NA == b3)) { - // Contents of input string are not base64. - return ERROR_INVALID_PARAMETER; - } - - pbDecodeBuffer[ib++] = (b0 << 2) | (b1 >> 4); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b1 << 4) | (b2 >> 2); - - if (ib < cbDecoded) { - pbDecodeBuffer[ib++] = (b2 << 6) | b3; - } - } - } - - DBG_ASSERT(ib == cbDecoded); - - return ERROR_SUCCESS; -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h deleted file mode 100644 index 469b074d73..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _BASE64_H_ -#define _BASE64_H_ - -DWORD -Base64Encode( - __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt( cchEncodedStringSize ) PWSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ); - -DWORD -Base64Decode( - __in PCWSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ); - -DWORD -Base64Encode( - __in_bcount( cbDecodedBufferSize ) VOID * pDecodedBuffer, - IN DWORD cbDecodedBufferSize, - __out_ecount_opt( cchEncodedStringSize ) PSTR pszEncodedString, - IN DWORD cchEncodedStringSize, - __out_opt DWORD * pcchEncoded - ); - -DWORD -Base64Decode( - __in PCSTR pszEncodedString, - __out_opt VOID * pDecodeBuffer, - __in DWORD cbDecodeBufferSize, - __out_opt DWORD * pcbDecoded - ); - -#endif // _BASE64_HXX_ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h deleted file mode 100644 index 1d68155387..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h +++ /dev/null @@ -1,271 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include - - -// -// BUFFER_T class shouldn't be used directly. Use BUFFER specialization class instead. -// The only BUFFER_T partners are STRU and STRA classes. -// BUFFER_T cannot hold other but primitive types since it doesn't call -// constructor and destructor. -// -// Note: Size is in bytes. -// -template -class BUFFER_T -{ -public: - - BUFFER_T() - : m_cbBuffer( sizeof(m_rgBuffer) ), - m_fHeapAllocated( false ), - m_pBuffer(m_rgBuffer) - /*++ - Description: - - Default constructor where the inline buffer is used. - - Arguments: - - None. - - Returns: - - None. - - --*/ - { - } - - BUFFER_T( - __inout_bcount(cbInit) T* pbInit, - __in DWORD cbInit - ) : m_pBuffer( pbInit ), - m_cbBuffer( cbInit ), - m_fHeapAllocated( false ) - /*++ - Description: - - Instantiate BUFFER, initially using pbInit as buffer - This is useful for stack-buffers and inline-buffer class members - (see STACK_BUFFER and INLINE_BUFFER_INIT below) - - BUFFER does not free pbInit. - - Arguments: - - pbInit - Initial buffer to use. - cbInit - Size of pbInit in bytes (not in elements). - - Returns: - - None. - - --*/ - { - _ASSERTE( NULL != pbInit ); - _ASSERTE( cbInit > 0 ); - } - - ~BUFFER_T() - { - if( IsHeapAllocated() ) - { - _ASSERTE( NULL != m_pBuffer ); - HeapFree( GetProcessHeap(), 0, m_pBuffer ); - m_pBuffer = NULL; - m_cbBuffer = 0; - m_fHeapAllocated = false; - } - } - - T* - QueryPtr( - VOID - ) const - { - // - // Return pointer to data buffer. - // - return m_pBuffer; - } - - DWORD - QuerySize( - VOID - ) const - { - // - // Return number of bytes. - // - return m_cbBuffer; - } - - __success(return == true) - bool - Resize( - const SIZE_T cbNewSize, - const bool fZeroMemoryBeyondOldSize = false - ) - /*++ - Description: - - Resizes the buffer. - - Arguments: - - cbNewSize - Size in bytes to grow to. - fZeroMemoryBeyondOldSize - - Whether to zero the region of memory of the - new buffer beyond the original size. - - Returns: - - TRUE on success, FALSE on failure. - - --*/ - { - PVOID pNewMem; - - if ( cbNewSize <= m_cbBuffer ) - { - return true; - } - - if ( cbNewSize > MAXDWORD ) - { - SetLastError( ERROR_INVALID_PARAMETER ); - return false; - } - - DWORD dwHeapAllocFlags = fZeroMemoryBeyondOldSize ? HEAP_ZERO_MEMORY : 0; - - if( IsHeapAllocated() ) - { - pNewMem = HeapReAlloc( GetProcessHeap(), dwHeapAllocFlags, m_pBuffer, cbNewSize ); - } - else - { - pNewMem = HeapAlloc( GetProcessHeap(), dwHeapAllocFlags, cbNewSize ); - } - - if( pNewMem == NULL ) - { - SetLastError( ERROR_NOT_ENOUGH_MEMORY ); - return false; - } - - if( !IsHeapAllocated() ) - { - // - // First time this block is allocated. Copy over old contents. - // - memcpy_s( pNewMem, static_cast(cbNewSize), m_pBuffer, m_cbBuffer ); - m_fHeapAllocated = true; - } - - m_pBuffer = reinterpret_cast(pNewMem); - m_cbBuffer = static_cast(cbNewSize); - - _ASSERTE( m_pBuffer != NULL ); - - return true; - } - -private: - - bool - IsHeapAllocated( - VOID - ) const - { - return m_fHeapAllocated; - } - - // - // The default inline buffer. - // This member should be at the beginning for alignment purposes. - // - T m_rgBuffer[LENGTH]; - - // - // Is m_pBuffer dynamically allocated? - // - bool m_fHeapAllocated; - - // - // Size of the buffer as requested by client in bytes. - // - DWORD m_cbBuffer; - - // - // Pointer to buffer. - // - __field_bcount_full(m_cbBuffer) - T* m_pBuffer; -}; - -// -// Resizes the buffer by 2 if the ideal size is bigger -// than the buffer length. That give us lg(n) allocations. -// -// Use template inferring like: -// -// BUFFER buff; -// hr = ResizeBufferByTwo(buff, 100); -// -template -HRESULT -ResizeBufferByTwo( - BUFFER_T& Buffer, - SIZE_T cbIdealSize, - bool fZeroMemoryBeyondOldSize = false -) -{ - if (cbIdealSize > Buffer.QuerySize()) - { - if (!Buffer.Resize(max(cbIdealSize, static_cast(Buffer.QuerySize() * 2)), - fZeroMemoryBeyondOldSize)) - { - return E_OUTOFMEMORY; - } - } - return S_OK; -} - - -// -// -// Lots of code uses BUFFER class to store a bunch of different -// structures, so m_rgBuffer needs to be 8 byte aligned when it is used -// as an opaque buffer. -// -#define INLINED_BUFFER_LEN 32 -typedef BUFFER_T BUFFER; - -// -// Assumption of macros below for pointer alignment purposes -// -C_ASSERT( sizeof(VOID*) <= sizeof(ULONGLONG) ); - -// -// Declare a BUFFER that will use stack memory of -// bytes. If the buffer overflows then a heap buffer will be allocated. -// -#define STACK_BUFFER( _name, _size ) \ - ULONGLONG __aqw##_name[ ( ( (_size) + sizeof(ULONGLONG) - 1 ) / sizeof(ULONGLONG) ) ]; \ - BUFFER _name( (BYTE*)__aqw##_name, sizeof(__aqw##_name) ) - -// -// Macros for declaring and initializing a BUFFER that will use inline memory -// of bytes as a member of an object. -// -#define INLINE_BUFFER( _name, _size ) \ - ULONGLONG __aqw##_name[ ( ( (_size) + sizeof(ULONGLONG) - 1 ) / sizeof(ULONGLONG) ) ]; \ - BUFFER _name; - -#define INLINE_BUFFER_INIT( _name ) \ - _name( (BYTE*)__aqw##_name, sizeof( __aqw##_name ) ) diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h deleted file mode 100644 index fd09b7a6a0..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h +++ /dev/null @@ -1,14 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _DATETIME_H_ -#define _DATETIME_H_ - -BOOL -StringTimeToFileTime( - PCSTR pszTime, - ULONGLONG * pulTime -); - -#endif - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h deleted file mode 100644 index 45c26777a9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h +++ /dev/null @@ -1,102 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _DBGUTIL_H_ -#define _DBGUTIL_H_ - -#include - -// -// TODO -// Using _CrtDbg implementation. If hooking is desired -// wrappers should be provided here so that we can reimplement -// if neecessary. -// -// IF_DEBUG/DEBUG FLAGS -// -// registry configuration -// - -// -// Debug error levels for DEBUG_FLAGS_VAR. -// - -#define DEBUG_FLAG_INFO 0x00000001 -#define DEBUG_FLAG_WARN 0x00000002 -#define DEBUG_FLAG_ERROR 0x00000004 - -// -// Predefined error level values. These are backwards from the -// windows definitions. -// - -#define DEBUG_FLAGS_INFO (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN | DEBUG_FLAG_INFO) -#define DEBUG_FLAGS_WARN (DEBUG_FLAG_ERROR | DEBUG_FLAG_WARN) -#define DEBUG_FLAGS_ERROR (DEBUG_FLAG_ERROR) -#define DEBUG_FLAGS_ANY (DEBUG_FLAG_INFO | DEBUG_FLAG_WARN | DEBUG_FLAG_ERROR) - -// -// Global variables to control tracing. Generally per module -// - -#ifndef DEBUG_FLAGS_VAR -#define DEBUG_FLAGS_VAR g_dwDebugFlags -#endif - -#ifndef DEBUG_LABEL_VAR -#define DEBUG_LABEL_VAR g_szDebugLabel -#endif - -extern PCSTR DEBUG_LABEL_VAR; -extern DWORD DEBUG_FLAGS_VAR; - -// -// Module should make this declaration globally. -// - -#define DECLARE_DEBUG_PRINT_OBJECT( _pszLabel_ ) \ - PCSTR DEBUG_LABEL_VAR = _pszLabel_; \ - DWORD DEBUG_FLAGS_VAR = DEBUG_FLAGS_ANY; \ - -#define DECLARE_DEBUG_PRINT_OBJECT2( _pszLabel_, _dwLevel_ ) \ - PCSTR DEBUG_LABEL_VAR = _pszLabel_; \ - DWORD DEBUG_FLAGS_VAR = _dwLevel_; \ - -// -// This doesn't do anything now. Should be safe to call in dll main. -// - -#define CREATE_DEBUG_PRINT_OBJECT - -// -// Trace macros -// - -#define DBG_CONTEXT _CRT_WARN, __FILE__, __LINE__, DEBUG_LABEL_VAR - -#ifdef DEBUG -#define DBGINFO(args) \ -{if (DEBUG_FLAGS_VAR & DEBUG_FLAG_INFO) { _CrtDbgReport args; }} -#define DBGWARN(args) \ -{if (DEBUG_FLAGS_VAR & DEBUG_FLAG_WARN) { _CrtDbgReport args; }} -#define DBGERROR(args) \ -{if (DEBUG_FLAGS_VAR & DEBUG_FLAG_ERROR) { _CrtDbgReport args; }} -#else -#define DBGINFO -#define DBGWARN -#define DBGERROR -#endif - -#define DBGPRINTF DBGINFO - -// -// Simple error traces -// - -#define DBGERROR_HR( _hr_ ) \ - DBGERROR((DBG_CONTEXT, "hr=0x%x\n", _hr_)) - -#define DBGERROR_STATUS( _status_ ) \ - DBGERROR((DBG_CONTEXT, "status=%d\n", _status_)) - -#endif diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h deleted file mode 100644 index a7bfeda2cf..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h +++ /dev/null @@ -1,325 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef __HASHFN_H__ -#define __HASHFN_H__ - - -// Produce a scrambled, randomish number in the range 0 to RANDOM_PRIME-1. -// Applying this to the results of the other hash functions is likely to -// produce a much better distribution, especially for the identity hash -// functions such as Hash(char c), where records will tend to cluster at -// the low end of the hashtable otherwise. LKRhash applies this internally -// to all hash signatures for exactly this reason. - -inline DWORD -HashScramble(DWORD dwHash) -{ - // Here are 10 primes slightly greater than 10^9 - // 1000000007, 1000000009, 1000000021, 1000000033, 1000000087, - // 1000000093, 1000000097, 1000000103, 1000000123, 1000000181. - - // default value for "scrambling constant" - const DWORD RANDOM_CONSTANT = 314159269UL; - // large prime number, also used for scrambling - const DWORD RANDOM_PRIME = 1000000007UL; - - return (RANDOM_CONSTANT * dwHash) % RANDOM_PRIME ; -} - - -// Faster scrambling function suggested by Eric Jacobsen - -inline DWORD -HashRandomizeBits(DWORD dw) -{ - return (((dw * 1103515245 + 12345) >> 16) - | ((dw * 69069 + 1) & 0xffff0000)); -} - - -// Small prime number used as a multiplier in the supplied hash functions -const DWORD HASH_MULTIPLIER = 101; - -#undef HASH_SHIFT_MULTIPLY - -#ifdef HASH_SHIFT_MULTIPLY -# define HASH_MULTIPLY(dw) (((dw) << 7) - (dw)) -#else -# define HASH_MULTIPLY(dw) ((dw) * HASH_MULTIPLIER) -#endif - -// Fast, simple hash function that tends to give a good distribution. -// Apply HashScramble to the result if you're using this for something -// other than LKRhash. - -inline DWORD -HashString( - const char* psz, - DWORD dwHash = 0) -{ - // force compiler to use unsigned arithmetic - const unsigned char* upsz = (const unsigned char*) psz; - - for ( ; *upsz; ++upsz) - dwHash = HASH_MULTIPLY(dwHash) + *upsz; - - return dwHash; -} - -inline DWORD -HashString( - __in_ecount(cch) const char* psz, - __in DWORD cch, - __in DWORD dwHash -) -{ - // force compiler to use unsigned arithmetic - const unsigned char* upsz = (const unsigned char*) psz; - - for (DWORD Index = 0; - Index < cch; - ++Index, ++upsz) - { - dwHash = HASH_MULTIPLY(dwHash) + *upsz; - } - - return dwHash; -} - - -// Unicode version of above - -inline DWORD -HashString( - const wchar_t* pwsz, - DWORD dwHash = 0) -{ - for ( ; *pwsz; ++pwsz) - dwHash = HASH_MULTIPLY(dwHash) + *pwsz; - - return dwHash; -} - -// Based on length of the string instead of null-terminating character - -inline DWORD -HashString( - __in_ecount(cch) const wchar_t* pwsz, - __in DWORD cch, - __in DWORD dwHash -) -{ - for (DWORD Index = 0; - Index < cch; - ++Index, ++pwsz) - { - dwHash = HASH_MULTIPLY(dwHash) + *pwsz; - } - - return dwHash; -} - - -// Quick-'n'-dirty case-insensitive string hash function. -// Make sure that you follow up with _stricmp or _mbsicmp. You should -// also cache the length of strings and check those first. Caching -// an uppercase version of a string can help too. -// Again, apply HashScramble to the result if using with something other -// than LKRhash. -// Note: this is not really adequate for MBCS strings. - -inline DWORD -HashStringNoCase( - const char* psz, - DWORD dwHash = 0) -{ - const unsigned char* upsz = (const unsigned char*) psz; - - for ( ; *upsz; ++upsz) - dwHash = HASH_MULTIPLY(dwHash) - + (*upsz & 0xDF); // strip off lowercase bit - - return dwHash; -} - -inline DWORD -HashStringNoCase( - __in_ecount(cch) - const char* psz, - SIZE_T cch, - DWORD dwHash) -{ - const unsigned char* upsz = (const unsigned char*) psz; - - for (SIZE_T Index = 0; - Index < cch; - ++Index, ++upsz) - { - dwHash = HASH_MULTIPLY(dwHash) - + (*upsz & 0xDF); // strip off lowercase bit - } - return dwHash; -} - - -// Unicode version of above - -inline DWORD -HashStringNoCase( - const wchar_t* pwsz, - DWORD dwHash = 0) -{ - for ( ; *pwsz; ++pwsz) - dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF); - - return dwHash; -} - -// Unicode version of above with length - -inline DWORD -HashStringNoCase( - __in_ecount(cch) - const wchar_t* pwsz, - SIZE_T cch, - DWORD dwHash) -{ - for (SIZE_T Index = 0; - Index < cch; - ++Index, ++pwsz) - { - dwHash = HASH_MULTIPLY(dwHash) + (*pwsz & 0xFFDF); - } - return dwHash; -} - - -// HashBlob returns the hash of a blob of arbitrary binary data. -// -// Warning: HashBlob is generally not the right way to hash a class object. -// Consider: -// class CFoo { -// public: -// char m_ch; -// double m_d; -// char* m_psz; -// }; -// -// inline DWORD Hash(const CFoo& rFoo) -// { return HashBlob(&rFoo, sizeof(CFoo)); } -// -// This is the wrong way to hash a CFoo for two reasons: (a) there will be -// a 7-byte gap between m_ch and m_d imposed by the alignment restrictions -// of doubles, which will be filled with random data (usually non-zero for -// stack variables), and (b) it hashes the address (rather than the -// contents) of the string m_psz. Similarly, -// -// bool operator==(const CFoo& rFoo1, const CFoo& rFoo2) -// { return memcmp(&rFoo1, &rFoo2, sizeof(CFoo)) == 0; } -// -// does the wrong thing. Much better to do this: -// -// DWORD Hash(const CFoo& rFoo) -// { -// return HashString(rFoo.m_psz, -// HASH_MULTIPLIER * Hash(rFoo.m_ch) -// + Hash(rFoo.m_d)); -// } -// -// Again, apply HashScramble if using with something other than LKRhash. - -inline DWORD -HashBlob( - const void* pv, - size_t cb, - DWORD dwHash = 0) -{ - const BYTE * pb = static_cast(pv); - - while (cb-- > 0) - dwHash = HASH_MULTIPLY(dwHash) + *pb++; - - return dwHash; -} - - - -// -// Overloaded hash functions for all the major builtin types. -// Again, apply HashScramble to result if using with something other than -// LKRhash. -// - -inline DWORD Hash(const char* psz) -{ return HashString(psz); } - -inline DWORD Hash(const unsigned char* pusz) -{ return HashString(reinterpret_cast(pusz)); } - -inline DWORD Hash(const signed char* pssz) -{ return HashString(reinterpret_cast(pssz)); } - -inline DWORD Hash(const wchar_t* pwsz) -{ return HashString(pwsz); } - -inline DWORD -Hash( - const GUID* pguid, - DWORD dwHash = 0) -{ - - return * reinterpret_cast(const_cast(pguid)) + dwHash; -} - -// Identity hash functions: scalar values map to themselves -inline DWORD Hash(char c) -{ return c; } - -inline DWORD Hash(unsigned char uc) -{ return uc; } - -inline DWORD Hash(signed char sc) -{ return sc; } - -inline DWORD Hash(short sh) -{ return sh; } - -inline DWORD Hash(unsigned short ush) -{ return ush; } - -inline DWORD Hash(int i) -{ return i; } - -inline DWORD Hash(unsigned int u) -{ return u; } - -inline DWORD Hash(long l) -{ return l; } - -inline DWORD Hash(unsigned long ul) -{ return ul; } - -inline DWORD Hash(float f) -{ - // be careful of rounding errors when computing keys - union { - float f; - DWORD dw; - } u; - u.f = f; - return u.dw; -} - -inline DWORD Hash(double dbl) -{ - // be careful of rounding errors when computing keys - union { - double dbl; - DWORD dw[2]; - } u; - u.dbl = dbl; - return u.dw[0] * HASH_MULTIPLIER + u.dw[1]; -} - -#endif // __HASHFN_H__ diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h deleted file mode 100644 index 9319e5643d..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h +++ /dev/null @@ -1,666 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include -#include "rwlock.h" -#include "prime.h" - -template -class HASH_NODE -{ - template - friend class HASH_TABLE; - - HASH_NODE( - _Record * pRecord, - DWORD dwHash - ) : _pNext (NULL), - _pRecord (pRecord), - _dwHash (dwHash) - {} - - ~HASH_NODE() - { - _ASSERTE(_pRecord == NULL); - } - - private: - // Next node in the hash table look-aside - HASH_NODE<_Record> *_pNext; - - // actual record - _Record * _pRecord; - - // hash value - DWORD _dwHash; -}; - -template -class HASH_TABLE -{ -protected: - typedef BOOL - (PFN_DELETE_IF)( - _Record * pRecord, - PVOID pvContext - ); - - typedef VOID - (PFN_APPLY)( - _Record * pRecord, - PVOID pvContext - ); - -public: - HASH_TABLE( - VOID - ) - : _ppBuckets( NULL ), - _nBuckets( 0 ), - _nItems( 0 ) - { - } - - virtual - ~HASH_TABLE(); - - virtual - VOID - ReferenceRecord( - _Record * pRecord - ) = 0; - - virtual - VOID - DereferenceRecord( - _Record * pRecord - ) = 0; - - virtual - _Key - ExtractKey( - _Record * pRecord - ) = 0; - - virtual - DWORD - CalcKeyHash( - _Key key - ) = 0; - - virtual - BOOL - EqualKeys( - _Key key1, - _Key key2 - ) = 0; - - DWORD - Count( - VOID - ) const; - - bool - IsInitialized( - VOID - ) const; - - virtual - VOID - Clear(); - - HRESULT - Initialize( - DWORD nBucketSize - ); - - virtual - VOID - FindKey( - _Key key, - _Record ** ppRecord - ); - - virtual - HRESULT - InsertRecord( - _Record * pRecord - ); - - virtual - VOID - DeleteKey( - _Key key - ); - - virtual - VOID - DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext - ); - - VOID - Apply( - PFN_APPLY pfnApply, - PVOID pvContext - ); - -private: - - __success(*ppNode != NULL && return != FALSE) - BOOL - FindNodeInternal( - _Key key, - DWORD dwHash, - __deref_out - HASH_NODE<_Record> ** ppNode, - __deref_opt_out - HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL - ); - - VOID - DeleteNode( - HASH_NODE<_Record> * pNode - ) - { - if (pNode->_pRecord != NULL) - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - - delete pNode; - } - - VOID - RehashTableIfNeeded( - VOID - ); - - HASH_NODE<_Record> ** _ppBuckets; - DWORD _nBuckets; - DWORD _nItems; - // - // Allow to use lock object in const methods. - // - mutable - CWSDRWLock _tableLock; -}; - -template -HRESULT -HASH_TABLE<_Record,_Key>::Initialize( - DWORD nBuckets -) -{ - HRESULT hr = S_OK; - - if ( nBuckets == 0 ) - { - hr = E_INVALIDARG; - goto Failed; - } - - if (nBuckets >= MAXDWORD/sizeof(HASH_NODE<_Record> *)) - { - hr = E_INVALIDARG; - goto Failed; - } - - _ASSERTE(_ppBuckets == NULL ); - if ( _ppBuckets != NULL ) - { - hr = E_INVALIDARG; - goto Failed; - } - - hr = _tableLock.Init(); - if ( FAILED( hr ) ) - { - goto Failed; - } - - _ppBuckets = (HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(HASH_NODE<_Record> *)); - if (_ppBuckets == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Failed; - } - _nBuckets = nBuckets; - - return S_OK; - -Failed: - - if (_ppBuckets) - { - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - } - - return hr; -} - - -template -HASH_TABLE<_Record,_Key>::~HASH_TABLE() -{ - if (_ppBuckets == NULL) - { - return; - } - - _ASSERTE(_nItems == 0); - - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - _nBuckets = 0; -} - -template< class _Record, class _Key> -DWORD -HASH_TABLE<_Record,_Key>::Count() const -{ - return _nItems; -} - -template< class _Record, class _Key> -bool -HASH_TABLE<_Record,_Key>::IsInitialized( - VOID -) const -{ - return _ppBuckets != NULL; -} - - -template -VOID -HASH_TABLE<_Record,_Key>::Clear() -{ - HASH_NODE<_Record> *pCurrent; - HASH_NODE<_Record> *pNext; - - // This is here in the off cases where someone instantiates a hashtable - // and then does an automatic "clear" before its destruction WITHOUT - // ever initializing it. - if ( ! _tableLock.QueryInited() ) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pCurrent = _ppBuckets[i]; - _ppBuckets[i] = NULL; - while (pCurrent != NULL) - { - pNext = pCurrent->_pNext; - DeleteNode(pCurrent); - pCurrent = pNext; - } - } - - _nItems = 0; - _tableLock.ExclusiveRelease(); -} - -template -__success(*ppNode != NULL && return != FALSE) -BOOL -HASH_TABLE<_Record,_Key>::FindNodeInternal( - _Key key, - DWORD dwHash, - __deref_out - HASH_NODE<_Record> ** ppNode, - __deref_opt_out - HASH_NODE<_Record> *** pppPreviousNodeNextPointer -) -/*++ - Return value indicates whether the item is found - key, dwHash - key and hash for the node to find - ppNode - on successful return, the node found, on failed return, the first - node with hash value greater than the node to be found - pppPreviousNodeNextPointer - the pointer to previous node's _pNext - - This routine may be called under either read or write lock ---*/ -{ - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - HASH_NODE<_Record> *pNode; - BOOL fFound = FALSE; - - ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets); - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - if (pNode->_dwHash == dwHash) - { - if (EqualKeys(key, - ExtractKey(pNode->_pRecord))) - { - fFound = TRUE; - break; - } - } - else if (pNode->_dwHash > dwHash) - { - break; - } - - ppPreviousNodeNextPointer = &(pNode->_pNext); - pNode = *ppPreviousNodeNextPointer; - } - - __analysis_assume( (pNode == NULL && fFound == FALSE) || - (pNode != NULL && fFound == TRUE ) ); - *ppNode = pNode; - if (pppPreviousNodeNextPointer != NULL) - { - *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer; - } - return fFound; -} - -template -VOID -HASH_TABLE<_Record,_Key>::FindKey( - _Key key, - _Record ** ppRecord -) -{ - HASH_NODE<_Record> *pNode; - - *ppRecord = NULL; - - DWORD dwHash = CalcKeyHash(key); - - _tableLock.SharedAcquire(); - - if (FindNodeInternal(key, dwHash, &pNode) && - pNode->_pRecord != NULL) - { - ReferenceRecord(pNode->_pRecord); - *ppRecord = pNode->_pRecord; - } - - _tableLock.SharedRelease(); -} - -template -HRESULT -HASH_TABLE<_Record,_Key>::InsertRecord( - _Record * pRecord -) -/*++ - This method inserts a node for this record and also empty nodes for paths - in the heirarchy leading upto this path - - The insert is done under only a read-lock - this is possible by keeping - the hashes in a bucket in increasing order and using interlocked operations - to actually insert the item in the hash-bucket lookaside list and the parent - children list - - Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists. - Never leak this error to the end user because "*file* already exists" may be confusing. ---*/ -{ - BOOL fLocked = FALSE; - _Key key = ExtractKey(pRecord); - DWORD dwHash = CalcKeyHash(key); - HRESULT hr = S_OK; - HASH_NODE<_Record> * pNewNode; - HASH_NODE<_Record> * pNextNode; - HASH_NODE<_Record> ** ppPreviousNodeNextPointer; - - // - // Ownership of pRecord is not transferred to pNewNode yet, so remember - // to either set it to null before deleting pNewNode or add an extra - // reference later - this is to make sure we do not do an extra ref/deref - // which users may view as getting flushed out of the hash-table - // - pNewNode = new HASH_NODE<_Record>(pRecord, dwHash); - if (pNewNode == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Finished; - } - - _tableLock.SharedAcquire(); - fLocked = TRUE; - - do - { - // - // Find the right place to add this node - // - if (FindNodeInternal(key, dwHash, &pNextNode, &ppPreviousNodeNextPointer)) - { - // - // If node already there, return error - // - pNewNode->_pRecord = NULL; - DeleteNode(pNewNode); - - // - // We should never leak this error to the end user - // because "file already exists" may be confusing. - // - hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS); - goto Finished; - } - - // - // If another node got inserted in between, we will have to retry - // - pNewNode->_pNext = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppPreviousNodeNextPointer, - pNewNode, - pNextNode) != pNextNode); - // pass ownership of pRecord now - if (pRecord != NULL) - { - ReferenceRecord(pRecord); - pRecord = NULL; - } - InterlockedIncrement((LONG *)&_nItems); - -Finished: - - if (fLocked) - { - _tableLock.SharedRelease(); - } - - if (SUCCEEDED(hr)) - { - RehashTableIfNeeded(); - } - - return hr; -} - -template -VOID -HASH_TABLE<_Record,_Key>::DeleteKey( - _Key key -) -{ - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - DWORD dwHash = CalcKeyHash(key); - - _tableLock.ExclusiveAcquire(); - - if (FindNodeInternal(key, dwHash, &pNode, &ppPreviousNodeNextPointer)) - { - *ppPreviousNodeNextPointer = pNode->_pNext; - DeleteNode(pNode); - _nItems--; - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext -) -{ - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - ppPreviousNodeNextPointer = _ppBuckets + i; - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - // - // Non empty nodes deleted based on DeleteIf, empty nodes deleted - // if they have no children - // - if (pfnDeleteIf(pNode->_pRecord, pvContext)) - { - *ppPreviousNodeNextPointer = pNode->_pNext; - DeleteNode(pNode); - _nItems--; - } - else - { - ppPreviousNodeNextPointer = &pNode->_pNext; - } - - pNode = *ppPreviousNodeNextPointer; - } - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::Apply( - PFN_APPLY pfnApply, - PVOID pvContext -) -{ - HASH_NODE<_Record> *pNode; - - _tableLock.SharedAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - if (pNode->_pRecord != NULL) - { - pfnApply(pNode->_pRecord, pvContext); - } - - pNode = pNode->_pNext; - } - } - - _tableLock.SharedRelease(); -} - -template -VOID -HASH_TABLE<_Record,_Key>::RehashTableIfNeeded( - VOID -) -{ - HASH_NODE<_Record> **ppBuckets; - DWORD nBuckets; - HASH_NODE<_Record> *pNode; - HASH_NODE<_Record> *pNextNode; - HASH_NODE<_Record> **ppNextPointer; - HASH_NODE<_Record> *pNewNextNode; - DWORD nNewBuckets; - - // - // If number of items has become too many, we will double the hash table - // size (we never reduce it however) - // - if (_nItems <= PRIME::GetPrime(2*_nBuckets)) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - nNewBuckets = PRIME::GetPrime(2*_nBuckets); - - if (_nItems <= nNewBuckets) - { - goto Finished; - } - - nBuckets = nNewBuckets; - if (nBuckets >= 0xffffffff/sizeof(HASH_NODE<_Record> *)) - { - goto Finished; - } - ppBuckets = (HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(HASH_NODE<_Record> *)); - if (ppBuckets == NULL) - { - goto Finished; - } - - // - // Take out nodes from the old hash table and insert in the new one, make - // sure to keep the hashes in increasing order - // - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - pNextNode = pNode->_pNext; - - ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets); - pNewNextNode = *ppNextPointer; - while (pNewNextNode != NULL && - pNewNextNode->_dwHash <= pNode->_dwHash) - { - ppNextPointer = &pNewNextNode->_pNext; - pNewNextNode = pNewNextNode->_pNext; - } - pNode->_pNext = pNewNextNode; - *ppNextPointer = pNode; - - pNode = pNextNode; - } - } - - HeapFree(GetProcessHeap(), 0, _ppBuckets); - _ppBuckets = ppBuckets; - _nBuckets = nBuckets; - ppBuckets = NULL; - -Finished: - - _tableLock.ExclusiveRelease(); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h deleted file mode 100644 index 80b70e97a9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h +++ /dev/null @@ -1,163 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#ifndef _LIST_ENTRY_H -#define _LIST_ENTRY_H - -// -// Doubly-linked list manipulation routines. -// - - -#define InitializeListHead32(ListHead) (\ - (ListHead)->Flink = (ListHead)->Blink = PtrToUlong((ListHead))) - - -FORCEINLINE -VOID -InitializeListHead( - IN PLIST_ENTRY ListHead - ) -{ - ListHead->Flink = ListHead->Blink = ListHead; -} - -FORCEINLINE -BOOLEAN -IsListEmpty( - IN const LIST_ENTRY * ListHead - ) -{ - return (BOOLEAN)(ListHead->Flink == ListHead); -} - -FORCEINLINE -BOOLEAN -RemoveEntryList( - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Blink; - PLIST_ENTRY Flink; - - Flink = Entry->Flink; - Blink = Entry->Blink; - Blink->Flink = Flink; - Flink->Blink = Blink; - return (BOOLEAN)(Flink == Blink); -} - -FORCEINLINE -PLIST_ENTRY -RemoveHeadList( - IN PLIST_ENTRY ListHead - ) -{ - PLIST_ENTRY Flink; - PLIST_ENTRY Entry; - - Entry = ListHead->Flink; - Flink = Entry->Flink; - ListHead->Flink = Flink; - Flink->Blink = ListHead; - return Entry; -} - - - -FORCEINLINE -PLIST_ENTRY -RemoveTailList( - IN PLIST_ENTRY ListHead - ) -{ - PLIST_ENTRY Blink; - PLIST_ENTRY Entry; - - Entry = ListHead->Blink; - Blink = Entry->Blink; - ListHead->Blink = Blink; - Blink->Flink = ListHead; - return Entry; -} - - -FORCEINLINE -VOID -InsertTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Blink; - - Blink = ListHead->Blink; - Entry->Flink = ListHead; - Entry->Blink = Blink; - Blink->Flink = Entry; - ListHead->Blink = Entry; -} - - -FORCEINLINE -VOID -InsertHeadList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY Entry - ) -{ - PLIST_ENTRY Flink; - - Flink = ListHead->Flink; - Entry->Flink = Flink; - Entry->Blink = ListHead; - Flink->Blink = Entry; - ListHead->Flink = Entry; -} - -FORCEINLINE -VOID -AppendTailList( - IN PLIST_ENTRY ListHead, - IN PLIST_ENTRY ListToAppend - ) -{ - PLIST_ENTRY ListEnd = ListHead->Blink; - - ListHead->Blink->Flink = ListToAppend; - ListHead->Blink = ListToAppend->Blink; - ListToAppend->Blink->Flink = ListHead; - ListToAppend->Blink = ListEnd; -} - -FORCEINLINE -PSINGLE_LIST_ENTRY -PopEntryList( - PSINGLE_LIST_ENTRY ListHead - ) -{ - PSINGLE_LIST_ENTRY FirstEntry; - FirstEntry = ListHead->Next; - if (FirstEntry != NULL) { - ListHead->Next = FirstEntry->Next; - } - - return FirstEntry; -} - - -FORCEINLINE -VOID -PushEntryList( - PSINGLE_LIST_ENTRY ListHead, - PSINGLE_LIST_ENTRY Entry - ) -{ - Entry->Next = ListHead->Next; - ListHead->Next = Entry; -} - - -#endif diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h deleted file mode 100644 index 960f663a98..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h +++ /dev/null @@ -1,63 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _MACROS_H -#define _MACROS_H - -// -// The DIFF macro should be used around an expression involving pointer -// subtraction. The expression passed to DIFF is cast to a size_t type, -// allowing the result to be easily assigned to any 32-bit variable or -// passed to a function expecting a 32-bit argument. -// - -#define DIFF(x) ((size_t)(x)) - -// Change a hexadecimal digit to its numerical equivalent -#define TOHEX( ch ) \ - ((ch) > L'9' ? \ - (ch) >= L'a' ? \ - (ch) - L'a' + 10 : \ - (ch) - L'A' + 10 \ - : (ch) - L'0') - - -// Change a number to its Hexadecimal equivalent - -#define TODIGIT( nDigit ) \ - (CHAR)((nDigit) > 9 ? \ - (nDigit) - 10 + 'A' \ - : (nDigit) + '0') - - -inline int -SAFEIsSpace(UCHAR c) -{ - return isspace( c ); -} - -inline int -SAFEIsAlNum(UCHAR c) -{ - return isalnum( c ); -} - -inline int -SAFEIsAlpha(UCHAR c) -{ - return isalpha( c ); -} - -inline int -SAFEIsXDigit(UCHAR c) -{ - return isxdigit( c ); -} - -inline int -SAFEIsDigit(UCHAR c) -{ - return isdigit( c ); -} - -#endif // _MACROS_H diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp deleted file mode 100644 index 775ec4cd0c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp +++ /dev/null @@ -1,474 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - - -#pragma warning (disable : 4267) - -#include "precomp.h" -#include "multisz.h" -#include - -// -// Private Definitions -// - -#define MAXULONG 4294967295 -#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r') - -// -// When appending data, this is the extra amount we request to avoid -// reallocations -// -#define STR_SLOP 128 - - -DWORD -MULTISZ::CalcLength( const WCHAR * str, - LPDWORD pcStrings ) -{ - DWORD count = 0; - DWORD total = 1; - DWORD len; - - while( *str ) { - len = ::wcslen( str ) + 1; - total += len; - str += len; - count++; - } - - if( pcStrings != NULL ) { - *pcStrings = count; - } - - return total; - -} // MULTISZ::CalcLength - - -BOOL -MULTISZ::FindString( const WCHAR * str ) -{ - - WCHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !::wcscmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += ::wcslen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZ::FindString - - -BOOL -MULTISZ::FindStringNoCase( const WCHAR * str ) -{ - - WCHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !_wcsicmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += wcslen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZ::FindStringNoCase - - -VOID -MULTISZ::AuxInit( const WCHAR * pInit ) -{ - BOOL fRet; - - if ( pInit ) - { - DWORD cStrings; - int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(WCHAR); - fRet = Resize( cbCopy ); - - if ( fRet ) { - CopyMemory( QueryPtr(), pInit, cbCopy ); - m_cchLen = (cbCopy)/sizeof(WCHAR); - m_cStrings = cStrings; - } else { -// BUFFER::SetValid( FALSE); - } - - } else { - - Reset(); - - } - -} // MULTISZ::AuxInit() - - -/******************************************************************* - - NAME: MULTISZ::AuxAppend - - SYNOPSIS: Appends the string onto the multisz. - - ENTRY: Object to append -********************************************************************/ - -BOOL MULTISZ::AuxAppend( const WCHAR * pStr, UINT cbStr, BOOL fAddSlop ) -{ - DBG_ASSERT( pStr != NULL ); - - UINT cbThis = QueryCB(); - - DBG_ASSERT( cbThis >= 2 ); - - if( cbThis == 4 ) { - - // - // It's empty, so start at the beginning. - // - - cbThis = 0; - - } else { - - // - // It's not empty, so back up over the final terminating NULL. - // - - cbThis -= sizeof(WCHAR); - - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - // Note: QuerySize returns the requested size of the string buffer, - // *not* the strlen of the buffer - // - - //AcIncrement( CacMultiszAppend); - - // - // Check for the arithmetic overflow - // - // ( 2 * sizeof( WCHAR ) ) is for the double terminator - // - ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(WCHAR); - if ( cb64Required > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( QuerySize() < (DWORD) cb64Required ) - { - ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 ); - // - // Check for the arithmetic overflow - // - if ( cb64AllocSize > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( !Resize( (DWORD) cb64AllocSize ) ) - return FALSE; - } - - // copy the exact string and tack on the double terminator - memcpy( (BYTE *) QueryPtr() + cbThis, - pStr, - cbStr); - *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0'; - *(WCHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(WCHAR) ) = L'\0'; - - m_cchLen = CalcLength( (const WCHAR *)QueryPtr(), &m_cStrings ); - return TRUE; - -} // MULTISZ::AuxAppend() - - -#if 0 - -BOOL -MULTISZ::CopyToBuffer( WCHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the WCHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to WCHAR buffer which on return contains - the UNICODE version of string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in *lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - if ( *lpcch == 0) { - - // - // Inquiring the size of buffer alone - // - *lpcch = QueryCCH() + 1; // add one character for terminating null - } else { - - // - // Copy after conversion from ANSI to Unicode - // - int iRet; - iRet = MultiByteToWideChar( CP_ACP, - MB_PRECOMPOSED | MB_ERR_INVALID_CHARS, - QueryStrA(), QueryCCH() + 1, - lpszBuffer, (int )*lpcch); - - if ( iRet == 0 || iRet != (int ) *lpcch) { - - // - // Error in conversion. - // - fReturn = FALSE; - } - } - - return ( fReturn); -} // MULTISZ::CopyToBuffer() -#endif - -BOOL -MULTISZ::CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the WCHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to WCHAR buffer which on return contains - the string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - register DWORD cch = QueryCCH(); - - if ( *lpcch >= cch) { - - DBG_ASSERT( lpszBuffer); - memcpy( lpszBuffer, QueryStr(), cch * sizeof(WCHAR)); - } else { - DBG_ASSERT( *lpcch < cch); - SetLastError( ERROR_INSUFFICIENT_BUFFER); - fReturn = FALSE; - } - - *lpcch = cch; - - return ( fReturn); -} // MULTISZ::CopyToBuffer() - -BOOL -MULTISZ::Equals( - MULTISZ* pmszRhs -) -// -// Compares this to pmszRhs, returns TRUE if equal -// -{ - DBG_ASSERT( NULL != pmszRhs ); - - PCWSTR pszLhs = First( ); - PCWSTR pszRhs = pmszRhs->First( ); - - if( m_cStrings != pmszRhs->m_cStrings ) - { - return FALSE; - } - - while( NULL != pszLhs ) - { - DBG_ASSERT( NULL != pszRhs ); - - if( 0 != wcscmp( pszLhs, pszRhs ) ) - { - return FALSE; - } - - pszLhs = Next( pszLhs ); - pszRhs = pmszRhs->Next( pszRhs ); - } - - return TRUE; -} - -HRESULT -SplitCommaDelimitedString( - PCWSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZ * pmszList -) -/*++ - -Routine Description: - - Split comma delimited string into a multisz. Additional leading empty - entries after the first are discarded. - -Arguments: - - pszList - List to split up - fTrimEntries - Whether each entry should be trimmed before added to multisz - fRemoveEmptyEntries - Whether empty entires should be discarded - pmszList - Filled with MULTISZ list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - - if ( pszList == NULL || - pmszList == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - pmszList->Reset(); - - /* - pszCurrent: start of the current entry which may be the comma that - precedes the next entry if the entry is empty - - pszNext: the comma that precedes the next entry. If - pszCurrent == pszNext, then the entry is empty - - pszEnd: just past the end of the current entry - */ - - for ( PCWSTR pszCurrent = pszList, - pszNext = wcschr( pszCurrent, L',' ) - ; - ; - pszCurrent = pszNext + 1, - pszNext = wcschr( pszCurrent, L',' ) ) - { - PCWSTR pszEnd = NULL; - - if ( pszNext != NULL ) - { - pszEnd = pszNext; - } - else - { - pszEnd = pszCurrent + wcslen( pszCurrent ); - } - - if ( fTrimEntries ) - { - while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) ) - { - pszCurrent++; - } - - while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) ) - { - pszEnd--; - } - } - - if ( pszCurrent != pszEnd || !fRemoveEmptyEntries ) - { - if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - if ( pszNext == NULL ) - { - break; - } - } - -Finished: - - return hr; -} - -#pragma warning(default:4267) \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h deleted file mode 100644 index f65c151d4f..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _MULTISZ_H_ -#define _MULTISZ_H_ - -#include "stringu.h" -#include "ntassert.h" - -/*++ - class MULTISZ: - - Intention: - A light-weight multi-string class supporting encapsulated string class. - - This object is derived from BUFFER class. - It maintains following state: - - m_fValid - whether this object is valid - - used only by MULTISZ() init functions - * NYI: I need to kill this someday * - m_cchLen - string length cached when we update the string. - m_cStrings - number of strings. - - Member Functions: - There are two categories of functions: - 1) Safe Functions - which do integrity checking of state - 2) UnSafe Functions - which do not do integrity checking, but - enable writing to the data stream freely. - (someday this will be enabled as Safe versions without - problem for users) - ---*/ -class MULTISZ : public BUFFER -{ -public: - - MULTISZ() - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { Reset(); } - - // creates a stack version of the MULTISZ object - uses passed in stack buffer - // MULTISZ does not free this pbInit on its own. - MULTISZ( __in_bcount(cbInit) WCHAR * pbInit, DWORD cbInit) - : BUFFER( (BYTE *) pbInit, cbInit), - m_cchLen (0), - m_cStrings(0) - {} - - MULTISZ( const WCHAR * pchInit ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit(pchInit); } - - MULTISZ( const MULTISZ & str ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit( str.QueryStr()); } - -// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; } - // - // Checks and returns TRUE if this string has no valid data else FALSE - // - BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); } - - BOOL Append( const WCHAR * pchInit ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - (DWORD) (::wcslen(pchInit)) * sizeof(WCHAR) - )) : - TRUE); - } - - - BOOL Append( const WCHAR * pchInit, DWORD cchLen ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - cchLen * sizeof(WCHAR))) : - TRUE); - } - - BOOL Append( STRU & str ) - { return AuxAppend( str.QueryStr(), - (str.QueryCCH()) * sizeof(WCHAR)); } - - // Resets the internal string to be NULL string. Buffer remains cached. - VOID Reset( VOID) - { DBG_ASSERT( QueryPtr() != NULL); - QueryStr()[0] = L'\0'; - QueryStr()[1] = L'\0'; - m_cchLen = 2; - m_cStrings = 0; - } - - BOOL Copy( const WCHAR * pchInit, IN DWORD cbLen ) { - if ( QueryPtr() ) { Reset(); } - return ( (pchInit != NULL) ? - AuxAppend( pchInit, cbLen, FALSE ): - TRUE); - } - - BOOL Copy( const MULTISZ & str ) - { return ( Copy(str.QueryStr(), str.QueryCB())); } - - // - // Returns the number of bytes in the string including the terminating - // NULLs - // - UINT QueryCB( VOID ) const - { return ( m_cchLen * sizeof(WCHAR)); } - - // - // Returns # of characters in the string including the terminating NULLs - // - UINT QueryCCH( VOID ) const { return (m_cchLen); } - - // - // Returns # of strings in the multisz. - // - - DWORD QueryStringCount( VOID ) const { return m_cStrings; } - - // - // Makes a copy of the stored string in given buffer - // - BOOL CopyToBuffer( __out_ecount_opt(*lpcch) WCHAR * lpszBuffer, LPDWORD lpcch) const; - - // - // Return the string buffer - // - WCHAR * QueryStrA( VOID ) const { return ( QueryStr()); } - WCHAR * QueryStr( VOID ) const { return ((WCHAR *) QueryPtr()); } - - // - // Makes a clone of the current string in the string pointer passed in. - // - BOOL - Clone( OUT MULTISZ * pstrClone) const - { - return ((pstrClone == NULL) ? - (SetLastError(ERROR_INVALID_PARAMETER), FALSE) : - (pstrClone->Copy( *this)) - ); - } // MULTISZ::Clone() - - // - // Recalculates the length of *this because we've modified the buffers - // directly - // - - VOID RecalcLen( VOID ) - { m_cchLen = MULTISZ::CalcLength( QueryStr(), &m_cStrings ); } - - // - // Calculate total character length of a MULTI_SZ, including the - // terminating NULLs. - // - - static DWORD CalcLength( const WCHAR * str, - LPDWORD pcStrings = NULL ); - - // - // Determine if the MULTISZ contains a specific string. - // - - BOOL FindString( const WCHAR * str ); - - BOOL FindString( STRU & str ) - { return FindString( str.QueryStr() ); } - - // - // Determine if the MULTISZ contains a specific string - case-insensitive - // - - BOOL FindStringNoCase( const WCHAR * str ); - - BOOL FindStringNoCase( STRU & str ) - { return FindStringNoCase( str.QueryStr() ); } - - // - // Used for scanning a multisz. - // - - const WCHAR * First( VOID ) const - { return *QueryStr() == L'\0' ? NULL : QueryStr(); } - - const WCHAR * Next( const WCHAR * Current ) const - { Current += ::wcslen( Current ) + 1; - return *Current == L'\0' ? NULL : Current; } - - BOOL - Equals( - MULTISZ* pmszRhs - ); - -private: - - DWORD m_cchLen; - DWORD m_cStrings; - VOID AuxInit( const WCHAR * pInit ); - BOOL AuxAppend( const WCHAR * pInit, - UINT cbStr, BOOL fAddSlop = TRUE ); - -}; - -// -// Quick macro for declaring a MULTISZ that will use stack memory of -// bytes. If the buffer overflows then a heap buffer will be allocated -// - -#define STACK_MULTISZ( name, size ) WCHAR __ach##name[size]; \ - MULTISZ name( __ach##name, sizeof( __ach##name )) - -HRESULT -SplitCommaDelimitedString( - PCWSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZ * pmszList -); - -#endif // !_MULTISZ_HXX_ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp deleted file mode 100644 index 54717edf05..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp +++ /dev/null @@ -1,408 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma warning (disable : 4267) -#include "precomp.h" -#include "multisza.h" -#include - -// -// Private Definitions -// - -#define MAXULONG 4294967295 -#define ISWHITE( ch ) ((ch) == L' ' || (ch) == L'\t' || (ch) == L'\r') - -// -// When appending data, this is the extra amount we request to avoid -// reallocations -// -#define STR_SLOP 128 - - -DWORD -MULTISZA::CalcLength( const CHAR * str, - LPDWORD pcStrings ) -{ - DWORD count = 0; - DWORD total = 1; - DWORD len; - - while( *str ) { - len = ::strlen( str ) + 1; - total += len; - str += len; - count++; - } - - if( pcStrings != NULL ) { - *pcStrings = count; - } - - return total; - -} // MULTISZA::CalcLength - - -BOOL -MULTISZA::FindString( const CHAR * str ) -{ - - CHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !::strcmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += ::strlen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZA::FindString - - -BOOL -MULTISZA::FindStringNoCase( const CHAR * str ) -{ - - CHAR * multisz; - - // - // Sanity check. - // - - DBG_ASSERT( QueryStr() != NULL ); - DBG_ASSERT( str != NULL ); - DBG_ASSERT( *str != '\0' ); - - // - // Scan it. - // - - multisz = QueryStr(); - - while( *multisz != '\0' ) { - - if( !_stricmp( multisz, str ) ) { - - return TRUE; - - } - - multisz += strlen( multisz ) + 1; - - } - - return FALSE; - -} // MULTISZA::FindStringNoCase - - -VOID -MULTISZA::AuxInit( const CHAR * pInit ) -{ - BOOL fRet; - - if ( pInit ) - { - DWORD cStrings; - int cbCopy = CalcLength( pInit, &cStrings ) * sizeof(CHAR); - fRet = Resize( cbCopy ); - - if ( fRet ) { - CopyMemory( QueryPtr(), pInit, cbCopy ); - m_cchLen = (cbCopy)/sizeof(CHAR); - m_cStrings = cStrings; - } else { -// BUFFER::SetValid( FALSE); - } - - } else { - - Reset(); - - } - -} // MULTISZA::AuxInit() - - -/******************************************************************* - - NAME: MULTISZA::AuxAppend - - SYNOPSIS: Appends the string onto the MULTISZA. - - ENTRY: Object to append -********************************************************************/ - -BOOL MULTISZA::AuxAppend( const CHAR * pStr, UINT cbStr, BOOL fAddSlop ) -{ - DBG_ASSERT( pStr != NULL ); - - UINT cbThis = QueryCB(); - - if( cbThis == 2 ) { - - // - // It's empty, so start at the beginning. - // - - cbThis = 0; - - } else { - - // - // It's not empty, so back up over the final terminating NULL. - // - - cbThis -= sizeof(CHAR); - - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - // Note: QuerySize returns the requested size of the string buffer, - // *not* the strlen of the buffer - // - - //AcIncrement( CacMultiszAppend); - - // - // Check for the arithmetic overflow - // - // ( 2 * sizeof( CHAR ) ) is for the double terminator - // - ULONGLONG cb64Required = (ULONGLONG)cbThis + cbStr + 2 * sizeof(CHAR); - if ( cb64Required > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( QuerySize() < (DWORD) cb64Required ) - { - ULONGLONG cb64AllocSize = cb64Required + (fAddSlop ? STR_SLOP : 0 ); - // - // Check for the arithmetic overflow - // - if ( cb64AllocSize > MAXULONG ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return FALSE; - } - if ( !Resize( (DWORD) cb64AllocSize ) ) - return FALSE; - } - - // copy the exact string and tack on the double terminator - memcpy( (BYTE *) QueryPtr() + cbThis, - pStr, - cbStr); - *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr) = L'\0'; - *(CHAR *)((BYTE *)QueryPtr() + cbThis + cbStr + sizeof(CHAR) ) = L'\0'; - - m_cchLen = CalcLength( (const CHAR *)QueryPtr(), &m_cStrings ); - return TRUE; - -} // MULTISZA::AuxAppend() - -BOOL -MULTISZA::CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const -/*++ - Description: - Copies the string into the CHAR buffer passed in if the buffer - is sufficient to hold the translated string. - If the buffer is small, the function returns small and sets *lpcch - to contain the required number of characters. - - Arguments: - lpszBuffer pointer to CHAR buffer which on return contains - the string on success. - lpcch pointer to DWORD containing the length of the buffer. - If *lpcch == 0 then the function returns TRUE with - the count of characters required stored in lpcch. - Also in this case lpszBuffer is not affected. - Returns: - TRUE on success. - FALSE on failure. Use GetLastError() for further details. ---*/ -{ - BOOL fReturn = TRUE; - - if ( lpcch == NULL) { - SetLastError( ERROR_INVALID_PARAMETER); - return ( FALSE); - } - - register DWORD cch = QueryCCH(); - - if ( *lpcch >= cch) { - - DBG_ASSERT( lpszBuffer); - memcpy( lpszBuffer, QueryStr(), cch * sizeof(CHAR)); - } else { - DBG_ASSERT( *lpcch < cch); - SetLastError( ERROR_INSUFFICIENT_BUFFER); - fReturn = FALSE; - } - - *lpcch = cch; - - return ( fReturn); -} // MULTISZA::CopyToBuffer() - -BOOL -MULTISZA::Equals( - MULTISZA* pmszRhs -) -// -// Compares this to pmszRhs, returns TRUE if equal -// -{ - DBG_ASSERT( NULL != pmszRhs ); - - PCSTR pszLhs = First( ); - PCSTR pszRhs = pmszRhs->First( ); - - if( m_cStrings != pmszRhs->m_cStrings ) - { - return FALSE; - } - - while( NULL != pszLhs ) - { - DBG_ASSERT( NULL != pszRhs ); - - if( 0 != strcmp( pszLhs, pszRhs ) ) - { - return FALSE; - } - - pszLhs = Next( pszLhs ); - pszRhs = pmszRhs->Next( pszRhs ); - } - - return TRUE; -} - -HRESULT -SplitCommaDelimitedString( - PCSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZA * pmszList -) -/*++ - -Routine Description: - - Split comma delimited string into a MULTISZA. Additional leading empty - entries after the first are discarded. - -Arguments: - - pszList - List to split up - fTrimEntries - Whether each entry should be trimmed before added to MULTISZA - fRemoveEmptyEntries - Whether empty entires should be discarded - pmszList - Filled with MULTISZA list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - - if ( pszList == NULL || - pmszList == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - pmszList->Reset(); - - /* - pszCurrent: start of the current entry which may be the comma that - precedes the next entry if the entry is empty - - pszNext: the comma that precedes the next entry. If - pszCurrent == pszNext, then the entry is empty - - pszEnd: just past the end of the current entry - */ - - for ( PCSTR pszCurrent = pszList, - pszNext = strchr( pszCurrent, L',' ) - ; - ; - pszCurrent = pszNext + 1, - pszNext = strchr( pszCurrent, L',' ) ) - { - PCSTR pszEnd = NULL; - - if ( pszNext != NULL ) - { - pszEnd = pszNext; - } - else - { - pszEnd = pszCurrent + strlen( pszCurrent ); - } - - if ( fTrimEntries ) - { - while ( pszCurrent < pszEnd && ISWHITE( pszCurrent[ 0 ] ) ) - { - pszCurrent++; - } - - while ( pszEnd > pszCurrent && ISWHITE( pszEnd[ -1 ] ) ) - { - pszEnd--; - } - } - - if ( pszCurrent != pszEnd || !fRemoveEmptyEntries ) - { - if ( !pmszList->Append( pszCurrent, (DWORD) ( pszEnd - pszCurrent ) ) ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - if ( pszNext == NULL ) - { - break; - } - } - -Finished: - - return hr; -} -#pragma warning(default:4267) \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h deleted file mode 100644 index d575ec9423..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h +++ /dev/null @@ -1,226 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _MULTISZA_H_ -#define _MULTISZA_H_ - -#include -#include "stringa.h" - - -/*++ - class MULTISZ: - - Intention: - A light-weight multi-string class supporting encapsulated string class. - - This object is derived from BUFFER class. - It maintains following state: - - m_fValid - whether this object is valid - - used only by MULTISZ() init functions - * NYI: I need to kill this someday * - m_cchLen - string length cached when we update the string. - m_cStrings - number of strings. - - Member Functions: - There are two categories of functions: - 1) Safe Functions - which do integrity checking of state - 2) UnSafe Functions - which do not do integrity checking, but - enable writing to the data stream freely. - (someday this will be enabled as Safe versions without - problem for users) - ---*/ -class MULTISZA : public BUFFER -{ -public: - - MULTISZA() - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { Reset(); } - - // creates a stack version of the MULTISZA object - uses passed in stack buffer - // MULTISZA does not free this pbInit on its own. - MULTISZA( __in_bcount(cbInit) CHAR * pbInit, DWORD cbInit) - : BUFFER( (BYTE *) pbInit, cbInit), - m_cchLen (0), - m_cStrings(0) - {} - - MULTISZA( const CHAR * pchInit ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit(pchInit); } - - MULTISZA( const MULTISZA & str ) - : BUFFER (), - m_cchLen ( 0), - m_cStrings(0) - { AuxInit( str.QueryStr()); } - -// BOOL IsValid(VOID) const { return ( BUFFER::IsValid()) ; } - // - // Checks and returns TRUE if this string has no valid data else FALSE - // - BOOL IsEmpty( VOID) const { return ( *QueryStr() == L'\0'); } - - BOOL Append( const CHAR * pchInit ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - (DWORD) (::strlen(pchInit)) * sizeof(CHAR) - )) : - TRUE); - } - - - BOOL Append( const CHAR * pchInit, DWORD cchLen ) { - return ((pchInit != NULL) ? (AuxAppend( pchInit, - cchLen * sizeof(CHAR))) : - TRUE); - } - - BOOL Append( STRA & str ) - { return AuxAppend( str.QueryStr(), - (str.QueryCCH()) * sizeof(CHAR)); } - - // Resets the internal string to be NULL string. Buffer remains cached. - VOID Reset( VOID) - { DBG_ASSERT( QueryPtr() != NULL); - QueryStr()[0] = L'\0'; - QueryStr()[1] = L'\0'; - m_cchLen = 2; - m_cStrings = 0; - } - - BOOL Copy( const CHAR * pchInit, IN DWORD cbLen ) { - if ( QueryPtr() ) { Reset(); } - return ( (pchInit != NULL) ? - AuxAppend( pchInit, cbLen, FALSE ): - TRUE); - } - - BOOL Copy( const MULTISZA & str ) - { return ( Copy(str.QueryStr(), str.QueryCB())); } - - // - // Returns the number of bytes in the string including the terminating - // NULLs - // - UINT QueryCB( VOID ) const - { return ( m_cchLen * sizeof(CHAR)); } - - // - // Returns # of characters in the string including the terminating NULLs - // - UINT QueryCCH( VOID ) const { return (m_cchLen); } - - // - // Returns # of strings in the MULTISZA. - // - - DWORD QueryStringCount( VOID ) const { return m_cStrings; } - - // - // Makes a copy of the stored string in given buffer - // - BOOL CopyToBuffer( __out_ecount_opt(*lpcch) CHAR * lpszBuffer, LPDWORD lpcch) const; - - // - // Return the string buffer - // - CHAR * QueryStrA( VOID ) const { return ( QueryStr()); } - CHAR * QueryStr( VOID ) const { return ((CHAR *) QueryPtr()); } - - // - // Makes a clone of the current string in the string pointer passed in. - // - BOOL - Clone( OUT MULTISZA * pstrClone) const - { - return ((pstrClone == NULL) ? - (SetLastError(ERROR_INVALID_PARAMETER), FALSE) : - (pstrClone->Copy( *this)) - ); - } // MULTISZA::Clone() - - // - // Recalculates the length of *this because we've modified the buffers - // directly - // - - VOID RecalcLen( VOID ) - { m_cchLen = MULTISZA::CalcLength( QueryStr(), &m_cStrings ); } - - // - // Calculate total character length of a MULTI_SZ, including the - // terminating NULLs. - // - - static DWORD CalcLength( const CHAR * str, - LPDWORD pcStrings = NULL ); - - // - // Determine if the MULTISZA contains a specific string. - // - - BOOL FindString( const CHAR * str ); - - BOOL FindString( STRA & str ) - { return FindString( str.QueryStr() ); } - - // - // Determine if the MULTISZA contains a specific string - case-insensitive - // - - BOOL FindStringNoCase( const CHAR * str ); - - BOOL FindStringNoCase( STRA & str ) - { return FindStringNoCase( str.QueryStr() ); } - - // - // Used for scanning a MULTISZA. - // - - const CHAR * First( VOID ) const - { return *QueryStr() == L'\0' ? NULL : QueryStr(); } - - const CHAR * Next( const CHAR * Current ) const - { Current += ::strlen( Current ) + 1; - return *Current == L'\0' ? NULL : Current; } - - BOOL - Equals( - MULTISZA* pmszRhs - ); - -private: - - DWORD m_cchLen; - DWORD m_cStrings; - VOID AuxInit( const CHAR * pInit ); - BOOL AuxAppend( const CHAR * pInit, - UINT cbStr, BOOL fAddSlop = TRUE ); - -}; - -// -// Quick macro for declaring a MULTISZA that will use stack memory of -// bytes. If the buffer overflows then a heap buffer will be allocated -// - -#define STACK_MULTISZA( name, size ) CHAR __ach##name[size]; \ - MULTISZA name( __ach##name, sizeof( __ach##name )) - -HRESULT -SplitCommaDelimitedString( - PCSTR pszList, - BOOL fTrimEntries, - BOOL fRemoveEmptyEntries, - MULTISZA * pmszList -); - -#endif // !_MULTISZA_HXX_ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h deleted file mode 100644 index 6d2f3b9a30..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h +++ /dev/null @@ -1,32 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#ifdef _ASSERTE - #undef _ASSERTE -#endif - -#ifdef ASSERT - #undef ASSERT -#endif - -#if defined( DBG ) && DBG - #define SX_ASSERT( _x ) ( (VOID)( ( ( _x ) ) ? TRUE : ( __annotation( L"Debug", L"AssertFail", L#_x ), DbgRaiseAssertionFailure(), FALSE ) ) ) - #define SX_ASSERTMSG( _m, _x ) ( (VOID)( ( ( _x ) ) ? TRUE : ( __annotation( L"Debug", L"AssertFail", L##_m ), DbgRaiseAssertionFailure(), FALSE ) ) ) - #define SX_VERIFY( _x ) SX_ASSERT( _x ) - #define _ASSERTE( _x ) SX_ASSERT( _x ) - #define ASSERT( _x ) SX_ASSERT( _x ) - #define assert( _x ) SX_ASSERT( _x ) - #define DBG_ASSERT( _x ) SX_ASSERT( _x ) - #define DBG_REQUIRE( _x ) SX_ASSERT( _x ) -#else - #define SX_ASSERT( _x ) ( (VOID)0 ) - #define SX_ASSERTMSG( _m, _x ) ( (VOID)0 ) - #define SX_VERIFY( _x ) ( (VOID)( ( _x ) ? TRUE : FALSE ) ) - #define _ASSERTE( _x ) ( (VOID)0 ) - #define assert( _x ) ( (VOID)0 ) - #define DBG_ASSERT( _x ) ( (VOID)0 ) - #define DBG_REQUIRE( _x ) ((VOID)(_x)) -#endif - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h deleted file mode 100644 index 5d3c563935..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h +++ /dev/null @@ -1,305 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -template -class PER_CPU -{ -public: - - template - inline - static - HRESULT - Create( - FunctionInitializer Initializer, - __deref_out PER_CPU ** ppInstance - ); - - inline - T * - GetLocal( - VOID - ); - - template - inline - VOID - ForEach( - FunctionForEach Function - ); - - inline - VOID - Dispose( - VOID - ); - -private: - - PER_CPU( - VOID - ) - { - // - // Don't perform any operation during constructor. - // Constructor will never be called. - // - } - - ~PER_CPU( - VOID - ) - { - // - // Don't perform any operation during destructor. - // Constructor will never be called. - // - } - - template - HRESULT - Initialize( - FunctionInitializer Initializer, - DWORD NumberOfVariables, - DWORD Alignment - ); - - T * - GetObject( - DWORD Index - ); - - static - HRESULT - GetProcessorInformation( - __out DWORD * pCacheLineSize, - __out DWORD * pNumberOfProcessors - ); - - // - // Pointer to the begining of the inlined array. - // - PVOID m_pVariables; - SIZE_T m_Alignment; - SIZE_T m_VariablesCount; -}; - -template -template -inline -// static -HRESULT -PER_CPU::Create( - FunctionInitializer Initializer, - __deref_out PER_CPU ** ppInstance -) -{ - HRESULT hr = S_OK; - DWORD CacheLineSize = 0; - DWORD ObjectCacheLineSize = 0; - DWORD NumberOfProcessors = 0; - PER_CPU * pInstance = NULL; - - hr = GetProcessorInformation(&CacheLineSize, - &NumberOfProcessors); - if (FAILED(hr)) - { - goto Finished; - } - - if (sizeof(T) > CacheLineSize) - { - // - // Round to the next multiple of the cache line size. - // - ObjectCacheLineSize = (sizeof(T) + CacheLineSize-1) & (CacheLineSize-1); - } - else - { - ObjectCacheLineSize = CacheLineSize; - } - - // - // Calculate the size of the PER_CPU object, including the array. - // The first cache line is for the member variables and the array - // starts in the next cache line. - // - SIZE_T Size = CacheLineSize + NumberOfProcessors * ObjectCacheLineSize; - - pInstance = (PER_CPU*) _aligned_malloc(Size, CacheLineSize); - if (pInstance == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - ZeroMemory(pInstance, Size); - - // - // The array start in the 2nd cache line. - // - pInstance->m_pVariables = reinterpret_cast(pInstance) + CacheLineSize; - - // - // Pass a disposer for disposing initialized items in case of failure. - // - hr = pInstance->Initialize(Initializer, - NumberOfProcessors, - ObjectCacheLineSize); - if (FAILED(hr)) - { - goto Finished; - } - - *ppInstance = pInstance; - pInstance = NULL; - -Finished: - - if (pInstance != NULL) - { - // - // Free the instance without disposing it. - // - pInstance->Dispose(); - pInstance = NULL; - } - - return hr; -} - -template -inline -T * -PER_CPU::GetLocal( - VOID -) -{ - // Use GetCurrentProcessorNumber (up to 64 logical processors) instead of - // GetCurrentProcessorNumberEx (more than 64 logical processors) because - // the number of processors are not densely packed per group. - // The idea of distributing variables per CPU is to have - // a scalability multiplier (could be NUMA node instead). - // - // Make sure the index don't go beyond the array size, if that happens, - // there won't be even distribution, but still better - // than one single variable. - // - return GetObject(GetCurrentProcessorNumber()); -} - -template -inline -T * -PER_CPU::GetObject( - DWORD Index -) -{ - return reinterpret_cast(static_cast(m_pVariables) + Index * m_Alignment); -} - -template -template -inline -VOID -PER_CPU::ForEach( - FunctionForEach Function -) -{ - for(DWORD Index = 0; Index < m_VariablesCount; ++Index) - { - T * pObject = GetObject(Index); - Function(pObject); - } -} - -template -VOID -PER_CPU::Dispose( - VOID -) -{ - _aligned_free(this); -} - -template -template -inline -HRESULT -PER_CPU::Initialize( - FunctionInitializer Initializer, - DWORD NumberOfVariables, - DWORD Alignment -) -/*++ - -Routine Description: - - Initialize each object using the initializer function. - If initialization for any object fails, it dispose the - objects that were successfully initialized. - -Arguments: - - Initializer - Function for initialize one object. - Signature: HRESULT Func(T*) - Dispose - Function for disposing initialized objects in case of failure. - Signature: void Func(T*) - NumberOfVariables - The length of the array of variables. - Alignment - Alignment to use for avoiding false sharing. - -Return: - - HRESULT - E_OUTOFMEMORY - ---*/ -{ - HRESULT hr = S_OK; - DWORD Index = 0; - - m_VariablesCount = NumberOfVariables; - m_Alignment = Alignment; - - for (; Index < m_VariablesCount; ++Index) - { - T * pObject = GetObject(Index); - Initializer(pObject); - } - - return hr; -} - -template -// static -HRESULT -PER_CPU::GetProcessorInformation( - __out DWORD * pCacheLineSize, - __out DWORD * pNumberOfProcessors -) -/*++ - -Routine Description: - - Gets the CPU cache-line size for the current system. - This information is used for avoiding CPU false sharing. - -Arguments: - - pCacheLineSize - The processor cache-line size. - pNumberOfProcessors - Maximum number of processors per group. - -Return: - - HRESULT - E_OUTOFMEMORY - ---*/ -{ - SYSTEM_INFO SystemInfo = { }; - - GetSystemInfo(&SystemInfo); - *pNumberOfProcessors = SystemInfo.dwNumberOfProcessors; - *pCacheLineSize = SYSTEM_CACHE_ALIGNMENT_SIZE; - - return S_OK; -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h deleted file mode 100644 index 9cccea4045..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include -#include -#pragma warning( disable:4127 ) -#include -#include -#include -#include -#include -#include - -#include "macros.h" -#include "stringu.h" -#include "stringa.h" -#include "dbgutil.h" -#include "ntassert.h" -#include "ahutil.h" -#include "acache.h" -//#include "base64.hxx" - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h deleted file mode 100644 index 6a6a88ed78..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h +++ /dev/null @@ -1,85 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include -#include - -// -// Pre-calculated prime numbers (up to 10,049,369). -// -extern __declspec(selectany) const DWORD g_Primes [] = { - 3, 7, 11, 17, 23, 29, 37, 47, 59, 71, 89, 107, 131, 163, 197, 239, 293, 353, 431, 521, 631, - 761, 919, 1103, 1327, 1597, 1931, 2333, 2801, 3371, 4049, 4861, 5839, 7013, 8419, 10103, - 12143, 14591, 17519, 21023, 25229, 30293, 36353, 43627, 52361, 62851, 75431, 90523, 108631, - 130363, 156437, 187751, 225307, 270371, 324449, 389357, 467237, 560689, 672827, 807403, - 968897, 1162687, 1395263, 1674319, 2009191, 2411033, 2893249, 3471899, 4166287, 4999559, - 5999471, 7199369, 7849369, 8649369, 9249369, 10049369 -}; - -class PRIME -{ -public: - - static - DWORD - GetPrime( - DWORD dwMinimum - ) - { - // - // Try to use the precalculated numbers. - // - for ( DWORD Index = 0; Index < _countof( g_Primes ); Index++ ) - { - DWORD dwCandidate = g_Primes[Index]; - if ( dwCandidate >= dwMinimum ) - { - return dwCandidate; - } - } - - // - // Do calculation. - // - for ( DWORD dwCandidate = dwMinimum | 1; - dwCandidate < MAXDWORD; - dwCandidate += 2 ) - { - if ( IsPrime( dwCandidate ) ) - { - return dwCandidate; - } - } - return dwMinimum; - } - -private: - - static - BOOL - IsPrime( - DWORD dwCandidate - ) - { - if ((dwCandidate & 1) == 0) - { - return ( dwCandidate == 2 ); - } - - DWORD dwMax = static_cast(sqrt(static_cast(dwCandidate))); - - for ( DWORD Index = 3; Index <= dwMax; Index += 2 ) - { - if ( (dwCandidate % Index) == 0 ) - { - return FALSE; - } - } - return TRUE; - } - - PRIME() {} - ~PRIME() {} -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/pudebug.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/pudebug.h deleted file mode 100644 index 7b0e35da0f..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/pudebug.h +++ /dev/null @@ -1,736 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -# ifndef _PUDEBUG_H_ -# define _PUDEBUG_H_ - -#ifndef _NO_TRACING_ -# define _NO_TRACING_ -#endif // _NO_TRACING_ - -/************************************************************ - * Include Headers - ************************************************************/ - -# ifdef __cplusplus -extern "C" { -# endif // __cplusplus - -# include - -# ifndef dllexp -# define dllexp __declspec( dllexport) -# endif // dllexp - -#include - -#ifndef IN_OUT -#define IN_OUT __inout -#endif - -/*********************************************************** - * Macros - ************************************************************/ - -enum PRINT_REASONS { - PrintNone = 0x0, // Nothing to be printed - PrintError = 0x1, // An error message - PrintWarning = 0x2, // A warning message - PrintLog = 0x3, // Just logging. Indicates a trace of where ... - PrintMsg = 0x4, // Echo input message - PrintCritical = 0x5, // Print and Exit - PrintAssertion= 0x6 // Printing for an assertion failure - }; - - -enum DEBUG_OUTPUT_FLAGS { - DbgOutputNone = 0x0, // None - DbgOutputKdb = 0x1, // Output to Kernel Debugger - DbgOutputLogFile = 0x2, // Output to LogFile - DbgOutputTruncate = 0x4, // Truncate Log File if necessary - DbgOutputStderr = 0x8, // Send output to std error - DbgOutputBackup = 0x10, // Make backup of debug file ? - DbgOutputMemory = 0x20, // Dump to memory buffer - DbgOutputAll = 0xFFFFFFFF // All the bits set. - }; - - -# define MAX_LABEL_LENGTH ( 100) - - -// The following flags are used internally to track what level of tracing we -// are currently using. Bitmapped for extensibility. -#define DEBUG_FLAG_ODS 0x00000001 -//#define DEBUG_FLAG_INFO 0x00000002 -//#define DEBUG_FLAG_WARN 0x00000004 -//#define DEBUG_FLAG_ERROR 0x00000008 -// The following are used internally to determine whether to log or not based -// on what the current state is -//#define DEBUG_FLAGS_INFO (DEBUG_FLAG_ODS | DEBUG_FLAG_INFO) -//#define DEBUG_FLAGS_WARN (DEBUG_FLAG_ODS | DEBUG_FLAG_INFO | DEBUG_FLAG_WARN) -//#define DEBUG_FLAGS_ERROR (DEBUG_FLAG_ODS | DEBUG_FLAG_INFO | DEBUG_FLAG_WARN | DEBUG_FLAG_ERROR) - -#define DEBUG_FLAGS_ANY (DEBUG_FLAG_INFO | DEBUG_FLAG_WARN | DEBUG_FLAG_ERROR) - -// -// user of DEBUG infrastructure may choose unique variable name for DEBUG_FLAGS -// that's specially useful for cases where DEBUG infrastructure is used within -// static library (static library may prefer to maintain it's own DebugFlags independent -// on the main program it links to -// -#ifndef DEBUG_FLAGS_VAR -#define DEBUG_FLAGS_VAR g_dwDebugFlags -#endif - -extern -#ifdef __cplusplus -"C" -# endif // _cplusplus - DWORD DEBUG_FLAGS_VAR ; // Debugging Flags - -# define DECLARE_DEBUG_VARIABLE() - -# define SET_DEBUG_FLAGS( dwFlags) DEBUG_FLAGS_VAR = dwFlags -# define GET_DEBUG_FLAGS() ( DEBUG_FLAGS_VAR ) - -# define LOAD_DEBUG_FLAGS_FROM_REG(hkey, dwDefault) \ - DEBUG_FLAGS_VAR = PuLoadDebugFlagsFromReg((hkey), (dwDefault)) - -# define LOAD_DEBUG_FLAGS_FROM_REG_STR(pszRegKey, dwDefault) \ - DEBUG_FLAGS_VAR = PuLoadDebugFlagsFromRegStr((pszRegKey), (dwDefault)) - -# define SAVE_DEBUG_FLAGS_IN_REG(hkey, dwDbg) \ - PuSaveDebugFlagsInReg((hkey), (dwDbg)) - -# define DEBUG_IF( arg, s) if ( DEBUG_ ## arg & GET_DEBUG_FLAGS()) { \ - s \ - } else {} - -# define IF_DEBUG( arg) if ( DEBUG_## arg & GET_DEBUG_FLAGS()) - - -/*++ - class DEBUG_PRINTS - - This class is responsible for printing messages to log file / kernel debugger - - Currently the class supports only member functions for char. - ( not unicode-strings). - ---*/ - - -typedef struct _DEBUG_PRINTS { - - CHAR m_rgchLabel[MAX_LABEL_LENGTH]; - CHAR m_rgchLogFilePath[MAX_PATH]; - CHAR m_rgchLogFileName[MAX_PATH]; - HANDLE m_LogFileHandle; - HANDLE m_StdErrHandle; - BOOL m_fInitialized; - BOOL m_fBreakOnAssert; - DWORD m_dwOutputFlags; - VOID *m_pMemoryLog; -} DEBUG_PRINTS, FAR * LPDEBUG_PRINTS; - - -LPDEBUG_PRINTS -PuCreateDebugPrintsObject( - IN const char * pszPrintLabel, - IN DWORD dwOutputFlags); - -// -// frees the debug prints object and closes any file if necessary. -// Returns NULL on success or returns pDebugPrints on failure. -// -LPDEBUG_PRINTS -PuDeleteDebugPrintsObject( - IN_OUT LPDEBUG_PRINTS pDebugPrints); - - -VOID -PuDbgPrint( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN const char * pszFormat, - ...); - // arglist -VOID -PuDbgPrintW( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN const WCHAR * pszFormat, - ...); // arglist - -// PuDbgPrintError is similar to PuDbgPrint() but allows -// one to print error code in friendly manner -VOID -PuDbgPrintError( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN DWORD dwError, - IN const char * pszFormat, - ...); // arglist - -/*++ - PuDbgDump() does not do any formatting of output. - It just dumps the given message onto the debug destinations. ---*/ -VOID -PuDbgDump( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN const char * pszDump - ); - -// -// PuDbgAssertFailed() *must* be __cdecl to properly capture the -// thread context at the time of the failure. -// - -INT -__cdecl -PuDbgAssertFailed( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN const char * pszExpression, - IN const char * pszMessage); - -INT -WINAPI -PuDbgPrintAssertFailed( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName, - IN const char * pszExpression, - IN const char * pszMessage); - -VOID -PuDbgCaptureContext ( - OUT PCONTEXT ContextRecord - ); - -VOID -PuDbgPrintCurrentTime( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFilePath, - IN int nLineNum, - IN const char * pszFunctionName - ); - -VOID -PuSetDbgOutputFlags( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN DWORD dwFlags); - -DWORD -PuGetDbgOutputFlags( - IN const LPDEBUG_PRINTS pDebugPrints); - - -// -// Following functions return Win32 error codes. -// NO_ERROR if success -// - -DWORD -PuOpenDbgPrintFile( - IN_OUT LPDEBUG_PRINTS pDebugPrints, - IN const char * pszFileName, - IN const char * pszPathForFile); - -DWORD -PuReOpenDbgPrintFile( - IN_OUT LPDEBUG_PRINTS pDebugPrints); - -DWORD -PuCloseDbgPrintFile( - IN_OUT LPDEBUG_PRINTS pDebugPrints); - -DWORD -PuOpenDbgMemoryLog( - IN_OUT LPDEBUG_PRINTS pDebugPrints); - -DWORD -PuCloseDbgMemoryLog( - IN_OUT LPDEBUG_PRINTS pDebugPrints); - -DWORD -PuLoadDebugFlagsFromReg(IN HKEY hkey, IN DWORD dwDefault); - -DWORD -PuLoadDebugFlagsFromRegStr(IN LPCSTR pszRegKey, IN DWORD dwDefault); - -DWORD -PuSaveDebugFlagsInReg(IN HKEY hkey, IN DWORD dwDbg); - - -# define PuPrintToKdb( pszOutput) \ - if ( pszOutput != NULL) { \ - OutputDebugString( pszOutput); \ - } else {} - - - -# ifdef __cplusplus -}; -# endif // __cplusplus - -// begin_user_unmodifiable - - - -/*********************************************************** - * Macros - ************************************************************/ - - -extern -#ifdef __cplusplus -"C" -# endif // _cplusplus -DEBUG_PRINTS * g_pDebug; // define a global debug variable - -# if DBG - -// For the CHK build we want ODS enabled. For an explanation of these flags see -// the comment just after the definition of DBG_CONTEXT -# define DECLARE_DEBUG_PRINTS_OBJECT() \ - DEBUG_PRINTS * g_pDebug = NULL; \ - DWORD DEBUG_FLAGS_VAR = DEBUG_FLAG_ERROR; - -#else // !DBG - -# define DECLARE_DEBUG_PRINTS_OBJECT() \ - DEBUG_PRINTS * g_pDebug = NULL; \ - DWORD DEBUG_FLAGS_VAR = 0; - -#endif // !DBG - - -// -// Call the following macro as part of your initialization for program -// planning to use the debugging class. -// -/** DEBUGDEBUG -# define CREATE_DEBUG_PRINT_OBJECT( pszLabel) \ - g_pDebug = PuCreateDebugPrintsObject( pszLabel, DEFAULT_OUTPUT_FLAGS);\ - if ( g_pDebug == NULL) { \ - OutputDebugStringA( "Unable to Create Debug Print Object \n"); \ - } -*/ - -// -// Call the following macro once as part of the termination of program -// which uses the debugging class. -// -# define DELETE_DEBUG_PRINT_OBJECT( ) \ - g_pDebug = PuDeleteDebugPrintsObject( g_pDebug); - - -# define VALID_DEBUG_PRINT_OBJECT() \ - ( ( g_pDebug != NULL) && g_pDebug->m_fInitialized) - - -// -// Use the DBG_CONTEXT without any surrounding braces. -// This is used to pass the values for global DebugPrintObject -// and File/Line information -// -//# define DBG_CONTEXT g_pDebug, __FILE__, __LINE__, __FUNCTION__ - -// The 3 main tracing macros, each one corresponds to a different level of -// tracing - -// The 3 main tracing macros, each one corresponds to a different level of -// tracing -//# define DBGINFO(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_INFO) { PuDbgPrint args; }} -//# define DBGWARN(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_WARN) { PuDbgPrint args; }} -//# define DBGERROR(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_ERROR) { PuDbgPrint args; }} - -# define DBGINFOW(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_INFO) { PuDbgPrintW args; }} -# define DBGWARNW(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_WARN) { PuDbgPrintW args; }} -# define DBGERRORW(args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_ERROR) { PuDbgPrintW args; }} - - -// -// DBGPRINTF() is printing function ( much like printf) but always called -// with the DBG_CONTEXT as follows -// DBGPRINTF( ( DBG_CONTEXT, format-string, arguments for format list)); -// -# define DBGPRINTF DBGINFO - -// -// DPERROR() is printing function ( much like printf) but always called -// with the DBG_CONTEXT as follows -// DPERROR( ( DBG_CONTEXT, error, format-string, -// arguments for format list)); -// -# define DPERROR( args) {if (DEBUG_FLAGS_VAR & DEBUG_FLAGS_ERROR) { PuDbgPrintError args; }} - -# if DBG - -# define DBG_CODE(s) s /* echoes code in debugging mode */ - -// The same 3 main tracing macros however in this case the macros are only compiled -// into the CHK build. This is necessary because some tracing info used functions or -// variables which are not compiled into the FRE build. -# define CHKINFO(args) { PuDbgPrint args; } -# define CHKWARN(args) { PuDbgPrint args; } -# define CHKERROR(args) { PuDbgPrint args; } - -# define CHKINFOW(args) { PuDbgPrintW args; } -# define CHKWARNW(args) { PuDbgPrintW args; } -# define CHKERRORW(args) { PuDbgPrintW args; } - - -#ifndef DBG_ASSERT -# ifdef _PREFAST_ -# define DBG_ASSERT(exp) ((void)0) /* Do Nothing */ -# define DBG_ASSERT_MSG(exp, pszMsg) ((void)0) /* Do Nothing */ -# define DBG_REQUIRE( exp) ((void) (exp)) -# else // !_PREFAST_ -# define DBG_ASSERT( exp ) \ - ( (VOID)( ( exp ) || ( DebugBreak(), \ - PuDbgPrintAssertFailed( DBG_CONTEXT, #exp, "" ) ) ) ) - -# define DBG_ASSERT_MSG( exp, pszMsg) \ - ( (VOID)( ( exp ) || ( DebugBreak(), \ - PuDbgPrintAssertFailed( DBG_CONTEXT, #exp, pszMsg ) ) ) ) - -# define DBG_REQUIRE( exp ) \ - DBG_ASSERT( exp ) -# endif // !_PREFAST_ -#endif - - -# define DBG_LOG() PuDbgPrint( DBG_CONTEXT, "\n" ) - -# define DBG_OPEN_LOG_FILE( pszFile, pszPath ) \ - PuOpenDbgPrintFile( g_pDebug, (pszFile), (pszPath) ) - -# define DBG_CLOSE_LOG_FILE( ) \ - PuCloseDbgPrintFile( g_pDebug ) - -# define DBG_OPEN_MEMORY_LOG( ) \ - PuOpenDbgMemoryLog( g_pDebug ) - - -# define DBGDUMP( args ) PuDbgDump args - -# define DBGPRINT_CURRENT_TIME() PuDbgPrintCurrentTime( DBG_CONTEXT ) - -# else // !DBG - -# define DBG_CODE(s) ((void)0) /* Do Nothing */ - -# define CHKINFO(args) ((void)0) /* Do Nothing */ -# define CHKWARN(args) ((void)0) /* Do Nothing */ -# define CHKERROR(args) ((void)0) /* Do Nothing */ - -# define CHKINFOW(args) ((void)0) /* Do Nothing */ -# define CHKWARNW(args) ((void)0) /* Do Nothing */ -# define CHKERRORW(args) ((void)0) /* Do Nothing */ - -#ifndef DBG_ASSERT -# define DBG_ASSERT(exp) ((void)0) /* Do Nothing */ - -# define DBG_ASSERT_MSG(exp, pszMsg) ((void)0) /* Do Nothing */ - -# define DBG_REQUIRE( exp) ((void) (exp)) -#endif // !DBG_ASSERT - -# define DBGDUMP( args) ((void)0) /* Do nothing */ - -# define DBG_LOG() ((void)0) /* Do Nothing */ - -# define DBG_OPEN_LOG_FILE( pszFile, pszPath) ((void)0) /* Do Nothing */ - -# define DBG_OPEN_MEMORY_LOG() ((void)0) /* Do Nothing */ - -# define DBG_CLOSE_LOG_FILE() ((void)0) /* Do Nothing */ - -# define DBGPRINT_CURRENT_TIME() ((void)0) /* Do Nothing */ - -# endif // !DBG - - -// end_user_unmodifiable - -// begin_user_unmodifiable - - -#ifdef ASSERT -# undef ASSERT -#endif - - -# define ASSERT( exp) DBG_ASSERT( exp) - - -// end_user_unmodifiable - -// begin_user_modifiable - -// -// Debugging constants consist of two pieces. -// All constants in the range 0x0 to 0x8000 are reserved -// User extensions may include additional constants (bit flags) -// - -# define DEBUG_API_ENTRY 0x00000001L -# define DEBUG_API_EXIT 0x00000002L -# define DEBUG_INIT_CLEAN 0x00000004L -# define DEBUG_ERROR 0x00000008L - - // End of Reserved Range -# define DEBUG_RESERVED 0x00000FFFL - -// end_user_modifiable - - - -/*********************************************************** - * Platform Type related variables and macros - ************************************************************/ - -// -// Enum for product types -// - -typedef enum _PLATFORM_TYPE { - - PtInvalid = 0, // Invalid - PtNtWorkstation = 1, // NT Workstation - PtNtServer = 2, // NT Server - -} PLATFORM_TYPE; - -// -// IISGetPlatformType is the function used to the platform type -// - -extern -#ifdef __cplusplus -"C" -# endif // _cplusplus -PLATFORM_TYPE -IISGetPlatformType( - VOID - ); - -// -// External Macros -// - -#define InetIsNtServer( _pt ) ((_pt) == PtNtServer) -#define InetIsNtWksta( _pt ) ((_pt) == PtNtWorkstation) -#define InetIsValidPT(_pt) ((_pt) != PtInvalid) - -extern -#ifdef __cplusplus -"C" -# endif // _cplusplus -PLATFORM_TYPE g_PlatformType; - - -// Use the DECLARE_PLATFORM_TYPE macro to declare the platform type -#define DECLARE_PLATFORM_TYPE() \ - PLATFORM_TYPE g_PlatformType = PtInvalid; - -// Use the INITIALIZE_PLATFORM_TYPE to init the platform type -// This should typically go inside the DLLInit or equivalent place. -#define INITIALIZE_PLATFORM_TYPE() \ - g_PlatformType = IISGetPlatformType(); - -// -// Additional Macros to use the Platform Type -// - -#define TsIsNtServer( ) InetIsNtServer(g_PlatformType) -#define TsIsNtWksta( ) InetIsNtWksta(g_PlatformType) -#define IISIsValidPlatform() InetIsValidPT(g_PlatformType) -#define IISPlatformType() (g_PlatformType) - - -/*********************************************************** - * Some utility functions for Critical Sections - ************************************************************/ - -// -// IISSetCriticalSectionSpinCount() provides a thunk for the -// original NT4.0sp3 API SetCriticalSectionSpinCount() for CS with Spin counts -// Users of this function should definitely dynlink with kernel32.dll, -// Otherwise errors will surface to a large extent -// -extern -# ifdef __cplusplus -"C" -# endif // _cplusplus -DWORD -IISSetCriticalSectionSpinCount( - LPCRITICAL_SECTION lpCriticalSection, - DWORD dwSpinCount -); - - -// -// Macro for the calls to SetCriticalSectionSpinCount() -// -# define SET_CRITICAL_SECTION_SPIN_COUNT( lpCS, dwSpins) \ - IISSetCriticalSectionSpinCount( (lpCS), (dwSpins)) - -// -// IIS_DEFAULT_CS_SPIN_COUNT is the default value of spins used by -// Critical sections defined within IIS. -// NYI: We should have to switch the individual values based on experiments! -// Current value is an arbitrary choice -// -# define IIS_DEFAULT_CS_SPIN_COUNT (1000) - -// -// Initializes a critical section and sets its spin count -// to IIS_DEFAULT_CS_SPIN_COUNT. Equivalent to -// InitializeCriticalSectionAndSpinCount(lpCS, IIS_DEFAULT_CS_SPIN_COUNT), -// but provides a safe thunking layer for older systems that don't provide -// this API. -// -extern -# ifdef __cplusplus -"C" -# endif // _cplusplus -BOOL -IISInitializeCriticalSection( - LPCRITICAL_SECTION lpCriticalSection -); - -// -// Macro for the calls to InitializeCriticalSection() -// -# define INITIALIZE_CRITICAL_SECTION(lpCS) IISInitializeCriticalSection(lpCS) - -# endif /* _DEBUG_HXX_ */ - -// -// The following macros allow the automatic naming of certain Win32 objects. -// See IIS\SVCS\IISRTL\WIN32OBJ.C for details on the naming convention. -// -// Set IIS_NAMED_WIN32_OBJECTS to a non-zero value to enable named events, -// semaphores, and mutexes. -// - -#if DBG -#define IIS_NAMED_WIN32_OBJECTS 1 -#else -#define IIS_NAMED_WIN32_OBJECTS 0 -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -HANDLE -PuDbgCreateEvent( - __in LPSTR FileName, - IN ULONG LineNumber, - __in LPSTR MemberName, - IN PVOID Address, - IN BOOL ManualReset, - IN BOOL InitialState - ); - -HANDLE -PuDbgCreateSemaphore( - __in LPSTR FileName, - IN ULONG LineNumber, - __in LPSTR MemberName, - IN PVOID Address, - IN LONG InitialCount, - IN LONG MaximumCount - ); - -HANDLE -PuDbgCreateMutex( - __in LPSTR FileName, - IN ULONG LineNumber, - __in LPSTR MemberName, - IN PVOID Address, - IN BOOL InitialOwner - ); - -#ifdef __cplusplus -} // extern "C" -#endif - -#if IIS_NAMED_WIN32_OBJECTS - -#define IIS_CREATE_EVENT( membername, address, manual, state ) \ - PuDbgCreateEvent( \ - (LPSTR)__FILE__, \ - (ULONG)__LINE__, \ - (membername), \ - (PVOID)(address), \ - (manual), \ - (state) \ - ) - -#define IIS_CREATE_SEMAPHORE( membername, address, initial, maximum ) \ - PuDbgCreateSemaphore( \ - (LPSTR)__FILE__, \ - (ULONG)__LINE__, \ - (membername), \ - (PVOID)(address), \ - (initial), \ - (maximum) \ - ) - -#define IIS_CREATE_MUTEX( membername, address, initial ) \ - PuDbgCreateMutex( \ - (LPSTR)__FILE__, \ - (ULONG)__LINE__, \ - (membername), \ - (PVOID)(address), \ - (initial) \ - ) - -#else // !IIS_NAMED_WIN32_OBJECTS - -#define IIS_CREATE_EVENT( membername, address, manual, state ) \ - CreateEventA( \ - NULL, \ - (manual), \ - (state), \ - NULL \ - ) - -#define IIS_CREATE_SEMAPHORE( membername, address, initial, maximum ) \ - CreateSemaphoreA( \ - NULL, \ - (initial), \ - (maximum), \ - NULL \ - ) - -#define IIS_CREATE_MUTEX( membername, address, initial ) \ - CreateMutexA( \ - NULL, \ - (initial), \ - NULL \ - ) - -#endif // IIS_NAMED_WIN32_OBJECTS - - -/************************ End of File ***********************/ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c deleted file mode 100644 index c1b2e13a6e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c +++ /dev/null @@ -1,229 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include -#include "dbgutil.h" -#include "pudebug.h" -#include "reftrace.h" - - -PTRACE_LOG -CreateRefTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader - ) -/*++ - -Routine Description: - - Creates a new (empty) ref count trace log buffer. - -Arguments: - - LogSize - The number of entries in the log. - - ExtraBytesInHeader - The number of extra bytes to include in the - log header. This is useful for adding application-specific - data to the log. - -Return Value: - - PTRACE_LOG - Pointer to the newly created log if successful, - NULL otherwise. - ---*/ -{ - - return CreateTraceLog( - LogSize, - ExtraBytesInHeader, - sizeof(REF_TRACE_LOG_ENTRY) - ); - -} // CreateRefTraceLog - - -VOID -DestroyRefTraceLog( - IN PTRACE_LOG Log - ) -/*++ - -Routine Description: - - Destroys a ref count trace log buffer created with CreateRefTraceLog(). - -Arguments: - - Log - The ref count trace log buffer to destroy. - -Return Value: - - None. - ---*/ -{ - - DestroyTraceLog( Log ); - -} // DestroyRefTraceLog - - -// -// N.B. For RtlCaptureBacktrace() to work properly, the calling function -// *must* be __cdecl, and must have a "normal" stack frame. So, we decorate -// WriteRefTraceLog[Ex]() with the __cdecl modifier and disable the frame -// pointer omission (FPO) optimization. -// - -//#pragma optimize( "y", off ) // disable frame pointer omission (FPO) -#pragma optimize( "", off ) // disable frame pointer omission (FPO) - -LONG -__cdecl -WriteRefTraceLog( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context - ) -/*++ - -Routine Description: - - Writes a new entry to the specified ref count trace log. The entry - written contains the updated reference count and a stack backtrace - leading up to the current caller. - -Arguments: - - Log - The log to write to. - - NewRefCount - The updated reference count. - - Context - An uninterpreted context to associate with the log entry. - -Return Value: - - Index of entry in log. - ---*/ -{ - - return WriteRefTraceLogEx( - Log, - NewRefCount, - Context, - REF_TRACE_EMPTY_CONTEXT, // suppress use of optional extra contexts - REF_TRACE_EMPTY_CONTEXT, - REF_TRACE_EMPTY_CONTEXT - ); - -} // WriteRefTraceLog - - - - -LONG -__cdecl -WriteRefTraceLogEx( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context, - IN CONST VOID * Context1, // optional extra context - IN CONST VOID * Context2, // optional extra context - IN CONST VOID * Context3 // optional extra context - ) -/*++ - -Routine Description: - - Writes a new "extended" entry to the specified ref count trace log. - The entry written contains the updated reference count, stack backtrace - leading up to the current caller and extra context information. - -Arguments: - - Log - The log to write to. - - NewRefCount - The updated reference count. - - Context - An uninterpreted context to associate with the log entry. - Context1 - An uninterpreted context to associate with the log entry. - Context2 - An uninterpreted context to associate with the log entry. - Context3 - An uninterpreted context to associate with the log entry. - - NOTE Context1/2/3 are "optional" in that the caller may suppress - debug display of these values by passing REF_TRACE_EMPTY_CONTEXT - for each of them. - -Return Value: - - Index of entry in log. - ---*/ -{ - - REF_TRACE_LOG_ENTRY entry; - ULONG hash; - DWORD cStackFramesSkipped; - - // - // Initialize the entry. - // - - RtlZeroMemory( - &entry, - sizeof(entry) - ); - - // - // Set log entry members. - // - - entry.NewRefCount = NewRefCount; - entry.Context = Context; - entry.Thread = GetCurrentThreadId(); - entry.Context1 = Context1; - entry.Context2 = Context2; - entry.Context3 = Context3; - - // - // Capture the stack backtrace. Normally, we skip two stack frames: - // one for this routine, and one for RtlCaptureBacktrace() itself. - // For non-Ex callers who come in via WriteRefTraceLog, - // we skip three stack frames. - // - - if ( entry.Context1 == REF_TRACE_EMPTY_CONTEXT - && entry.Context2 == REF_TRACE_EMPTY_CONTEXT - && entry.Context3 == REF_TRACE_EMPTY_CONTEXT - ) { - - cStackFramesSkipped = 2; - - } else { - - cStackFramesSkipped = 1; - - } - - RtlCaptureStackBackTrace( - cStackFramesSkipped, - REF_TRACE_LOG_STACK_DEPTH, - entry.Stack, - &hash - ); - - // - // Write it to the log. - // - - return WriteTraceLog( - Log, - &entry - ); - -} // WriteRefTraceLogEx - -#pragma optimize( "", on ) // restore frame pointer omission (FPO) - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h deleted file mode 100644 index e90ca0444a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h +++ /dev/null @@ -1,87 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _REFTRACE_H_ -#define _REFTRACE_H_ - - -#if defined(__cplusplus) -extern "C" { -#endif // __cplusplus - -#include -#include "tracelog.h" - -// -// This is the number of stack backtrace values captured in each -// trace log entry. This value is chosen to make the log entry -// exactly twelve dwords long, making it a bit easier to interpret -// from within the debugger without the debugger extension. -// - -#define REF_TRACE_LOG_STACK_DEPTH 9 - -// No-op value for the Context1,2,3 parameters of WriteRefTraceLogEx -//#define REF_TRACE_EMPTY_CONTEXT ((PVOID) -1) -#define REF_TRACE_EMPTY_CONTEXT NULL - - -// -// This defines the entry written to the trace log. -// - -typedef struct _REF_TRACE_LOG_ENTRY { - - LONG NewRefCount; - CONST VOID * Context; - CONST VOID * Context1; - CONST VOID * Context2; - CONST VOID * Context3; - DWORD Thread; - PVOID Stack[REF_TRACE_LOG_STACK_DEPTH]; - -} REF_TRACE_LOG_ENTRY, *PREF_TRACE_LOG_ENTRY; - - -// -// Manipulators. -// - -PTRACE_LOG -CreateRefTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader - ); - -VOID -DestroyRefTraceLog( - IN PTRACE_LOG Log - ); - -LONG -__cdecl -WriteRefTraceLog( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context - ); - -LONG -__cdecl -WriteRefTraceLogEx( - IN PTRACE_LOG Log, - IN LONG NewRefCount, - IN CONST VOID * Context, - IN CONST VOID * Context1, - IN CONST VOID * Context2, - IN CONST VOID * Context3 - ); - - -#if defined(__cplusplus) -} // extern "C" -#endif // __cplusplus - - -#endif // _REFTRACE_H_ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h deleted file mode 100644 index dc7ccf834b..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h +++ /dev/null @@ -1,193 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#if (_WIN32_WINNT < 0x600) - -// -// XP implementation. -// -class CWSDRWLock -{ -public: - - CWSDRWLock() - : m_bInited(FALSE) - { - } - - ~CWSDRWLock() - { - if (m_bInited) - { - DeleteCriticalSection(&m_rwLock.critsec); - CloseHandle(m_rwLock.ReadersDoneEvent); - } - } - - BOOL QueryInited() const - { - return m_bInited; - } - - HRESULT Init() - { - HRESULT hr = S_OK; - - if (FALSE == m_bInited) - { - m_rwLock.fWriterWaiting = FALSE; - m_rwLock.LockCount = 0; - if ( !InitializeCriticalSectionAndSpinCount( &m_rwLock.critsec, 0 )) - { - DWORD dwError = GetLastError(); - hr = HRESULT_FROM_WIN32(dwError); - return hr; - } - - m_rwLock.ReadersDoneEvent = CreateEvent(NULL, FALSE, FALSE, NULL); - if( NULL == m_rwLock.ReadersDoneEvent ) - { - DWORD dwError = GetLastError(); - hr = HRESULT_FROM_WIN32(dwError); - DeleteCriticalSection(&m_rwLock.critsec); - return hr; - } - m_bInited = TRUE; - } - - return hr; - } - - void SharedAcquire() - { - EnterCriticalSection(&m_rwLock.critsec); - InterlockedIncrement(&m_rwLock.LockCount); - LeaveCriticalSection(&m_rwLock.critsec); - } - - void SharedRelease() - { - ReleaseRWLock(); - } - - void ExclusiveAcquire() - { - EnterCriticalSection( &m_rwLock.critsec ); - - m_rwLock.fWriterWaiting = TRUE; - - // check if there are any readers active - if ( InterlockedExchangeAdd( &m_rwLock.LockCount, 0 ) > 0 ) - { - // - // Wait for all the readers to get done.. - // - WaitForSingleObject( m_rwLock.ReadersDoneEvent, INFINITE ); - } - m_rwLock.LockCount = -1; - } - - void ExclusiveRelease() - { - ReleaseRWLock(); - } - -private: - - BOOL m_bInited; - - typedef struct _RW_LOCK - { - BOOL fWriterWaiting; // Is a writer waiting on the lock? - LONG LockCount; - CRITICAL_SECTION critsec; - HANDLE ReadersDoneEvent; - } RW_LOCK, *PRW_LOCK; - - RW_LOCK m_rwLock; - -private: - - void ReleaseRWLock() - { - LONG Count = InterlockedDecrement( &m_rwLock.LockCount ); - - if ( 0 <= Count ) - { - // releasing a read lock - if (( m_rwLock.fWriterWaiting ) && ( 0 == Count )) - { - SetEvent( m_rwLock.ReadersDoneEvent ); - } - } - else - { - // Releasing a write lock - m_rwLock.LockCount = 0; - m_rwLock.fWriterWaiting = FALSE; - LeaveCriticalSection(&m_rwLock.critsec); - } - } -}; - -#else - -// -// Implementation for Windows Vista or greater. -// -class CWSDRWLock -{ -public: - - CWSDRWLock() - { - InitializeSRWLock(&m_rwLock); - } - - BOOL QueryInited() - { - return TRUE; - } - - - HRESULT Init() - { - // - // Method defined to keep compatibility with CWSDRWLock class for XP. - // - return S_OK; - } - - void SharedAcquire() - { - AcquireSRWLockShared(&m_rwLock); - } - - void SharedRelease() - { - ReleaseSRWLockShared(&m_rwLock); - } - - void ExclusiveAcquire() - { - AcquireSRWLockExclusive(&m_rwLock); - } - - void ExclusiveRelease() - { - ReleaseSRWLockExclusive(&m_rwLock); - } - -private: - - SRWLOCK m_rwLock; -}; - -#endif - -// -// Rename the lock class to a more clear name. -// -typedef CWSDRWLock READ_WRITE_LOCK; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp deleted file mode 100644 index 29da773bca..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp +++ /dev/null @@ -1,1767 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.h" - -STRA::STRA( - VOID -) : m_cchLen( 0 ) -{ - *( QueryStr() ) = '\0'; -} - -STRA::STRA( - __inout_ecount(cchInit) CHAR* pbInit, - __in DWORD cchInit -) : m_Buff( pbInit, cchInit * sizeof( CHAR ) ), - m_cchLen(0) -/*++ - Description: - - Used by STACK_STRA. Initially populates underlying buffer with pbInit. - - pbInit is not freed. - - Arguments: - - pbInit - initial memory to use - cchInit - count, in characters, of pbInit - - Returns: - - None. - ---*/ -{ - _ASSERTE( NULL != pbInit ); - _ASSERTE( cchInit > 0 ); - _ASSERTE( pbInit[0] == '\0' ); -} - -BOOL -STRA::IsEmpty( - VOID -) const -{ - return ( m_cchLen == 0 ); -} - -BOOL -STRA::Equals( - __in PCSTR pszRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - _ASSERTE( NULL != pszRhs ); - - if( fIgnoreCase ) - { - return ( 0 == _stricmp( QueryStr(), pszRhs ) ); - } - - return ( 0 == strcmp( QueryStr(), pszRhs ) ); -} - -BOOL -STRA::Equals( - __in const STRA * pstrRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - _ASSERTE( NULL != pstrRhs ); - return Equals( pstrRhs->QueryStr(), fIgnoreCase ); -} - -BOOL -STRA::Equals( - __in const STRA & strRhs, - __in BOOL fIgnoreCase /*= FALSE*/ -) const -{ - return Equals( strRhs.QueryStr(), fIgnoreCase ); -} - -DWORD -STRA::QueryCB( - VOID -) const -// -// Returns the number of bytes in the string excluding the terminating NULL -// -{ - return m_cchLen * sizeof( CHAR ); -} - -DWORD -STRA::QueryCCH( - VOID -) const -// -// Returns the number of characters in the string excluding the terminating NULL -// -{ - return m_cchLen; -} - -DWORD -STRA::QuerySizeCCH( - VOID -) const -// -// Returns size of the underlying storage buffer, in characters -// -{ - return m_Buff.QuerySize() / sizeof( CHAR ); -} - -DWORD -STRA::QuerySize( - VOID -) const -// -// Returns the size of the storage buffer in bytes -// -{ - return m_Buff.QuerySize(); -} - -__nullterminated -__bcount(this->m_cchLen) -CHAR * -STRA::QueryStr( - VOID -) const -// -// Return the string buffer -// -{ - return m_Buff.QueryPtr(); -} - -VOID -STRA::Reset( - VOID -) -// -// Resets the internal string to be NULL string. Buffer remains cached. -// -{ - _ASSERTE( QueryStr() != NULL ); - *(QueryStr()) = '\0'; - m_cchLen = 0; -} - -HRESULT -STRA::Resize( - __in DWORD cchSize -) -{ - if( !m_Buff.Resize( cchSize * sizeof( CHAR ) ) ) - { - return E_OUTOFMEMORY; - } - - return S_OK; -} - -HRESULT -STRA::SyncWithBuffer( - VOID -) -// -// Recalculate the length of the string, etc. because we've modified -// the buffer directly. -// -{ - HRESULT hr; - size_t size; - hr = StringCchLengthA( QueryStr(), - QuerySizeCCH(), - &size ); - if ( SUCCEEDED( hr ) ) - { - m_cchLen = static_cast(size); - } - return hr; -} - -HRESULT -STRA::Copy( - __in PCSTR pszCopy -) -{ - HRESULT hr; - size_t cbLen; - hr = StringCbLengthA( pszCopy, - STRSAFE_MAX_CCH, - &cbLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return Copy( pszCopy, cbLen ); -} - - -HRESULT -STRA::Copy( - __in_ecount(cchLen) - PCSTR pszCopy, - __in SIZE_T cbLen -) -// -// Copy the contents of another string to this one -// -{ - _ASSERTE( cbLen <= MAXDWORD ); - - return AuxAppend( - pszCopy, - static_cast(cbLen), - 0 - ); -} - -HRESULT -STRA::Copy( - __in const STRA * pstrRhs -) -{ - _ASSERTE( pstrRhs != NULL ); - return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRA::Copy( - __in const STRA & strRhs -) -{ - return Copy( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRA::CopyW( - __in PCWSTR pszCopyW -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszCopyW, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return CopyW( pszCopyW, cchLen ); -} - -HRESULT -STRA::CopyWTruncate( - __in PCWSTR pszCopyWTruncate -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszCopyWTruncate, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return CopyWTruncate( pszCopyWTruncate, cchLen ); -} - -HRESULT -STRA::CopyWTruncate( - __in_ecount(cchLen) - PCWSTR pszCopyWTruncate, - __in SIZE_T cchLen -) -// -// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste -// -{ - _ASSERTE( cchLen <= MAXDWORD ); - - return AuxAppendWTruncate( - pszCopyWTruncate, - static_cast(cchLen), - 0 - ); -} - -HRESULT -STRA::Append( - __in PCSTR pszAppend -) -{ - HRESULT hr; - size_t cbLen; - hr = StringCbLengthA( pszAppend, - STRSAFE_MAX_CCH, - &cbLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return Append( pszAppend, cbLen ); -} - -HRESULT -STRA::Append( - __in_ecount(cchLen) - PCSTR pszAppend, - __in SIZE_T cbLen -) -{ - _ASSERTE( cbLen <= MAXDWORD ); - if ( cbLen == 0 ) - { - return S_OK; - } - return AuxAppend( - pszAppend, - static_cast(cbLen), - QueryCB() - ); -} - -HRESULT -STRA::Append( - __in const STRA * pstrRhs -) -{ - _ASSERTE( pstrRhs != NULL ); - return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRA::Append( - __in const STRA & strRhs -) -{ - return Append( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRA::AppendWTruncate( - __in PCWSTR pszAppendWTruncate -) -{ - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszAppendWTruncate, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return AppendWTruncate( pszAppendWTruncate, cchLen ); -} - -HRESULT -STRA::AppendWTruncate( - __in_ecount(cchLen) - PCWSTR pszAppendWTruncate, - __in SIZE_T cchLen -) -// -// The "Truncate" methods do not do proper conversion. They do a (CHAR) caste -// -{ - _ASSERTE( cchLen <= MAXDWORD ); - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendWTruncate( - pszAppendWTruncate, - static_cast(cchLen), - QueryCB() - ); -} - -HRESULT -STRA::CopyToBuffer( - __out_bcount(*pcb) CHAR* pszBuffer, - __inout DWORD * pcb -) const -// -// Makes a copy of the stored string into the given buffer -// -{ - _ASSERTE( NULL != pszBuffer ); - _ASSERTE( NULL != pcb ); - - HRESULT hr = S_OK; - DWORD cbNeeded = QueryCB() + sizeof( CHAR ); - - if( *pcb < cbNeeded ) - { - hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ); - goto Finished; - } - - memcpy( pszBuffer, QueryStr(), cbNeeded ); - -Finished: - - *pcb = cbNeeded; - - return hr; -} - -HRESULT -STRA::SetLen( - __in DWORD cchLen -) -/*++ - * -Routine Description: - - Set the length of the string and null terminate, if there - is sufficient buffer already allocated. Will not reallocate. - -Arguments: - - cchLen - The number of characters in the new string. - -Return Value: - - HRESULT - ---*/ -{ - if( cchLen >= QuerySizeCCH() ) - { - return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - - *( QueryStr() + cchLen ) = '\0'; - m_cchLen = cchLen; - - return S_OK; -} - - -HRESULT -STRA::SafeSnprintf( - __in __format_string - PCSTR pszFormatString, - ... -) -/*++ - -Routine Description: - - Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pszFormatString - printf format - ... - printf args - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - va_list argsList; - va_start( argsList, pszFormatString ); - - hr = SafeVsnprintf(pszFormatString, argsList); - - va_end( argsList ); - return hr; -} - -HRESULT -STRA::SafeVsnprintf( - __in __format_string - PCSTR pszFormatString, - va_list argsList -) -/*++ - -Routine Description: - - Writes to a STRA, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pszFormatString - printf format - argsList - printf va_list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - int cchOutput; - int cchNeeded; - - // - // Format the incoming message using vsnprintf() - // so that the overflows are captured - // - cchOutput = _vsnprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pszFormatString, - argsList - ); - - if( cchOutput == -1 ) - { - // - // Couldn't fit this in the original STRU size. - // - cchNeeded = _vscprintf( pszFormatString, argsList ); - if( cchNeeded > 64 * 1024 ) - { - // - // If we're trying to produce a string > 64k chars, then - // there is probably a problem - // - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - - // - // _vscprintf doesn't include terminating null character - // - cchNeeded++; - - hr = Resize( cchNeeded ); - if( FAILED( hr ) ) - { - goto Finished; - } - - cchOutput = _vsnprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pszFormatString, - argsList - ); - if( -1 == cchOutput ) - { - // - // This should never happen, cause we should already have correctly sized memory - // - _ASSERTE( FALSE ); - - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - } - - // - // always null terminate at the last WCHAR - // - QueryStr()[ QuerySizeCCH() - 1 ] = L'\0'; - - // - // we directly touched the buffer - therefore: - // - hr = SyncWithBuffer(); - if( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - if( FAILED( hr ) ) - { - Reset(); - } - - return hr; -} - -bool -FShouldEscapeUtf8( - BYTE ch - ) -{ - if ( ( ch >= 128 ) ) - { - return true; - } - - return false; -} - -bool -FShouldEscapeUrl( - BYTE ch - ) -{ - if ( ( ch >= 128 || - ch <= 32 || - ch == '<' || - ch == '>' || - ch == '%' || - ch == '?' || - ch == '#' ) && - !( ch == '\n' || ch == '\r' ) ) - { - return true; - } - - return false; -} - -HRESULT -STRA::Escape( - VOID -) -/*++ - -Routine Description: - - Escapes a STRA - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - return EscapeInternal( FShouldEscapeUrl ); -} - -HRESULT -STRA::EscapeUtf8( - VOID -) -/*++ - -Routine Description: - - Escapes the high-bit chars in a STRA. LWS, CR, LF & controls are untouched. - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - return EscapeInternal( FShouldEscapeUtf8 ); -} - - -HRESULT -STRA::EscapeInternal( - PFN_F_SHOULD_ESCAPE pfnFShouldEscape -) -/*++ - -Routine Description: - - Escapes a STRA according to the predicate function passed in - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - LPCSTR pch = QueryStr(); - __analysis_assume( pch != NULL ); - int i = 0; - BYTE ch; - HRESULT hr = S_OK; - BOOL fRet = FALSE; - SIZE_T NewSize = 0; - - // Set to true if any % escaping occurs - BOOL fEscapingDone = FALSE; - - // - // If there are any characters that need to be escaped we copy the entire string - // character by character into straTemp, escaping as we go, then at the end - // copy all of straTemp over. Don't modify InlineBuffer directly. - // - CHAR InlineBuffer[512]; - InlineBuffer[0] = '\0'; - STRA straTemp(InlineBuffer, sizeof(InlineBuffer)/sizeof(*InlineBuffer)); - - _ASSERTE( pch ); - - while (ch = pch[i]) - { - // - // Escape characters that are in the non-printable range - // but ignore CR and LF - // - - if ( pfnFShouldEscape( ch ) ) - { - if (FALSE == fEscapingDone) - { - // first character in the string that needed escaping - fEscapingDone = TRUE; - - // guess that the size needs to be larger than - // what we used to have times two - NewSize = QueryCCH() * 2; - if ( NewSize > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - return hr; - } - - hr = straTemp.Resize( static_cast(NewSize) ); - - if (FAILED(hr)) - { - return hr; - } - - // Copy all of the previous buffer into buffTemp, only if it is not the first character: - - if ( i > 0) - { - hr = straTemp.Copy(QueryStr(), - i * sizeof(CHAR)); - if (FAILED(hr)) - { - return hr; - } - } - } - - // resize the temporary (if needed) with the slop of the entire buffer length - // this fixes constant reallocation if the entire string needs to be escaped - NewSize = QueryCCH() + 2 * sizeof(CHAR) + 1 * sizeof(CHAR); - if ( NewSize > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - return hr; - } - - fRet = straTemp.m_Buff.Resize( NewSize ); - if ( !fRet ) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - return hr; - } - - // - // Create the string to append for the current character - // - - CHAR chHex[3]; - chHex[0] = '%'; - - // - // Convert the low then the high character to hex - // - - UINT nLowDigit = (UINT)(ch % 16); - chHex[2] = TODIGIT( nLowDigit ); - - ch /= 16; - - UINT nHighDigit = (UINT)(ch % 16); - - chHex[1] = TODIGIT( nHighDigit ); - - // - // Actually append the converted character to the end of the temporary - // - hr = straTemp.Append(chHex, 3); - if (FAILED(hr)) - { - return hr; - } - } - else - { - // if no escaping done, no need to copy - if (fEscapingDone) - { - // if ANY escaping done, copy current character into new buffer - straTemp.Append(&pch[i], 1); - } - } - - // inspect the next character in the string - i++; - } - - if (fEscapingDone) - { - // the escaped string is now in straTemp - hr = Copy(straTemp); - } - - return hr; - -} // EscapeInternal() - -VOID -STRA::Unescape( - VOID -) -/*++ - -Routine Description: - - Unescapes a STRA - - Supported escape sequences are: - %uxxxx unescapes Unicode character xxxx into system codepage - %xx unescapes character xx - % without following hex digits is ignored - -Arguments: - - None - -Return Value: - - None - ---*/ -{ - CHAR *pScan; - CHAR *pDest; - CHAR *pNextScan; - WCHAR wch; - DWORD dwLen; - BOOL fChanged = FALSE; - - // - // Now take care of any escape characters - // - pDest = pScan = strchr(QueryStr(), '%'); - - while (pScan) - { - if ((pScan[1] == 'u' || pScan[1] == 'U') && - SAFEIsXDigit(pScan[2]) && - SAFEIsXDigit(pScan[3]) && - SAFEIsXDigit(pScan[4]) && - SAFEIsXDigit(pScan[5])) - { - wch = TOHEX(pScan[2]) * 4096 + TOHEX(pScan[3]) * 256 - + TOHEX(pScan[4]) * 16 + TOHEX(pScan[5]); - - dwLen = WideCharToMultiByte(CP_ACP, - WC_NO_BEST_FIT_CHARS, - &wch, - 1, - (LPSTR) pDest, - 6, - NULL, - NULL); - - pDest += dwLen; - pScan += 6; - fChanged = TRUE; - } - else if (SAFEIsXDigit(pScan[1]) && SAFEIsXDigit(pScan[2])) - { - *pDest = TOHEX(pScan[1]) * 16 + TOHEX(pScan[2]); - - pDest ++; - pScan += 3; - fChanged = TRUE; - } - else // Not an escaped char, just a '%' - { - if (fChanged) - { - *pDest = *pScan; - } - - pDest++; - pScan++; - } - - // - // Copy all the information between this and the next escaped char - // - pNextScan = strchr(pScan, '%'); - - if (fChanged) // pScan!=pDest, so we have to copy the char's - { - if (!pNextScan) // That was the last '%' in the string - { - memmove(pDest, - pScan, - QueryCCH() - DIFF(pScan - QueryStr()) + 1); - } - else - { - // There is another '%', move intermediate chars - if ((dwLen = (DWORD)DIFF(pNextScan - pScan)) != 0) - { - memmove(pDest, - pScan, - dwLen); - pDest += dwLen; - } - } - } - - pScan = pNextScan; - } - - if (fChanged) - { - m_cchLen = (DWORD)strlen(QueryStr()); // for safety recalc the length - } - - return; -} - -HRESULT -STRA::CopyWToUTF8Unescaped( - __in LPCWSTR cpchStr -) -{ - return STRA::CopyWToUTF8Unescaped(cpchStr, (DWORD) wcslen(cpchStr)); -} - -HRESULT -STRA::CopyWToUTF8Unescaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch -) -{ - HRESULT hr = S_OK; - int iRet; - - if (cch == 0) - { - Reset(); - return S_OK; - } - - iRet = ConvertUnicodeToUTF8(cpchStr, - &m_Buff, - cch); - if (-1 == iRet) - { - // could not convert - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - m_cchLen = iRet; - - _ASSERTE(strlen(m_Buff.QueryPtr()) == m_cchLen); -Finished: - return hr; -} - -HRESULT -STRA::CopyWToUTF8Escaped( - __in LPCWSTR cpchStr -) -{ - return STRA::CopyWToUTF8Escaped(cpchStr, (DWORD) wcslen(cpchStr)); -} - -HRESULT -STRA::CopyWToUTF8Escaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch -) -{ - HRESULT hr = S_OK; - - hr = CopyWToUTF8Unescaped(cpchStr, cch); - if (FAILED(hr)) - { - goto Finished; - } - - hr = Escape(); - if (FAILED(hr)) - { - goto Finished; - } - - hr = S_OK; -Finished: - return hr; -} - -HRESULT -STRA::AuxAppend( - __in_ecount(cbLen) - LPCSTR pStr, - __in DWORD cbLen, - __in DWORD cbOffset -) -{ - _ASSERTE( NULL != pStr ); - _ASSERTE( cbOffset <= QueryCB() ); - - ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbLen + sizeof( CHAR ); - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cb64NewSize ) - { - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - memcpy( reinterpret_cast(m_Buff.QueryPtr()) + cbOffset, pStr, cbLen ); - - m_cchLen = cbLen + cbOffset; - - *( QueryStr() + m_cchLen ) = '\0'; - - return S_OK; -} - -HRESULT -STRA::AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation, - __in DWORD dwFlags -) -{ - HRESULT hr = S_OK; - DWORD cbAvailable = 0; - DWORD cbRet = 0; - - // - // There are only two expect places to append - // - _ASSERTE( 0 == cbOffset || QueryCB() == cbOffset ); - - if ( cchAppendW == 0 ) - { - goto Finished; - } - - // - // start by assuming 1 char to 1 char will be enough space - // - if( !m_Buff.Resize( cbOffset + cchAppendW + sizeof( CHAR ) ) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - cbAvailable = m_Buff.QuerySize() - cbOffset; - - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - QueryStr() + cbOffset, - cbAvailable, - NULL, - NULL - ); - if( 0 != cbRet ) - { - if(!m_Buff.Resize(cbOffset + cbRet + 1)) - { - hr = E_OUTOFMEMORY; - } - - // - // not zero --> success, so we're done - // - goto Finished; - } - - // - // We only know how to handle ERROR_INSUFFICIENT_BUFFER - // - hr = HRESULT_FROM_WIN32( GetLastError() ); - if( hr != HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ) ) - { - goto Finished; - } - - // - // Reset HResult because we need to get the number of bytes needed - // - hr = S_OK; - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - NULL, - 0, - NULL, - NULL - ); - if( 0 == cbRet ) - { - // - // no idea how we could ever reach here - // - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - - if( !m_Buff.Resize( cbOffset + cbRet + 1) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - cbAvailable = m_Buff.QuerySize() - cbOffset; - - cbRet = WideCharToMultiByte( - CodePage, - dwFlags, - pszAppendW, - cchAppendW, - QueryStr() + cbOffset, - cbAvailable, - NULL, - NULL - ); - if( 0 == cbRet ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - -Finished: - - if( SUCCEEDED( hr ) && 0 != cbRet ) - { - m_cchLen = cbRet + cbOffset; - } - - // - // ensure we're still NULL terminated in the right spot - // (regardless of success or failure) - // - QueryStr()[m_cchLen] = '\0'; - - return hr; -} - -HRESULT -STRA::AuxAppendWTruncate( - __in_ecount(cchAppendW) - __in PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset -) -// -// Cheesey WCHAR --> CHAR conversion -// -{ - HRESULT hr = S_OK; - CHAR* pszBuffer; - - _ASSERTE( NULL != pszAppendW ); - _ASSERTE( 0 == cbOffset || cbOffset == QueryCB() ); - - if( !pszAppendW ) - { - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Finished; - } - - ULONGLONG cbNeeded = (ULONGLONG)cbOffset + cchAppendW + sizeof( CHAR ); - if( cbNeeded > MAXDWORD ) - { - hr = HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - goto Finished; - } - - if( !m_Buff.Resize( static_cast(cbNeeded) ) ) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // - // Copy/convert the UNICODE string over (by making two bytes into one) - // - pszBuffer = QueryStr() + cbOffset; - for( DWORD i = 0; i < cchAppendW; i++ ) - { - pszBuffer[i] = static_cast(pszAppendW[i]); - } - - m_cchLen = cchAppendW + cbOffset; - *( QueryStr() + m_cchLen ) = '\0'; - -Finished: - - return hr; -} - -// static -int -STRA::ConvertUnicodeToCodePage( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __inout BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen, - __in UINT uCodePage -) -{ - _ASSERTE(NULL != pszSrcUnicodeString); - _ASSERTE(NULL != pbufDstAnsiString); - - BOOL bTemp; - int iStrLen = 0; - DWORD dwFlags; - - if (uCodePage == CP_ACP) - { - dwFlags = WC_NO_BEST_FIT_CHARS; - } - else - { - dwFlags = 0; - } - - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - (LPSTR)pbufDstAnsiString->QueryPtr(), - (int)pbufDstAnsiString->QuerySize(), - NULL, - NULL); - if ((iStrLen == 0) && (GetLastError() == ERROR_INSUFFICIENT_BUFFER)) { - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - NULL, - 0, - NULL, - NULL); - if (iStrLen != 0) { - // add one just for the extra NULL - bTemp = pbufDstAnsiString->Resize(iStrLen + 1); - if (!bTemp) - { - iStrLen = 0; - } - else - { - iStrLen = WideCharToMultiByte(uCodePage, - dwFlags, - pszSrcUnicodeString, - dwStringLen, - (LPSTR)pbufDstAnsiString->QueryPtr(), - (int)pbufDstAnsiString->QuerySize(), - NULL, - NULL); - } - - } - } - - if (0 != iStrLen && - pbufDstAnsiString->Resize(iStrLen + 1)) - { - // insert a terminating NULL into buffer for the dwStringLen+1 in the case that the dwStringLen+1 was not a NULL. - ((CHAR*)pbufDstAnsiString->QueryPtr())[iStrLen] = '\0'; - } - else - { - iStrLen = -1; - } - - return iStrLen; -} - -// static -HRESULT -STRA::ConvertUnicodeToMultiByte( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen -) -{ - return ConvertUnicodeToCodePage( pszSrcUnicodeString, - pbufDstAnsiString, - dwStringLen, - CP_ACP ); -} - -// static -HRESULT -STRA::ConvertUnicodeToUTF8( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen -) -{ - return ConvertUnicodeToCodePage( pszSrcUnicodeString, - pbufDstAnsiString, - dwStringLen, - CP_UTF8 ); -} - -/*++ - -Routine Description: - - Removes leading and trailing whitespace - ---*/ - -VOID -STRA::Trim() -{ - PSTR pszString = QueryStr(); - DWORD cchNewLength = m_cchLen; - DWORD cchLeadingWhitespace = 0; - DWORD cchTempLength = 0; - - for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--) - { - if (isspace((unsigned char) pszString[ixString]) != 0) - { - pszString[ixString] = '\0'; - cchNewLength--; - } - else - { - break; - } - } - - cchTempLength = cchNewLength; - for (DWORD ixString = 0; ixString < cchTempLength; ixString++) - { - if (isspace((unsigned char) pszString[ixString]) != 0) - { - cchLeadingWhitespace++; - cchNewLength--; - } - else - { - break; - } - } - - if (cchNewLength == 0) - { - - Reset(); - } - else if (cchLeadingWhitespace > 0) - { - memmove(pszString, pszString + cchLeadingWhitespace, cchNewLength * sizeof(CHAR)); - pszString[cchNewLength] = '\0'; - } - - SyncWithBuffer(); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pStraPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in const STRA * pStraPrefix, - __in bool fIgnoreCase) const -{ - _ASSERTE( pStraPrefix != NULL ); - return StartsWith(pStraPrefix->QueryStr(), fIgnoreCase); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - straPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in const STRA & straPrefix, - __in bool fIgnoreCase) const -{ - return StartsWith(straPrefix.QueryStr(), fIgnoreCase); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pszPrefix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::StartsWith( - __in PCSTR pszPrefix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - BOOL fMatch = FALSE; - size_t cchPrefix = 0; - - if (pszPrefix == NULL) - { - goto Finished; - } - - hr = StringCchLengthA( pszPrefix, - STRSAFE_MAX_CCH, - &cchPrefix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchPrefix <= MAXDWORD ); - - if (cchPrefix > m_cchLen) - { - goto Finished; - } - - if( fIgnoreCase ) - { - fMatch = ( 0 == _strnicmp( QueryStr(), pszPrefix, cchPrefix ) ); - } - else - { - fMatch = ( 0 == strncmp( QueryStr(), pszPrefix, cchPrefix ) ); - } - - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pStraSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in const STRA * pStraSuffix, - __in bool fIgnoreCase) const -{ - _ASSERTE( pStraSuffix != NULL ); - return EndsWith(pStraSuffix->QueryStr(), fIgnoreCase); -} - - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - straSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in const STRA & straSuffix, - __in bool fIgnoreCase) const -{ - return EndsWith(straSuffix.QueryStr(), fIgnoreCase); -} - - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pszSuffix - string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ -BOOL -STRA::EndsWith( - __in PCSTR pszSuffix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - PSTR pszString = QueryStr(); - BOOL fMatch = FALSE; - size_t cchSuffix = 0; - ptrdiff_t ixOffset = 0; - - if (pszSuffix == NULL) - { - goto Finished; - } - - hr = StringCchLengthA( pszSuffix, - STRSAFE_MAX_CCH, - &cchSuffix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchSuffix <= MAXDWORD ); - - if (cchSuffix > m_cchLen) - { - goto Finished; - } - - ixOffset = m_cchLen - cchSuffix; - _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD); - - if( fIgnoreCase ) - { - fMatch = ( 0 == _strnicmp( pszString + ixOffset, pszSuffix, cchSuffix ) ); - } - else - { - fMatch = ( 0 == strncmp( pszString + ixOffset, pszSuffix, cchSuffix ) ); - } - -Finished: - - return fMatch; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - the initial index. - -Return Value: - - The index for the first character occurence in the string. - - -1 if not found. - ---*/ -INT -STRA::IndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const CHAR* pChar = strchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified substring. - -Arguments: - - pszValue - substring to find - dwStartIndex - initial index. - -Return Value: - - The index for the first character occurence in the string. - - -1 if not found. - ---*/ -INT -STRA::IndexOf( - __in PCSTR pszValue, - __in DWORD dwStartIndex - ) const -{ - HRESULT hr = S_OK; - INT nIndex = -1; - SIZE_T cchValue = 0; - - // Validate input parameters - if( dwStartIndex >= QueryCCH() || !pszValue ) - { - goto Finished; - } - - const CHAR* pChar = strstr( QueryStr() + dwStartIndex, pszValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the last occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - initial index. - -Return Value: - - The index for the last character occurence in the string. - - -1 if not found. - ---*/ -INT -STRA::LastIndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const CHAR* pChar = strrchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h deleted file mode 100644 index 39737f4a69..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h +++ /dev/null @@ -1,515 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "buffer.h" -#include "macros.h" -#include - -class STRA -{ - -public: - - STRA( - VOID - ); - - STRA( - __inout_ecount(cchInit) CHAR* pbInit, - __in DWORD cchInit - ); - - BOOL - IsEmpty( - VOID - ) const; - - BOOL - Equals( - __in PCSTR pszRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - BOOL - Equals( - __in const STRA * pstrRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - BOOL - Equals( - __in const STRA & strRhs, - __in BOOL fIgnoreCase = FALSE - ) const; - - static - BOOL - Equals( - __in PCSTR pszLhs, - __in PCSTR pszRhs, - __in bool fIgnoreCase = false - ) - { - // Return FALSE if either or both strings are NULL. - if (!pszLhs || !pszRhs) return FALSE; - - if( fIgnoreCase ) - { - return ( 0 == _stricmp( pszLhs, pszRhs ) ); - } - - return ( 0 == strcmp( pszLhs, pszRhs ) ); - } - - VOID - Trim(); - - BOOL - StartsWith( - __in const STRA * pStraPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - StartsWith( - __in const STRA & straPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - StartsWith( - __in PCSTR pszPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in const STRA * pStraSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in const STRA & straSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in PCSTR pszSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - INT - IndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - IndexOf( - __in PCSTR pszValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - LastIndexOf( - __in CHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - DWORD - QueryCB( - VOID - ) const; - - DWORD - QueryCCH( - VOID - ) const; - - DWORD - QuerySizeCCH( - VOID - ) const; - - DWORD - QuerySize( - VOID - ) const; - - __nullterminated - __bcount(this->m_cchLen) - CHAR * - QueryStr( - VOID - ) const; - - VOID - Reset( - VOID - ); - - HRESULT - Resize( - __in DWORD cchSize - ); - - HRESULT - SyncWithBuffer( - VOID - ); - - HRESULT - Copy( - __in PCSTR pszCopy - ); - - HRESULT - Copy( - __in_ecount(cbLen) - PCSTR pszCopy, - __in SIZE_T cbLen - ); - - HRESULT - Copy( - __in const STRA * pstrRhs - ); - - HRESULT - Copy( - __in const STRA & strRhs - ); - - HRESULT - CopyW( - __in PCWSTR pszCopyW - ); - - HRESULT - CopyW( - __in_ecount(cchLen) - PCWSTR pszCopyW, - __in SIZE_T cchLen, - __in UINT CodePage = CP_UTF8, - __in BOOL fFailIfNoTranslation = FALSE - ) - { - _ASSERTE( cchLen <= MAXDWORD ); - - return AuxAppendW( - pszCopyW, - static_cast(cchLen), - 0, - CodePage, - fFailIfNoTranslation - ); - } - - HRESULT - CopyWTruncate( - __in PCWSTR pszCopyWTruncate - ); - - HRESULT - CopyWTruncate( - __in_ecount(cchLen) - PCWSTR pszCopyWTruncate, - __in SIZE_T cchLen - ); - - HRESULT - Append( - __in PCSTR pszAppend - ); - - HRESULT - Append( - __in_ecount(cbLen) - PCSTR pszAppend, - __in SIZE_T cbLen - ); - - HRESULT - Append( - __in const STRA * pstrRhs - ); - - HRESULT - Append( - __in const STRA & strRhs - ); - - HRESULT - AppendW( - __in PCWSTR pszAppendW - ) - { - HRESULT hr; - size_t cchLen; - hr = StringCchLengthW( pszAppendW, - STRSAFE_MAX_CCH, - &cchLen ); - if ( FAILED( hr ) ) - { - return hr; - } - return AppendW( pszAppendW, cchLen ); - } - - HRESULT - AppendW( - __in_ecount(cchLen) - PCWSTR pszAppendW, - __in SIZE_T cchLen, - __in UINT CodePage = CP_UTF8, - __in BOOL fFailIfNoTranslation = FALSE - ) - { - _ASSERTE( cchLen <= MAXDWORD ); - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendW( - pszAppendW, - static_cast(cchLen), - QueryCB(), - CodePage, - fFailIfNoTranslation - ); - } - - HRESULT - AppendWTruncate( - __in PCWSTR pszAppendWTruncate - ); - - HRESULT - AppendWTruncate( - __in_ecount(cchLen) - PCWSTR pszAppendWTruncate, - __in SIZE_T cchLen - ); - - HRESULT - CopyToBuffer( - __out_bcount(*pcb) CHAR* pszBuffer, - __inout DWORD * pcb - ) const; - - HRESULT - SetLen( - __in DWORD cchLen - ); - - HRESULT - SafeSnprintf( - __in __format_string - PCSTR pszFormatString, - ... - ); - - HRESULT - SafeVsnprintf( - __in __format_string - PCSTR pszFormatString, - va_list argsList - ); - - HRESULT - Escape( - VOID - ); - - HRESULT - EscapeUtf8( - VOID - ); - - VOID - Unescape( - VOID - ); - - HRESULT - CopyWToUTF8Unescaped( - __in LPCWSTR cpchStr - ); - - HRESULT - CopyWToUTF8Unescaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch - ); - - HRESULT - CopyWToUTF8Escaped( - __in LPCWSTR cpchStr - ); - - HRESULT - CopyWToUTF8Escaped( - __in_ecount(cch) - LPCWSTR cpchStr, - __in DWORD cch - ); - -private: - - // - // Avoid C++ errors. This object should never go through a copy - // constructor, unintended cast or assignment. - // - STRA( const STRA &); - STRA & operator = (const STRA &); - - HRESULT - AuxAppend( - __in_ecount(cbLen) - LPCSTR pStr, - __in DWORD cbLen, - __in DWORD cbOffset - ); - - HRESULT - AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation - ) - { - DWORD dwFlags = 0; - - if( CP_ACP == CodePage ) - { - dwFlags = WC_NO_BEST_FIT_CHARS; - } - else if( fFailIfNoTranslation && CodePage == CP_UTF8 ) - { - // - // WC_ERR_INVALID_CHARS is only supported in Longhorn or greater. - // -#if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - dwFlags |= WC_ERR_INVALID_CHARS; -#else - UNREFERENCED_PARAMETER(fFailIfNoTranslation); -#endif - } - - return AuxAppendW( pszAppendW, - cchAppendW, - cbOffset, - CodePage, - fFailIfNoTranslation, - dwFlags ); - } - - HRESULT - AuxAppendW( - __in_ecount(cchAppendW) - PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset, - __in UINT CodePage, - __in BOOL fFailIfNoTranslation, - __in DWORD dwFlags - ); - - HRESULT - AuxAppendWTruncate( - __in_ecount(cchAppendW) - __in PCWSTR pszAppendW, - __in DWORD cchAppendW, - __in DWORD cbOffset - ); - - static - int - ConvertUnicodeToCodePage( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __inout BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen, - __in UINT uCodePage - ); - - static - HRESULT - ConvertUnicodeToMultiByte( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen - ); - - static - HRESULT - ConvertUnicodeToUTF8( - __in_ecount(dwStringLen) - LPCWSTR pszSrcUnicodeString, - __in BUFFER_T * pbufDstAnsiString, - __in DWORD dwStringLen - ); - - typedef bool (* PFN_F_SHOULD_ESCAPE)(BYTE ch); - - HRESULT - EscapeInternal( - PFN_F_SHOULD_ESCAPE pfnFShouldEscape - ); - - // - // Buffer with an inline buffer of 1, - // enough to hold null-terminating character. - // - BUFFER_T m_Buff; - DWORD m_cchLen; -}; - -inline -HRESULT -AppendToString( - ULONGLONG Number, - STRA & String -) -{ - // prefast complains Append requires input - // to be null terminated, so zero initialize - // and pass the size of the buffer minus one - // to _ui64toa_s - CHAR chNumber[32] = {0}; - if (_ui64toa_s(Number, - chNumber, - sizeof(chNumber) - sizeof(CHAR), - 10) != 0) - { - return E_INVALIDARG; - } - return String.Append(chNumber); -} - -template -CHAR* InitHelper(__out CHAR (&psz)[size]) -{ - psz[0] = '\0'; - return psz; -} - -// -// Heap operation reduction macros -// -#define STACK_STRA(name, size) CHAR __ach##name[size];\ - STRA name(InitHelper(__ach##name), sizeof(__ach##name)) - -#define INLINE_STRA(name, size) CHAR __ach##name[size];\ - STRA name; - -#define INLINE_STRA_INIT(name) name(InitHelper(__ach##name), sizeof(__ach##name)) diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp deleted file mode 100644 index 15da79a7fe..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp +++ /dev/null @@ -1,1271 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma warning (disable : 4267) - -#include "precomp.h" - -STRU::STRU( - VOID -) : m_cchLen( 0 ) -{ - *(QueryStr()) = L'\0'; -} - -STRU::STRU( - __inout_ecount(cchInit) WCHAR* pbInit, - __in DWORD cchInit -) : m_Buff( pbInit, cchInit * sizeof( WCHAR ) ), - m_cchLen( 0 ) -/*++ - Description: - - Used by STACK_STRU. Initially populates underlying buffer with pbInit. - - pbInit is not freed. - - Arguments: - - pbInit - initial memory to use - cchInit - count, in characters, of pbInit - - Returns: - - None. - ---*/ -{ - _ASSERTE( cchInit <= (MAXDWORD / sizeof( WCHAR )) ); - _ASSERTE( NULL != pbInit ); - _ASSERTE(cchInit > 0 ); - _ASSERTE(pbInit[0] == L'\0'); -} - -BOOL -STRU::IsEmpty( - VOID -) const -{ - return ( m_cchLen == 0 ); -} - -DWORD -STRU::QueryCB( - VOID -) const -// -// Returns the number of bytes in the string excluding the terminating NULL -// -{ - return m_cchLen * sizeof( WCHAR ); -} - -DWORD -STRU::QueryCCH( - VOID -) const -// -// Returns the number of characters in the string excluding the terminating NULL -// -{ - return m_cchLen; -} - -DWORD -STRU::QuerySizeCCH( - VOID -) const -// -// Returns size of the underlying storage buffer, in characters -// -{ - return m_Buff.QuerySize() / sizeof( WCHAR ); -} - -__nullterminated -__ecount(this->m_cchLen) -WCHAR* -STRU::QueryStr( - VOID -) const -// -// Return the string buffer -// -{ - return m_Buff.QueryPtr(); -} - -VOID -STRU::Reset( - VOID -) -// -// Resets the internal string to be NULL string. Buffer remains cached. -// -{ - _ASSERTE( QueryStr() != NULL ); - *(QueryStr()) = L'\0'; - m_cchLen = 0; -} - -HRESULT -STRU::Resize( - DWORD cchSize -) -{ - SIZE_T cbSize = cchSize * sizeof( WCHAR ); - if ( cbSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - if( !m_Buff.Resize( cbSize ) ) - { - return E_OUTOFMEMORY; - } - - return S_OK; -} - -HRESULT -STRU::SyncWithBuffer( - VOID -) -// -// Recalculate the length of the string, etc. because we've modified -// the buffer directly. -// -{ - HRESULT hr; - size_t size; - hr = StringCchLengthW( QueryStr(), - QuerySizeCCH(), - &size ); - if ( SUCCEEDED( hr ) ) - { - m_cchLen = static_cast(size); - } - return hr; -} - -HRESULT -STRU::Copy( - __in PCWSTR pszCopy -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCchLengthW( pszCopy, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return Copy( pszCopy, - cbStr ); -} - -HRESULT -STRU::Copy( - __in_ecount(cchLen) - PCWSTR pszCopy, - SIZE_T cchLen -) -// -// Copy the contents of another string to this one -// -{ - return AuxAppend( pszCopy, - cchLen * sizeof(WCHAR), - 0); -} - -HRESULT -STRU::Copy( - __in const STRU * pstrRhs -) -{ - _ASSERTE( NULL != pstrRhs ); - return Copy( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRU::Copy( - __in const STRU & str -) -{ - return Copy( str.QueryStr(), str.QueryCCH() ); -} - -HRESULT -STRU::CopyAndExpandEnvironmentStrings( - __in PCWSTR pszSource -) -{ - HRESULT hr = S_OK; - DWORD cchDestReqBuff = 0; - - Reset(); - - cchDestReqBuff = ExpandEnvironmentStringsW( pszSource, - QueryStr(), - QuerySizeCCH() ); - if ( cchDestReqBuff == 0 ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - else if ( cchDestReqBuff > QuerySizeCCH() ) - { - hr = Resize( cchDestReqBuff ); - if ( FAILED( hr ) ) - { - goto Finished; - } - - cchDestReqBuff = ExpandEnvironmentStringsW( pszSource, - QueryStr(), - QuerySizeCCH() ); - - if ( cchDestReqBuff == 0 || cchDestReqBuff > QuerySizeCCH() ) - { - _ASSERTE( FALSE ); - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Finished; - } - } - - hr = SyncWithBuffer(); - if ( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - return hr; - -} - -HRESULT -STRU::CopyA( - __in PCSTR pszCopyA -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCbLengthA( pszCopyA, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return CopyA( pszCopyA, - cbStr ); -} - -HRESULT -STRU::CopyA( - __in_bcount(cchLen) - PCSTR pszCopyA, - SIZE_T cchLen, - UINT CodePage /*= CP_UTF8*/ -) -{ - return AuxAppendA( - pszCopyA, - cchLen, - 0, - CodePage - ); -} - -HRESULT -STRU::Append( - __in PCWSTR pszAppend -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCchLengthW( pszAppend, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return Append( pszAppend, - cbStr ); -} - -HRESULT -STRU::Append( - __in_ecount(cchLen) - PCWSTR pszAppend, - SIZE_T cchLen -) -// -// Append something to the end of the string -// -{ - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppend( pszAppend, - cchLen * sizeof(WCHAR), - QueryCB() ); -} - -HRESULT -STRU::Append( - __in const STRU * pstrRhs -) -{ - _ASSERTE( NULL != pstrRhs ); - return Append( pstrRhs->QueryStr(), pstrRhs->QueryCCH() ); -} - -HRESULT -STRU::Append( - __in const STRU & strRhs -) -{ - return Append( strRhs.QueryStr(), strRhs.QueryCCH() ); -} - -HRESULT -STRU::AppendA( - __in PCSTR pszAppendA -) -{ - HRESULT hr; - size_t cbStr; - - hr = StringCbLengthA( pszAppendA, - STRSAFE_MAX_CCH, - &cbStr ); - if ( FAILED( hr ) ) - { - return hr; - } - - _ASSERTE( cbStr <= MAXDWORD ); - return AppendA( pszAppendA, - cbStr ); -} - -HRESULT -STRU::AppendA( - __in_bcount(cchLen) - PCSTR pszAppendA, - SIZE_T cchLen, - UINT CodePage /*= CP_UTF8*/ -) -{ - if ( cchLen == 0 ) - { - return S_OK; - } - return AuxAppendA( - pszAppendA, - cchLen, - QueryCB(), - CodePage - ); -} - -HRESULT -STRU::CopyToBuffer( - __out_bcount(*pcb) WCHAR* pszBuffer, - PDWORD pcb -) const -// -// Makes a copy of the stored string into the given buffer -// -{ - _ASSERTE( NULL != pszBuffer ); - _ASSERTE( NULL != pcb ); - - HRESULT hr = S_OK; - DWORD cbNeeded = QueryCB() + sizeof( WCHAR ); - - if( *pcb < cbNeeded ) - { - hr = HRESULT_FROM_WIN32( ERROR_INSUFFICIENT_BUFFER ); - goto Finished; - } - - // - // BUGBUG: StringCchCopy? - // - memcpy( pszBuffer, QueryStr(), cbNeeded ); - -Finished: - - *pcb = cbNeeded; - - return hr; -} - -HRESULT -STRU::SetLen( - __in DWORD cchLen -) -/*++ - * -Routine Description: - - Set the length of the string and null terminate, if there - is sufficient buffer already allocated. Will not reallocate. - -Arguments: - - cchLen - The number of characters in the new string. - -Return Value: - - HRESULT - ---*/ -{ - if( cchLen >= QuerySizeCCH() ) - { - return HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - } - - *( QueryStr() + cchLen ) = L'\0'; - m_cchLen = cchLen; - - return S_OK; -} - -HRESULT -STRU::SafeSnwprintf( - __in PCWSTR pwszFormatString, - ... -) -/*++ - -Routine Description: - - Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pwszFormatString - printf format - ... - printf args - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - va_list argsList; - va_start( argsList, pwszFormatString ); - - hr = SafeVsnwprintf(pwszFormatString, argsList); - - va_end( argsList ); - return hr; -} - -HRESULT -STRU::SafeVsnwprintf( - __in PCWSTR pwszFormatString, - va_list argsList -) -/*++ - -Routine Description: - - Writes to a STRU, growing it as needed. It arbitrarily caps growth at 64k chars. - -Arguments: - - pwszFormatString - printf format - argsList - printf va_list - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - int cchOutput; - int cchNeeded; - - // - // Format the incoming message using vsnprintf() - // so that the overflows are captured - // - cchOutput = _vsnwprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pwszFormatString, - argsList - ); - - if( cchOutput == -1 ) - { - // - // Couldn't fit this in the original STRU size. - // - cchNeeded = _vscwprintf( pwszFormatString, argsList ); - if( cchNeeded > 64 * 1024 ) - { - // - // If we're trying to produce a string > 64k chars, then - // there is probably a problem - // - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - - // - // _vscprintf doesn't include terminating null character - // - cchNeeded++; - - hr = Resize( cchNeeded ); - if( FAILED( hr ) ) - { - goto Finished; - } - - cchOutput = _vsnwprintf_s( - QueryStr(), - QuerySizeCCH(), - QuerySizeCCH() - 1, - pwszFormatString, - argsList - ); - if( -1 == cchOutput ) - { - // - // This should never happen, cause we should already have correctly sized memory - // - _ASSERTE( FALSE ); - - hr = HRESULT_FROM_WIN32( ERROR_INVALID_DATA ); - goto Finished; - } - } - - // - // always null terminate at the last WCHAR - // - QueryStr()[ QuerySizeCCH() - 1 ] = L'\0'; - - // - // we directly touched the buffer - therefore: - // - hr = SyncWithBuffer(); - if ( FAILED( hr ) ) - { - goto Finished; - } - -Finished: - - if( FAILED( hr ) ) - { - Reset(); - } - - return hr; -} - -HRESULT -STRU::AuxAppend( - __in_ecount(cNumStrings) - PCWSTR const rgpszStrings[], - SIZE_T cNumStrings -) -/*++ - -Routine Description: - - Appends an array of strings of length cNumStrings - -Arguments: - - rgStrings - The array of strings to be appened - cNumStrings - The count of String - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - size_t cbStringsTotal = sizeof( WCHAR ); // Account for null-terminator - - // - // Compute total size of the string. - // Resize internal buffer - // Copy each array element one by one to backing buffer - // Update backing buffer string length - // - for ( SIZE_T i = 0; i < cNumStrings; i++ ) - { - _ASSERTE( rgpszStrings[ i ] != NULL ); - if ( NULL == rgpszStrings[ i ] ) - { - return E_INVALIDARG; - } - - size_t cbString = 0; - - hr = StringCbLengthW( rgpszStrings[ i ], - STRSAFE_MAX_CCH * sizeof( WCHAR ), - &cbString ); - if ( FAILED( hr ) ) - { - return hr; - } - - cbStringsTotal += cbString; - - if ( cbStringsTotal > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - } - - size_t cbBufSizeRequired = QueryCB() + cbStringsTotal; - if ( cbBufSizeRequired > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cbBufSizeRequired ) - { - if( !m_Buff.Resize( cbBufSizeRequired ) ) - { - return E_OUTOFMEMORY; - } - } - - STRSAFE_LPWSTR pszStringEnd = QueryStr() + QueryCCH(); - size_t cchRemaining = QuerySizeCCH() - QueryCCH(); - for ( SIZE_T i = 0; i < cNumStrings; i++ ) - { - hr = StringCchCopyExW( pszStringEnd, // pszDest - cchRemaining, // cchDest - rgpszStrings[ i ], // pszSrc - &pszStringEnd, // ppszDestEnd - &cchRemaining, // pcchRemaining - 0 ); // dwFlags - if ( FAILED( hr ) ) - { - _ASSERTE( FALSE ); - HRESULT hr2 = SyncWithBuffer(); - if ( FAILED( hr2 ) ) - { - return hr2; - } - return hr; - } - } - - m_cchLen = static_cast< DWORD >( cbBufSizeRequired ) / sizeof( WCHAR ) - 1; - - return S_OK; -} - -HRESULT -STRU::AuxAppend( - __in_bcount(cbStr) - const WCHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset -) -/*++ - -Routine Description: - - Appends to the string starting at the (byte) offset cbOffset. - -Arguments: - - pStr - A unicode string to be appended - cbStr - Length, in bytes, of pStr - cbOffset - Offset, in bytes, at which to begin the append - -Return Value: - - HRESULT - ---*/ -{ - _ASSERTE( NULL != pStr ); - _ASSERTE( 0 == cbStr % sizeof( WCHAR ) ); - _ASSERTE( cbOffset <= QueryCB() ); - _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) ); - - ULONGLONG cb64NewSize = (ULONGLONG)cbOffset + cbStr + sizeof( WCHAR ); - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( m_Buff.QuerySize() < cb64NewSize ) - { - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - memcpy( reinterpret_cast(m_Buff.QueryPtr()) + cbOffset, pStr, cbStr ); - - m_cchLen = (static_cast(cbStr) + cbOffset) / sizeof(WCHAR); - - *( QueryStr() + m_cchLen ) = L'\0'; - - return S_OK; -} - -HRESULT -STRU::AuxAppendA( - __in_bcount(cbStr) - const CHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset, - UINT CodePage -) -/*++ - -Routine Description: - - Convert and append an ANSI string to the string starting at - the (byte) offset cbOffset - -Arguments: - - pStr - An ANSI string to be appended - cbStr - Length, in bytes, of pStr - cbOffset - Offset, in bytes, at which to begin the append - CodePage - code page to use for conversion - -Return Value: - - HRESULT - ---*/ -{ - WCHAR* pszBuffer; - DWORD cchBuffer; - DWORD cchCharsCopied = 0; - - _ASSERTE( NULL != pStr ); - _ASSERTE( cbOffset <= QueryCB() ); - _ASSERTE( 0 == cbOffset % sizeof( WCHAR ) ); - - if ( NULL == pStr ) - { - return E_INVALIDARG; - } - - if( 0 == cbStr ) - { - return S_OK; - } - - // - // Only resize when we have to. When we do resize, we tack on - // some extra space to avoid extra reallocations. - // - if( m_Buff.QuerySize() < (ULONGLONG)cbOffset + (cbStr * sizeof( WCHAR )) + sizeof(WCHAR) ) - { - ULONGLONG cb64NewSize = (ULONGLONG)( cbOffset + cbStr * sizeof(WCHAR) + sizeof( WCHAR ) ); - - // - // Check for the arithmetic overflow - // - if( cb64NewSize > MAXDWORD ) - { - return HRESULT_FROM_WIN32( ERROR_ARITHMETIC_OVERFLOW ); - } - - if( !m_Buff.Resize( static_cast(cb64NewSize) ) ) - { - return E_OUTOFMEMORY; - } - } - - pszBuffer = reinterpret_cast(reinterpret_cast(m_Buff.QueryPtr()) + cbOffset); - cchBuffer = ( m_Buff.QuerySize() - cbOffset - sizeof( WCHAR ) ) / sizeof( WCHAR ); - - cchCharsCopied = MultiByteToWideChar( - CodePage, - MB_ERR_INVALID_CHARS, - pStr, - static_cast(cbStr), - pszBuffer, - cchBuffer - ); - if( 0 == cchCharsCopied ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - // - // set the new length - // - m_cchLen = cchCharsCopied + cbOffset/sizeof(WCHAR); - - // - // Must be less than, cause still need to add NULL - // - _ASSERTE( m_cchLen < QuerySizeCCH() ); - - // - // append NULL character - // - *(QueryStr() + m_cchLen) = L'\0'; - - return S_OK; -} - - -/*++ - -Routine Description: - - Removes leading and trailing whitespace - ---*/ - -VOID -STRU::Trim() -{ - PWSTR pwszString = QueryStr(); - DWORD cchNewLength = m_cchLen; - DWORD cchLeadingWhitespace = 0; - DWORD cchTempLength = 0; - - for (LONG ixString = m_cchLen - 1; ixString >= 0; ixString--) - { - if (iswspace(pwszString[ixString]) != 0) - { - pwszString[ixString] = L'\0'; - cchNewLength--; - } - else - { - break; - } - } - - cchTempLength = cchNewLength; - for (DWORD ixString = 0; ixString < cchTempLength; ixString++) - { - if (iswspace(pwszString[ixString]) != 0) - { - cchLeadingWhitespace++; - cchNewLength--; - } - else - { - break; - } - } - - if (cchNewLength == 0) - { - - Reset(); - } - else if (cchLeadingWhitespace > 0) - { - memmove(pwszString, pwszString + cchLeadingWhitespace, cchNewLength * sizeof(WCHAR)); - pwszString[cchNewLength] = L'\0'; - } - - SyncWithBuffer(); -} - -/*++ - -Routine Description: - - Compares the string to the provided prefix to check for equality - -Arguments: - - pwszPrefix - wide char string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if prefix string matches with internal string, FALSE otherwise - ---*/ - -BOOL -STRU::StartsWith( - __in PCWSTR pwszPrefix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - BOOL fMatch = FALSE; - size_t cchPrefix = 0; - - if (pwszPrefix == NULL) - { - goto Finished; - } - - hr = StringCchLengthW( pwszPrefix, - STRSAFE_MAX_CCH, - &cchPrefix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchPrefix <= MAXDWORD ); - - if (cchPrefix > m_cchLen) - { - goto Finished; - } - - #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - fMatch = ( CSTR_EQUAL == CompareStringOrdinal( QueryStr(), - cchPrefix, - pwszPrefix, - cchPrefix, - fIgnoreCase ) ); - #else - - if( fIgnoreCase ) - { - fMatch = ( 0 == _wcsnicmp( QueryStr(), pwszPrefix, cchPrefix ) ); - } - else - { - fMatch = ( 0 == wcsncmp( QueryStr(), pwszPrefix, cchPrefix ) ); - } - - #endif - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Compares the string to the provided suffix to check for equality - -Arguments: - - pwszSuffix - wide char string to compare with - fIgnoreCase - indicates whether the string comparison should be case-sensitive - -Return Value: - - TRUE if suffix string matches with internal string, FALSE otherwise - ---*/ - - -BOOL -STRU::EndsWith( - __in PCWSTR pwszSuffix, - __in bool fIgnoreCase) const -{ - HRESULT hr = S_OK; - PWSTR pwszString = QueryStr(); - BOOL fMatch = FALSE; - size_t cchSuffix = 0; - ptrdiff_t ixOffset = 0; - - if (pwszSuffix == NULL) - { - goto Finished; - } - - hr = StringCchLengthW( pwszSuffix, - STRSAFE_MAX_CCH, - &cchSuffix ); - if (FAILED(hr)) - { - goto Finished; - } - - _ASSERTE( cchSuffix <= MAXDWORD ); - - if (cchSuffix > m_cchLen) - { - goto Finished; - } - - ixOffset = m_cchLen - cchSuffix; - _ASSERTE(ixOffset >= 0 && ixOffset <= MAXDWORD); - - #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - fMatch = ( CSTR_EQUAL == CompareStringOrdinal( pwszString + ixOffset, - cchSuffix, - pwszSuffix, - cchSuffix, - fIgnoreCase ) ); - #else - - if( fIgnoreCase ) - { - fMatch = ( 0 == _wcsnicmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) ); - } - else - { - fMatch = ( 0 == wcsncmp( pwszString + ixOffset, pwszSuffix, cchSuffix ) ); - } - - #endif - -Finished: - - return fMatch; -} - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - the initial index. - -Return Value: - - The index for the first character occurence in the string. - - -1 if not found. - ---*/ -INT -STRU::IndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const WCHAR* pwChar = wcschr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the first occurrence of the specified substring. - -Arguments: - - pwszValue - substring to find - dwStartIndex - initial index. - -Return Value: - - The index for the first character occurence in the string. - - -1 if not found. - ---*/ -INT -STRU::IndexOf( - __in PCWSTR pwszValue, - __in DWORD dwStartIndex - ) const -{ - HRESULT hr = S_OK; - INT nIndex = -1; - SIZE_T cchValue = 0; - - // Validate input parameters - if( dwStartIndex >= QueryCCH() || !pwszValue ) - { - goto Finished; - } - - const WCHAR* pwChar = wcsstr( QueryStr() + dwStartIndex, pwszValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - - -/*++ - -Routine Description: - - Searches the string for the last occurrence of the specified character. - -Arguments: - - charValue - character to find - dwStartIndex - initial index. - -Return Value: - - The index for the last character occurence in the string. - - -1 if not found. - ---*/ -INT -STRU::LastIndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex - ) const -{ - INT nIndex = -1; - - // Make sure that there are no buffer overruns. - if( dwStartIndex >= QueryCCH() ) - { - goto Finished; - } - - const WCHAR* pwChar = wcsrchr( QueryStr() + dwStartIndex, charValue ); - - // Determine the index if found - if( pwChar ) - { - // nIndex will be set to -1 on failure. - (VOID)SizeTToInt( pwChar - QueryStr(), &nIndex ); - } - -Finished: - - return nIndex; -} - -//static -HRESULT -STRU::ExpandEnvironmentVariables( - __in PCWSTR pszString, - __out STRU * pstrExpandedString - ) -/*++ - -Routine Description: - - Expand the environment variables in a string - -Arguments: - - pszString - String with environment variables to expand - pstrExpandedString - Receives expanded string on success - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr = S_OK; - DWORD cchNewSize = 0; - - if ( pszString == NULL || - pstrExpandedString == NULL ) - { - DBG_ASSERT( FALSE ); - hr = HRESULT_FROM_WIN32( ERROR_INVALID_PARAMETER ); - goto Exit; - } - - cchNewSize = ExpandEnvironmentStrings( pszString, - pstrExpandedString->QueryStr(), - pstrExpandedString->QuerySizeCCH() ); - if ( cchNewSize == 0 ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Exit; - } - - if ( cchNewSize > pstrExpandedString->QuerySizeCCH() ) - { - hr = pstrExpandedString->Resize( - ( cchNewSize + 1 ) * sizeof( WCHAR ) - ); - if ( FAILED( hr ) ) - { - goto Exit; - } - - cchNewSize = ExpandEnvironmentStrings( - pszString, - pstrExpandedString->QueryStr(), - pstrExpandedString->QuerySizeCCH() - ); - - if ( cchNewSize == 0 || - cchNewSize > pstrExpandedString->QuerySizeCCH() ) - { - hr = HRESULT_FROM_WIN32( GetLastError() ); - goto Exit; - } - } - - pstrExpandedString->SyncWithBuffer(); - - hr = S_OK; - -Exit: - - return hr; -} - -#pragma warning(default:4267) diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h deleted file mode 100644 index 6f27c5421d..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h +++ /dev/null @@ -1,427 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "buffer.h" -#include - -class STRU -{ - -public: - - STRU( - VOID - ); - - STRU( - __inout_ecount(cchInit) WCHAR* pbInit, - __in DWORD cchInit - ); - - BOOL - IsEmpty( - VOID - ) const; - - BOOL - Equals( - __in const STRU * pstrRhs, - __in BOOL fIgnoreCase = FALSE - ) const - { - _ASSERTE( pstrRhs != NULL ); - return Equals( pstrRhs->QueryStr(), fIgnoreCase ); - } - - BOOL - Equals( - __in const STRU & strRhs, - __in BOOL fIgnoreCase = FALSE - ) const - { - return Equals( strRhs.QueryStr(), fIgnoreCase ); - } - - BOOL - Equals( - __in PCWSTR pszRhs, - __in BOOL fIgnoreCase = FALSE - ) const - { - _ASSERTE( NULL != pszRhs ); - if ( NULL == pszRhs ) - { - return FALSE; - } - - #if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - return ( CSTR_EQUAL == CompareStringOrdinal( QueryStr(), - QueryCCH(), - pszRhs, - -1, - fIgnoreCase ) ); - #else - - if( fIgnoreCase ) - { - return ( 0 == _wcsicmp( QueryStr(), pszRhs ) ); - } - return ( 0 == wcscmp( QueryStr(), pszRhs ) ); - - #endif - } - - - static - BOOL - Equals( - __in PCWSTR pwszLhs, - __in PCWSTR pwszRhs, - __in bool fIgnoreCase = false - ) - { - // Return FALSE if either or both strings are NULL. - if (!pwszLhs || !pwszRhs) return FALSE; - - // - // This method performs a ordinal string comparison when OS is Vista or - // greater and a culture sensitive comparison if not (XP). This is - // consistent with the existing Equals implementation (see above). - // -#if defined( NTDDI_VERSION ) && NTDDI_VERSION >= NTDDI_LONGHORN - - return ( CSTR_EQUAL == CompareStringOrdinal( pwszLhs, - -1, - pwszRhs, - -1, - fIgnoreCase ) ); -#else - - if( fIgnoreCase ) - { - return ( 0 == _wcsicmp( pwszLhs, pwszRhs ) ); - } - else - { - return ( 0 == wcscmp( pwszLhs, pwszRhs ) ); - } - -#endif - } - - VOID - Trim(); - - BOOL - StartsWith( - __in const STRU * pStruPrefix, - __in bool fIgnoreCase = FALSE - ) const - { - _ASSERTE( pStruPrefix != NULL ); - return StartsWith( pStruPrefix->QueryStr(), fIgnoreCase ); - } - - BOOL - StartsWith( - __in const STRU & struPrefix, - __in bool fIgnoreCase = FALSE - ) const - { - return StartsWith( struPrefix.QueryStr(), fIgnoreCase ); - } - - BOOL - StartsWith( - __in PCWSTR pwszPrefix, - __in bool fIgnoreCase = FALSE - ) const; - - BOOL - EndsWith( - __in const STRU * pStruSuffix, - __in bool fIgnoreCase = FALSE - ) const - { - _ASSERTE( pStruSuffix != NULL ); - return EndsWith( pStruSuffix->QueryStr(), fIgnoreCase ); - } - - BOOL - EndsWith( - __in const STRU & struSuffix, - __in bool fIgnoreCase = FALSE - ) const - { - return EndsWith( struSuffix.QueryStr(), fIgnoreCase ); - } - - BOOL - EndsWith( - __in PCWSTR pwszSuffix, - __in bool fIgnoreCase = FALSE - ) const; - - INT - IndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - IndexOf( - __in PCWSTR pwszValue, - __in DWORD dwStartIndex = 0 - ) const; - - INT - LastIndexOf( - __in WCHAR charValue, - __in DWORD dwStartIndex = 0 - ) const; - - DWORD - QueryCB( - VOID - ) const; - - DWORD - QueryCCH( - VOID - ) const; - - DWORD - QuerySizeCCH( - VOID - ) const; - - __nullterminated - __ecount(this->m_cchLen) - WCHAR* - QueryStr( - VOID - ) const; - - VOID - Reset( - VOID - ); - - HRESULT - Resize( - DWORD cchSize - ); - - HRESULT - SyncWithBuffer( - VOID - ); - - template - HRESULT - Copy( - __in PCWSTR const (&rgpszStrings)[size] - ) - // - // Copies an array of strings declared as stack array. For example: - // - // LPCWSTR rgExample[] { L"one", L"two" }; - // hr = str.Copy( rgExample ); - // - { - Reset(); - - return AuxAppend( rgpszStrings, _countof( rgpszStrings ) ); - } - - HRESULT - Copy( - __in PCWSTR pszCopy - ); - - HRESULT - Copy( - __in_ecount(cchLen) - PCWSTR pszCopy, - SIZE_T cchLen - ); - - HRESULT - Copy( - __in const STRU * pstrRhs - ); - - HRESULT - Copy( - __in const STRU & str - ); - - HRESULT - CopyAndExpandEnvironmentStrings( - __in PCWSTR pszSource - ); - - HRESULT - CopyA( - __in PCSTR pszCopyA - ); - - HRESULT - CopyA( - __in_bcount(cchLen) - PCSTR pszCopyA, - SIZE_T cchLen, - UINT CodePage = CP_UTF8 - ); - - template - HRESULT - Append( - __in PCWSTR const (&rgpszStrings)[size] - ) - // - // Appends an array of strings declared as stack array. For example: - // - // LPCWSTR rgExample[] { L"one", L"two" }; - // hr = str.Append( rgExample ); - // - { - return AuxAppend( rgpszStrings, _countof( rgpszStrings ) ); - } - - HRESULT - Append( - __in PCWSTR pszAppend - ); - - HRESULT - Append( - __in_ecount(cchLen) - PCWSTR pszAppend, - SIZE_T cchLen - ); - - HRESULT - Append( - __in const STRU * pstrRhs - ); - - HRESULT - Append( - __in const STRU & strRhs - ); - - HRESULT - AppendA( - __in PCSTR pszAppendA - ); - - HRESULT - AppendA( - __in_bcount(cchLen) - PCSTR pszAppendA, - SIZE_T cchLen, - UINT CodePage = CP_UTF8 - ); - - HRESULT - CopyToBuffer( - __out_bcount(*pcb) WCHAR* pszBuffer, - PDWORD pcb - ) const; - - HRESULT - SetLen( - __in DWORD cchLen - ); - - HRESULT - SafeSnwprintf( - __in PCWSTR pwszFormatString, - ... - ); - - HRESULT - SafeVsnwprintf( - __in PCWSTR pwszFormatString, - va_list argsList - ); - - static - HRESULT ExpandEnvironmentVariables( - __in PCWSTR pszString, - __out STRU * pstrExpandedString - ); - -private: - - // - // Avoid C++ errors. This object should never go through a copy - // constructor, unintended cast or assignment. - // - STRU( const STRU & ); - STRU & operator = ( const STRU & ); - - HRESULT - AuxAppend( - __in_ecount(cNumStrings) - PCWSTR const rgpszStrings[], - SIZE_T cNumStrings - ); - - HRESULT - AuxAppend( - __in_bcount(cbStr) - const WCHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset - ); - - HRESULT - AuxAppendA( - __in_bcount(cbStr) - const CHAR* pStr, - SIZE_T cbStr, - DWORD cbOffset, - UINT CodePage - ); - - // - // Buffer with an inline buffer of 1, - // enough to hold null-terminating character. - // - BUFFER_T m_Buff; - DWORD m_cchLen; -}; - -// -// Helps to initialize an external buffer before -// constructing the STRU object. -// -template -WCHAR* InitHelper(__out WCHAR (&psz)[size]) -{ - psz[0] = L'\0'; - return psz; -} - -// -// Heap operation reduction macros -// -#define STACK_STRU(name, size) WCHAR __ach##name[size];\ - STRU name(InitHelper(__ach##name), sizeof(__ach##name)/sizeof(*__ach##name)) - -#define INLINE_STRU(name, size) WCHAR __ach##name[size];\ - STRU name; - -#define INLINE_STRU_INIT(name) name(InitHelper(__ach##name), sizeof(__ach##name)/sizeof(*__ach##name)) - - -HRESULT -MakePathCanonicalizationProof( - IN PCWSTR pszName, - OUT STRU * pstrPath -); diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c deleted file mode 100644 index f7b2da5e43..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c +++ /dev/null @@ -1,235 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include -#include "pudebug.h" -#include "tracelog.h" -#include - - -#define ALLOC_MEM(cb) (PVOID)LocalAlloc( LPTR, (cb) ) -#define FREE_MEM(ptr) (VOID)LocalFree( (HLOCAL)(ptr) ) - - - -PTRACE_LOG -CreateTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader, - IN LONG EntrySize - ) -/*++ - -Routine Description: - - Creates a new (empty) trace log buffer. - -Arguments: - - LogSize - The number of entries in the log. - - ExtraBytesInHeader - The number of extra bytes to include in the - log header. This is useful for adding application-specific - data to the log. - - EntrySize - The size (in bytes) of each entry. - -Return Value: - - PTRACE_LOG - Pointer to the newly created log if successful, - NULL otherwise. - ---*/ -{ - - ULONG ulTotalSize = 0; - ULONG ulLogSize = 0; - ULONG ulEntrySize = 0; - ULONG ulTmpResult = 0; - ULONG ulExtraBytesInHeader = 0; - PTRACE_LOG log = NULL; - HRESULT hr = S_OK; - - // - // Sanity check the parameters. - // - - //DBG_ASSERT( LogSize > 0 ); - //DBG_ASSERT( EntrySize > 0 ); - //DBG_ASSERT( ExtraBytesInHeader >= 0 ); - //DBG_ASSERT( ( EntrySize & 3 ) == 0 ); - - // - // converting to unsigned long. Since all these values are positive - // so its safe to cast them to their unsigned equivalent directly. - // - ulLogSize = (ULONG) LogSize; - ulEntrySize = (ULONG) EntrySize; - ulExtraBytesInHeader = (ULONG) ExtraBytesInHeader; - - // - // Check if the multiplication operation will overflow a LONG - // ulTotalSize = LogSize * EntrySize; - // - hr = ULongMult( ulLogSize, ulEntrySize, &ulTotalSize ); - if ( FAILED(hr) ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return NULL; - } - - // - // check for overflow in addition operation. - // ulTmpResult = sizeof(TRACE_LOG) + ulExtraBytesInHeader - // - hr = ULongAdd( (ULONG) sizeof(TRACE_LOG), ulExtraBytesInHeader, &ulTmpResult ); - if ( FAILED(hr) ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return NULL; - } - - // - // check for overflow in addition operation. - // ulTotalSize = ulTotalSize + ulTmpResult; - // - hr = ULongAdd( ulTmpResult, ulTotalSize, &ulTotalSize ); - if ( FAILED(hr) ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return NULL; - } - - if ( ulTotalSize > (ULONG) 0x7FFFFFFF ) - { - SetLastError( ERROR_ARITHMETIC_OVERFLOW ); - return NULL; - } - - // - // Allocate & initialize the log structure. - // - - log = (PTRACE_LOG)ALLOC_MEM( ulTotalSize ); - - // - // Initialize it. - // - - if( log != NULL ) { - - RtlZeroMemory( log, ulTotalSize ); - - log->Signature = TRACE_LOG_SIGNATURE; - log->LogSize = LogSize; - log->NextEntry = -1; - log->EntrySize = EntrySize; - log->LogBuffer = (PUCHAR)( log + 1 ) + ExtraBytesInHeader; - } - - return log; - -} // CreateTraceLog - - -VOID -DestroyTraceLog( - IN PTRACE_LOG Log - ) -/*++ - -Routine Description: - - Destroys a trace log buffer created with CreateTraceLog(). - -Arguments: - - Log - The trace log buffer to destroy. - -Return Value: - - None. - ---*/ -{ - if ( Log != NULL ) { - //DBG_ASSERT( Log->Signature == TRACE_LOG_SIGNATURE ); - - Log->Signature = TRACE_LOG_SIGNATURE_X; - FREE_MEM( Log ); - } - -} // DestroyTraceLog - - -LONG -WriteTraceLog( - IN PTRACE_LOG Log, - IN PVOID Entry - ) -/*++ - -Routine Description: - - Writes a new entry to the specified trace log. - -Arguments: - - Log - The log to write to. - - Entry - Pointer to the data to write. This buffer is assumed to be - Log->EntrySize bytes long. - -Return Value: - - Index of entry in log. This is useful for correlating the output - of !inetdbg.ref to a particular point in the output debug stream - ---*/ -{ - - PUCHAR target; - ULONG index; - - //DBG_ASSERT( Log != NULL ); - //DBG_ASSERT( Log->Signature == TRACE_LOG_SIGNATURE ); - //DBG_ASSERT( Entry != NULL ); - - // - // Find the next slot, copy the entry to the slot. - // - - index = ( (ULONG) InterlockedIncrement( &Log->NextEntry ) ) % (ULONG) Log->LogSize; - - //DBG_ASSERT( index < (ULONG) Log->LogSize ); - - target = Log->LogBuffer + ( index * Log->EntrySize ); - - RtlCopyMemory( - target, - Entry, - Log->EntrySize - ); - - return index; -} // WriteTraceLog - - -VOID -ResetTraceLog( - IN PTRACE_LOG Log - ) -{ - - //DBG_ASSERT( Log != NULL ); - //DBG_ASSERT( Log->Signature == TRACE_LOG_SIGNATURE ); - - RtlZeroMemory( - ( Log + 1 ), - Log->LogSize * Log->EntrySize - ); - - Log->NextEntry = -1; - -} // ResetTraceLog - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h deleted file mode 100644 index ed34bcffc9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h +++ /dev/null @@ -1,105 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef _TRACELOG_H_ -#define _TRACELOG_H_ - - -#if defined(__cplusplus) -extern "C" { -#endif // __cplusplus - - -typedef struct _TRACE_LOG { - - // - // Signature. - // - - LONG Signature; - - // - // The total number of entries available in the log. - // - - LONG LogSize; - - // - // The index of the next entry to use. - // - - LONG NextEntry; - - // - // The byte size of each entry. - // - - LONG EntrySize; - - // - // Pointer to the start of the circular buffer. - // - - PUCHAR LogBuffer; - - // - // The extra header bytes and actual log entries go here. - // - // BYTE ExtraHeaderBytes[ExtraBytesInHeader]; - // BYTE Entries[LogSize][EntrySize]; - // - -} TRACE_LOG, *PTRACE_LOG; - - -// -// Log header signature. -// - -#define TRACE_LOG_SIGNATURE ((DWORD)'gOlT') -#define TRACE_LOG_SIGNATURE_X ((DWORD)'golX') - - -// -// This macro maps a TRACE_LOG pointer to a pointer to the 'extra' -// data associated with the log. -// - -#define TRACE_LOG_TO_EXTRA_DATA(log) (PVOID)( (log) + 1 ) - - -// -// Manipulators. -// - -PTRACE_LOG -CreateTraceLog( - IN LONG LogSize, - IN LONG ExtraBytesInHeader, - IN LONG EntrySize - ); - -VOID -DestroyTraceLog( - IN PTRACE_LOG Log - ); - -LONG -WriteTraceLog( - IN PTRACE_LOG Log, - IN PVOID Entry - ); - -VOID -ResetTraceLog( - IN PTRACE_LOG Log - ); - - -#if defined(__cplusplus) -} // extern "C" -#endif // __cplusplus - - -#endif // _TRACELOG_H_ - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h deleted file mode 100644 index baa50726ce..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h +++ /dev/null @@ -1,850 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include -#include "rwlock.h" -#include "prime.h" - -template -class TREE_HASH_NODE -{ - template - friend class TREE_HASH_TABLE; - - private: - // Next node in the hash table look-aside - TREE_HASH_NODE<_Record> *_pNext; - - // links in the tree structure - TREE_HASH_NODE * _pParentNode; - TREE_HASH_NODE * _pFirstChild; - TREE_HASH_NODE * _pNextSibling; - - // actual record - _Record * _pRecord; - - // hash value - PCWSTR _pszPath; - DWORD _dwHash; -}; - -template -class TREE_HASH_TABLE -{ -protected: - typedef BOOL - (PFN_DELETE_IF)( - _Record * pRecord, - PVOID pvContext - ); - - typedef VOID - (PFN_APPLY)( - _Record * pRecord, - PVOID pvContext - ); - -public: - TREE_HASH_TABLE( - BOOL fCaseSensitive - ) : _ppBuckets( NULL ), - _nBuckets( 0 ), - _nItems( 0 ), - _fCaseSensitive( fCaseSensitive ) - { - } - - virtual - ~TREE_HASH_TABLE(); - - virtual - VOID - ReferenceRecord( - _Record * pRecord - ) = 0; - - virtual - VOID - DereferenceRecord( - _Record * pRecord - ) = 0; - - virtual - PCWSTR - GetKey( - _Record * pRecord - ) = 0; - - DWORD - Count() - { - return _nItems; - } - - virtual - VOID - Clear(); - - HRESULT - Initialize( - DWORD nBucketSize - ); - - DWORD - CalcHash( - PCWSTR pszKey - ) - { - return _fCaseSensitive ? HashString(pszKey) : HashStringNoCase(pszKey); - } - - virtual - VOID - FindKey( - PCWSTR pszKey, - _Record ** ppRecord - ); - - virtual - HRESULT - InsertRecord( - _Record * pRecord - ); - - virtual - VOID - DeleteKey( - PCWSTR pszKey - ); - - virtual - VOID - DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext - ); - - VOID - Apply( - PFN_APPLY pfnApply, - PVOID pvContext - ); - -private: - - BOOL - FindNodeInternal( - PCWSTR pszKey, - DWORD dwHash, - TREE_HASH_NODE<_Record> ** ppNode, - TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer = NULL - ); - - HRESULT - AddNodeInternal( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode - ); - - HRESULT - AllocateNode( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode - ); - - VOID - DeleteNode( - TREE_HASH_NODE<_Record> * pNode - ) - { - if (pNode->_pRecord != NULL) - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - - HeapFree(GetProcessHeap(), - 0, - pNode); - } - - VOID - DeleteNodeInternal( - TREE_HASH_NODE<_Record> ** ppPreviousNodeNextPointer, - TREE_HASH_NODE<_Record> * pNode - ); - - VOID - RehashTableIfNeeded( - VOID - ); - - TREE_HASH_NODE<_Record> ** _ppBuckets; - DWORD _nBuckets; - DWORD _nItems; - BOOL _fCaseSensitive; - CWSDRWLock _tableLock; -}; - -template -HRESULT -TREE_HASH_TABLE<_Record>::AllocateNode( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode -) -{ - // - // Allocate enough extra space for pszPath - // - DWORD cchPath = (DWORD) wcslen(pszPath); - if (cchPath >= ((0xffffffff - sizeof(TREE_HASH_NODE<_Record>))/sizeof(WCHAR) - 1)) - { - return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - TREE_HASH_NODE<_Record> *pNode = (TREE_HASH_NODE<_Record> *)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - sizeof(TREE_HASH_NODE<_Record>) + (cchPath+1)*sizeof(WCHAR)); - if (pNode == NULL) - { - return HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - } - - memcpy(pNode+1, pszPath, (cchPath+1)*sizeof(WCHAR)); - pNode->_pszPath = (PCWSTR)(pNode+1); - pNode->_dwHash = dwHash; - pNode->_pNext = pNode->_pNextSibling = pNode->_pFirstChild = NULL; - pNode->_pParentNode = pParentNode; - pNode->_pRecord = pRecord; - - *ppNewNode = pNode; - return S_OK; -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::Initialize( - DWORD nBuckets -) -{ - HRESULT hr = S_OK; - - if ( nBuckets == 0 ) - { - hr = E_INVALIDARG; - goto Failed; - } - - hr = _tableLock.Init(); - if ( FAILED( hr ) ) - { - goto Failed; - } - - if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *)) - { - hr = E_INVALIDARG; - goto Failed; - } - - _ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(TREE_HASH_NODE<_Record> *)); - if (_ppBuckets == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - goto Failed; - } - _nBuckets = nBuckets; - - return S_OK; - -Failed: - - if (_ppBuckets) - { - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - } - - return hr; -} - - -template -TREE_HASH_TABLE<_Record>::~TREE_HASH_TABLE() -{ - if (_ppBuckets == NULL) - { - return; - } - - _ASSERTE(_nItems == 0); - - HeapFree(GetProcessHeap(), - 0, - _ppBuckets); - _ppBuckets = NULL; - _nBuckets = 0; -} - -template -VOID -TREE_HASH_TABLE<_Record>::Clear() -{ - TREE_HASH_NODE<_Record> *pCurrent; - TREE_HASH_NODE<_Record> *pNext; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pCurrent = _ppBuckets[i]; - _ppBuckets[i] = NULL; - while (pCurrent != NULL) - { - pNext = pCurrent->_pNext; - DeleteNode(pCurrent); - pCurrent = pNext; - } - } - - _nItems = 0; - _tableLock.ExclusiveRelease(); -} - -template -BOOL -TREE_HASH_TABLE<_Record>::FindNodeInternal( - PCWSTR pszKey, - DWORD dwHash, - TREE_HASH_NODE<_Record> ** ppNode, - TREE_HASH_NODE<_Record> *** pppPreviousNodeNextPointer -) -/*++ - Return value indicates whether the item is found - key, dwHash - key and hash for the node to find - ppNode - on successful return, the node found, on failed return, the first - node with hash value greater than the node to be found - pppPreviousNodeNextPointer - the pointer to previous node's _pNext - - This routine may be called under either read or write lock ---*/ -{ - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - TREE_HASH_NODE<_Record> *pNode; - BOOL fFound = FALSE; - - ppPreviousNodeNextPointer = _ppBuckets + (dwHash % _nBuckets); - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - if (pNode->_dwHash == dwHash) - { - if (CompareStringOrdinal(pszKey, - -1, - pNode->_pszPath, - -1, - !_fCaseSensitive) == CSTR_EQUAL) - { - fFound = TRUE; - break; - } - } - else if (pNode->_dwHash > dwHash) - { - break; - } - - ppPreviousNodeNextPointer = &(pNode->_pNext); - pNode = *ppPreviousNodeNextPointer; - } - - *ppNode = pNode; - if (pppPreviousNodeNextPointer != NULL) - { - *pppPreviousNodeNextPointer = ppPreviousNodeNextPointer; - } - return fFound; -} - -template -VOID -TREE_HASH_TABLE<_Record>::FindKey( - PCWSTR pszKey, - _Record ** ppRecord -) -{ - TREE_HASH_NODE<_Record> *pNode; - - *ppRecord = NULL; - - DWORD dwHash = CalcHash(pszKey); - - _tableLock.SharedAcquire(); - - if (FindNodeInternal(pszKey, dwHash, &pNode) && - pNode->_pRecord != NULL) - { - ReferenceRecord(pNode->_pRecord); - *ppRecord = pNode->_pRecord; - } - - _tableLock.SharedRelease(); -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::AddNodeInternal( - PCWSTR pszPath, - DWORD dwHash, - _Record * pRecord, - TREE_HASH_NODE<_Record> * pParentNode, - TREE_HASH_NODE<_Record> ** ppNewNode -) -/*++ - Return value is HRESULT indicating sucess or failure - pszPath, dwHash, pRecord - path, hash value and record to be inserted - pParentNode - this will be the parent of the node being inserted - ppNewNode - on successful return, the new node created and inserted - - This function may be called under a read or write lock ---*/ -{ - TREE_HASH_NODE<_Record> *pNewNode; - TREE_HASH_NODE<_Record> *pNextNode; - TREE_HASH_NODE<_Record> **ppNextPointer; - HRESULT hr; - - // - // Ownership of pRecord is not transferred to pNewNode yet, so remember - // to either set it to null before deleting pNewNode or add an extra - // reference later - this is to make sure we do not do an extra ref/deref - // which users may view as getting flushed out of the hash-table - // - hr = AllocateNode(pszPath, - dwHash, - pRecord, - pParentNode, - &pNewNode); - if (FAILED(hr)) - { - return hr; - } - - do - { - // - // Find the right place to add this node - // - - if (FindNodeInternal(pszPath, dwHash, &pNextNode, &ppNextPointer)) - { - // - // If node already there, record may still need updating - // - if (pRecord != NULL && - InterlockedCompareExchangePointer((PVOID *)&pNextNode->_pRecord, - pRecord, - NULL) == NULL) - { - ReferenceRecord(pRecord); - hr = S_OK; - } - else - { - hr = HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS); - } - - // ownership of pRecord has either passed to existing record or - // not to anyone at all - pNewNode->_pRecord = NULL; - DeleteNode(pNewNode); - *ppNewNode = pNextNode; - return hr; - } - - // - // If another node got inserted in betwen, we will have to retry - // - pNewNode->_pNext = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer, - pNewNode, - pNextNode) != pNextNode); - // pass ownership of pRecord now - if (pRecord != NULL) - { - ReferenceRecord(pRecord); - pRecord = NULL; - } - InterlockedIncrement((LONG *)&_nItems); - - // - // update the parent - // - if (pParentNode != NULL) - { - ppNextPointer = &pParentNode->_pFirstChild; - do - { - pNextNode = *ppNextPointer; - pNewNode->_pNextSibling = pNextNode; - } while (InterlockedCompareExchangePointer((PVOID *)ppNextPointer, - pNewNode, - pNextNode) != pNextNode); - } - - *ppNewNode = pNewNode; - return S_OK; -} - -template -HRESULT -TREE_HASH_TABLE<_Record>::InsertRecord( - _Record * pRecord -) -/*++ - This method inserts a node for this record and also empty nodes for paths - in the heirarchy leading upto this path - - The insert is done under only a read-lock - this is possible by keeping - the hashes in a bucket in increasing order and using interlocked operations - to actually insert the item in the hash-bucket lookaside list and the parent - children list - - Returns HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS) if the record already exists. - Never leak this error to the end user because "*file* already exists" may be confusing. ---*/ -{ - PCWSTR pszKey = GetKey(pRecord); - STACK_STRU( strPartialPath, 256); - PWSTR pszPartialPath; - DWORD dwHash; - DWORD cchEnd; - HRESULT hr; - TREE_HASH_NODE<_Record> *pParentNode = NULL; - - hr = strPartialPath.Copy(pszKey); - if (FAILED(hr)) - { - goto Finished; - } - pszPartialPath = strPartialPath.QueryStr(); - - _tableLock.SharedAcquire(); - - // - // First find the lowest parent node present - // - for (cchEnd = strPartialPath.QueryCCH() - 1; cchEnd > 0; cchEnd--) - { - if (pszPartialPath[cchEnd] == L'/' || pszPartialPath[cchEnd] == L'\\') - { - pszPartialPath[cchEnd] = L'\0'; - - dwHash = CalcHash(pszPartialPath); - if (FindNodeInternal(pszPartialPath, dwHash, &pParentNode)) - { - pszPartialPath[cchEnd] = pszKey[cchEnd]; - break; - } - pParentNode = NULL; - } - } - - // - // Now go ahead and add the rest of the tree (including our record) - // - for (; cchEnd <= strPartialPath.QueryCCH(); cchEnd++) - { - if (pszPartialPath[cchEnd] == L'\0') - { - dwHash = CalcHash(pszPartialPath); - hr = AddNodeInternal( - pszPartialPath, - dwHash, - (cchEnd == strPartialPath.QueryCCH()) ? pRecord : NULL, - pParentNode, - &pParentNode); - if (FAILED(hr) && - hr != HRESULT_FROM_WIN32(ERROR_ALREADY_EXISTS)) - { - goto Finished; - } - - pszPartialPath[cchEnd] = pszKey[cchEnd]; - } - } - -Finished: - _tableLock.SharedRelease(); - - if (SUCCEEDED(hr)) - { - RehashTableIfNeeded(); - } - - return hr; -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteNodeInternal( - TREE_HASH_NODE<_Record> ** ppNextPointer, - TREE_HASH_NODE<_Record> * pNode -) -/*++ - pNode is the node to be deleted - ppNextPointer is the pointer to the previous node's next pointer pointing - to this node - - This function should be called under write-lock ---*/ -{ - // - // First remove this node from hash table - // - *ppNextPointer = pNode->_pNext; - - // - // Now fixup parent - // - if (pNode->_pParentNode != NULL) - { - ppNextPointer = &pNode->_pParentNode->_pFirstChild; - while (*ppNextPointer != pNode) - { - ppNextPointer = &(*ppNextPointer)->_pNextSibling; - } - *ppNextPointer = pNode->_pNextSibling; - } - - // - // Now remove all children recursively - // - TREE_HASH_NODE<_Record> *pChild = pNode->_pFirstChild; - TREE_HASH_NODE<_Record> *pNextChild; - while (pChild != NULL) - { - pNextChild = pChild->_pNextSibling; - - ppNextPointer = _ppBuckets + (pChild->_dwHash % _nBuckets); - while (*ppNextPointer != pChild) - { - ppNextPointer = &(*ppNextPointer)->_pNext; - } - pChild->_pParentNode = NULL; - DeleteNodeInternal(ppNextPointer, pChild); - - pChild = pNextChild; - } - - DeleteNode(pNode); - _nItems--; -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteKey( - PCWSTR pszKey -) -{ - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - - DWORD dwHash = CalcHash(pszKey); - - _tableLock.ExclusiveAcquire(); - - if (FindNodeInternal(pszKey, dwHash, &pNode, &ppPreviousNodeNextPointer)) - { - DeleteNodeInternal(ppPreviousNodeNextPointer, pNode); - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::DeleteIf( - PFN_DELETE_IF pfnDeleteIf, - PVOID pvContext -) -{ - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> **ppPreviousNodeNextPointer; - BOOL fDelete; - - _tableLock.ExclusiveAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - ppPreviousNodeNextPointer = _ppBuckets + i; - pNode = *ppPreviousNodeNextPointer; - while (pNode != NULL) - { - // - // Non empty nodes deleted based on DeleteIf, empty nodes deleted - // if they have no children - // - fDelete = FALSE; - if (pNode->_pRecord != NULL) - { - if (pfnDeleteIf(pNode->_pRecord, pvContext)) - { - fDelete = TRUE; - } - } - else if (pNode->_pFirstChild == NULL) - { - fDelete = TRUE; - } - - if (fDelete) - { - if (pNode->_pFirstChild == NULL) - { - DeleteNodeInternal(ppPreviousNodeNextPointer, pNode); - } - else - { - DereferenceRecord(pNode->_pRecord); - pNode->_pRecord = NULL; - } - } - else - { - ppPreviousNodeNextPointer = &pNode->_pNext; - } - - pNode = *ppPreviousNodeNextPointer; - } - } - - _tableLock.ExclusiveRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::Apply( - PFN_APPLY pfnApply, - PVOID pvContext -) -{ - TREE_HASH_NODE<_Record> *pNode; - - _tableLock.SharedAcquire(); - - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - if (pNode->_pRecord != NULL) - { - pfnApply(pNode->_pRecord, pvContext); - } - - pNode = pNode->_pNext; - } - } - - _tableLock.SharedRelease(); -} - -template -VOID -TREE_HASH_TABLE<_Record>::RehashTableIfNeeded( - VOID -) -{ - TREE_HASH_NODE<_Record> **ppBuckets; - DWORD nBuckets; - TREE_HASH_NODE<_Record> *pNode; - TREE_HASH_NODE<_Record> *pNextNode; - TREE_HASH_NODE<_Record> **ppNextPointer; - TREE_HASH_NODE<_Record> *pNewNextNode; - DWORD nNewBuckets; - - // - // If number of items has become too many, we will double the hash table - // size (we never reduce it however) - // - if (_nItems <= PRIME::GetPrime(2*_nBuckets)) - { - return; - } - - _tableLock.ExclusiveAcquire(); - - nNewBuckets = PRIME::GetPrime(2*_nBuckets); - - if (_nItems <= nNewBuckets) - { - goto Finished; - } - - nBuckets = nNewBuckets; - if (nBuckets >= 0xffffffff/sizeof(TREE_HASH_NODE<_Record> *)) - { - goto Finished; - } - ppBuckets = (TREE_HASH_NODE<_Record> **)HeapAlloc( - GetProcessHeap(), - HEAP_ZERO_MEMORY, - nBuckets*sizeof(TREE_HASH_NODE<_Record> *)); - if (ppBuckets == NULL) - { - goto Finished; - } - - // - // Take out nodes from the old hash table and insert in the new one, make - // sure to keep the hashes in increasing order - // - for (DWORD i=0; i<_nBuckets; i++) - { - pNode = _ppBuckets[i]; - while (pNode != NULL) - { - pNextNode = pNode->_pNext; - - ppNextPointer = ppBuckets + (pNode->_dwHash % nBuckets); - pNewNextNode = *ppNextPointer; - while (pNewNextNode != NULL && - pNewNextNode->_dwHash <= pNode->_dwHash) - { - ppNextPointer = &pNewNextNode->_pNext; - pNewNextNode = pNewNextNode->_pNext; - } - pNode->_pNext = pNewNextNode; - *ppNextPointer = pNode; - - pNode = pNextNode; - } - } - - HeapFree(GetProcessHeap(), 0, _ppBuckets); - _ppBuckets = ppBuckets; - _nBuckets = nBuckets; - ppBuckets = NULL; - -Finished: - - _tableLock.ExclusiveRelease(); -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cxx deleted file mode 100644 index 214ee65abf..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cxx +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "precomp.h" - -HRESULT -MakePathCanonicalizationProof( - IN PCWSTR pszName, - OUT STRU * pstrPath -) -/*++ - -Routine Description: - - This functions adds a prefix - to the string, which is "\\?\UNC\" for a UNC path, and "\\?\" for - other paths. This prefix tells Windows not to parse the path. - -Arguments: - - IN pszName - The path to be converted - OUT pstrPath - Output path created - -Return Values: - - HRESULT - ---*/ -{ - HRESULT hr; - - if (pszName[0] == L'\\' && pszName[1] == L'\\') - { - // - // If the path is already canonicalized, just return - // - - if ((pszName[2] == '?' || pszName[2] == '.') && - pszName[3] == '\\') - { - hr = pstrPath->Copy(pszName); - - if (SUCCEEDED(hr)) - { - // - // If the path was in DOS form ("\\.\"), - // we need to change it to Win32 from ("\\?\") - // - - pstrPath->QueryStr()[2] = L'?'; - } - - return hr; - } - - pszName += 2; - - - if (FAILED(hr = pstrPath->Copy(L"\\\\?\\UNC\\"))) - { - return hr; - } - } - else if (wcslen(pszName) > MAX_PATH) - { - if (FAILED(hr = pstrPath->Copy(L"\\\\?\\"))) - { - return hr; - } - } - else - { - pstrPath->Reset(); - } - - return pstrPath->Append(pszName); -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj deleted file mode 100644 index 955839f2b9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/RequestHandler.vcxproj +++ /dev/null @@ -1,259 +0,0 @@ - - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {D57EA297-6DC2-4BC0-8C91-334863327863} - Win32Proj - RequestHandler - 10.0.15063.0 - RequestHandler - - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - DynamicLibrary - true - v141 - Unicode - - - DynamicLibrary - false - v141 - true - Unicode - - - - - - - - - - - - - - - - - - - - - aspnetcorerh - - - false - - - false - - - - NotUsing - Level4 - Disabled - WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - precomp.hxx - $(IntDir)$(TargetName).pch - ProgramDatabase - MultiThreadedDebug - ..\IISLib;..\CommonLib;.\Inc - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - true - kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - Source.def - - - - - NotUsing - Level4 - Disabled - WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - precomp.hxx - $(IntDir)$(TargetName).pch - ProgramDatabase - MultiThreadedDebug - ..\IISLib;..\CommonLib;.\Inc - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - true - kernel32.lib;user32.lib;advapi32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - Source.def - - - - - Level4 - NotUsing - MaxSpeed - true - true - WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions) - precomp.hxx - MultiThreaded - ..\IISLib;..\CommonLib;.\Inc - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - false - true - true - Source.def - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;winhttp.lib;odbc32.lib;ws2_32.lib;odbccp32.lib;wbemuuid.lib;iphlpapi.lib;pdh.lib;rpcrt4.lib;%(AdditionalDependencies) - - - - - Level4 - NotUsing - MaxSpeed - true - true - NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions) - precomp.hxx - MultiThreaded - ..\IISLib;..\CommonLib;.\Inc - true - true - true - false - SyncCThrow - 8Bytes - true - false - true - CompileAsCpp - true - - - Windows - false - true - true - Source.def - kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;rpcrt4.lib;winhttp.lib;pdh.lib;ws2_32.lib;wbemuuid.lib;iphlpapi.lib;%(AdditionalDependencies) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - {55494e58-e061-4c4c-a0a8-837008e72f85} - - - {4787a64f-9a3e-4867-a55a-70cb4b2b2ffe} - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/Source.def deleted file mode 100644 index 889bd1a39b..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/Source.def +++ /dev/null @@ -1,6 +0,0 @@ -LIBRARY aspnetcorerh - -EXPORTS - CreateApplication - CreateRequestHandler - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/aspnetcore_event.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/aspnetcore_event.h deleted file mode 100644 index 2c13d20d1e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/aspnetcore_event.h +++ /dev/null @@ -1,550 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#ifndef __ASPNETCOREEVENT_H__ -#define __ASPNETCOREEVENT_H__ -/*++ - - Module Name: - - aspnetcore_event.h - - Abstract: - - Header file has been generated from mof file containing - IIS trace event descriptions - ---*/ - -// -// Start of the new provider class WWWServerTraceProvider, -// GUID: {3a2a4e84-4c21-4981-ae10-3fda0d9b0f83} -// Description: IIS: WWW Server -// - -class WWWServerTraceProvider -{ -public: - static - LPCGUID - GetProviderGuid( VOID ) - // return GUID for the current event class - { - static const GUID ProviderGuid = - {0x3a2a4e84,0x4c21,0x4981,{0xae,0x10,0x3f,0xda,0x0d,0x9b,0x0f,0x83}}; - return &ProviderGuid; - }; - enum enumAreaFlags - { - // AspNetCore module events - ANCM = 0x10000 - }; - static - LPCWSTR - TranslateEnumAreaFlagsToString( enum enumAreaFlags EnumValue) - { - switch( (DWORD) EnumValue ) - { - case 0x10000: return L"ANCM"; - } - return NULL; - }; - - static - BOOL - CheckTracingEnabled( - IHttpTraceContext * pHttpTraceContext, - enumAreaFlags AreaFlags, - DWORD dwVerbosity ) - { - HRESULT hr; - HTTP_TRACE_CONFIGURATION TraceConfig; - TraceConfig.pProviderGuid = GetProviderGuid(); - hr = pHttpTraceContext->GetTraceConfiguration( &TraceConfig ); - if ( FAILED( hr ) || !TraceConfig.fProviderEnabled ) - { - return FALSE; - } - if ( TraceConfig.dwVerbosity >= dwVerbosity && - ( TraceConfig.dwAreas == (DWORD) AreaFlags || - ( TraceConfig.dwAreas & (DWORD)AreaFlags ) == (DWORD)AreaFlags ) ) - { - return TRUE; - } - return FALSE; - }; -}; - -// -// Start of the new event class ANCMEvents, -// GUID: {82ADEAD7-12B2-4781-BDCA-5A4B6C757191} -// Description: ANCM runtime events -// - -class ANCMEvents -{ -public: - static - LPCGUID - GetAreaGuid( VOID ) - // return GUID for the current event class - { - static const GUID AreaGuid = - {0x82adead7,0x12b2,0x4781,{0xbd,0xca,0x5a,0x4b,0x6c,0x75,0x71,0x91}}; - return &AreaGuid; - }; - - // - // Event: mof class name ANCMAppStart, - // Description: Start application success - // EventTypeName: ANCM_START_APPLICATION_SUCCESS - // EventType: 1 - // EventLevel: 4 - // - - class ANCM_START_APPLICATION_SUCCESS - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId, - LPCWSTR pAppDescription - ) - // - // Raise ANCM_START_APPLICATION_SUCCESS Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 1; - Event.pszEventName = L"ANCM_START_APPLICATION_SUCCESS"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 4; - Event.cEventItems = 2; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 2 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Items[ 1 ].pszName = L"AppDescription"; - Items[ 1 ].dwDataType = HTTP_TRACE_TYPE_LPCWSTR; // mof type (string) - Items[ 1 ].pbData = (PBYTE) pAppDescription; - Items[ 1 ].cbData = - ( Items[ 1 ].pbData == NULL )? 0 : ( sizeof(WCHAR) * (1 + (DWORD) wcslen( (PWSTR) Items[ 1 ].pbData ) ) ); - Items[ 1 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 4 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMAppStartFail, - // Description: Start application failed - // EventTypeName: ANCM_START_APPLICATION_FAIL - // EventType: 2 - // EventLevel: 2 - // - - class ANCM_START_APPLICATION_FAIL - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId, - LPCWSTR pFailureDescription - ) - // - // Raise ANCM_START_APPLICATION_FAIL Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 2; - Event.pszEventName = L"ANCM_START_APPLICATION_FAIL"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 2; - Event.cEventItems = 2; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 2 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Items[ 1 ].pszName = L"FailureDescription"; - Items[ 1 ].dwDataType = HTTP_TRACE_TYPE_LPCWSTR; // mof type (string) - Items[ 1 ].pbData = (PBYTE) pFailureDescription; - Items[ 1 ].cbData = - ( Items[ 1 ].pbData == NULL )? 0 : ( sizeof(WCHAR) * (1 + (DWORD) wcslen( (PWSTR) Items[ 1 ].pbData ) ) ); - Items[ 1 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 2 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMForwardStart, - // Description: Start forwarding request - // EventTypeName: ANCM_REQUEST_FORWARD_START - // EventType: 3 - // EventLevel: 4 - // - - class ANCM_REQUEST_FORWARD_START - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId - ) - // - // Raise ANCM_REQUEST_FORWARD_START Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 3; - Event.pszEventName = L"ANCM_REQUEST_FORWARD_START"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 4; - Event.cEventItems = 1; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 1 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 4 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMForwardEnd, - // Description: Finish forwarding request - // EventTypeName: ANCM_REQUEST_FORWARD_END - // EventType: 4 - // EventLevel: 4 - // - - class ANCM_REQUEST_FORWARD_END - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId - ) - // - // Raise ANCM_REQUEST_FORWARD_END Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 4; - Event.pszEventName = L"ANCM_REQUEST_FORWARD_END"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 4; - Event.cEventItems = 1; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 1 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 4 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMForwardFail, - // Description: Forwarding request failure - // EventTypeName: ANCM_REQUEST_FORWARD_FAIL - // EventType: 5 - // EventLevel: 2 - // - - class ANCM_REQUEST_FORWARD_FAIL - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId, - ULONG ErrorCode - ) - // - // Raise ANCM_REQUEST_FORWARD_FAIL Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 5; - Event.pszEventName = L"ANCM_REQUEST_FORWARD_FAIL"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 2; - Event.cEventItems = 2; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 2 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Items[ 1 ].pszName = L"ErrorCode"; - Items[ 1 ].dwDataType = HTTP_TRACE_TYPE_ULONG; // mof type (uint32) - Items[ 1 ].pbData = (PBYTE) &ErrorCode; - Items[ 1 ].cbData = 4; - Items[ 1 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 2 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMWinHttpCallBack, - // Description: Receiving callback from WinHttp - // EventTypeName: ANCM_WINHTTP_CALLBACK - // EventType: 6 - // EventLevel: 4 - // - - class ANCM_WINHTTP_CALLBACK - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId, - ULONG InternetStatus - ) - // - // Raise ANCM_WINHTTP_CALLBACK Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 6; - Event.pszEventName = L"ANCM_WINHTTP_CALLBACK"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 4; - Event.cEventItems = 2; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 2 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Items[ 1 ].pszName = L"InternetStatus"; - Items[ 1 ].dwDataType = HTTP_TRACE_TYPE_ULONG; // mof type (uint32) - Items[ 1 ].pbData = (PBYTE) &InternetStatus; - Items[ 1 ].cbData = 4; - Items[ 1 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 4 ); //Verbosity - }; - }; - // - // Event: mof class name ANCMForwardEnd, - // Description: Inprocess executing request failure - // EventTypeName: ANCM_EXECUTE_REQUEST_FAIL - // EventType: 7 - // EventLevel: 2 - // - - class ANCM_EXECUTE_REQUEST_FAIL - { - public: - static - HRESULT - RaiseEvent( - IHttpTraceContext * pHttpTraceContext, - LPCGUID pContextId, - ULONG ErrorCode - ) - // - // Raise ANCM_EXECUTE_REQUEST_FAIL Event - // - { - HTTP_TRACE_EVENT Event; - Event.pProviderGuid = WWWServerTraceProvider::GetProviderGuid(); - Event.dwArea = WWWServerTraceProvider::ANCM; - Event.pAreaGuid = ANCMEvents::GetAreaGuid(); - Event.dwEvent = 7; - Event.pszEventName = L"ANCM_EXECUTE_REQUEST_FAIL"; - Event.dwEventVersion = 1; - Event.dwVerbosity = 2; - Event.cEventItems = 2; - Event.pActivityGuid = NULL; - Event.pRelatedActivityGuid = NULL; - Event.dwTimeStamp = 0; - Event.dwFlags = HTTP_TRACE_EVENT_FLAG_STATIC_DESCRIPTIVE_FIELDS; - - // pActivityGuid, pRelatedActivityGuid, Timestamp to be filled in by IIS - - HTTP_TRACE_EVENT_ITEM Items[ 2 ]; - Items[ 0 ].pszName = L"ContextId"; - Items[ 0 ].dwDataType = HTTP_TRACE_TYPE_LPCGUID; // mof type (object) - Items[ 0 ].pbData = (PBYTE) pContextId; - Items[ 0 ].cbData = 16; - Items[ 0 ].pszDataDescription = NULL; - Items[ 1 ].pszName = L"ErrorCode"; - Items[ 1 ].dwDataType = HTTP_TRACE_TYPE_ULONG; // mof type (uint32) - Items[ 1 ].pbData = (PBYTE) &ErrorCode; - Items[ 1 ].cbData = 4; - Items[ 1 ].pszDataDescription = NULL; - Event.pEventItems = Items; - pHttpTraceContext->RaiseTraceEvent( &Event ); - return S_OK; - }; - - static - BOOL - IsEnabled( - IHttpTraceContext * pHttpTraceContext ) - // Check if tracing for this event is enabled - { - return WWWServerTraceProvider::CheckTracingEnabled( - pHttpTraceContext, - WWWServerTraceProvider::ANCM, - 2 ); //Verbosity - }; - }; -}; -#endif diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/disconnectcontext.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/disconnectcontext.h deleted file mode 100644 index e43a49c0a0..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/disconnectcontext.h +++ /dev/null @@ -1,78 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -class ASYNC_DISCONNECT_CONTEXT : public IHttpConnectionStoredContext -{ -public: - ASYNC_DISCONNECT_CONTEXT() - { - m_pHandler = NULL; - } - - VOID - CleanupStoredContext() - { - DBG_ASSERT(m_pHandler == NULL); - delete this; - } - - VOID - NotifyDisconnect() - { - REQUEST_HANDLER *pInitialValue = (REQUEST_HANDLER*) - InterlockedExchangePointer((PVOID*)&m_pHandler, NULL); - - if (pInitialValue != NULL) - { - pInitialValue->TerminateRequest(TRUE); - pInitialValue->DereferenceRequestHandler(); - } - } - - VOID - SetHandler( - REQUEST_HANDLER *pHandler - ) - { - // - // Take a reference on the forwarding handler. - // This reference will be released on either of two conditions: - // - // 1. When the request processing ends, in which case a ResetHandler() - // is called. - // - // 2. When a disconnect notification arrives. - // - // We need to make sure that only one of them ends up dereferencing - // the object. - // - - DBG_ASSERT(pHandler != NULL); - DBG_ASSERT(m_pHandler == NULL); - - pHandler->ReferenceRequestHandler(); - InterlockedExchangePointer((PVOID*)&m_pHandler, pHandler); - } - - VOID - ResetHandler( - VOID - ) - { - REQUEST_HANDLER *pInitialValue = (REQUEST_HANDLER*) - InterlockedExchangePointer((PVOID*)&m_pHandler, NULL); - - if (pInitialValue != NULL) - { - pInitialValue->DereferenceRequestHandler(); - } - } - -private: - ~ASYNC_DISCONNECT_CONTEXT() - {} - - REQUEST_HANDLER * m_pHandler; -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx deleted file mode 100644 index 3cfdef0798..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/dllmain.cxx +++ /dev/null @@ -1,369 +0,0 @@ -// dllmain.cpp : Defines the entry point for the DLL application. -#include "precomp.hxx" -#include -#include - -BOOL g_fNsiApiNotSupported = FALSE; -BOOL g_fWebSocketSupported = FALSE; -BOOL g_fEnableReferenceCountTracing = FALSE; -BOOL g_fGlobalInitialize = FALSE; -BOOL g_fOutOfProcessInitialize = FALSE; -BOOL g_fOutOfProcessInitializeError = FALSE; -BOOL g_fWinHttpNonBlockingCallbackAvailable = FALSE; -BOOL g_fProcessDetach = FALSE; -DWORD g_OptionalWinHttpFlags = 0; -DWORD g_dwAspNetCoreDebugFlags = 0; -DWORD g_dwDebugFlags = 0; -DWORD g_dwTlsIndex = TLS_OUT_OF_INDEXES; -SRWLOCK g_srwLockRH; -HINTERNET g_hWinhttpSession = NULL; -IHttpServer * g_pHttpServer = NULL; -HINSTANCE g_hWinHttpModule; -HINSTANCE g_hAspNetCoreModule; -HANDLE g_hEventLog = NULL; - - -VOID -InitializeGlobalConfiguration( - IHttpServer * pServer -) -{ - HKEY hKey; - BOOL fLocked = FALSE; - DWORD dwSize = 0; - DWORD dwResult = 0; - - if (!g_fGlobalInitialize) - { - AcquireSRWLockExclusive(&g_srwLockRH); - fLocked = TRUE; - - if (g_fGlobalInitialize) - { - // Done by another thread - goto Finished; - } - - g_pHttpServer = pServer; - if (pServer->IsCommandLineLaunch()) - { - g_hEventLog = RegisterEventSource(NULL, ASPNETCORE_IISEXPRESS_EVENT_PROVIDER); - } - else - { - g_hEventLog = RegisterEventSource(NULL, ASPNETCORE_EVENT_PROVIDER); - } - - if (RegOpenKeyEx(HKEY_LOCAL_MACHINE, - L"SOFTWARE\\Microsoft\\IIS Extensions\\IIS AspNetCore Module\\Parameters", - 0, - KEY_READ, - &hKey) == NO_ERROR) - { - DWORD dwType; - DWORD dwData; - DWORD cbData; - - cbData = sizeof(dwData); - if ((RegQueryValueEx(hKey, - L"OptionalWinHttpFlags", - NULL, - &dwType, - (LPBYTE)&dwData, - &cbData) == NO_ERROR) && - (dwType == REG_DWORD)) - { - g_OptionalWinHttpFlags = dwData; - } - - cbData = sizeof(dwData); - if ((RegQueryValueEx(hKey, - L"EnableReferenceCountTracing", - NULL, - &dwType, - (LPBYTE)&dwData, - &cbData) == NO_ERROR) && - (dwType == REG_DWORD) && (dwData == 1 || dwData == 0)) - { - g_fEnableReferenceCountTracing = !!dwData; - } - - cbData = sizeof(dwData); - if ((RegQueryValueEx(hKey, - L"DebugFlags", - NULL, - &dwType, - (LPBYTE)&dwData, - &cbData) == NO_ERROR) && - (dwType == REG_DWORD)) - { - g_dwAspNetCoreDebugFlags = dwData; - } - RegCloseKey(hKey); - } - - dwResult = GetExtendedTcpTable(NULL, - &dwSize, - FALSE, - AF_INET, - TCP_TABLE_OWNER_PID_LISTENER, - 0); - if (dwResult != NO_ERROR && dwResult != ERROR_INSUFFICIENT_BUFFER) - { - g_fNsiApiNotSupported = TRUE; - } - - g_fWebSocketSupported = IsWindows8OrGreater(); - - g_fGlobalInitialize = TRUE; - } -Finished: - if (fLocked) - { - ReleaseSRWLockExclusive(&g_srwLockRH); - } -} - -// -// Global initialization routine for OutOfProcess -// -HRESULT -EnsureOutOfProcessInitializtion() -{ - - DBG_ASSERT(pServer); - - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - - if (g_fOutOfProcessInitializeError) - { - hr = E_NOT_VALID_STATE; - goto Finished; - } - - if (!g_fOutOfProcessInitialize) - { - AcquireSRWLockExclusive(&g_srwLockRH); - fLocked = TRUE; - if (g_fOutOfProcessInitializeError) - { - hr = E_NOT_VALID_STATE; - goto Finished; - } - - if (g_fOutOfProcessInitialize) - { - // Done by another thread - goto Finished; - } - - g_hWinHttpModule = GetModuleHandle(TEXT("winhttp.dll")); - - g_hAspNetCoreModule = GetModuleHandle(TEXT("aspnetcore.dll")); - - hr = WINHTTP_HELPER::StaticInitialize(); - if (FAILED(hr)) - { - if (hr == HRESULT_FROM_WIN32(ERROR_PROC_NOT_FOUND)) - { - g_fWebSocketSupported = FALSE; - } - else - { - goto Finished; - } - } - - g_hWinhttpSession = WinHttpOpen(L"", - WINHTTP_ACCESS_TYPE_NO_PROXY, - WINHTTP_NO_PROXY_NAME, - WINHTTP_NO_PROXY_BYPASS, - WINHTTP_FLAG_ASYNC); - if (g_hWinhttpSession == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // - // Don't set non-blocking callbacks WINHTTP_OPTION_ASSURED_NON_BLOCKING_CALLBACKS, - // as we will call WinHttpQueryDataAvailable to get response on the same thread - // that we received callback from Winhttp on completing sending/forwarding the request - // - - // - // Setup the callback function - // - if (WinHttpSetStatusCallback(g_hWinhttpSession, - FORWARDING_HANDLER::OnWinHttpCompletion, - (WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | - WINHTTP_CALLBACK_STATUS_SENDING_REQUEST), - NULL) == WINHTTP_INVALID_STATUS_CALLBACK) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // - // Make sure we see the redirects (rather than winhttp doing it - // automatically) - // - DWORD dwRedirectOption = WINHTTP_OPTION_REDIRECT_POLICY_NEVER; - if (!WinHttpSetOption(g_hWinhttpSession, - WINHTTP_OPTION_REDIRECT_POLICY, - &dwRedirectOption, - sizeof(dwRedirectOption))) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - g_dwTlsIndex = TlsAlloc(); - if (g_dwTlsIndex == TLS_OUT_OF_INDEXES) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - hr = FORWARDING_HANDLER::StaticInitialize(g_fEnableReferenceCountTracing); - if (FAILED(hr)) - { - goto Finished; - } - - hr = WEBSOCKET_HANDLER::StaticInitialize(g_fEnableReferenceCountTracing); - if (FAILED(hr)) - { - goto Finished; - } - } - -Finished: - if (FAILED(hr)) - { - g_fOutOfProcessInitializeError = TRUE; - } - if (fLocked) - { - ReleaseSRWLockExclusive(&g_srwLockRH); - } - return hr; -} - -BOOL APIENTRY DllMain(HMODULE hModule, - DWORD ul_reason_for_call, - LPVOID lpReserved -) -{ - UNREFERENCED_PARAMETER(lpReserved); - - switch (ul_reason_for_call) - { - case DLL_PROCESS_ATTACH: - DisableThreadLibraryCalls(hModule); - InitializeSRWLock(&g_srwLockRH); - break; - case DLL_PROCESS_DETACH: - g_fProcessDetach = TRUE; - default: - break; - } - return TRUE; -} - -HRESULT -__stdcall -CreateApplication( - _In_ IHttpServer *pServer, - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ APPLICATION **ppApplication -) -{ - HRESULT hr = S_OK; - APPLICATION *pApplication = NULL; - - // Initialze some global variables here - InitializeGlobalConfiguration(pServer); - - if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) - { - pApplication = new IN_PROCESS_APPLICATION(pServer, pConfig); - if (pApplication == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY); - goto Finished; - } - } - else if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_OUT_PROCESS) - { - hr = EnsureOutOfProcessInitializtion(); - if (FAILED(hr)) - { - goto Finished; - } - - pApplication = new OUT_OF_PROCESS_APPLICATION(pServer, pConfig); - if (pApplication == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY); - goto Finished; - } - - hr = ((OUT_OF_PROCESS_APPLICATION*)pApplication)->Initialize(); - if (FAILED(hr)) - { - delete pApplication; - pApplication = NULL; - goto Finished; - } - } - else - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - goto Finished; - } - - *ppApplication = pApplication; - -Finished: - return hr; -} - -HRESULT -__stdcall -CreateRequestHandler( - _In_ IHttpContext *pHttpContext, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication, - _Out_ REQUEST_HANDLER **pRequestHandler -) -{ - HRESULT hr = S_OK; - REQUEST_HANDLER* pHandler = NULL; - ASPNETCORE_CONFIG* pConfig = pApplication->QueryConfig(); - DBG_ASSERT(pConfig); - - if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_IN_PROCESS) - { - pHandler = new IN_PROCESS_HANDLER(pHttpContext, pModuleId, pApplication); - } - else if (pConfig->QueryHostingModel() == APP_HOSTING_MODEL::HOSTING_OUT_PROCESS) - { - pHandler = new FORWARDING_HANDLER(pHttpContext, pModuleId, pApplication); - } - else - { - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - } - - if (pHandler == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_OUTOFMEMORY); - } - else - { - *pRequestHandler = pHandler; - } - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/environmentvariablehelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/environmentvariablehelpers.h deleted file mode 100644 index 268011d30a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/environmentvariablehelpers.h +++ /dev/null @@ -1,421 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "precomp.hxx" - -class ENVIRONMENT_VAR_HELPERS -{ - -public: - static - VOID - CopyToMultiSz( - ENVIRONMENT_VAR_ENTRY * pEntry, - PVOID pvData - ) - { - STRU strTemp; - MULTISZ *pMultiSz = static_cast(pvData); - DBG_ASSERT(pMultiSz); - DBG_ASSERT(pEntry); - strTemp.Copy(pEntry->QueryName()); - strTemp.Append(pEntry->QueryValue()); - pMultiSz->Append(strTemp.QueryStr()); - } - - static - VOID - CopyToTable( - ENVIRONMENT_VAR_ENTRY * pEntry, - PVOID pvData - ) - { - // best effort copy, ignore the failure - ENVIRONMENT_VAR_ENTRY * pNewEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pNewEntry != NULL) - { - pNewEntry->Initialize(pEntry->QueryName(), pEntry->QueryValue()); - ENVIRONMENT_VAR_HASH *pHash = static_cast(pvData); - DBG_ASSERT(pHash); - pHash->InsertRecord(pNewEntry); - // Need to dereference as InsertRecord references it now - pNewEntry->Dereference(); - } - } - - static - VOID - AppendEnvironmentVariables - ( - ENVIRONMENT_VAR_ENTRY * pEntry, - PVOID pvData - ) - { - HRESULT hr = S_OK; - DWORD dwResult = 0; - DWORD dwError = 0; - STRU struNameBuffer; - STACK_STRU(struValueBuffer, 300); - BOOL fFound = FALSE; - - HRESULT* pHr = static_cast(pvData); - - // pEntry->QueryName includes the trailing =, remove it before calling stru - if (FAILED(hr = struNameBuffer.Copy(pEntry->QueryName()))) - { - goto Finished; - } - dwResult = struNameBuffer.LastIndexOf(L'='); - if (dwResult != -1) - { - struNameBuffer.QueryStr()[dwResult] = L'\0'; - if (FAILED(hr = struNameBuffer.SyncWithBuffer())) - { - goto Finished; - } - } - - dwResult = GetEnvironmentVariable(struNameBuffer.QueryStr(), struValueBuffer.QueryStr(), struValueBuffer.QuerySizeCCH()); - if (dwResult == 0) - { - dwError = GetLastError(); - // Windows API (e.g., CreateProcess) allows variable with empty string value - // in such case dwResult will be 0 and dwError will also be 0 - // As UI and CMD does not allow empty value, ignore this environment var - if (dwError != ERROR_ENVVAR_NOT_FOUND && dwError != ERROR_SUCCESS) - { - hr = HRESULT_FROM_WIN32(dwError); - goto Finished; - } - } - else if (dwResult > struValueBuffer.QuerySizeCCH()) - { - // have to increase the buffer and try get environment var again - struValueBuffer.Reset(); - struValueBuffer.Resize(dwResult + (DWORD)wcslen(pEntry->QueryValue()) + 2); // for null char and semicolon - dwResult = GetEnvironmentVariable(struNameBuffer.QueryStr(), - struValueBuffer.QueryStr(), - struValueBuffer.QuerySizeCCH()); - if (struValueBuffer.IsEmpty()) - { - hr = E_UNEXPECTED; - goto Finished; - } - fFound = TRUE; - } - else - { - fFound = TRUE; - } - - if (FAILED(hr = struValueBuffer.SyncWithBuffer())) - { - goto Finished; - } - - if (fFound) - { - if (FAILED(hr = struValueBuffer.Append(L";"))) - { - goto Finished; - } - } - if (FAILED(hr = struValueBuffer.Append(pEntry->QueryValue()))) - { - goto Finished; - } - - if (FAILED(hr = pEntry->Initialize(pEntry->QueryName(), struValueBuffer.QueryStr()))) - { - goto Finished; - } - - Finished: - if (FAILED(hr)) - { - *pHr = hr; - } - return; - } - - static - VOID - SetEnvironmentVariables - ( - ENVIRONMENT_VAR_ENTRY * pEntry, - PVOID pvData - ) - { - UNREFERENCED_PARAMETER(pvData); - HRESULT hr = S_OK; - DWORD dwResult = 0; - STRU struNameBuffer; - - HRESULT* pHr = static_cast(pvData); - - // pEntry->QueryName includes the trailing =, remove it before calling SetEnvironmentVariable. - if (FAILED(hr = struNameBuffer.Copy(pEntry->QueryName()))) - { - goto Finished; - } - dwResult = struNameBuffer.LastIndexOf(L'='); - if (dwResult != -1) - { - struNameBuffer.QueryStr()[dwResult] = L'\0'; - if (FAILED(hr = struNameBuffer.SyncWithBuffer())) - { - goto Finished; - } - } - - dwResult = SetEnvironmentVariable(struNameBuffer.QueryStr(), pEntry->QueryValue()); - if (dwResult == 0) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - } - - Finished: - if (FAILED(hr)) - { - *pHr = hr; - } - return; - } - - static - HRESULT - InitEnvironmentVariablesTable - ( - _In_ ENVIRONMENT_VAR_HASH* pInEnvironmentVarTable, - _In_ BOOL fWindowsAuthEnabled, - _In_ BOOL fBasicAuthEnabled, - _In_ BOOL fAnonymousAuthEnabled, - _Out_ ENVIRONMENT_VAR_HASH** ppEnvironmentVarTable - ) - { - HRESULT hr = S_OK; - BOOL fFound = FALSE; - DWORD dwResult, dwError; - STRU strIisAuthEnvValue; - STACK_STRU(strStartupAssemblyEnv, 1024); - ENVIRONMENT_VAR_ENTRY* pHostingEntry = NULL; - ENVIRONMENT_VAR_ENTRY* pIISAuthEntry = NULL; - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable = NULL; - - pEnvironmentVarTable = new ENVIRONMENT_VAR_HASH(); - if (pEnvironmentVarTable == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // - // few environment variables expected, small bucket size for hash table - // - if (FAILED(hr = pEnvironmentVarTable->Initialize(37 /*prime*/))) - { - goto Finished; - } - - // copy the envirable hash table (from configuration) to a temp one as we may need to remove elements - pInEnvironmentVarTable->Apply(ENVIRONMENT_VAR_HELPERS::CopyToTable, pEnvironmentVarTable); - if (pEnvironmentVarTable->Count() != pInEnvironmentVarTable->Count()) - { - // hash table copy failed - hr = E_UNEXPECTED; - goto Finished; - } - - pEnvironmentVarTable->FindKey((PWSTR)ASPNETCORE_IIS_AUTH_ENV_STR, &pIISAuthEntry); - if (pIISAuthEntry != NULL) - { - // user defined ASPNETCORE_IIS_HTTPAUTH in configuration, wipe it off - pIISAuthEntry->Dereference(); - pEnvironmentVarTable->DeleteKey((PWSTR)ASPNETCORE_IIS_AUTH_ENV_STR); - } - - if (fWindowsAuthEnabled) - { - strIisAuthEnvValue.Copy(ASPNETCORE_IIS_AUTH_WINDOWS); - } - - if (fBasicAuthEnabled) - { - strIisAuthEnvValue.Append(ASPNETCORE_IIS_AUTH_BASIC); - } - - if (fAnonymousAuthEnabled) - { - strIisAuthEnvValue.Append(ASPNETCORE_IIS_AUTH_ANONYMOUS); - } - - if (strIisAuthEnvValue.IsEmpty()) - { - strIisAuthEnvValue.Copy(ASPNETCORE_IIS_AUTH_NONE); - } - - pIISAuthEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pIISAuthEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - if (FAILED(hr = pIISAuthEntry->Initialize(ASPNETCORE_IIS_AUTH_ENV_STR, strIisAuthEnvValue.QueryStr())) || - FAILED(hr = pEnvironmentVarTable->InsertRecord(pIISAuthEntry))) - { - goto Finished; - } - - // Compiler is complaining about conversion between PCWSTR and PWSTR here. - // Explictly casting. - pEnvironmentVarTable->FindKey((PWSTR)HOSTING_STARTUP_ASSEMBLIES_NAME, &pHostingEntry); - if (pHostingEntry != NULL) - { - // user defined ASPNETCORE_HOSTINGSTARTUPASSEMBLIES in configuration - // the value will be used in OutputEnvironmentVariables. Do nothing here - pHostingEntry->Dereference(); - pHostingEntry = NULL; - goto Skipped; - } - - //check whether ASPNETCORE_HOSTINGSTARTUPASSEMBLIES is defined in system - dwResult = GetEnvironmentVariable(HOSTING_STARTUP_ASSEMBLIES_ENV_STR, - strStartupAssemblyEnv.QueryStr(), - strStartupAssemblyEnv.QuerySizeCCH()); - if (dwResult == 0) - { - dwError = GetLastError(); - // Windows API (e.g., CreateProcess) allows variable with empty string value - // in such case dwResult will be 0 and dwError will also be 0 - // As UI and CMD does not allow empty value, ignore this environment var - if (dwError != ERROR_ENVVAR_NOT_FOUND && dwError != ERROR_SUCCESS) - { - hr = HRESULT_FROM_WIN32(dwError); - goto Finished; - } - } - else if (dwResult > strStartupAssemblyEnv.QuerySizeCCH()) - { - // have to increase the buffer and try get environment var again - strStartupAssemblyEnv.Reset(); - strStartupAssemblyEnv.Resize(dwResult + (DWORD)wcslen(HOSTING_STARTUP_ASSEMBLIES_VALUE) + 1); - dwResult = GetEnvironmentVariable(HOSTING_STARTUP_ASSEMBLIES_ENV_STR, - strStartupAssemblyEnv.QueryStr(), - strStartupAssemblyEnv.QuerySizeCCH()); - if (strStartupAssemblyEnv.IsEmpty()) - { - hr = E_UNEXPECTED; - goto Finished; - } - fFound = TRUE; - } - else - { - fFound = TRUE; - } - - strStartupAssemblyEnv.SyncWithBuffer(); - if (fFound) - { - strStartupAssemblyEnv.Append(L";"); - } - strStartupAssemblyEnv.Append(HOSTING_STARTUP_ASSEMBLIES_VALUE); - - // the environment variable was not defined, create it and add to hashtable - pHostingEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pHostingEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - if (FAILED(hr = pHostingEntry->Initialize(HOSTING_STARTUP_ASSEMBLIES_NAME, strStartupAssemblyEnv.QueryStr())) || - FAILED(hr = pEnvironmentVarTable->InsertRecord(pHostingEntry))) - { - goto Finished; - } - - Skipped: - *ppEnvironmentVarTable = pEnvironmentVarTable; - pEnvironmentVarTable = NULL; - - Finished: - if (pHostingEntry != NULL) - { - pHostingEntry->Dereference(); - pHostingEntry = NULL; - } - - if (pIISAuthEntry != NULL) - { - pIISAuthEntry->Dereference(); - pIISAuthEntry = NULL; - } - - if (pEnvironmentVarTable != NULL) - { - pEnvironmentVarTable->Clear(); - delete pEnvironmentVarTable; - pEnvironmentVarTable = NULL; - } - return hr; - } - - - static - HRESULT - AddWebsocketEnabledToEnvironmentVariables - ( - _Inout_ ENVIRONMENT_VAR_HASH* pInEnvironmentVarTable, - _In_ BOOL fWebsocketsEnabled - ) - { - HRESULT hr = S_OK; - ENVIRONMENT_VAR_ENTRY* pIISWebsocketEntry = NULL; - STACK_STRU(strIISWebsocketEnvValue, 40); - - // We only need to set the WEBSOCKET_SUPPORTED environment variable for out of process - pInEnvironmentVarTable->FindKey((PWSTR)ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED_ENV_STR, &pIISWebsocketEntry); - if (pIISWebsocketEntry != NULL) - { - // user defined ASPNETCORE_IIS_WEBSOCKETS in configuration, wipe it off - pIISWebsocketEntry->Dereference(); - pInEnvironmentVarTable->DeleteKey((PWSTR)ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED_ENV_STR); - } - // Set either true or false for the WebsocketEnvValue. - if (fWebsocketsEnabled) - { - if (FAILED(hr = strIISWebsocketEnvValue.Copy(L"true"))) - { - goto Finished; - } - } - else - { - if (FAILED(hr = strIISWebsocketEnvValue.Copy(L"false"))) - { - goto Finished; - } - } - - pIISWebsocketEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pIISWebsocketEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - if (FAILED(hr = pIISWebsocketEntry->Initialize(ASPNETCORE_IIS_WEBSOCKETS_SUPPORTED_ENV_STR, strIISWebsocketEnvValue.QueryStr())) || - FAILED(hr = pInEnvironmentVarTable->InsertRecord(pIISWebsocketEntry))) - { - goto Finished; - } - - Finished: - return hr; - } -public: - ENVIRONMENT_VAR_HELPERS(); - ~ENVIRONMENT_VAR_HELPERS(); -}; - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp deleted file mode 100644 index d8566262e1..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.cpp +++ /dev/null @@ -1,986 +0,0 @@ -#include "..\precomp.hxx" - -IN_PROCESS_APPLICATION* IN_PROCESS_APPLICATION::s_Application = NULL; - -IN_PROCESS_APPLICATION::IN_PROCESS_APPLICATION( - IHttpServer* pHttpServer, - ASPNETCORE_CONFIG* pConfig) : - APPLICATION(pHttpServer, pConfig), - m_pHttpServer(pHttpServer), - m_ProcessExitCode(0), - m_hLogFileHandle(INVALID_HANDLE_VALUE), - m_hErrReadPipe(INVALID_HANDLE_VALUE), - m_hErrWritePipe(INVALID_HANDLE_VALUE), - m_dwStdErrReadTotal(0), - m_fDoneStdRedirect(FALSE), - m_fBlockCallbacksIntoManaged(FALSE), - m_fInitialized(FALSE), - m_fShutdownCalledFromNative(FALSE), - m_fShutdownCalledFromManaged(FALSE), - m_srwLock() -{ - // is it guaranteed that we have already checked app offline at this point? - // If so, I don't think there is much to do here. - DBG_ASSERT(pHttpServer != NULL); - DBG_ASSERT(pConfig != NULL); - InitializeSRWLock(&m_srwLock); - - // TODO we can probably initialized as I believe we are the only ones calling recycle. - m_status = APPLICATION_STATUS::STARTING; -} - -IN_PROCESS_APPLICATION::~IN_PROCESS_APPLICATION() -{ - if (m_hLogFileHandle != INVALID_HANDLE_VALUE) - { - m_Timer.CancelTimer(); - CloseHandle(m_hLogFileHandle); - m_hLogFileHandle = INVALID_HANDLE_VALUE; - } - - m_hThread = NULL; - s_Application = NULL; -} - -//static -VOID -IN_PROCESS_APPLICATION::DoShutDown( - LPVOID lpParam -) -{ - IN_PROCESS_APPLICATION* pApplication = static_cast(lpParam); - DBG_ASSERT(pApplication); - pApplication->ShutDownInternal(); -} - -__override -VOID -IN_PROCESS_APPLICATION::ShutDown( - VOID -) -{ - HRESULT hr = S_OK; - CHandle hThread; - DWORD dwThreadStatus = 0; - DWORD dwTimeout = m_pConfig->QueryShutdownTimeLimitInMS(); - - if (IsDebuggerPresent()) - { - dwTimeout = INFINITE; - } - - hThread.Attach(CreateThread( - NULL, // default security attributes - 0, // default stack size - (LPTHREAD_START_ROUTINE)DoShutDown, - this, // thread function arguments - 0, // default creation flags - NULL)); // receive thread identifier - - if ((HANDLE)hThread == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (WaitForSingleObject(hThread, dwTimeout) != WAIT_OBJECT_0) - { - // if the thread is still running, we need kill it first before exit to avoid AV - if (GetExitCodeThread(m_hThread, &dwThreadStatus) != 0 && dwThreadStatus == STILL_ACTIVE) - { - // Calling back into managed at this point is prone to have AVs - // Calling terminate thread here may be our best solution. - TerminateThread(hThread, STATUS_CONTROL_C_EXIT); - hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT); - } - } - -Finished: - - if (FAILED(hr)) - { - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE, - ASPNETCORE_EVENT_APP_SHUTDOWN_FAILURE_MSG, - m_pConfig->QueryConfigPath()->QueryStr()); - - // - // Managed layer may block the shutdown and lead to shutdown timeout - // Assumption: only one inprocess application is hosted. - // Call process exit to force shutdown - // - exit(hr); - } -} - - -VOID -IN_PROCESS_APPLICATION::ShutDownInternal() -{ - DWORD dwThreadStatus = 0; - DWORD dwTimeout = m_pConfig->QueryShutdownTimeLimitInMS(); - HANDLE handle = NULL; - WIN32_FIND_DATA fileData; - - if (IsDebuggerPresent()) - { - dwTimeout = INFINITE; - } - - if (m_fShutdownCalledFromNative || - m_status == APPLICATION_STATUS::STARTING || - m_status == APPLICATION_STATUS::FAIL) - { - return; - } - - { - SRWLockWrapper lock(m_srwLock); - - if (m_fShutdownCalledFromNative || - m_status == APPLICATION_STATUS::STARTING || - m_status == APPLICATION_STATUS::FAIL) - { - return; - } - - // We need to keep track of when both managed and native initiate shutdown - // to avoid AVs. If shutdown has already been initiated in managed, we don't want to call into - // managed. We still need to wait on main exiting no matter what. m_fShutdownCalledFromNative - // is used for detecting redundant calls and blocking more requests to OnExecuteRequestHandler. - m_fShutdownCalledFromNative = TRUE; - m_status = APPLICATION_STATUS::SHUTDOWN; - - if (!m_fShutdownCalledFromManaged) - { - // We cannot call into managed if the dll is detaching from the process. - // Calling into managed code when the dll is detaching is strictly a bad idea, - // and usually results in an AV saying "The string binding is invalid" - if (!g_fProcessDetach) - { - m_ShutdownHandler(m_ShutdownHandlerContext); - m_ShutdownHandler = NULL; - } - } - - // Release the lock before we wait on the thread to exit. - } - - if (!m_fShutdownCalledFromManaged) - { - if (m_hThread != NULL && - GetExitCodeThread(m_hThread, &dwThreadStatus) != 0 && - dwThreadStatus == STILL_ACTIVE) - { - // wait for graceful shutdown, i.e., the exit of the background thread or timeout - if (WaitForSingleObject(m_hThread, dwTimeout) != WAIT_OBJECT_0) - { - // if the thread is still running, we need kill it first before exit to avoid AV - if (GetExitCodeThread(m_hThread, &dwThreadStatus) != 0 && dwThreadStatus == STILL_ACTIVE) - { - // Calling back into managed at this point is prone to have AVs - // Calling terminate thread here may be our best solution. - TerminateThread(m_hThread, STATUS_CONTROL_C_EXIT); - } - } - } - } - - CloseHandle(m_hThread); - m_hThread = NULL; - s_Application = NULL; - - CloseStdErrHandles(); - - if (m_pStdFile != NULL) - { - fflush(stdout); - fflush(stderr); - fclose(m_pStdFile); - } - - if (m_hLogFileHandle != INVALID_HANDLE_VALUE) - { - m_Timer.CancelTimer(); - CloseHandle(m_hLogFileHandle); - m_hLogFileHandle = INVALID_HANDLE_VALUE; - } - - // delete empty log file - handle = FindFirstFile(m_struLogFilePath.QueryStr(), &fileData); - if (handle != INVALID_HANDLE_VALUE && - fileData.nFileSizeHigh == 0 && - fileData.nFileSizeLow == 0) // skip check of nFileSizeHigh - { - FindClose(handle); - // no need to check whether the deletion succeeds - // as nothing can be done - DeleteFile(m_struLogFilePath.QueryStr()); - } -} - -__override -VOID -IN_PROCESS_APPLICATION::Recycle( - VOID -) -{ - // We need to guarantee that recycle is only called once, as calling pHttpServer->RecycleProcess - // multiple times can lead to AVs. - if (m_fRecycleCalled) - { - return; - } - - { - SRWLockWrapper lock(m_srwLock); - - if (m_fRecycleCalled) - { - return; - } - - m_fRecycleCalled = true; - } - - if (!m_pHttpServer->IsCommandLineLaunch()) - { - // IIS scenario. - // notify IIS first so that new request will be routed to new worker process - m_pHttpServer->RecycleProcess(L"AspNetCore InProcess Recycle Process on Demand"); - } - else - { - // IISExpress scenario - // Shutdown the managed application and call exit to terminate current process - ShutDown(); - exit(0); - } -} - -REQUEST_NOTIFICATION_STATUS -IN_PROCESS_APPLICATION::OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus, - IN_PROCESS_HANDLER* pInProcessHandler -) -{ - REQUEST_NOTIFICATION_STATUS dwRequestNotificationStatus = RQ_NOTIFICATION_CONTINUE; - - ReferenceApplication(); - - if (pInProcessHandler->QueryIsManagedRequestComplete()) - { - // means PostCompletion has been called and this is the associated callback. - dwRequestNotificationStatus = pInProcessHandler->QueryAsyncCompletionStatus(); - } - else if (m_fBlockCallbacksIntoManaged) - { - // this can potentially happen in ungraceful shutdown. - // Or something really wrong happening with async completions - // At this point, managed is in a shutting down state and we cannot send a request to it. - pInProcessHandler->QueryHttpContext()->GetResponse()->SetStatus(503, - "Server has been shutdown", - 0, - (ULONG)HRESULT_FROM_WIN32(ERROR_SHUTDOWN_IN_PROGRESS)); - dwRequestNotificationStatus = RQ_NOTIFICATION_FINISH_REQUEST; - } - else - { - // Call the managed handler for async completion. - dwRequestNotificationStatus = m_AsyncCompletionHandler(pInProcessHandler->QueryManagedHttpContext(), hrCompletionStatus, cbCompletion); - } - - DereferenceApplication(); - - return dwRequestNotificationStatus; -} - -REQUEST_NOTIFICATION_STATUS -IN_PROCESS_APPLICATION::OnExecuteRequest( - _In_ IHttpContext* pHttpContext, - _In_ IN_PROCESS_HANDLER* pInProcessHandler -) -{ - REQUEST_NOTIFICATION_STATUS dwRequestNotificationStatus = RQ_NOTIFICATION_CONTINUE; - PFN_REQUEST_HANDLER pRequestHandler = NULL; - - ReferenceApplication(); - pRequestHandler = m_RequestHandler; - - if (pRequestHandler == NULL) - { - // - // return error as the application did not register callback - // - if (ANCMEvents::ANCM_EXECUTE_REQUEST_FAIL::IsEnabled(pHttpContext->GetTraceContext())) - { - ANCMEvents::ANCM_EXECUTE_REQUEST_FAIL::RaiseEvent(pHttpContext->GetTraceContext(), - NULL, - (ULONG)E_APPLICATION_ACTIVATION_EXEC_FAILURE); - } - - pHttpContext->GetResponse()->SetStatus(500, - "Internal Server Error", - 0, - (ULONG)E_APPLICATION_ACTIVATION_EXEC_FAILURE); - - dwRequestNotificationStatus = RQ_NOTIFICATION_FINISH_REQUEST; - } - else if (m_status != APPLICATION_STATUS::RUNNING || m_fBlockCallbacksIntoManaged) - { - pHttpContext->GetResponse()->SetStatus(503, - "Server is currently shutting down.", - 0, - (ULONG)HRESULT_FROM_WIN32(ERROR_SHUTDOWN_IN_PROGRESS)); - dwRequestNotificationStatus = RQ_NOTIFICATION_FINISH_REQUEST; - } - else - { - dwRequestNotificationStatus = pRequestHandler(pInProcessHandler, m_RequestHandlerContext); - } - - DereferenceApplication(); - - return dwRequestNotificationStatus; -} - -VOID -IN_PROCESS_APPLICATION::SetCallbackHandles( - _In_ PFN_REQUEST_HANDLER request_handler, - _In_ PFN_SHUTDOWN_HANDLER shutdown_handler, - _In_ PFN_MANAGED_CONTEXT_HANDLER async_completion_handler, - _In_ VOID* pvRequstHandlerContext, - _In_ VOID* pvShutdownHandlerContext -) -{ - m_RequestHandler = request_handler; - m_RequestHandlerContext = pvRequstHandlerContext; - m_ShutdownHandler = shutdown_handler; - m_ShutdownHandlerContext = pvShutdownHandlerContext; - m_AsyncCompletionHandler = async_completion_handler; - - CloseStdErrHandles(); - // Can't check the std err handle as it isn't a critical error - SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE); - // Initialization complete - SetEvent(m_pInitalizeEvent); - m_fInitialized = TRUE; -} - -VOID -IN_PROCESS_APPLICATION::SetStdOut( - VOID -) -{ - HRESULT hr = S_OK; - STRU struPath; - SYSTEMTIME systemTime; - SECURITY_ATTRIBUTES saAttr = { 0 }; - HANDLE hStdErrReadPipe; - HANDLE hStdErrWritePipe; - - if (!m_fDoneStdRedirect) - { - // Have not set stdout yet, redirect stdout to log file - SRWLockWrapper lock(m_srwLock); - if (!m_fDoneStdRedirect) - { - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - // - // best effort - // no need to capture the error code as nothing we can do here - // in case mamanged layer exits abnormally, may not be able to capture the log content as it is buffered. - // - if (!GetConsoleWindow()) - { - // Full IIS scenario. - - // - // SetStdHandle works as w3wp does not have Console - // Current process does not have a console - // - if (m_pConfig->QueryStdoutLogEnabled()) - { - hr = UTILITY::ConvertPathToFullPath( - m_pConfig->QueryStdoutLogFile()->QueryStr(), - m_pConfig->QueryApplicationPhysicalPath()->QueryStr(), - &struPath); - if (FAILED(hr)) - { - goto Finished; - } - - hr = UTILITY::EnsureDirectoryPathExist(struPath.QueryStr()); - if (FAILED(hr)) - { - goto Finished; - } - - GetSystemTime(&systemTime); - hr = m_struLogFilePath.SafeSnwprintf(L"%s_%d%02d%02d%02d%02d%02d_%d.log", - struPath.QueryStr(), - systemTime.wYear, - systemTime.wMonth, - systemTime.wDay, - systemTime.wHour, - systemTime.wMinute, - systemTime.wSecond, - GetCurrentProcessId()); - if (FAILED(hr)) - { - goto Finished; - } - - m_hLogFileHandle = CreateFileW(m_struLogFilePath.QueryStr(), - FILE_READ_DATA | FILE_WRITE_DATA, - FILE_SHARE_READ, - &saAttr, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (m_hLogFileHandle == INVALID_HANDLE_VALUE) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (!SetStdHandle(STD_OUTPUT_HANDLE, m_hLogFileHandle)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (!SetStdHandle(STD_ERROR_HANDLE, m_hLogFileHandle)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // not work - // AllocConsole() does not help - // *stdout = *m_pStdFile; - // *stderr = *m_pStdFile; - // _dup2(_fileno(m_pStdFile), _fileno(stdout)); - // _dup2(_fileno(m_pStdFile), _fileno(stderr)); - // this one cannot capture the process start failure - // _wfreopen_s(&m_pStdFile, struLogFileName.QueryStr(), L"w", stdout); - - // Periodically flush the log content to file - m_Timer.InitializeTimer(STTIMER::TimerCallback, &m_struLogFilePath, 3000, 3000); - } - else - { - // - // CreatePipe for outputting stderr to the windows event log. - // Ignore failures - // - if (!CreatePipe(&hStdErrReadPipe, &hStdErrWritePipe, &saAttr, 0 /*nSize*/)) - { - goto Finished; - } - - if (!SetStdHandle(STD_ERROR_HANDLE, hStdErrWritePipe)) - { - goto Finished; - } - - m_hErrReadPipe = hStdErrReadPipe; - m_hErrWritePipe = hStdErrWritePipe; - - // Read the stderr handle on a separate thread until we get 4096 bytes. - m_hErrThread = CreateThread( - NULL, // default security attributes - 0, // default stack size - (LPTHREAD_START_ROUTINE)ReadStdErrHandle, - this, // thread function arguments - 0, // default creation flags - NULL); // receive thread identifier - - if (m_hErrThread == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - } - else - { - // The process has console, e.g., IIS Express scenario - - if (_wfopen_s(&m_pStdFile, m_struLogFilePath.QueryStr(), L"w") == 0) - { - // known issue: error info may not be capture when process crashes during buffering - // even we disabled FILE buffering - setvbuf(m_pStdFile, NULL, _IONBF, 0); - _dup2(_fileno(m_pStdFile), _fileno(stdout)); - _dup2(_fileno(m_pStdFile), _fileno(stderr)); - } - // These don't work for console scenario - // close and AllocConsole does not help - //_wfreopen_s(&m_pStdFile, struLogFileName.QueryStr(), L"w", stdout); - // SetStdHandle(STD_ERROR_HANDLE, m_hLogFileHandle); - // SetStdHandle(STD_OUTPUT_HANDLE, m_hLogFileHandle); - //*stdout = *m_pStdFile; - //*stderr = *m_pStdFile; - } - } - } - -Finished: - m_fDoneStdRedirect = TRUE; - if (FAILED(hr) && m_pConfig->QueryStdoutLogEnabled()) - { - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_CONFIG_ERROR, - ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG, - m_struLogFilePath.QueryStr(), - hr); - } -} - -VOID -IN_PROCESS_APPLICATION::ReadStdErrHandle( - LPVOID pContext -) -{ - IN_PROCESS_APPLICATION *pApplication = (IN_PROCESS_APPLICATION*)pContext; - DBG_ASSERT(pApplication != NULL); - pApplication->ReadStdErrHandleInternal(); -} - -VOID -IN_PROCESS_APPLICATION::ReadStdErrHandleInternal( - VOID -) -{ - DWORD dwNumBytesRead = 0; - while (true) - { - if (ReadFile(m_hErrReadPipe, &m_pzFileContents[m_dwStdErrReadTotal], 4096 - m_dwStdErrReadTotal, &dwNumBytesRead, NULL)) - { - m_dwStdErrReadTotal += dwNumBytesRead; - if (m_dwStdErrReadTotal >= 4096) - { - break; - } - } - else if (GetLastError() == ERROR_BROKEN_PIPE) - { - break; - } - } -} - -VOID -IN_PROCESS_APPLICATION::CloseStdErrHandles -( - VOID -) -{ - DWORD dwThreadStatus = 0; - DWORD dwTimeout = m_pConfig->QueryShutdownTimeLimitInMS(); - // Close Handles for stderr as we only care about capturing startup errors - if (m_hErrWritePipe != INVALID_HANDLE_VALUE) - { - CloseHandle(m_hErrWritePipe); - m_hErrWritePipe = INVALID_HANDLE_VALUE; - } - - if (m_hErrThread != NULL && - GetExitCodeThread(m_hErrThread, &dwThreadStatus) != 0 && - dwThreadStatus == STILL_ACTIVE) - { - // wait for gracefullshut down, i.e., the exit of the background thread or timeout - if (WaitForSingleObject(m_hErrThread, dwTimeout) != WAIT_OBJECT_0) - { - // if the thread is still running, we need kill it first before exit to avoid AV - if (GetExitCodeThread(m_hErrThread, &dwThreadStatus) != 0 && dwThreadStatus == STILL_ACTIVE) - { - TerminateThread(m_hErrThread, STATUS_CONTROL_C_EXIT); - } - } - } - - CloseHandle(m_hErrThread); - m_hErrThread = NULL; - - if (m_hErrReadPipe != INVALID_HANDLE_VALUE) - { - CloseHandle(m_hErrReadPipe); - m_hErrReadPipe = INVALID_HANDLE_VALUE; - } -} - -// Will be called by the inprocesshandler -HRESULT -IN_PROCESS_APPLICATION::LoadManagedApplication -( - VOID -) -{ - HRESULT hr = S_OK; - DWORD dwTimeout; - DWORD dwResult; - - ReferenceApplication(); - - if (m_status != APPLICATION_STATUS::STARTING) - { - // Core CLR has already been loaded. - // Cannot load more than once even there was a failure - if (m_status == APPLICATION_STATUS::FAIL) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - } - else if (m_status == APPLICATION_STATUS::SHUTDOWN) - { - hr = HRESULT_FROM_WIN32(ERROR_SHUTDOWN_IS_SCHEDULED); - } - - goto Finished; - } - - // Set up stdout redirect - SetStdOut(); - - { - SRWLockWrapper lock(m_srwLock); - if (m_status != APPLICATION_STATUS::STARTING) - { - if (m_status == APPLICATION_STATUS::FAIL) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - } - else if (m_status == APPLICATION_STATUS::SHUTDOWN) - { - hr = HRESULT_FROM_WIN32(ERROR_SHUTDOWN_IS_SCHEDULED); - } - - goto Finished; - } - m_hThread = CreateThread( - NULL, // default security attributes - 0, // default stack size - (LPTHREAD_START_ROUTINE)ExecuteAspNetCoreProcess, - this, // thread function arguments - 0, // default creation flags - NULL); // receive thread identifier - - if (m_hThread == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - m_pInitalizeEvent = CreateEvent( - NULL, // default security attributes - TRUE, // manual reset event - FALSE, // not set - NULL); // name - - if (m_pInitalizeEvent == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - } - - // If the debugger is attached, never timeout - if (IsDebuggerPresent()) - { - dwTimeout = INFINITE; - } - else - { - dwTimeout = m_pConfig->QueryStartupTimeLimitInMS(); - } - - const HANDLE pHandles[2]{ m_hThread, m_pInitalizeEvent }; - - // Wait on either the thread to complete or the event to be set - dwResult = WaitForMultipleObjects(2, pHandles, FALSE, dwTimeout); - - // It all timed out - if (dwResult == WAIT_TIMEOUT) - { - // kill the backend thread as loading dotnet timedout - TerminateThread(m_hThread, 0); - hr = HRESULT_FROM_WIN32(dwResult); - goto Finished; - } - else if (dwResult == WAIT_FAILED) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // The thread ended it means that something failed - if (dwResult == WAIT_OBJECT_0) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - goto Finished; - } - - m_status = APPLICATION_STATUS::RUNNING; - } -Finished: - - if (FAILED(hr)) - { - m_status = APPLICATION_STATUS::FAIL; - - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_LOAD_CLR_FALIURE, - ASPNETCORE_EVENT_LOAD_CLR_FALIURE_MSG, - m_pConfig->QueryApplicationPath()->QueryStr(), - m_pConfig->QueryApplicationPhysicalPath()->QueryStr(), - hr); - } - DereferenceApplication(); - - return hr; -} - -// static -VOID -IN_PROCESS_APPLICATION::ExecuteAspNetCoreProcess( - _In_ LPVOID pContext -) -{ - HRESULT hr = S_OK; - IN_PROCESS_APPLICATION *pApplication = (IN_PROCESS_APPLICATION*)pContext; - DBG_ASSERT(pApplication != NULL); - hr = pApplication->ExecuteApplication(); - // - // no need to log the error here as if error happened, the thread will exit - // the error will ba catched by caller LoadManagedApplication which will log an error - // - -} - -HRESULT -IN_PROCESS_APPLICATION::SetEnvironementVariablesOnWorkerProcess( - VOID -) -{ - HRESULT hr = S_OK; - ENVIRONMENT_VAR_HASH* pHashTable = NULL; - if (FAILED(hr = ENVIRONMENT_VAR_HELPERS::InitEnvironmentVariablesTable( - m_pConfig->QueryEnvironmentVariables(), - m_pConfig->QueryWindowsAuthEnabled(), - m_pConfig->QueryBasicAuthEnabled(), - m_pConfig->QueryAnonymousAuthEnabled(), - &pHashTable))) - { - goto Finished; - } - - pHashTable->Apply(ENVIRONMENT_VAR_HELPERS::AppendEnvironmentVariables, &hr); - if (FAILED(hr)) - { - goto Finished; - } - pHashTable->Apply(ENVIRONMENT_VAR_HELPERS::SetEnvironmentVariables, &hr); - if (FAILED(hr)) - { - goto Finished; - } -Finished: - return hr; -} - -HRESULT -IN_PROCESS_APPLICATION::ExecuteApplication( - VOID -) -{ - HRESULT hr = S_OK; - HMODULE hModule; - hostfxr_main_fn pProc; - - DBG_ASSERT(m_status == APPLICATION_STATUS::STARTING); - - hModule = LoadLibraryW(m_pConfig->QueryHostFxrFullPath()); - - if (hModule == NULL) - { - // .NET Core not installed (we can log a more detailed error message here) - hr = ERROR_BAD_ENVIRONMENT; - goto Finished; - } - - // Get the entry point for main - pProc = (hostfxr_main_fn)GetProcAddress(hModule, "hostfxr_main"); - if (pProc == NULL) - { - hr = ERROR_BAD_ENVIRONMENT; - goto Finished; - } - - if (FAILED(hr = SetEnvironementVariablesOnWorkerProcess())) - { - goto Finished; - } - - // There can only ever be a single instance of .NET Core - // loaded in the process but we need to get config information to boot it up in the - // first place. This is happening in an execute request handler and everyone waits - // until this initialization is done. - // We set a static so that managed code can call back into this instance and - // set the callbacks - s_Application = this; - - hr = RunDotnetApplication(m_pConfig->QueryHostFxrArgCount(), m_pConfig->QueryHostFxrArguments(), pProc); - -Finished: - - // - // this method is called by the background thread and should never exit unless shutdown - // If main returned and shutdown was not called in managed, we want to block native from calling into - // managed. To do this, we can say that shutdown was called from managed. - // Don't bother locking here as there will always be a race between receiving a native shutdown - // notification and unexpected managed exit. - // - m_status = APPLICATION_STATUS::SHUTDOWN; - m_fShutdownCalledFromManaged = TRUE; - FreeLibrary(hModule); - - if (!m_fShutdownCalledFromNative) - { - LogErrorsOnMainExit(hr); - if (m_fInitialized) - { - // - // If the inprocess server was initialized, we need to cause recycle to be called on the worker process. - // - Recycle(); - } - } - - return hr; -} - -VOID -IN_PROCESS_APPLICATION::LogErrorsOnMainExit( - HRESULT hr -) -{ - // - // Ungraceful shutdown, try to log an error message. - // This will be a common place for errors as it means the hostfxr_main returned - // or there was an exception. - // - CHAR pzFileContents[4096] = { 0 }; - DWORD dwNumBytesRead; - STRU struStdErrLog; - LARGE_INTEGER li = { 0 }; - BOOL fLogged = FALSE; - DWORD dwFilePointer = 0; - - if (m_pConfig->QueryStdoutLogEnabled()) - { - // Put stdout/stderr logs into - if (m_hLogFileHandle != INVALID_HANDLE_VALUE) - { - if (GetFileSizeEx(m_hLogFileHandle, &li) && li.LowPart > 0 && li.HighPart == 0) - { - if (li.LowPart > 4096) - { - dwFilePointer = SetFilePointer(m_hLogFileHandle, -4096, NULL, FILE_END); - } - else - { - dwFilePointer = SetFilePointer(m_hLogFileHandle, 0, NULL, FILE_BEGIN); - } - if (dwFilePointer != INVALID_SET_FILE_POINTER) - { - if (ReadFile(m_hLogFileHandle, pzFileContents, 4096, &dwNumBytesRead, NULL)) - { - if (SUCCEEDED(struStdErrLog.CopyA(m_pzFileContents, m_dwStdErrReadTotal))) - { - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDOUT_MSG, - m_pConfig->QueryApplicationPath()->QueryStr(), - m_pConfig->QueryApplicationPhysicalPath()->QueryStr(), - hr, - struStdErrLog.QueryStr()); - fLogged = TRUE; - - } - } - } - } - } - } - else - { - if (m_dwStdErrReadTotal > 0) - { - if (SUCCEEDED(struStdErrLog.CopyA(m_pzFileContents, m_dwStdErrReadTotal))) - { - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_STDERR_MSG, - m_pConfig->QueryApplicationPath()->QueryStr(), - m_pConfig->QueryApplicationPhysicalPath()->QueryStr(), - hr, - struStdErrLog.QueryStr()); - fLogged = TRUE; - } - } - } - - if (!fLogged) - { - // If we didn't log, log the generic message. - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT, - ASPNETCORE_EVENT_INPROCESS_THREAD_EXIT_MSG, - m_pConfig->QueryApplicationPath()->QueryStr(), - m_pConfig->QueryApplicationPhysicalPath()->QueryStr(), - hr); - fLogged = TRUE; - } -} - -// -// Calls hostfxr_main with the hostfxr and application as arguments. -// Method should be called with only -// Need to have __try / __except in methods that require unwinding. -// Note, this will not -// -HRESULT -IN_PROCESS_APPLICATION::RunDotnetApplication(DWORD argc, CONST PCWSTR* argv, hostfxr_main_fn pProc) -{ - HRESULT hr = S_OK; - __try - { - m_ProcessExitCode = pProc(argc, argv); - } - __except (FilterException(GetExceptionCode(), GetExceptionInformation())) - { - // TODO Log error message here. - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - } - - return hr; -} - -// static -INT -IN_PROCESS_APPLICATION::FilterException(unsigned int, struct _EXCEPTION_POINTERS*) -{ - // We assume that any exception is a failure as the applicaiton didn't start or there was a startup error. - // TODO, log error based on exception code. - return EXCEPTION_EXECUTE_HANDLER; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h deleted file mode 100644 index a97fa0a3a9..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocessapplication.h +++ /dev/null @@ -1,191 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -typedef REQUEST_NOTIFICATION_STATUS(WINAPI * PFN_REQUEST_HANDLER) (IN_PROCESS_HANDLER* pInProcessHandler, void* pvRequestHandlerContext); -typedef BOOL(WINAPI * PFN_SHUTDOWN_HANDLER) (void* pvShutdownHandlerContext); -typedef REQUEST_NOTIFICATION_STATUS(WINAPI * PFN_MANAGED_CONTEXT_HANDLER)(void *pvManagedHttpContext, HRESULT hrCompletionStatus, DWORD cbCompletion); - -class IN_PROCESS_APPLICATION : public APPLICATION -{ -public: - IN_PROCESS_APPLICATION(IHttpServer* pHttpServer, ASPNETCORE_CONFIG* pConfig); - - ~IN_PROCESS_APPLICATION(); - - __override - VOID - ShutDown(); - - VOID - SetCallbackHandles( - _In_ PFN_REQUEST_HANDLER request_callback, - _In_ PFN_SHUTDOWN_HANDLER shutdown_callback, - _In_ PFN_MANAGED_CONTEXT_HANDLER managed_context_callback, - _In_ VOID* pvRequstHandlerContext, - _In_ VOID* pvShutdownHandlerContext - ); - - __override - VOID - Recycle( - VOID - ); - - // Executes the .NET Core process - HRESULT - ExecuteApplication( - VOID - ); - - VOID - ReadStdErrHandleInternal( - VOID - ); - - VOID - CloseStdErrHandles( - VOID - ); - - HRESULT - LoadManagedApplication( - VOID - ); - - VOID - LogErrorsOnMainExit( - HRESULT hr - ); - - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus, - IN_PROCESS_HANDLER* pInProcessHandler - ); - - REQUEST_NOTIFICATION_STATUS - OnExecuteRequest - ( - IHttpContext* pHttpContext, - IN_PROCESS_HANDLER* pInProcessHandler - ); - - VOID - StopCallsIntoManaged( - VOID - ) - { - m_fBlockCallbacksIntoManaged = TRUE; - } - - VOID - StopIncomingRequests( - VOID - ) - { - m_fShutdownCalledFromManaged = TRUE; - } - - static - IN_PROCESS_APPLICATION* - GetInstance( - VOID - ) - { - return s_Application; - } - -private: - static - VOID - DoShutDown( - LPVOID lpParam - ); - - VOID - ShutDownInternal( - VOID - ); - - IHttpServer* const m_pHttpServer; - - // Thread executing the .NET Core process - HANDLE m_hThread; - - // The request handler callback from managed code - PFN_REQUEST_HANDLER m_RequestHandler; - VOID* m_RequestHandlerContext; - - // The shutdown handler callback from managed code - PFN_SHUTDOWN_HANDLER m_ShutdownHandler; - VOID* m_ShutdownHandlerContext; - - PFN_MANAGED_CONTEXT_HANDLER m_AsyncCompletionHandler; - - // The event that gets triggered when managed initialization is complete - HANDLE m_pInitalizeEvent; - - // The std log file handle - HANDLE m_hLogFileHandle; - HANDLE m_hErrReadPipe; - HANDLE m_hErrWritePipe; - STRU m_struLogFilePath; - - // The exit code of the .NET Core process - INT m_ProcessExitCode; - - BOOL m_fIsWebSocketsConnection; - BOOL m_fDoneStdRedirect; - volatile BOOL m_fBlockCallbacksIntoManaged; - volatile BOOL m_fShutdownCalledFromNative; - volatile BOOL m_fShutdownCalledFromManaged; - BOOL m_fRecycleCalled; - BOOL m_fInitialized; - - FILE* m_pStdFile; - STTIMER m_Timer; - SRWLOCK m_srwLock; - - // Thread for capturing startup stderr logs when logging is disabled - HANDLE m_hErrThread; - CHAR m_pzFileContents[4096] = { 0 }; - DWORD m_dwStdErrReadTotal; - static IN_PROCESS_APPLICATION* s_Application; - - VOID - SetStdOut( - VOID - ); - - static - VOID - ExecuteAspNetCoreProcess( - _In_ LPVOID pContext - ); - - static - VOID - ReadStdErrHandle - ( - _In_ LPVOID pContext - ); - - HRESULT - SetEnvironementVariablesOnWorkerProcess( - VOID - ); - - static - INT - FilterException(unsigned int code, struct _EXCEPTION_POINTERS *ep); - - HRESULT - RunDotnetApplication( - DWORD argc, - CONST PCWSTR* argv, - hostfxr_main_fn pProc - ); -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp deleted file mode 100644 index c98d84744c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.cpp +++ /dev/null @@ -1,136 +0,0 @@ -#include "..\precomp.hxx" - -IN_PROCESS_HANDLER::IN_PROCESS_HANDLER( - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication -): REQUEST_HANDLER(pW3Context, pModuleId, pApplication) -{ - m_fManagedRequestComplete = FALSE; -} - -IN_PROCESS_HANDLER::~IN_PROCESS_HANDLER() -{ - //todo -} - -__override -REQUEST_NOTIFICATION_STATUS -IN_PROCESS_HANDLER::OnExecuteRequestHandler() -{ - // First get the in process Application - HRESULT hr; - hr = ((IN_PROCESS_APPLICATION*)m_pApplication)->LoadManagedApplication(); - if (FAILED(hr)) - { - // TODO remove com_error? - /*_com_error err(hr); - if (ANCMEvents::ANCM_START_APPLICATION_FAIL::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_START_APPLICATION_FAIL::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL, - err.ErrorMessage()); - } - */ - //fInternalError = TRUE; - m_pW3Context->GetResponse()->SetStatus(500, "Internal Server Error", 0, hr); - return REQUEST_NOTIFICATION_STATUS::RQ_NOTIFICATION_FINISH_REQUEST; - } - - // FREB log - - if (ANCMEvents::ANCM_START_APPLICATION_SUCCESS::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_START_APPLICATION_SUCCESS::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL, - L"InProcess Application"); - } - - //SetHttpSysDisconnectCallback(); - return ((IN_PROCESS_APPLICATION*)m_pApplication)->OnExecuteRequest(m_pW3Context, this); -} - -__override -REQUEST_NOTIFICATION_STATUS -IN_PROCESS_HANDLER::OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus -) -{ - IN_PROCESS_APPLICATION* application = (IN_PROCESS_APPLICATION*)m_pApplication; - if (application == NULL) - { - return RQ_NOTIFICATION_FINISH_REQUEST; - } - - // OnAsyncCompletion must call into the application if there was a error. We will redo calls - // to Read/Write if we called cancelIo on the IHttpContext. - return application->OnAsyncCompletion(cbCompletion, hrCompletionStatus, this); -} - -VOID -IN_PROCESS_HANDLER::TerminateRequest( - bool fClientInitiated -) -{ - UNREFERENCED_PARAMETER(fClientInitiated); - //todo -} - -PVOID -IN_PROCESS_HANDLER::QueryManagedHttpContext( - VOID -) -{ - return m_pManagedHttpContext; -} - -BOOL -IN_PROCESS_HANDLER::QueryIsManagedRequestComplete( - VOID -) -{ - return m_fManagedRequestComplete; -} - -IHttpContext* -IN_PROCESS_HANDLER::QueryHttpContext( - VOID -) -{ - return m_pW3Context; -} - -VOID -IN_PROCESS_HANDLER::IndicateManagedRequestComplete( - VOID -) -{ - m_fManagedRequestComplete = TRUE; -} - -REQUEST_NOTIFICATION_STATUS -IN_PROCESS_HANDLER::QueryAsyncCompletionStatus( - VOID -) -{ - return m_requestNotificationStatus; -} - -VOID -IN_PROCESS_HANDLER::SetAsyncCompletionStatus( - REQUEST_NOTIFICATION_STATUS requestNotificationStatus -) -{ - m_requestNotificationStatus = requestNotificationStatus; -} - -VOID -IN_PROCESS_HANDLER::SetManagedHttpContext( - PVOID pManagedHttpContext -) -{ - m_pManagedHttpContext = pManagedHttpContext; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h deleted file mode 100644 index 1ea1a8dbc5..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/inprocess/inprocesshandler.h +++ /dev/null @@ -1,72 +0,0 @@ -#pragma once - -class IN_PROCESS_HANDLER : public REQUEST_HANDLER -{ -public: - IN_PROCESS_HANDLER( - - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication); - - ~IN_PROCESS_HANDLER(); - - __override - REQUEST_NOTIFICATION_STATUS - OnExecuteRequestHandler(); - - __override - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus - ); - - __override - VOID - TerminateRequest( - bool fClientInitiated - - ); - - PVOID - QueryManagedHttpContext( - VOID - ); - - VOID - SetManagedHttpContext( - PVOID pManagedHttpContext - ); - - IHttpContext* - QueryHttpContext( - VOID - ); - - BOOL - QueryIsManagedRequestComplete( - VOID - ); - - VOID - IndicateManagedRequestComplete( - VOID - ); - - REQUEST_NOTIFICATION_STATUS - QueryAsyncCompletionStatus( - VOID - ); - - VOID - SetAsyncCompletionStatus( - REQUEST_NOTIFICATION_STATUS requestNotificationStatus - ); - -private: - PVOID m_pManagedHttpContext; - IHttpContext* m_pHttpContext; - BOOL m_fManagedRequestComplete; - REQUEST_NOTIFICATION_STATUS m_requestNotificationStatus; -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx deleted file mode 100644 index 85eb5b4d47..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/managedexports.cxx +++ /dev/null @@ -1,450 +0,0 @@ -// Copyright (c) .NET Foundation and contributors. All rights reserved. -// Licensed under the MIT license. See LICENSE file in the project root for full license information. - -#include "precomp.hxx" - -// -// Initialization export -// -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -VOID -register_callbacks( - _In_ PFN_REQUEST_HANDLER request_handler, - _In_ PFN_SHUTDOWN_HANDLER shutdown_handler, - _In_ PFN_MANAGED_CONTEXT_HANDLER async_completion_handler, - _In_ VOID* pvRequstHandlerContext, - _In_ VOID* pvShutdownHandlerContext -) -{ - IN_PROCESS_APPLICATION::GetInstance()->SetCallbackHandles( - request_handler, - shutdown_handler, - async_completion_handler, - pvRequstHandlerContext, - pvShutdownHandlerContext - ); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HTTP_REQUEST* -http_get_raw_request( - _In_ IN_PROCESS_HANDLER* pInProcessHandler -) -{ - return pInProcessHandler->QueryHttpContext()->GetRequest()->GetRawHttpRequest(); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HTTP_RESPONSE* -http_get_raw_response( - _In_ IN_PROCESS_HANDLER* pInProcessHandler -) -{ - return pInProcessHandler->QueryHttpContext()->GetResponse()->GetRawHttpResponse(); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_get_server_variable( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ PCSTR pszVariableName, - _Out_ BSTR* pwszReturn -) -{ - PCWSTR pszVariableValue; - DWORD cbLength; - HRESULT hr = pInProcessHandler - ->QueryHttpContext() - ->GetServerVariable(pszVariableName, &pszVariableValue, &cbLength); - - if (FAILED(hr) || cbLength == 0) - { - goto Finished; - } - - *pwszReturn = SysAllocString(pszVariableValue); - - if (*pwszReturn == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - -Finished: - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_set_response_status_code( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ USHORT statusCode, - _In_ PCSTR pszReason -) -{ - return pInProcessHandler->QueryHttpContext()->GetResponse()->SetStatus(statusCode, pszReason); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_post_completion( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - DWORD cbBytes -) -{ - return pInProcessHandler->QueryHttpContext()->PostCompletion(cbBytes); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_set_completion_status( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ REQUEST_NOTIFICATION_STATUS requestNotificationStatus -) -{ - HRESULT hr = S_OK; - - pInProcessHandler->IndicateManagedRequestComplete(); - pInProcessHandler->SetAsyncCompletionStatus(requestNotificationStatus); - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_set_managed_context( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ PVOID pvManagedContext -) -{ - // todo: should we consider changing the signature - HRESULT hr = S_OK; - pInProcessHandler->SetManagedHttpContext(pvManagedContext); - - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -VOID -http_indicate_completion( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ REQUEST_NOTIFICATION_STATUS notificationStatus -) -{ - pInProcessHandler->QueryHttpContext()->IndicateCompletion(notificationStatus); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -VOID -http_get_completion_info( - _In_ IHttpCompletionInfo2* info, - _Out_ DWORD* cbBytes, - _Out_ HRESULT* hr -) -{ - *cbBytes = info->GetCompletionBytes(); - *hr = info->GetCompletionStatus(); -} - -// -// todo: we should not rely on IN_PROCESS_APPLICATION::GetInstance() -// the signature should be changed. application's based address should be passed in -// - -struct IISConfigurationData -{ - BSTR pwzFullApplicationPath; - BSTR pwzVirtualApplicationPath; - BOOL fWindowsAuthEnabled; - BOOL fBasicAuthEnabled; - BOOL fAnonymousAuthEnable; -}; - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_get_application_properties( - _In_ IISConfigurationData* pIISCofigurationData -) -{ - ASPNETCORE_CONFIG* pConfiguration = NULL; - IN_PROCESS_APPLICATION* pApplication = IN_PROCESS_APPLICATION::GetInstance(); - - if (pApplication == NULL) - { - return E_FAIL; - } - - pConfiguration = pApplication->QueryConfig(); - - pIISCofigurationData->pwzFullApplicationPath = SysAllocString(pConfiguration->QueryApplicationPhysicalPath()->QueryStr()); - pIISCofigurationData->pwzVirtualApplicationPath = SysAllocString(pConfiguration->QueryApplicationVirtualPath()->QueryStr()); - pIISCofigurationData->fWindowsAuthEnabled = pConfiguration->QueryWindowsAuthEnabled(); - pIISCofigurationData->fBasicAuthEnabled = pConfiguration->QueryBasicAuthEnabled(); - pIISCofigurationData->fAnonymousAuthEnable = pConfiguration->QueryAnonymousAuthEnabled(); - - return S_OK; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_read_request_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _Out_ CHAR* pvBuffer, - _In_ DWORD dwCbBuffer, - _Out_ DWORD* pdwBytesReceived, - _Out_ BOOL* pfCompletionPending -) -{ - HRESULT hr = S_OK; - - if (pInProcessHandler == NULL) - { - return E_FAIL; - } - if (dwCbBuffer == 0) - { - return E_FAIL; - } - IHttpRequest *pHttpRequest = (IHttpRequest*)pInProcessHandler->QueryHttpContext()->GetRequest(); - - // Check if there is anything to read - if (pHttpRequest->GetRemainingEntityBytes() > 0) - { - BOOL fAsync = TRUE; - hr = pHttpRequest->ReadEntityBody( - pvBuffer, - dwCbBuffer, - fAsync, - pdwBytesReceived, - pfCompletionPending); - - if (hr == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF)) - { - // We reached the end of the data - hr = S_OK; - } - } - else - { - *pdwBytesReceived = 0; - *pfCompletionPending = FALSE; - } - - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_write_response_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ HTTP_DATA_CHUNK* pDataChunks, - _In_ DWORD dwChunks, - _In_ BOOL* pfCompletionExpected -) -{ - IHttpResponse *pHttpResponse = (IHttpResponse*)pInProcessHandler->QueryHttpContext()->GetResponse(); - BOOL fAsync = TRUE; - BOOL fMoreData = TRUE; - DWORD dwBytesSent = 0; - - HRESULT hr = pHttpResponse->WriteEntityChunks( - pDataChunks, - dwChunks, - fAsync, - fMoreData, - &dwBytesSent, - pfCompletionExpected); - - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_flush_response_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _Out_ BOOL* pfCompletionExpected -) -{ - IHttpResponse *pHttpResponse = (IHttpResponse*)pInProcessHandler->QueryHttpContext()->GetResponse(); - - BOOL fAsync = TRUE; - BOOL fMoreData = TRUE; - DWORD dwBytesSent = 0; - - HRESULT hr = pHttpResponse->Flush( - fAsync, - fMoreData, - &dwBytesSent, - pfCompletionExpected); - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_websockets_read_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ CHAR* pvBuffer, - _In_ DWORD cbBuffer, - _In_ PFN_ASYNC_COMPLETION pfnCompletionCallback, - _In_ VOID* pvCompletionContext, - _In_ DWORD* pDwBytesReceived, - _In_ BOOL* pfCompletionPending -) -{ - IHttpRequest3 *pHttpRequest = (IHttpRequest3*)pInProcessHandler->QueryHttpContext()->GetRequest(); - - BOOL fAsync = TRUE; - - HRESULT hr = pHttpRequest->ReadEntityBody( - pvBuffer, - cbBuffer, - fAsync, - pfnCompletionCallback, - pvCompletionContext, - pDwBytesReceived, - pfCompletionPending); - - if (hr == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF)) - { - // We reached the end of the data - hr = S_OK; - } - - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_websockets_write_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ HTTP_DATA_CHUNK* pDataChunks, - _In_ DWORD dwChunks, - _In_ PFN_ASYNC_COMPLETION pfnCompletionCallback, - _In_ VOID* pvCompletionContext, - _In_ BOOL* pfCompletionExpected -) -{ - IHttpResponse2 *pHttpResponse = (IHttpResponse2*)pInProcessHandler->QueryHttpContext()->GetResponse(); - - BOOL fAsync = TRUE; - BOOL fMoreData = TRUE; - DWORD dwBytesSent; - - HRESULT hr = pHttpResponse->WriteEntityChunks( - pDataChunks, - dwChunks, - fAsync, - fMoreData, - pfnCompletionCallback, - pvCompletionContext, - &dwBytesSent, - pfCompletionExpected); - - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_websockets_flush_bytes( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ PFN_ASYNC_COMPLETION pfnCompletionCallback, - _In_ VOID* pvCompletionContext, - _In_ BOOL* pfCompletionExpected -) -{ - IHttpResponse2 *pHttpResponse = (IHttpResponse2*)pInProcessHandler->QueryHttpContext()->GetResponse(); - - BOOL fAsync = TRUE; - BOOL fMoreData = TRUE; - DWORD dwBytesSent; - - HRESULT hr = pHttpResponse->Flush( - fAsync, - fMoreData, - pfnCompletionCallback, - pvCompletionContext, - &dwBytesSent, - pfCompletionExpected); - return hr; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_enable_websockets( - _In_ IN_PROCESS_HANDLER* pInProcessHandler -) -{ - //if (!g_fWebSocketSupported) - //{ - // return E_FAIL; - //} - - ((IHttpContext3*)pInProcessHandler->QueryHttpContext())->EnableFullDuplex(); - ((IHttpResponse2*)pInProcessHandler->QueryHttpContext()->GetResponse())->DisableBuffering(); - - return S_OK; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_cancel_io( - _In_ IN_PROCESS_HANDLER* pInProcessHandler -) -{ - return pInProcessHandler->QueryHttpContext()->CancelIo(); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_response_set_unknown_header( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ PCSTR pszHeaderName, - _In_ PCSTR pszHeaderValue, - _In_ USHORT usHeaderValueLength, - _In_ BOOL fReplace -) -{ - return pInProcessHandler->QueryHttpContext()->GetResponse()->SetHeader(pszHeaderName, pszHeaderValue, usHeaderValueLength, fReplace); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_response_set_known_header( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _In_ HTTP_HEADER_ID dwHeaderId, - _In_ PCSTR pszHeaderValue, - _In_ USHORT usHeaderValueLength, - _In_ BOOL fReplace -) -{ - return pInProcessHandler->QueryHttpContext()->GetResponse()->SetHeader(dwHeaderId, pszHeaderValue, usHeaderValueLength, fReplace); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -HRESULT -http_get_authentication_information( - _In_ IN_PROCESS_HANDLER* pInProcessHandler, - _Out_ BSTR* pstrAuthType, - _Out_ VOID** pvToken -) -{ - *pstrAuthType = SysAllocString(pInProcessHandler->QueryHttpContext()->GetUser()->GetAuthenticationType()); - *pvToken = pInProcessHandler->QueryHttpContext()->GetUser()->GetPrimaryToken(); - - return S_OK; -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -VOID -http_stop_calls_into_managed() -{ - IN_PROCESS_APPLICATION::GetInstance()->StopCallsIntoManaged(); -} - -EXTERN_C __MIDL_DECLSPEC_DLLEXPORT -VOID -http_stop_incoming_requests() -{ - IN_PROCESS_APPLICATION::GetInstance()->StopIncomingRequests(); -} - -// End of export diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.cxx deleted file mode 100644 index 99990f938c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.cxx +++ /dev/null @@ -1,52 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" - -FORWARDER_CONNECTION::FORWARDER_CONNECTION( - VOID -) : m_cRefs (1), - m_hConnection (NULL) -{ -} - -HRESULT -FORWARDER_CONNECTION::Initialize( - DWORD dwPort -) -{ - HRESULT hr = S_OK; - - hr = m_ConnectionKey.Initialize( dwPort ); - if ( FAILED( hr ) ) - { - goto Finished; - } - - m_hConnection = WinHttpConnect(g_hWinhttpSession, - L"127.0.0.1", - (USHORT) dwPort, - 0); - if (m_hConnection == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // - // Since WinHttp will not emit WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING - // when closing WebSocket handle on Win8. Register callback at Connect level as a workaround - // - if (WinHttpSetStatusCallback(m_hConnection, - FORWARDING_HANDLER::OnWinHttpCompletion, - WINHTTP_CALLBACK_FLAG_HANDLES, - NULL) == WINHTTP_INVALID_STATUS_CALLBACK) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - -Finished: - - return hr; -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.h deleted file mode 100644 index 232e239888..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwarderconnection.h +++ /dev/null @@ -1,157 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -// -// The key used for hash-table lookups, consists of the port on which the http process is created. -// -class FORWARDER_CONNECTION_KEY -{ -public: - - FORWARDER_CONNECTION_KEY( - VOID - ) - { - } - - HRESULT - Initialize( - _In_ DWORD dwPort - ) - { - m_dwPort = dwPort; - return S_OK; - } - - BOOL - GetIsEqual( - const FORWARDER_CONNECTION_KEY * key2 - ) const - { - return m_dwPort == key2->m_dwPort; - } - - DWORD CalcKeyHash() const - { - // TODO: Review hash distribution. - return Hash(m_dwPort); - } - -private: - - DWORD m_dwPort; -}; - -class FORWARDER_CONNECTION -{ -public: - - FORWARDER_CONNECTION( - VOID - ); - - HRESULT - Initialize( - DWORD dwPort - ); - - HINTERNET - QueryHandle() const - { - return m_hConnection; - } - - VOID - ReferenceForwarderConnection() const - { - InterlockedIncrement(&m_cRefs); - } - - VOID - DereferenceForwarderConnection() const - { - if (InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - } - } - - FORWARDER_CONNECTION_KEY * - QueryConnectionKey() - { - return &m_ConnectionKey; - } - -private: - - ~FORWARDER_CONNECTION() - { - if (m_hConnection != NULL) - { - WinHttpCloseHandle(m_hConnection); - m_hConnection = NULL; - } - } - - mutable LONG m_cRefs; - FORWARDER_CONNECTION_KEY m_ConnectionKey; - HINTERNET m_hConnection; -}; - -class FORWARDER_CONNECTION_HASH : - public HASH_TABLE -{ - -public: - - FORWARDER_CONNECTION_HASH() - {} - - FORWARDER_CONNECTION_KEY * - ExtractKey( - FORWARDER_CONNECTION *pConnection - ) - { - return pConnection->QueryConnectionKey(); - } - - DWORD - CalcKeyHash( - FORWARDER_CONNECTION_KEY *key - ) - { - return key->CalcKeyHash(); - } - - BOOL - EqualKeys( - FORWARDER_CONNECTION_KEY *key1, - FORWARDER_CONNECTION_KEY *key2 - ) - { - return key1->GetIsEqual(key2); - } - - VOID - ReferenceRecord( - FORWARDER_CONNECTION *pConnection - ) - { - pConnection->ReferenceForwarderConnection(); - } - - VOID - DereferenceRecord( - FORWARDER_CONNECTION *pConnection - ) - { - pConnection->DereferenceForwarderConnection(); - } - -private: - - FORWARDER_CONNECTION_HASH(const FORWARDER_CONNECTION_HASH &); - void operator=(const FORWARDER_CONNECTION_HASH &); -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp deleted file mode 100644 index 4614b27d34..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.cpp +++ /dev/null @@ -1,2747 +0,0 @@ -#include "..\precomp.hxx" - -// Just to be aware of the FORWARDING_HANDLER object size. -C_ASSERT(sizeof(FORWARDING_HANDLER) <= 632); - -#define DEF_MAX_FORWARDS 32 -#define HEX_TO_ASCII(c) ((CHAR)(((c) < 10) ? ((c) + '0') : ((c) + 'a' - 10))) -#define BUFFER_SIZE (8192UL) -#define ENTITY_BUFFER_SIZE (6 + BUFFER_SIZE + 2) - -#define FORWARDING_HANDLER_SIGNATURE ((DWORD)'FHLR') -#define FORWARDING_HANDLER_SIGNATURE_FREE ((DWORD)'fhlr') - -STRA FORWARDING_HANDLER::sm_pStra502ErrorMsg; -ALLOC_CACHE_HANDLER * FORWARDING_HANDLER::sm_pAlloc = NULL; -TRACE_LOG * FORWARDING_HANDLER::sm_pTraceLog = NULL; -PROTOCOL_CONFIG FORWARDING_HANDLER::sm_ProtocolConfig; -RESPONSE_HEADER_HASH * FORWARDING_HANDLER::sm_pResponseHeaderHash = NULL; - -FORWARDING_HANDLER::FORWARDING_HANDLER( - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication -) : REQUEST_HANDLER(pW3Context, pModuleId, pApplication), - m_Signature(FORWARDING_HANDLER_SIGNATURE), - m_RequestStatus(FORWARDER_START), - m_fClientDisconnected(FALSE), - m_fResponseHeadersReceivedAndSet(FALSE), - m_fDoReverseRewriteHeaders(FALSE), - m_fFinishRequest(FALSE), - m_fHasError(FALSE), - m_pszHeaders(NULL), - m_cchHeaders(0), - m_BytesToReceive(0), - m_BytesToSend(0), - m_fWebSocketEnabled(FALSE), - m_pWebSocket(NULL), - m_dwHandlers (1), // default http handler - m_fDoneAsyncCompletion(FALSE), - m_fHttpHandleInClose(FALSE), - m_fWebSocketHandleInClose(FALSE), - m_fServerResetConn(FALSE) -{ -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::FORWARDING_HANDLER"); -#endif - - InitializeSRWLock(&m_RequestLock); -} - -FORWARDING_HANDLER::~FORWARDING_HANDLER( -) -{ - // - // Destructor has started. - // - m_Signature = FORWARDING_HANDLER_SIGNATURE_FREE; - -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::~FORWARDING_HANDLER"); -#endif - // - // RemoveRequest() should already have been called and m_pDisconnect - // has been freed or m_pDisconnect was never initialized. - // - // Disconnect notification cleanup would happen first, before - // the FORWARDING_HANDLER instance got removed from m_pSharedhandler list. - // The m_pServer cleanup would happen afterwards, since there may be a - // call pending from SHARED_HANDLER to FORWARDING_HANDLER::SetStatusAndHeaders() - // - DBG_ASSERT(m_pDisconnect == NULL); - - RemoveRequest(); - - FreeResponseBuffers(); - - if (m_pWebSocket) - { - m_pWebSocket->Terminate(); - m_pWebSocket = NULL; - } -} - -__override -REQUEST_NOTIFICATION_STATUS -FORWARDING_HANDLER::OnExecuteRequestHandler() -{ - REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_CONTINUE; - HRESULT hr = S_OK; - BOOL fRequestLocked = FALSE; - BOOL fHandleSet = FALSE; - BOOL fFailedToStartKestrel = FALSE; - BOOL fSecure = FALSE; - HINTERNET hConnect = NULL; - IHttpRequest *pRequest = m_pW3Context->GetRequest(); - IHttpResponse *pResponse = m_pW3Context->GetResponse(); - IHttpConnection *pClientConnection = NULL; - OUT_OF_PROCESS_APPLICATION *pApplication = NULL; - PROTOCOL_CONFIG *pProtocol = &sm_ProtocolConfig; - SERVER_PROCESS *pServerProcess = NULL; - - USHORT cchHostName = 0; - - STACK_STRU(strDestination, 32); - STACK_STRU(strUrl, 2048); - STACK_STRU(struEscapedUrl, 2048); - - // - // Take a reference so that object does not go away as a result of - // async completion. - // - ReferenceRequestHandler(); - - // override Protocol related config from aspNetCore config - pProtocol->OverrideConfig(m_pApplication->QueryConfig()); - - // check connection - pClientConnection = m_pW3Context->GetConnection(); - if (pClientConnection == NULL || - !pClientConnection->IsConnected()) - { - hr = HRESULT_FROM_WIN32(WSAECONNRESET); - goto Failure; - } - - pApplication = static_cast (m_pApplication); - if (pApplication == NULL) - { - hr = E_INVALIDARG; - goto Failure; - } - - hr = pApplication->GetProcess(&pServerProcess); - if (FAILED(hr)) - { - fFailedToStartKestrel = TRUE; - goto Failure; - } - - if (pServerProcess == NULL) - { - fFailedToStartKestrel = TRUE; - hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED); - goto Failure; - } - - if (pServerProcess->QueryWinHttpConnection() == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_HANDLE); - goto Failure; - } - - hConnect = pServerProcess->QueryWinHttpConnection()->QueryHandle(); - - m_pszOriginalHostHeader = pRequest->GetHeader(HttpHeaderHost, &cchHostName); - // - // parse original url - // - if (FAILED(hr = UTILITY::SplitUrl(pRequest->GetRawHttpRequest()->CookedUrl.pFullUrl, - &fSecure, - &strDestination, - &strUrl))) - { - goto Failure; - } - - if (FAILED(hr = UTILITY::EscapeAbsPath(pRequest, &struEscapedUrl))) - { - goto Failure; - } - - m_fDoReverseRewriteHeaders = pProtocol->QueryReverseRewriteHeaders(); - - m_cMinBufferLimit = pProtocol->QueryMinResponseBuffer(); - - // - // Mark request as websocket if upgrade header is present. - // - if (pApplication->QueryConfig()->QueryWebSocketEnabled()) - { - USHORT cchHeader = 0; - PCSTR pszWebSocketHeader = pRequest->GetHeader("Upgrade", &cchHeader); - if (cchHeader == 9 && _stricmp(pszWebSocketHeader, "websocket") == 0) - { - m_fWebSocketEnabled = TRUE; - } - } - - hr = CreateWinHttpRequest(pRequest, - pProtocol, - hConnect, - &struEscapedUrl, - pServerProcess); - if (FAILED(hr)) - { - goto Failure; - } - - // Set client disconnect callback contract with IIS - m_pDisconnect = static_cast( - pClientConnection->GetModuleContextContainer()-> - GetConnectionModuleContext(m_pModuleId)); - if (m_pDisconnect == NULL) - { - m_pDisconnect = new ASYNC_DISCONNECT_CONTEXT(); - if (m_pDisconnect == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - - hr = pClientConnection->GetModuleContextContainer()-> - SetConnectionModuleContext(m_pDisconnect, - m_pModuleId); - DBG_ASSERT(hr != HRESULT_FROM_WIN32(ERROR_ALREADY_ASSIGNED)); - if (FAILED(hr)) - { - goto Failure; - } - } - - m_pDisconnect->SetHandler(this); - fHandleSet = TRUE; - - // require lock as client disconnect callback may happen - AcquireSRWLockShared(&m_RequestLock); - fRequestLocked = TRUE; - - // - // Remember the handler being processed in the current thread - // before staring a WinHTTP operation. - // - DBG_ASSERT(fRequestLocked); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); - TlsSetValue(g_dwTlsIndex, this); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); - - if (m_hRequest == NULL) - { - hr = HRESULT_FROM_WIN32(WSAECONNRESET); - goto Failure; - } - - // - // Begins normal request handling. Send request to server. - // - m_RequestStatus = FORWARDER_SENDING_REQUEST; - - // - // Calculate the bytes to receive from the content length. - // - DWORD cbContentLength = 0; - PCSTR pszContentLength = pRequest->GetHeader(HttpHeaderContentLength); - if (pszContentLength != NULL) - { - cbContentLength = m_BytesToReceive = atol(pszContentLength); - if (m_BytesToReceive == INFINITE) - { - hr = HRESULT_FROM_WIN32(WSAECONNRESET); - goto Failure; - } - } - else if (pRequest->GetHeader(HttpHeaderTransferEncoding) != NULL) - { - m_BytesToReceive = INFINITE; - } - - if (m_fWebSocketEnabled) - { - // - // Set the upgrade flag for a websocket request. - // - if (!WinHttpSetOption(m_hRequest, - WINHTTP_OPTION_UPGRADE_TO_WEB_SOCKET, - NULL, - 0)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - - m_cchLastSend = m_cchHeaders; - - //FREB log - if (ANCMEvents::ANCM_REQUEST_FORWARD_START::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_REQUEST_FORWARD_START::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL); - } - - if (!WinHttpSendRequest(m_hRequest, - m_pszHeaders, - m_cchHeaders, - NULL, - 0, - cbContentLength, - reinterpret_cast(static_cast(this)))) - { - hr = HRESULT_FROM_WIN32(GetLastError()); -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::OnExecuteRequestHandler, Send request failed"); -#endif - // FREB log - if (ANCMEvents::ANCM_REQUEST_FORWARD_FAIL::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_REQUEST_FORWARD_FAIL::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL, - hr); - } - - goto Failure; - } - - // - // Async WinHTTP operation is in progress. Release this thread meanwhile, - // OnWinHttpCompletion method should resume the work by posting an IIS completion. - // - retVal = RQ_NOTIFICATION_PENDING; - goto Finished; - -Failure: - m_RequestStatus = FORWARDER_DONE; - - //disable client disconnect callback - RemoveRequest(); - - pResponse->DisableKernelCache(); - pResponse->GetRawHttpResponse()->EntityChunkCount = 0; - if (hr == HRESULT_FROM_WIN32(WSAECONNRESET)) - { - pResponse->SetStatus(400, "Bad Request", 0, hr); - } - else if (fFailedToStartKestrel && !m_pApplication->QueryConfig()->QueryDisableStartUpErrorPage()) - { - HTTP_DATA_CHUNK DataChunk; - pResponse->SetStatus(502, "Bad Gateway", 5, hr, NULL, TRUE); - pResponse->SetHeader("Content-Type", - "text/html", - (USHORT)strlen("text/html"), - FALSE - ); - - DataChunk.DataChunkType = HttpDataChunkFromMemory; - DataChunk.FromMemory.pBuffer = (PVOID)sm_pStra502ErrorMsg.QueryStr(); - DataChunk.FromMemory.BufferLength = sm_pStra502ErrorMsg.QueryCB(); - pResponse->WriteEntityChunkByReference(&DataChunk); - } - else - { - // - // default error behavior - // - pResponse->SetStatus(502, "Bad Gateway", 3, hr); - } - // - // Finish the request on failure. - // - retVal = RQ_NOTIFICATION_FINISH_REQUEST; - -Finished: - if (fRequestLocked) - { - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); - TlsSetValue(g_dwTlsIndex, NULL); - ReleaseSRWLockShared(&m_RequestLock); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); - } - - DereferenceRequestHandler(); - // - // Do not use this object after dereferencing it, it may be gone. - // - - return retVal; -} - -__override -REQUEST_NOTIFICATION_STATUS -FORWARDING_HANDLER::OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus -) -/*++ - -Routine Description: - -Handle the completion from IIS and continue the execution -of this request based on the current state. - -Arguments: - -cbCompletion - Number of bytes associated with this completion -dwCompletionStatus - the win32 status associated with this completion - -Return Value: - -REQUEST_NOTIFICATION_STATUS - ---*/ -{ - HRESULT hr = S_OK; - REQUEST_NOTIFICATION_STATUS retVal = RQ_NOTIFICATION_PENDING; - BOOL fLocked = FALSE; - BOOL fClientError = FALSE; - BOOL fClosed = FALSE; - BOOL fWebSocketUpgraded = FALSE; - - DBG_ASSERT(m_pW3Context != NULL); - __analysis_assume(m_pW3Context != NULL); - - // - // Take a reference so that object does not go away as a result of - // async completion. - // - ReferenceRequestHandler(); - - if (sm_pTraceLog != NULL) - { - WriteRefTraceLogEx(sm_pTraceLog, - m_cRefs, - this, - "FORWARDING_HANDLER::OnAsyncCompletion Enter", - reinterpret_cast(static_cast(cbCompletion)), - reinterpret_cast(static_cast(hrCompletionStatus))); - } - - if (TlsGetValue(g_dwTlsIndex) != this) - { - // - // Acquire exclusive lock as WinHTTP callback may happen on different thread - // We don't want two threads signal IIS pipeline simultaneously - // - AcquireLockExclusive(); - fLocked = TRUE; - } - - if (m_fClientDisconnected && (m_RequestStatus != FORWARDER_DONE)) - { - hr = ERROR_CONNECTION_ABORTED; - goto Failure; - } - - if (m_RequestStatus == FORWARDER_RECEIVED_WEBSOCKET_RESPONSE) - { -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::OnAsyncCompletion, Send completed for 101 response"); -#endif - // - // This should be the write completion of the 101 response. - // - m_pWebSocket = new WEBSOCKET_HANDLER(); - if (m_pWebSocket == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - - hr = m_pWebSocket->ProcessRequest(this, m_pW3Context, m_hRequest, &fWebSocketUpgraded); - if (fWebSocketUpgraded) - { - // WinHttp WebSocket handle has been created, bump the counter so that remember to close it - // and prevent from premature postcomplation and unexpected callback from winhttp - InterlockedIncrement(&m_dwHandlers); - } - - if (FAILED(hr)) - { - // This failure could happen when client disconnect happens or backend server fails - // after websocket upgrade - goto Failure; - } - - // - // WebSocket upgrade is successful. Close the WinHttpRequest Handle - // - m_fHttpHandleInClose = TRUE; - fClosed = WinHttpCloseHandle(m_hRequest); - DBG_ASSERT(fClosed); - m_hRequest = NULL; - - if (!fClosed) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - retVal = RQ_NOTIFICATION_PENDING; - goto Finished; - } - - // - // Begins normal completion handling. There is already an exclusive acquired lock - // for protecting the WinHTTP request handle from being closed. - // - switch (m_RequestStatus) - { - case FORWARDER_RECEIVING_RESPONSE: - - // - // This is a completion of a write (send) to http.sys, abort in case of - // failure, if there is more data available from WinHTTP, read it - // or else ask if there is more. - // - if (FAILED(hrCompletionStatus)) - { - hr = hrCompletionStatus; - fClientError = TRUE; - goto Failure; - } - - hr = OnReceivingResponse(); - if (FAILED(hr)) - { - goto Failure; - } - break; - - case FORWARDER_SENDING_REQUEST: - - hr = OnSendingRequest(cbCompletion, - hrCompletionStatus, - &fClientError); - if (FAILED(hr)) - { - goto Failure; - } - break; - - default: - DBG_ASSERT(m_RequestStatus == FORWARDER_DONE); - if (m_hRequest == NULL && m_pWebSocket == NULL) - { - // Request must have been done - if (!m_fFinishRequest) - { - goto Failure; - } - - if (m_fHasError) - { - retVal = RQ_NOTIFICATION_FINISH_REQUEST; - } - else - { - retVal = RQ_NOTIFICATION_CONTINUE; - } - } - goto Finished; - } - - // - // Either OnReceivingResponse or OnSendingRequest initiated an - // async WinHTTP operation, release this thread meanwhile, - // OnWinHttpCompletion method should resume the work by posting an IIS completion. - // - retVal = RQ_NOTIFICATION_PENDING; - goto Finished; - -Failure: - - // - // Reset status for consistency. - // - m_RequestStatus = FORWARDER_DONE; - if (!m_fHasError) - { - m_fHasError = TRUE; - - // - // Do the right thing based on where the error originated from. - // - IHttpResponse *pResponse = m_pW3Context->GetResponse(); - pResponse->DisableKernelCache(); - pResponse->GetRawHttpResponse()->EntityChunkCount = 0; - - if (fClientError || m_fClientDisconnected) - { - if (!m_fResponseHeadersReceivedAndSet) - { - pResponse->SetStatus(400, "Bad Request", 0, HRESULT_FROM_WIN32(WSAECONNRESET)); - } - else - { - // - // Response headers from origin server were - // already received and set for the current response. - // Honor the response status. - // - } - } - else - { - STACK_STRU(strDescription, 128); - - pResponse->SetStatus(502, "Bad Gateway", 3, hr); - - if (hr > HRESULT_FROM_WIN32(WINHTTP_ERROR_BASE) && - hr <= HRESULT_FROM_WIN32(WINHTTP_ERROR_LAST)) - { -#pragma prefast (suppress : __WARNING_FUNCTION_NEEDS_REVIEW, "Function and parameters reviewed.") - FormatMessage( - FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE, - g_hWinHttpModule, - HRESULT_CODE(hr), - 0, - strDescription.QueryStr(), - strDescription.QuerySizeCCH(), - NULL); - } - else - { - LoadString(g_hAspNetCoreModule, - IDS_SERVER_ERROR, - strDescription.QueryStr(), - strDescription.QuerySizeCCH()); - } - (VOID)strDescription.SyncWithBuffer(); - - if (strDescription.QueryCCH() != 0) - { - pResponse->SetErrorDescription( - strDescription.QueryStr(), - strDescription.QueryCCH(), - FALSE); - } - - if (hr == HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE)) - { - if (!m_fServerResetConn) - { - RemoveRequest(); - pResponse->ResetConnection(); - m_fServerResetConn = TRUE; - } - } - } - } - - if (m_pWebSocket != NULL && !m_fWebSocketHandleInClose) - { - m_fWebSocketHandleInClose = TRUE; - m_pWebSocket->TerminateRequest(); - } - - if (m_hRequest != NULL && !m_fHttpHandleInClose) - { - m_fHttpHandleInClose = TRUE; - WinHttpCloseHandle(m_hRequest); - m_hRequest = NULL; - } - -Finished: - - if (retVal != RQ_NOTIFICATION_PENDING) - { - - DBG_ASSERT(m_dwHandlers == 0); - RemoveRequest(); - - // This is just a safety guard to prevent from returning non pending status no more once - // which should never happen - if (!m_fDoneAsyncCompletion) - { - m_fDoneAsyncCompletion = TRUE; - } - else - { - retVal = RQ_NOTIFICATION_PENDING; - } - } - - if (fLocked) - { - ReleaseLockExclusive(); - } - - DereferenceRequestHandler(); - // - // Do not use this object after dereferencing it, it may be gone. - // -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::OnAsyncCompletion Done %d", retVal); -#endif - return retVal; -} - -// static -HRESULT -FORWARDING_HANDLER::StaticInitialize( - BOOL fEnableReferenceCountTracing -) -/*++ - -Routine Description: - -Global initialization routine for FORWARDING_HANDLERs - -Arguments: - -fEnableReferenceCountTracing - True if ref count tracing should be use. - -Return Value: - -HRESULT - ---*/ -{ - HRESULT hr = S_OK; - - sm_pAlloc = new ALLOC_CACHE_HANDLER; - if (sm_pAlloc == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = sm_pAlloc->Initialize(sizeof(FORWARDING_HANDLER), - 64); // nThreshold - if (FAILED(hr)) - { - goto Finished; - } - - sm_pResponseHeaderHash = new RESPONSE_HEADER_HASH; - if (sm_pResponseHeaderHash == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = sm_pResponseHeaderHash->Initialize(); - if (FAILED(hr)) - { - goto Finished; - } - - // Initialize PROTOCOL_CONFIG - hr = sm_ProtocolConfig.Initialize(); - if (FAILED(hr)) - { - goto Finished; - } - - if (fEnableReferenceCountTracing) - { - sm_pTraceLog = CreateRefTraceLog(10000, 0); - } - - sm_pStra502ErrorMsg.Copy( - " \ - \ - \ - \ - IIS 502.5 Error \ -
\ -

HTTP Error 502.5 - Process Failure

\ -
\ -

Common causes of this issue:

\ -
  • The application process failed to start
  • \ -
  • The application process started but then stopped
  • \ -
  • The application process started but failed to listen on the configured port
\ -
\ -
\ -

Troubleshooting steps:

\ -
  • Check the system event log for error messages
  • \ -
  • Enable logging the application process' stdout messages
  • \ -
  • Attach a debugger to the application process and inspect
\ -

For more information visit: \ - https://go.microsoft.com/fwlink/?LinkID=808681

\ -
\ -
\ -
"); - -Finished: - if (FAILED(hr)) - { - StaticTerminate(); - } - return hr; -} - -//static -VOID -FORWARDING_HANDLER::StaticTerminate() -{ - sm_pStra502ErrorMsg.Reset(); - - if (sm_pResponseHeaderHash != NULL) - { - sm_pResponseHeaderHash->Clear(); - delete sm_pResponseHeaderHash; - sm_pResponseHeaderHash = NULL; - } - - if (sm_pTraceLog != NULL) - { - DestroyRefTraceLog(sm_pTraceLog); - sm_pTraceLog = NULL; - } - - if (sm_pAlloc != NULL) - { - delete sm_pAlloc; - sm_pAlloc = NULL; - } -} - -HRESULT -FORWARDING_HANDLER::GetHeaders( - _In_ const PROTOCOL_CONFIG * pProtocol, - _In_ BOOL fForwardWindowsAuthToken, - _In_ SERVER_PROCESS* pServerProcess, - _Out_ PCWSTR * ppszHeaders, - _Inout_ DWORD * pcchHeaders -) -{ - HRESULT hr = S_OK; - PCSTR pszCurrentHeader; - PCSTR ppHeadersToBeRemoved; - PCSTR pszFinalHeader; - USHORT cchCurrentHeader; - DWORD cchFinalHeader; - BOOL fSecure = FALSE; // dummy. Used in SplitUrl. Value will not be used - // as ANCM always use http protocol to communicate with backend - STRU struDestination; - STRU struUrl; - STACK_STRA(strTemp, 64); - HTTP_REQUEST_HEADERS *pHeaders; - IHttpRequest *pRequest = m_pW3Context->GetRequest(); - MULTISZA mszMsAspNetCoreHeaders; - - // - // We historically set the host section in request url to the new host header - // this is wrong but Kestrel has dependency on it. - // should change it in the future - // - if (!pProtocol->QueryPreserveHostHeader()) - { - if (FAILED(hr = UTILITY::SplitUrl(pRequest->GetRawHttpRequest()->CookedUrl.pFullUrl, - &fSecure, - &struDestination, - &struUrl)) || - FAILED(hr = strTemp.CopyW(struDestination.QueryStr())) || - FAILED(hr = pRequest->SetHeader(HttpHeaderHost, - strTemp.QueryStr(), - static_cast(strTemp.QueryCCH()), - TRUE))) // fReplace - { - return hr; - } - } - // - // Strip all headers starting with MS-ASPNETCORE. - // These headers are generated by the asp.net core module and - // passed to the process it creates. - // - - pHeaders = &m_pW3Context->GetRequest()->GetRawHttpRequest()->Headers; - for (DWORD i = 0; iUnknownHeaderCount; i++) - { - if (_strnicmp(pHeaders->pUnknownHeaders[i].pName, "MS-ASPNETCORE", 13) == 0) - { - mszMsAspNetCoreHeaders.Append(pHeaders->pUnknownHeaders[i].pName, (DWORD)pHeaders->pUnknownHeaders[i].NameLength); - } - } - - ppHeadersToBeRemoved = mszMsAspNetCoreHeaders.First(); - - // - // iterate the list of headers to be removed and delete them from the request. - // - - while (ppHeadersToBeRemoved != NULL) - { - m_pW3Context->GetRequest()->DeleteHeader(ppHeadersToBeRemoved); - ppHeadersToBeRemoved = mszMsAspNetCoreHeaders.Next(ppHeadersToBeRemoved); - } - - if (pServerProcess->QueryGuid() != NULL) - { - hr = m_pW3Context->GetRequest()->SetHeader("MS-ASPNETCORE-TOKEN", - pServerProcess->QueryGuid(), - (USHORT)strlen(pServerProcess->QueryGuid()), - TRUE); - if (FAILED(hr)) - { - return hr; - } - } - - if (fForwardWindowsAuthToken && - (_wcsicmp(m_pW3Context->GetUser()->GetAuthenticationType(), L"negotiate") == 0 || - _wcsicmp(m_pW3Context->GetUser()->GetAuthenticationType(), L"ntlm") == 0)) - { - if (m_pW3Context->GetUser()->GetPrimaryToken() != NULL && - m_pW3Context->GetUser()->GetPrimaryToken() != INVALID_HANDLE_VALUE) - { - HANDLE hTargetTokenHandle = NULL; - hr = pServerProcess->SetWindowsAuthToken(m_pW3Context->GetUser()->GetPrimaryToken(), - &hTargetTokenHandle); - if (FAILED(hr)) - { - return hr; - } - - // - // set request header with target token value - // - CHAR pszHandleStr[16] = { 0 }; - if (_ui64toa_s((UINT64)hTargetTokenHandle, pszHandleStr, 16, 16) != 0) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_DATA); - return hr; - } - - hr = m_pW3Context->GetRequest()->SetHeader("MS-ASPNETCORE-WINAUTHTOKEN", - pszHandleStr, - (USHORT)strlen(pszHandleStr), - TRUE); - if (FAILED(hr)) - { - return hr; - } - } - } - - if (!pProtocol->QueryXForwardedForName()->IsEmpty()) - { - strTemp.Reset(); - - pszCurrentHeader = pRequest->GetHeader(pProtocol->QueryXForwardedForName()->QueryStr(), &cchCurrentHeader); - if (pszCurrentHeader != NULL) - { - if (FAILED(hr = strTemp.Copy(pszCurrentHeader, cchCurrentHeader)) || - FAILED(hr = strTemp.Append(", ", 2))) - { - return hr; - } - } - - if (FAILED(hr = m_pW3Context->GetServerVariable("REMOTE_ADDR", - &pszFinalHeader, - &cchFinalHeader))) - { - return hr; - } - - if (pRequest->GetRawHttpRequest()->Address.pRemoteAddress->sa_family == AF_INET6) - { - if (FAILED(hr = strTemp.Append("[", 1)) || - FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader)) || - FAILED(hr = strTemp.Append("]", 1))) - { - return hr; - } - } - else - { - if (FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader))) - { - return hr; - } - } - - if (pProtocol->QueryIncludePortInXForwardedFor()) - { - if (FAILED(hr = m_pW3Context->GetServerVariable("REMOTE_PORT", - &pszFinalHeader, - &cchFinalHeader))) - { - return hr; - } - - if (FAILED(hr = strTemp.Append(":", 1)) || - FAILED(hr = strTemp.Append(pszFinalHeader, cchFinalHeader))) - { - return hr; - } - } - - if (FAILED(hr = pRequest->SetHeader(pProtocol->QueryXForwardedForName()->QueryStr(), - strTemp.QueryStr(), - static_cast(strTemp.QueryCCH()), - TRUE))) // fReplace - { - return hr; - } - } - - if (!pProtocol->QuerySslHeaderName()->IsEmpty()) - { - const HTTP_SSL_INFO *pSslInfo = pRequest->GetRawHttpRequest()->pSslInfo; - LPSTR pszScheme = "http"; - if (pSslInfo != NULL) - { - pszScheme = "https"; - } - - strTemp.Reset(); - - pszCurrentHeader = pRequest->GetHeader(pProtocol->QuerySslHeaderName()->QueryStr(), &cchCurrentHeader); - if (pszCurrentHeader != NULL) - { - if (FAILED(hr = strTemp.Copy(pszCurrentHeader, cchCurrentHeader)) || - FAILED(hr = strTemp.Append(", ", 2))) - { - return hr; - } - } - - if (FAILED(hr = strTemp.Append(pszScheme))) - { - return hr; - } - - if (FAILED(pRequest->SetHeader(pProtocol->QuerySslHeaderName()->QueryStr(), - strTemp.QueryStr(), - (USHORT)strTemp.QueryCCH(), - TRUE))) - { - return hr; - } - } - - if (!pProtocol->QueryClientCertName()->IsEmpty()) - { - if (pRequest->GetRawHttpRequest()->pSslInfo == NULL || - pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo == NULL) - { - pRequest->DeleteHeader(pProtocol->QueryClientCertName()->QueryStr()); - } - else - { - // Resize the buffer large enough to hold the encoded certificate info - if (FAILED(hr = strTemp.Resize( - 1 + (pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->CertEncodedSize + 2) / 3 * 4))) - { - return hr; - } - - Base64Encode( - pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->pCertEncoded, - pRequest->GetRawHttpRequest()->pSslInfo->pClientCertInfo->CertEncodedSize, - strTemp.QueryStr(), - strTemp.QuerySize(), - NULL); - strTemp.SyncWithBuffer(); - - if (FAILED(hr = pRequest->SetHeader( - pProtocol->QueryClientCertName()->QueryStr(), - strTemp.QueryStr(), - static_cast(strTemp.QueryCCH()), - TRUE))) // fReplace - { - return hr; - } - } - } - - // - // Remove the connection header - // - if (!m_fWebSocketEnabled) - { - pRequest->DeleteHeader(HttpHeaderConnection); - } - - // - // Get all the headers to send to the client - // - hr = m_pW3Context->GetServerVariable("ALL_RAW", - ppszHeaders, - pcchHeaders); - if (FAILED(hr)) - { - return hr; - } - - return S_OK; -} - -HRESULT -FORWARDING_HANDLER::CreateWinHttpRequest( - _In_ const IHttpRequest * pRequest, - _In_ const PROTOCOL_CONFIG * pProtocol, - _In_ HINTERNET hConnect, - _Inout_ STRU * pstrUrl, - _In_ SERVER_PROCESS* pServerProcess -) -{ - HRESULT hr = S_OK; - PCWSTR pszVersion = NULL; - PCSTR pszVerb; - STACK_STRU(strVerb, 32); - - // - // Create the request handle for this request (leave some fields blank, - // we will fill them when sending the request) - // - pszVerb = pRequest->GetHttpMethod(); - if (FAILED(hr = strVerb.CopyA(pszVerb))) - { - goto Finished; - } - - //pszVersion = pProtocol->QueryVersion(); - if (pszVersion == NULL) - { - DWORD cchUnused; - hr = m_pW3Context->GetServerVariable( - "HTTP_VERSION", - &pszVersion, - &cchUnused); - if (FAILED(hr)) - { - goto Finished; - } - } - - m_hRequest = WinHttpOpenRequest(hConnect, - strVerb.QueryStr(), - pstrUrl->QueryStr(), - pszVersion, - WINHTTP_NO_REFERER, - WINHTTP_DEFAULT_ACCEPT_TYPES, - WINHTTP_FLAG_ESCAPE_DISABLE_QUERY - | g_OptionalWinHttpFlags); - if (m_hRequest == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (!WinHttpSetTimeouts(m_hRequest, - pProtocol->QueryTimeout(), - pProtocol->QueryTimeout(), - pProtocol->QueryTimeout(), - pProtocol->QueryTimeout())) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - DWORD dwResponseBufferLimit = pProtocol->QueryResponseBufferLimit(); - if (!WinHttpSetOption(m_hRequest, - WINHTTP_OPTION_MAX_RESPONSE_DRAIN_SIZE, - &dwResponseBufferLimit, - sizeof(dwResponseBufferLimit))) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - DWORD dwMaxHeaderSize = pProtocol->QueryMaxResponseHeaderSize(); - if (!WinHttpSetOption(m_hRequest, - WINHTTP_OPTION_MAX_RESPONSE_HEADER_SIZE, - &dwMaxHeaderSize, - sizeof(dwMaxHeaderSize))) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - DWORD dwOption = WINHTTP_DISABLE_COOKIES; - - dwOption |= WINHTTP_DISABLE_AUTHENTICATION; - - if (!pProtocol->QueryDoKeepAlive()) - { - dwOption |= WINHTTP_DISABLE_KEEP_ALIVE; - } - if (!WinHttpSetOption(m_hRequest, - WINHTTP_OPTION_DISABLE_FEATURE, - &dwOption, - sizeof(dwOption))) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (WinHttpSetStatusCallback(m_hRequest, - FORWARDING_HANDLER::OnWinHttpCompletion, - (WINHTTP_CALLBACK_FLAG_ALL_COMPLETIONS | - WINHTTP_CALLBACK_FLAG_HANDLES | - WINHTTP_CALLBACK_STATUS_SENDING_REQUEST), - NULL) == WINHTTP_INVALID_STATUS_CALLBACK) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - hr = GetHeaders(pProtocol, - m_pApplication->QueryConfig()->QueryForwardWindowsAuthToken(), - pServerProcess, - &m_pszHeaders, - &m_cchHeaders); - if (FAILED(hr)) - { - goto Finished; - } - -Finished: - - return hr; -} - -VOID -FORWARDING_HANDLER::OnWinHttpCompletion( - HINTERNET hRequest, - DWORD_PTR dwContext, - DWORD dwInternetStatus, - LPVOID lpvStatusInformation, - DWORD dwStatusInformationLength -) -{ - FORWARDING_HANDLER * pThis = static_cast(reinterpret_cast(dwContext)); - if (pThis == NULL) - { - //error happened, nothing can be done here - return; - } - DBG_ASSERT(pThis->m_Signature == FORWARDING_HANDLER_SIGNATURE); - pThis->OnWinHttpCompletionInternal(hRequest, - dwInternetStatus, - lpvStatusInformation, - dwStatusInformationLength); -} - -VOID -FORWARDING_HANDLER::OnWinHttpCompletionInternal( - _In_ HINTERNET hRequest, - _In_ DWORD dwInternetStatus, - _In_ LPVOID lpvStatusInformation, - _In_ DWORD dwStatusInformationLength -) -/*++ - -Routine Description: - -Completion call associated with a WinHTTP operation - -Arguments: - -hRequest - The winhttp request handle associated with this completion -dwInternetStatus - enum specifying what the completion is for -lpvStatusInformation - completion specific information -dwStatusInformationLength - length of the above information - -Return Value: - -None - ---*/ -{ - HRESULT hr = S_OK; - BOOL fExclusiveLocked = FALSE; - BOOL fSharedLocked = FALSE; - BOOL fClientError = FALSE; - BOOL fAnotherCompletionExpected = FALSE; - BOOL fDoPostCompletion = FALSE; - BOOL fHandleClosing = (dwInternetStatus == WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING); - DWORD dwHandlers = 1; // defaullt for http handler - - - DBG_ASSERT(m_pW3Context != NULL); - __analysis_assume(m_pW3Context != NULL); - IHttpResponse * pResponse = m_pW3Context->GetResponse(); - - // Reference the request handler to prevent it from being released prematurely - ReferenceRequestHandler(); - - UNREFERENCED_PARAMETER(dwStatusInformationLength); - - if (sm_pTraceLog != NULL) - { - WriteRefTraceLogEx(sm_pTraceLog, - m_cRefs, - this, - "FORWARDING_HANDLER::OnWinHttpCompletionInternal Enter", - reinterpret_cast(static_cast(dwInternetStatus)), - NULL); - } - - //FREB log - if (ANCMEvents::ANCM_WINHTTP_CALLBACK::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_WINHTTP_CALLBACK::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL, - dwInternetStatus); - } - -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::OnWinHttpCompletionInternal %x -- %d --%p\n", dwInternetStatus, GetCurrentThreadId(), m_pW3Context); -#endif - // - // Exclusive lock on the winhttp handle to protect from a client disconnect/ - // server stop closing the handle while we are using it. - // - // WinHttp can call async completion on the same thread/stack, so - // we have to account for that and not try to take the lock again, - // otherwise, we could end up in a deadlock. - // - - if (TlsGetValue(g_dwTlsIndex) != this) - { - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); - if (m_RequestStatus != FORWARDER_RECEIVED_WEBSOCKET_RESPONSE) - { - // Webscoket has already been guarded by critical section - // Only require exclisive lock for non-websocket scenario which has duplex channel - // Otherwise, there will be a deadlock - AcquireLockExclusive(); - fExclusiveLocked = TRUE; - } - else - { - AcquireSRWLockShared(&m_RequestLock); - TlsSetValue(g_dwTlsIndex, this); - fSharedLocked = TRUE; - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); - } - } - - if (fHandleClosing) - { - dwHandlers = InterlockedDecrement(&m_dwHandlers); - } - - if (m_fFinishRequest) - { - // Request was done by another thread, skip - goto Finished; - } - - - if (m_fClientDisconnected && (m_RequestStatus != FORWARDER_DONE)) - { - hr = ERROR_CONNECTION_ABORTED; - goto Failure; - } - - // - // In case of websocket, http request handle (m_hRequest) will be closed immediately after upgrading success - // This close will trigger a callback with WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING - // As m_RequestStatus is FORWARDER_RECEIVED_WEBSOCKET_RESPONSE, this callback will be skipped. - // When WebSocket handle (m_pWebsocket) gets closed, another winhttp handle close callback will be triggered - // This callback will be captured and then notify IIS pipeline to continue - // This ensures no request leaks - // - if (m_RequestStatus == FORWARDER_RECEIVED_WEBSOCKET_RESPONSE) - { - fAnotherCompletionExpected = TRUE; - if (m_pWebSocket == NULL) - { - goto Finished; - } - - switch (dwInternetStatus) - { - case WINHTTP_CALLBACK_STATUS_SHUTDOWN_COMPLETE: - m_pWebSocket->OnWinHttpShutdownComplete(); - break; - - case WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE: - m_pWebSocket->OnWinHttpSendComplete( - (WINHTTP_WEB_SOCKET_STATUS*)lpvStatusInformation - ); - break; - - case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: - m_pWebSocket->OnWinHttpReceiveComplete( - (WINHTTP_WEB_SOCKET_STATUS*)lpvStatusInformation - ); - break; - - case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: - m_pWebSocket->OnWinHttpIoError( - (WINHTTP_WEB_SOCKET_ASYNC_RESULT*)lpvStatusInformation - ); - break; - } - goto Finished; - } - - switch (dwInternetStatus) - { - case WINHTTP_CALLBACK_STATUS_SENDREQUEST_COMPLETE: - case WINHTTP_CALLBACK_STATUS_WRITE_COMPLETE: - hr = OnWinHttpCompletionSendRequestOrWriteComplete(hRequest, - dwInternetStatus, - &fClientError, - &fAnotherCompletionExpected); - break; - - case WINHTTP_CALLBACK_STATUS_HEADERS_AVAILABLE: - hr = OnWinHttpCompletionStatusHeadersAvailable(hRequest, - &fAnotherCompletionExpected); - break; - - case WINHTTP_CALLBACK_STATUS_DATA_AVAILABLE: - hr = OnWinHttpCompletionStatusDataAvailable(hRequest, - *reinterpret_cast(lpvStatusInformation), // dwBytes - &fAnotherCompletionExpected); - break; - - case WINHTTP_CALLBACK_STATUS_READ_COMPLETE: - hr = OnWinHttpCompletionStatusReadComplete(pResponse, - dwStatusInformationLength, - &fAnotherCompletionExpected); - break; - - case WINHTTP_CALLBACK_STATUS_REQUEST_ERROR: - hr = HRESULT_FROM_WIN32(static_cast(lpvStatusInformation)->dwError); - break; - - case WINHTTP_CALLBACK_STATUS_SENDING_REQUEST: - // - // This is a notification, not a completion. This notifiation happens - // during the Send Request operation. - // - fAnotherCompletionExpected = TRUE; - break; - - case WINHTTP_CALLBACK_STATUS_REQUEST_SENT: - // - // Need to ignore this event. We get it as a side-effect of registering - // for WINHTTP_CALLBACK_STATUS_SENDING_REQUEST (which we actually need). - // - hr = S_OK; - fAnotherCompletionExpected = TRUE; - break; - - case WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING: - if (ANCMEvents::ANCM_REQUEST_FORWARD_END::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_REQUEST_FORWARD_END::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL); - } - if (m_RequestStatus != FORWARDER_DONE) - { - hr = ERROR_CONNECTION_ABORTED; - fClientError = m_fClientDisconnected; - } - m_hRequest = NULL; - fAnotherCompletionExpected = FALSE; - break; - - case WINHTTP_CALLBACK_STATUS_CONNECTION_CLOSED: - hr = ERROR_CONNECTION_ABORTED; - break; - - default: - // - // E_UNEXPECTED is rarely used, if seen means that this condition may been occurred. - // - DBG_ASSERT(FALSE); - hr = E_UNEXPECTED; - if (sm_pTraceLog != NULL) - { - WriteRefTraceLogEx(sm_pTraceLog, - m_cRefs, - this, - "FORWARDING_HANDLER::OnWinHttpCompletionInternal Unexpected WinHTTP Status", - reinterpret_cast(static_cast(dwInternetStatus)), - NULL); - } - break; - } - - // - // Handle failure code for switch statement above. - // - if (FAILED(hr)) - { - goto Failure; - } - - // - // WinHTTP completion handled successfully. - // - goto Finished; - -Failure: - - if (!m_fHasError) - { - m_RequestStatus = FORWARDER_DONE; - m_fHasError = TRUE; - - pResponse->DisableKernelCache(); - pResponse->GetRawHttpResponse()->EntityChunkCount = 0; - - if (hr == HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE)) - { - m_fResetConnection = TRUE; - } - - if (fClientError || m_fClientDisconnected) - { - if (!m_fResponseHeadersReceivedAndSet) - { - pResponse->SetStatus(400, "Bad Request", 0, HRESULT_FROM_WIN32(WSAECONNRESET)); - } - else - { - // - // Response headers from origin server were - // already received and set for the current response. - // Honor the response status. - // - } - } - else - { - STACK_STRU(strDescription, 128); - - pResponse->SetStatus(502, "Bad Gateway", 3, hr); - - if (!(hr > HRESULT_FROM_WIN32(WINHTTP_ERROR_BASE) && - hr <= HRESULT_FROM_WIN32(WINHTTP_ERROR_LAST)) || -#pragma prefast (suppress : __WARNING_FUNCTION_NEEDS_REVIEW, "Function and parameters reviewed.") - FormatMessage( - FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_FROM_HMODULE, - g_hWinHttpModule, - HRESULT_CODE(hr), - 0, - strDescription.QueryStr(), - strDescription.QuerySizeCCH(), - NULL) == 0) - { - LoadString(g_hAspNetCoreModule, - IDS_SERVER_ERROR, - strDescription.QueryStr(), - strDescription.QuerySizeCCH()); - } - - strDescription.SyncWithBuffer(); - if (strDescription.QueryCCH() != 0) - { - pResponse->SetErrorDescription( - strDescription.QueryStr(), - strDescription.QueryCCH(), - FALSE); - } - } - } - - // FREB log - if (ANCMEvents::ANCM_REQUEST_FORWARD_FAIL::IsEnabled(m_pW3Context->GetTraceContext())) - { - ANCMEvents::ANCM_REQUEST_FORWARD_FAIL::RaiseEvent( - m_pW3Context->GetTraceContext(), - NULL, - hr); - } - -Finished: - // - // Since we use TLS to guard WinHttp operation, call PostCompletion instead of - // IndicateCompletion to allow cleaning up the TLS before thread reuse. - // Never post after the request has been finished for whatever reason - // - // Only postCompletion after all WinHttp handles (http and websocket) got closed, - // i.e., received WINHTTP_CALLBACK_STATUS_HANDLE_CLOSING callback for both handles - // So that no further WinHttp callback will be called - // Never post completion again after that - // Otherwise, there will be a AV as the request already passed IIS pipeline - // - if (fHandleClosing && dwHandlers == 0) - { - // - // Happy path - // - // Marked the request is finished, no more PostCompletion is allowed - RemoveRequest(); - m_fFinishRequest = TRUE; - fDoPostCompletion = TRUE; - if (m_pWebSocket != NULL) - { - m_pWebSocket->Terminate(); - m_pWebSocket = NULL; - } - } - else if (m_RequestStatus == FORWARDER_DONE) - { - // - // Error path - // - RemoveRequest(); - if (m_hRequest != NULL && !m_fHttpHandleInClose) - { - m_fHttpHandleInClose = TRUE; - WinHttpCloseHandle(m_hRequest); - m_hRequest = NULL; - } - - if (m_pWebSocket != NULL && !m_fWebSocketHandleInClose) - { - m_fWebSocketHandleInClose = TRUE; - m_pWebSocket->TerminateRequest(); - } - - if (fHandleClosing) - { - fDoPostCompletion = dwHandlers == 0; - m_fFinishRequest = fDoPostCompletion; - } - } - else if (!fAnotherCompletionExpected) - { - // - // Regular async IO operation - // - fDoPostCompletion = !m_fFinishRequest; - } - - // - // No code should access IIS m_pW3Context after posting the completion. - // - if (fDoPostCompletion) - { - m_pW3Context->PostCompletion(0); - } - - if (fExclusiveLocked) - { - ReleaseLockExclusive(); - } - else if (fSharedLocked) - { - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); - TlsSetValue(g_dwTlsIndex, NULL); - ReleaseSRWLockShared(&m_RequestLock); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); - } - - DereferenceRequestHandler(); - -} - -HRESULT -FORWARDING_HANDLER::OnWinHttpCompletionSendRequestOrWriteComplete( - HINTERNET hRequest, - DWORD, - __out BOOL * pfClientError, - __out BOOL * pfAnotherCompletionExpected -) -{ - HRESULT hr = S_OK; - IHttpRequest * pRequest = m_pW3Context->GetRequest(); - - // - // completion for sending the initial request or request entity to - // winhttp, get more request entity if available, else start receiving - // the response - // - if (m_BytesToReceive > 0) - { - if (m_pEntityBuffer == NULL) - { - m_pEntityBuffer = GetNewResponseBuffer( - ENTITY_BUFFER_SIZE); - if (m_pEntityBuffer == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - } - - if (sm_pTraceLog != NULL) - { - WriteRefTraceLogEx(sm_pTraceLog, - m_cRefs, - this, - "Calling ReadEntityBody", - NULL, - NULL); - } - hr = pRequest->ReadEntityBody( - m_pEntityBuffer + 6, - min(m_BytesToReceive, BUFFER_SIZE), - TRUE, // fAsync - NULL, // pcbBytesReceived - NULL); // pfCompletionPending - if (hr == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF)) - { - DBG_ASSERT(m_BytesToReceive == 0 || - m_BytesToReceive == INFINITE); - - // - // ERROR_HANDLE_EOF is not an error. - // - hr = S_OK; - - if (m_BytesToReceive == INFINITE) - { - m_BytesToReceive = 0; - m_cchLastSend = 5; - - // - // WinHttpWriteData can operate asynchronously. - // - // Take reference so that object does not go away as a result of - // async completion. - // - //ReferenceForwardingHandler(); - if (!WinHttpWriteData(m_hRequest, - "0\r\n\r\n", - 5, - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - //DereferenceForwardingHandler(); - goto Finished; - } - *pfAnotherCompletionExpected = TRUE; - - goto Finished; - } - } - else if (FAILED(hr)) - { - *pfClientError = TRUE; - goto Finished; - } - else - { - // - // ReadEntityBody will post a completion to IIS. - // - *pfAnotherCompletionExpected = TRUE; - - goto Finished; - } - } - - m_RequestStatus = FORWARDER_RECEIVING_RESPONSE; - - if (!WinHttpReceiveResponse(hRequest, NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - *pfAnotherCompletionExpected = TRUE; - -Finished: - - return hr; -} - -HRESULT -FORWARDING_HANDLER::OnWinHttpCompletionStatusHeadersAvailable( - HINTERNET hRequest, - __out BOOL * pfAnotherCompletionExpected -) -{ - HRESULT hr = S_OK; - STACK_BUFFER(bufHeaderBuffer, 2048); - STACK_STRA(strHeaders, 2048); - DWORD dwHeaderSize = bufHeaderBuffer.QuerySize(); - - UNREFERENCED_PARAMETER(pfAnotherCompletionExpected); - - // - // Headers are available, read the status line and headers and pass - // them on to the client - // - // WinHttpQueryHeaders operates synchronously, - // no need for taking reference. - // - dwHeaderSize = bufHeaderBuffer.QuerySize(); - if (!WinHttpQueryHeaders(hRequest, - WINHTTP_QUERY_RAW_HEADERS_CRLF, - WINHTTP_HEADER_NAME_BY_INDEX, - bufHeaderBuffer.QueryPtr(), - &dwHeaderSize, - WINHTTP_NO_HEADER_INDEX)) - { - if (!bufHeaderBuffer.Resize(dwHeaderSize)) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // - // WinHttpQueryHeaders operates synchronously, - // no need for taking reference. - // - if (!WinHttpQueryHeaders(hRequest, - WINHTTP_QUERY_RAW_HEADERS_CRLF, - WINHTTP_HEADER_NAME_BY_INDEX, - bufHeaderBuffer.QueryPtr(), - &dwHeaderSize, - WINHTTP_NO_HEADER_INDEX)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - - if (FAILED(hr = strHeaders.CopyW( - reinterpret_cast(bufHeaderBuffer.QueryPtr())))) - { - goto Finished; - } - - // Issue: The reason we add trailing \r\n is to eliminate issues that have been observed - // in some configurations where status and headers would not have final \r\n nor \r\n\r\n - // (last header was null terminated).That caused crash within header parsing code that expected valid - // format. Parsing code was fized to return ERROR_INVALID_PARAMETER, but we still should make - // Example of a status+header string that was causing problems (note the missing \r\n at the end) - // HTTP/1.1 302 Moved Permanently\r\n....\r\nLocation:http://site\0 - // - - if (!strHeaders.IsEmpty() && strHeaders.QueryStr()[strHeaders.QueryCCH() - 1] != '\n') - { - hr = strHeaders.Append("\r\n"); - if (FAILED(hr)) - { - goto Finished; - } - } - - if (FAILED(hr = SetStatusAndHeaders( - strHeaders.QueryStr(), - strHeaders.QueryCCH()))) - { - goto Finished; - } - - FreeResponseBuffers(); - - // - // If the request was websocket, and response was 101, - // trigger a flush, so that IIS's websocket module - // can get a chance to initialize and complete the handshake. - // - - if (m_fWebSocketEnabled) - { - m_RequestStatus = FORWARDER_RECEIVED_WEBSOCKET_RESPONSE; - - hr = m_pW3Context->GetResponse()->Flush( - TRUE, - TRUE, - NULL, - NULL); - - if (FAILED(hr)) - { - *pfAnotherCompletionExpected = FALSE; - } - else - { - *pfAnotherCompletionExpected = TRUE; - } - } - -Finished: - - return hr; -} - -HRESULT -FORWARDING_HANDLER::OnWinHttpCompletionStatusDataAvailable( - HINTERNET hRequest, - DWORD dwBytes, - _Out_ BOOL * pfAnotherCompletionExpected -) -{ - HRESULT hr = S_OK; - - // - // Response data is available from winhttp, read it - // - if (dwBytes == 0) - { - if (m_cContentLength != 0) - { - hr = HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE); - goto Finished; - } - - m_RequestStatus = FORWARDER_DONE; - - goto Finished; - } - - m_BytesToSend = dwBytes; - if (m_cContentLength != 0) - { - m_cContentLength -= dwBytes; - } - - m_pEntityBuffer = GetNewResponseBuffer( - min(m_BytesToSend, BUFFER_SIZE)); - if (m_pEntityBuffer == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - // - // WinHttpReadData can operate asynchronously. - // - // Take reference so that object does not go away as a result of - // async completion. - // - //ReferenceForwardingHandler(); - if (!WinHttpReadData(hRequest, - m_pEntityBuffer, - min(m_BytesToSend, BUFFER_SIZE), - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - //DereferenceForwardingHandler(); - goto Finished; - } - *pfAnotherCompletionExpected = TRUE; - -Finished: - - return hr; -} - -HRESULT -FORWARDING_HANDLER::OnWinHttpCompletionStatusReadComplete( - __in IHttpResponse * pResponse, - DWORD dwStatusInformationLength, - __out BOOL * pfAnotherCompletionExpected -) -{ - HRESULT hr = S_OK; - - // - // Response data has been read from winhttp, send it to the client - // - m_BytesToSend -= dwStatusInformationLength; - - if (m_cMinBufferLimit >= BUFFER_SIZE / 2) - { - if (m_cContentLength != 0) - { - m_cContentLength -= dwStatusInformationLength; - } - - // - // If we were not using WinHttpQueryDataAvailable and winhttp - // did not fill our buffer, we must have reached the end of the - // response - // - if (dwStatusInformationLength == 0 || - m_BytesToSend != 0) - { - if (m_cContentLength != 0) - { - hr = HRESULT_FROM_WIN32(ERROR_WINHTTP_INVALID_SERVER_RESPONSE); - goto Finished; - } - - m_RequestStatus = FORWARDER_DONE; - } - } - else - { - DBG_ASSERT(dwStatusInformationLength != 0); - } - - if (dwStatusInformationLength == 0) - { - goto Finished; - } - else - { - m_cBytesBuffered += dwStatusInformationLength; - - HTTP_DATA_CHUNK Chunk; - Chunk.DataChunkType = HttpDataChunkFromMemory; - Chunk.FromMemory.pBuffer = m_pEntityBuffer; - Chunk.FromMemory.BufferLength = dwStatusInformationLength; - if (FAILED(hr = pResponse->WriteEntityChunkByReference(&Chunk))) - { - goto Finished; - } - } - - if (m_cBytesBuffered >= m_cMinBufferLimit) - { - // - // Always post a completion to resume the WinHTTP data pump. - // - hr = pResponse->Flush(TRUE, // fAsync - TRUE, // fMoreData - NULL); // pcbSent - if (FAILED(hr)) - { - goto Finished; - } - *pfAnotherCompletionExpected = TRUE; - } - else - { - *pfAnotherCompletionExpected = FALSE; - } - -Finished: - - return hr; -} - -HRESULT -FORWARDING_HANDLER::OnSendingRequest( - DWORD cbCompletion, - HRESULT hrCompletionStatus, - __out BOOL * pfClientError -) -{ - HRESULT hr = S_OK; - // - // This is a completion for a read from http.sys, abort in case - // of failure, if we read anything write it out over WinHTTP, - // but we have already reached EOF, now read the response - // - if (hrCompletionStatus == HRESULT_FROM_WIN32(ERROR_HANDLE_EOF)) - { - DBG_ASSERT(m_BytesToReceive == 0 || m_BytesToReceive == INFINITE); - if (m_BytesToReceive == INFINITE) - { - m_BytesToReceive = 0; - m_cchLastSend = 5; // "0\r\n\r\n" - - if (!WinHttpWriteData(m_hRequest, - "0\r\n\r\n", - 5, - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - } - else - { - m_RequestStatus = FORWARDER_RECEIVING_RESPONSE; - - if (!WinHttpReceiveResponse(m_hRequest, NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - } - } - else if (SUCCEEDED(hrCompletionStatus)) - { - DWORD cbOffset; - - if (m_BytesToReceive != INFINITE) - { - m_BytesToReceive -= cbCompletion; - cbOffset = 6; - } - else - { - // - // For chunk-encoded requests, need to re-chunk the entity body - // Add the CRLF just before and after the chunk data - // - m_pEntityBuffer[4] = '\r'; - m_pEntityBuffer[5] = '\n'; - - m_pEntityBuffer[cbCompletion + 6] = '\r'; - m_pEntityBuffer[cbCompletion + 7] = '\n'; - - if (cbCompletion < 0x10) - { - cbOffset = 3; - m_pEntityBuffer[3] = HEX_TO_ASCII(cbCompletion); - cbCompletion += 5; - } - else if (cbCompletion < 0x100) - { - cbOffset = 2; - m_pEntityBuffer[2] = HEX_TO_ASCII(cbCompletion >> 4); - m_pEntityBuffer[3] = HEX_TO_ASCII(cbCompletion & 0xf); - cbCompletion += 6; - } - else if (cbCompletion < 0x1000) - { - cbOffset = 1; - m_pEntityBuffer[1] = HEX_TO_ASCII(cbCompletion >> 8); - m_pEntityBuffer[2] = HEX_TO_ASCII((cbCompletion >> 4) & 0xf); - m_pEntityBuffer[3] = HEX_TO_ASCII(cbCompletion & 0xf); - cbCompletion += 7; - } - else - { - DBG_ASSERT(cbCompletion < 0x10000); - - cbOffset = 0; - m_pEntityBuffer[0] = HEX_TO_ASCII(cbCompletion >> 12); - m_pEntityBuffer[1] = HEX_TO_ASCII((cbCompletion >> 8) & 0xf); - m_pEntityBuffer[2] = HEX_TO_ASCII((cbCompletion >> 4) & 0xf); - m_pEntityBuffer[3] = HEX_TO_ASCII(cbCompletion & 0xf); - cbCompletion += 8; - } - } - m_cchLastSend = cbCompletion; - - if (!WinHttpWriteData(m_hRequest, - m_pEntityBuffer + cbOffset, - cbCompletion, - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - } - else - { - hr = hrCompletionStatus; - *pfClientError = TRUE; - goto Failure; - } - -Failure: - - return hr; -} - -HRESULT -FORWARDING_HANDLER::OnReceivingResponse( -) -{ - HRESULT hr = S_OK; - - if (m_cBytesBuffered >= m_cMinBufferLimit) - { - FreeResponseBuffers(); - } - - if (m_BytesToSend == 0) - { - // - // If response buffering is enabled, try to read large chunks - // at a time - also treat very small buffering limit as no - // buffering - // - m_BytesToSend = min(m_cMinBufferLimit, BUFFER_SIZE); - if (m_BytesToSend < BUFFER_SIZE / 2) - { - // - // Disable buffering. - // - m_BytesToSend = 0; - } - } - - if (m_BytesToSend == 0) - { - // - // No buffering enabled. - // - if (!WinHttpQueryDataAvailable(m_hRequest, NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - } - else - { - // - // Buffering enabled. - // - if (m_pEntityBuffer == NULL) - { - m_pEntityBuffer = GetNewResponseBuffer(min(m_BytesToSend, BUFFER_SIZE)); - if (m_pEntityBuffer == NULL) - { - hr = E_OUTOFMEMORY; - goto Failure; - } - } - - if (!WinHttpReadData(m_hRequest, - m_pEntityBuffer, - min(m_BytesToSend, BUFFER_SIZE), - NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - } - -Failure: - return hr; -} - -BYTE * -FORWARDING_HANDLER::GetNewResponseBuffer( - DWORD dwBufferSize -) -{ - DWORD dwNeededSize = (m_cEntityBuffers + 1) * sizeof(BYTE *); - if (dwNeededSize > m_buffEntityBuffers.QuerySize() && - !m_buffEntityBuffers.Resize( - max(dwNeededSize, m_buffEntityBuffers.QuerySize() * 2))) - { - return NULL; - } - - BYTE *pBuffer = (BYTE *)HeapAlloc(GetProcessHeap(), - 0, // dwFlags - dwBufferSize); - if (pBuffer == NULL) - { - return NULL; - } - - m_buffEntityBuffers.QueryPtr()[m_cEntityBuffers] = pBuffer; - m_cEntityBuffers++; - - return pBuffer; -} - -VOID -FORWARDING_HANDLER::FreeResponseBuffers() -{ - BYTE **pBuffers = m_buffEntityBuffers.QueryPtr(); - for (DWORD i = 0; iGetResponse(); - IHttpRequest * pRequest = m_pW3Context->GetRequest(); - STACK_STRA(strHeaderName, 128); - STACK_STRA(strHeaderValue, 2048); - DWORD index = 0; - PSTR pchNewline; - PCSTR pchEndofHeaderValue; - BOOL fServerHeaderPresent = FALSE; - - _ASSERT(pszHeaders != NULL); - - // - // The first line is the status line - // - PSTR pchStatus = const_cast(strchr(pszHeaders, ' ')); - if (pchStatus == NULL) - { - return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - } - while (*pchStatus == ' ') - { - pchStatus++; - } - USHORT uStatus = static_cast(atoi(pchStatus)); - - if (m_fWebSocketEnabled && uStatus != 101) - { - // - // Expected 101 response. - // - - m_fWebSocketEnabled = FALSE; - } - - pchStatus = strchr(pchStatus, ' '); - if (pchStatus == NULL) - { - return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - } - while (*pchStatus == ' ') - { - pchStatus++; - } - if (*pchStatus == '\r' || *pchStatus == '\n') - { - pchStatus--; - } - - pchNewline = strchr(pchStatus, '\n'); - if (pchNewline == NULL) - { - return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - } - - if (uStatus != 200) - { - // - // Skip over any spaces before the '\n' - // - for (pchEndofHeaderValue = pchNewline - 1; - (pchEndofHeaderValue > pchStatus) && - ((*pchEndofHeaderValue == ' ') || - (*pchEndofHeaderValue == '\r')); - pchEndofHeaderValue--) - { - } - - // - // Copy the status description - // - if (FAILED(hr = strHeaderValue.Copy( - pchStatus, - (DWORD)(pchEndofHeaderValue - pchStatus) + 1)) || - FAILED(hr = pResponse->SetStatus(uStatus, - strHeaderValue.QueryStr(), - 0, - S_OK, - NULL, - TRUE))) - { - return hr; - } - } - - for (index = static_cast(pchNewline - pszHeaders) + 1; - pszHeaders[index] != '\r' && pszHeaders[index] != '\n' && pszHeaders[index] != '\0'; - index = static_cast(pchNewline - pszHeaders) + 1) - { - // - // Find the ':' in Header : Value\r\n - // - PCSTR pchColon = strchr(pszHeaders + index, ':'); - - // - // Find the '\n' in Header : Value\r\n - // - pchNewline = const_cast(strchr(pszHeaders + index, '\n')); - - if (pchNewline == NULL) - { - return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - } - - // - // Take care of header continuation - // - while (pchNewline[1] == ' ' || - pchNewline[1] == '\t') - { - pchNewline = strchr(pchNewline + 1, '\n'); - } - - DBG_ASSERT( - (pchColon != NULL) && (pchColon < pchNewline)); - if ((pchColon == NULL) || (pchColon >= pchNewline)) - { - return HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - } - - // - // Skip over any spaces before the ':' - // - PCSTR pchEndofHeaderName; - for (pchEndofHeaderName = pchColon - 1; - (pchEndofHeaderName >= pszHeaders + index) && - (*pchEndofHeaderName == ' '); - pchEndofHeaderName--) - { - } - - pchEndofHeaderName++; - - // - // Copy the header name - // - if (FAILED(hr = strHeaderName.Copy( - pszHeaders + index, - (DWORD)(pchEndofHeaderName - pszHeaders) - index))) - { - return hr; - } - - // - // Skip over the ':' and any trailing spaces - // - for (index = static_cast(pchColon - pszHeaders) + 1; - pszHeaders[index] == ' '; - index++) - { - } - - // - // Skip over any spaces before the '\n' - // - for (pchEndofHeaderValue = pchNewline - 1; - (pchEndofHeaderValue >= pszHeaders + index) && - ((*pchEndofHeaderValue == ' ') || - (*pchEndofHeaderValue == '\r')); - pchEndofHeaderValue--) - { - } - - pchEndofHeaderValue++; - - // - // Copy the header value - // - if (pchEndofHeaderValue == pszHeaders + index) - { - strHeaderValue.Reset(); - } - else if (FAILED(hr = strHeaderValue.Copy( - pszHeaders + index, - (DWORD)(pchEndofHeaderValue - pszHeaders) - index))) - { - return hr; - } - - // - // Do not pass the transfer-encoding:chunked, Connection, Date or - // Server headers along - // - DWORD headerIndex = sm_pResponseHeaderHash->GetIndex(strHeaderName.QueryStr()); - if (headerIndex == UNKNOWN_INDEX) - { - hr = pResponse->SetHeader(strHeaderName.QueryStr(), - strHeaderValue.QueryStr(), - static_cast(strHeaderValue.QueryCCH()), - FALSE); // fReplace - } - else - { - switch (headerIndex) - { - case HttpHeaderTransferEncoding: - if (!strHeaderValue.Equals("chunked", TRUE)) - { - break; - } - __fallthrough; - case HttpHeaderConnection: - case HttpHeaderDate: - continue; - - case HttpHeaderServer: - fServerHeaderPresent = TRUE; - break; - - case HttpHeaderContentLength: - if (pRequest->GetRawHttpRequest()->Verb != HttpVerbHEAD) - { - m_cContentLength = _atoi64(strHeaderValue.QueryStr()); - } - break; - } - - hr = pResponse->SetHeader(static_cast(headerIndex), - strHeaderValue.QueryStr(), - static_cast(strHeaderValue.QueryCCH()), - TRUE); // fReplace - } - if (FAILED(hr)) - { - return hr; - } - } - - // - // Explicitly remove the Server header if the back-end didn't set one. - // - - if (!fServerHeaderPresent) - { - pResponse->DeleteHeader("Server"); - } - - if (m_fDoReverseRewriteHeaders) - { - hr = DoReverseRewrite(pResponse); - if (FAILED(hr)) - { - return hr; - } - } - - m_fResponseHeadersReceivedAndSet = TRUE; - - return S_OK; -} - -HRESULT -FORWARDING_HANDLER::DoReverseRewrite( - _In_ IHttpResponse *pResponse -) -{ - DBG_ASSERT(pResponse == m_pW3Context->GetResponse()); - BOOL fSecure = (m_pW3Context->GetRequest()->GetRawHttpRequest()->pSslInfo != NULL); - STRA strTemp; - PCSTR pszHeader; - PCSTR pszStartHost; - PCSTR pszEndHost; - HTTP_RESPONSE_HEADERS *pHeaders; - HRESULT hr; - - // - // Content-Location and Location are easy, one known header in - // http[s]://host/url format - // - pszHeader = pResponse->GetHeader(HttpHeaderContentLocation); - if (pszHeader != NULL) - { - if (_strnicmp(pszHeader, "http://", 7) == 0) - { - pszStartHost = pszHeader + 7; - } - else if (_strnicmp(pszHeader, "https://", 8) == 0) - { - pszStartHost = pszHeader + 8; - } - else - { - goto Location; - } - - pszEndHost = strchr(pszStartHost, '/'); - - if (FAILED(hr = strTemp.Copy(fSecure ? "https://" : "http://")) || - FAILED(hr = strTemp.Append(m_pszOriginalHostHeader))) - { - return hr; - } - if (pszEndHost != NULL && - FAILED(hr = strTemp.Append(pszEndHost))) - { - return hr; - } - if (FAILED(hr = pResponse->SetHeader(HttpHeaderContentLocation, - strTemp.QueryStr(), - static_cast(strTemp.QueryCCH()), - TRUE))) - { - return hr; - } - } - -Location: - - pszHeader = pResponse->GetHeader(HttpHeaderLocation); - if (pszHeader != NULL) - { - if (_strnicmp(pszHeader, "http://", 7) == 0) - { - pszStartHost = pszHeader + 7; - } - else if (_strnicmp(pszHeader, "https://", 8) == 0) - { - pszStartHost = pszHeader + 8; - } - else - { - goto SetCookie; - } - - pszEndHost = strchr(pszStartHost, '/'); - - if (FAILED(hr = strTemp.Copy(fSecure ? "https://" : "http://")) || - FAILED(hr = strTemp.Append(m_pszOriginalHostHeader))) - { - return hr; - } - if (pszEndHost != NULL && - FAILED(hr = strTemp.Append(pszEndHost))) - { - return hr; - } - if (FAILED(hr = pResponse->SetHeader(HttpHeaderLocation, - strTemp.QueryStr(), - static_cast(strTemp.QueryCCH()), - TRUE))) - { - return hr; - } - } - -SetCookie: - - // - // Set-Cookie is different - possibly multiple unknown headers with - // syntax name=value ; ... ; Domain=.host ; ... - // - pHeaders = &pResponse->GetRawHttpResponse()->Headers; - for (DWORD i = 0; iUnknownHeaderCount; i++) - { - if (_stricmp(pHeaders->pUnknownHeaders[i].pName, "Set-Cookie") != 0) - { - continue; - } - - pszHeader = pHeaders->pUnknownHeaders[i].pRawValue; - pszStartHost = strchr(pszHeader, ';'); - while (pszStartHost != NULL) - { - pszStartHost++; - while (IsSpace(*pszStartHost)) - { - pszStartHost++; - } - - if (_strnicmp(pszStartHost, "Domain", 6) != 0) - { - pszStartHost = strchr(pszStartHost, ';'); - continue; - } - pszStartHost += 6; - - while (IsSpace(*pszStartHost)) - { - pszStartHost++; - } - if (*pszStartHost != '=') - { - break; - } - pszStartHost++; - while (IsSpace(*pszStartHost)) - { - pszStartHost++; - } - if (*pszStartHost == '.') - { - pszStartHost++; - } - pszEndHost = pszStartHost; - while (!IsSpace(*pszEndHost) && - *pszEndHost != ';' && - *pszEndHost != '\0') - { - pszEndHost++; - } - - if (FAILED(hr = strTemp.Copy(pszHeader, static_cast(pszStartHost - pszHeader))) || - FAILED(hr = strTemp.Append(m_pszOriginalHostHeader)) || - FAILED(hr = strTemp.Append(pszEndHost))) - { - return hr; - } - - pszHeader = (PCSTR)m_pW3Context->AllocateRequestMemory(strTemp.QueryCCH() + 1); - if (pszHeader == NULL) - { - return E_OUTOFMEMORY; - } - StringCchCopyA(const_cast(pszHeader), strTemp.QueryCCH() + 1, strTemp.QueryStr()); - pHeaders->pUnknownHeaders[i].pRawValue = pszHeader; - pHeaders->pUnknownHeaders[i].RawValueLength = static_cast(strTemp.QueryCCH()); - - break; - } - } - - return S_OK; -} - -VOID -FORWARDING_HANDLER::RemoveRequest( - VOID -) -{ - ASYNC_DISCONNECT_CONTEXT * pDisconnect; - pDisconnect = (ASYNC_DISCONNECT_CONTEXT *)InterlockedExchangePointer((PVOID*)&m_pDisconnect, NULL); - if (pDisconnect != NULL) - { - pDisconnect->ResetHandler(); - pDisconnect = NULL; - } -} - -VOID -FORWARDING_HANDLER::TerminateRequest( - bool fClientInitiated -) -{ - UNREFERENCED_PARAMETER(fClientInitiated); - - BOOL fLocked = FALSE; - if (TlsGetValue(g_dwTlsIndex) != this) - { - // - // Acquire exclusive lock as WinHTTP callback may happen on different thread - // We don't want two threads signal IIS pipeline simultaneously - // - AcquireLockExclusive(); - fLocked = TRUE; - } - - // Set tls as close winhttp handle will immediately trigger - // a winhttp callback on the same thread and we donot want to - // acquire the lock again - -#ifdef DEBUG - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "FORWARDING_HANDLER::TerminateRequest %d --%p\n", GetCurrentThreadId(), m_pW3Context); -#endif // DEBUG - - if (!m_fHttpHandleInClose) - { - m_fClientDisconnected = fClientInitiated; - } - - if (fLocked) - { - ReleaseLockExclusive(); - } -} - -VOID -FORWARDING_HANDLER::AcquireLockExclusive() -{ - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); - AcquireSRWLockExclusive(&m_RequestLock); - TlsSetValue(g_dwTlsIndex, this); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); -} - -VOID -FORWARDING_HANDLER::ReleaseLockExclusive() -{ - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == this); - TlsSetValue(g_dwTlsIndex, NULL); - ReleaseSRWLockExclusive(&m_RequestLock); - DBG_ASSERT(TlsGetValue(g_dwTlsIndex) == NULL); -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h deleted file mode 100644 index 427540f2d3..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/forwardinghandler.h +++ /dev/null @@ -1,233 +0,0 @@ -#pragma once - -extern DWORD g_OptionalWinHttpFlags; -extern HINSTANCE g_hWinHttpModule; -extern HINSTANCE g_hAspNetCoreModule; - - -enum FORWARDING_REQUEST_STATUS -{ - FORWARDER_START, - FORWARDER_SENDING_REQUEST, - FORWARDER_RECEIVING_RESPONSE, - FORWARDER_RECEIVED_WEBSOCKET_RESPONSE, - FORWARDER_DONE, - FORWARDER_FINISH_REQUEST -}; - - -class FORWARDING_HANDLER : public REQUEST_HANDLER -{ -public: - FORWARDING_HANDLER( - - _In_ IHttpContext *pW3Context, - _In_ HTTP_MODULE_ID *pModuleId, - _In_ APPLICATION *pApplication); - - ~FORWARDING_HANDLER(); - - __override - REQUEST_NOTIFICATION_STATUS - OnExecuteRequestHandler(); - - __override - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - DWORD cbCompletion, - HRESULT hrCompletionStatus - ); - - VOID - SetStatus( - FORWARDING_REQUEST_STATUS status - ) - { - m_RequestStatus = status; - } - - static - VOID - CALLBACK - FORWARDING_HANDLER::OnWinHttpCompletion( - HINTERNET hRequest, - DWORD_PTR dwContext, - DWORD dwInternetStatus, - LPVOID lpvStatusInformation, - DWORD dwStatusInformationLength - ); - - static - HRESULT - StaticInitialize( - BOOL fEnableReferenceCountTracing - ); - - static - VOID - StaticTerminate(); - - VOID - TerminateRequest( - bool fClientInitiated - ); - -private: - - VOID - AcquireLockExclusive(); - - VOID - ReleaseLockExclusive(); - - HRESULT - CreateWinHttpRequest( - _In_ const IHttpRequest * pRequest, - _In_ const PROTOCOL_CONFIG * pProtocol, - _In_ HINTERNET hConnect, - _Inout_ STRU * pstrUrl, - _In_ SERVER_PROCESS* pServerProcess - ); - - VOID - FORWARDING_HANDLER::OnWinHttpCompletionInternal( - _In_ HINTERNET hRequest, - _In_ DWORD dwInternetStatus, - _In_ LPVOID lpvStatusInformation, - _In_ DWORD dwStatusInformationLength - ); - - HRESULT - OnWinHttpCompletionSendRequestOrWriteComplete( - HINTERNET hRequest, - DWORD dwInternetStatus, - _Out_ BOOL * pfClientError, - _Out_ BOOL * pfAnotherCompletionExpected - ); - - HRESULT - OnWinHttpCompletionStatusHeadersAvailable( - HINTERNET hRequest, - _Out_ BOOL * pfAnotherCompletionExpected - ); - - HRESULT - OnWinHttpCompletionStatusDataAvailable( - HINTERNET hRequest, - DWORD dwBytes, - _Out_ BOOL * pfAnotherCompletionExpected - ); - - HRESULT - OnWinHttpCompletionStatusReadComplete( - _In_ IHttpResponse * pResponse, - DWORD dwStatusInformationLength, - _Out_ BOOL * pfAnotherCompletionExpected - ); - - HRESULT - OnSendingRequest( - DWORD cbCompletion, - HRESULT hrCompletionStatus, - _Out_ BOOL * pfClientError - ); - - HRESULT - OnReceivingResponse(); - - BYTE * - GetNewResponseBuffer( - DWORD dwBufferSize - ); - - VOID - FreeResponseBuffers(); - - HRESULT - SetStatusAndHeaders( - PCSTR pszHeaders, - DWORD cchHeaders - ); - - HRESULT - DoReverseRewrite( - _In_ IHttpResponse *pResponse - ); - - HRESULT - GetHeaders( - _In_ const PROTOCOL_CONFIG * pProtocol, - _In_ BOOL fForwardWindowsAuthToken, - _In_ SERVER_PROCESS* pServerProcess, - _Out_ PCWSTR * ppszHeaders, - _Inout_ DWORD * pcchHeaders - ); - - VOID - RemoveRequest( - VOID - ); - - DWORD m_Signature; - // - // WinHTTP request handle is protected using a read-write lock. - // - SRWLOCK m_RequestLock; - HINTERNET m_hRequest; - FORWARDING_REQUEST_STATUS m_RequestStatus; - - BOOL m_fWebSocketEnabled; - BOOL m_fResponseHeadersReceivedAndSet; - BOOL m_fResetConnection; - BOOL m_fDoReverseRewriteHeaders; - BOOL m_fServerResetConn; - volatile BOOL m_fClientDisconnected; - // - // A safety guard flag indicating no more IIS PostCompletion is allowed - // - volatile BOOL m_fFinishRequest; - // - // A safety guard flag to prevent from unexpect callback which may signal IIS pipeline - // more than once with non-pending status - // - volatile BOOL m_fDoneAsyncCompletion; - volatile BOOL m_fHasError; - // - // WinHttp may hit AV under race if handle got closed more than once simultaneously - // Use two bool variables to guard - // - volatile BOOL m_fHttpHandleInClose; - volatile BOOL m_fWebSocketHandleInClose; - - PCSTR m_pszOriginalHostHeader; - PCWSTR m_pszHeaders; - // - // Record the number of winhttp handles in use - // release IIS pipeline only after all handles got closed - // - volatile LONG m_dwHandlers; - DWORD m_cchHeaders; - DWORD m_BytesToReceive; - DWORD m_BytesToSend; - DWORD m_cchLastSend; - DWORD m_cEntityBuffers; - DWORD m_cBytesBuffered; - DWORD m_cMinBufferLimit; - ULONGLONG m_cContentLength; - WEBSOCKET_HANDLER * m_pWebSocket; - ASYNC_DISCONNECT_CONTEXT * m_pDisconnect; - - BYTE * m_pEntityBuffer; - static const SIZE_T INLINE_ENTITY_BUFFERS = 8; - BUFFER_T m_buffEntityBuffers; - - static ALLOC_CACHE_HANDLER * sm_pAlloc; - static PROTOCOL_CONFIG sm_ProtocolConfig; - static RESPONSE_HEADER_HASH * sm_pResponseHeaderHash; - // - // Reference cout tracing for debugging purposes. - // - static TRACE_LOG * sm_pTraceLog; - - static STRA sm_pStra502ErrorMsg; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp deleted file mode 100644 index e9222ba95e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.cpp +++ /dev/null @@ -1,78 +0,0 @@ -#include "..\precomp.hxx" - -OUT_OF_PROCESS_APPLICATION::OUT_OF_PROCESS_APPLICATION( - IHttpServer* pHttpServer, - ASPNETCORE_CONFIG* pConfig) : - APPLICATION(pHttpServer, pConfig) -{ - m_status = APPLICATION_STATUS::RUNNING; - m_pProcessManager = NULL; - InitializeSRWLock(&rwlock); -} - -OUT_OF_PROCESS_APPLICATION::~OUT_OF_PROCESS_APPLICATION() -{ - if (m_pProcessManager != NULL) - { - m_pProcessManager->ShutdownAllProcesses(); - m_pProcessManager->DereferenceProcessManager(); - m_pProcessManager = NULL; - } -} - -HRESULT -OUT_OF_PROCESS_APPLICATION::Initialize( -) -{ - HRESULT hr = S_OK; - if (m_pProcessManager == NULL) - { - m_pProcessManager = new PROCESS_MANAGER; - if (m_pProcessManager == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = m_pProcessManager->Initialize(); - if (FAILED(hr)) - { - goto Finished; - } - } - -Finished: - return hr; -} - -HRESULT -OUT_OF_PROCESS_APPLICATION::GetProcess( - _Out_ SERVER_PROCESS **ppServerProcess -) -{ - return m_pProcessManager->GetProcess(m_pConfig, ppServerProcess); -} - -__override -VOID -OUT_OF_PROCESS_APPLICATION::ShutDown() -{ - AcquireSRWLockExclusive(&rwlock); - { - if (m_pProcessManager != NULL) - { - m_pProcessManager->ShutdownAllProcesses(); - m_pProcessManager->DereferenceProcessManager(); - m_pProcessManager = NULL; - } - } - ReleaseSRWLockExclusive(&rwlock); -} - -__override -VOID -OUT_OF_PROCESS_APPLICATION::Recycle() -{ - ShutDown(); -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h deleted file mode 100644 index f8c30a69cc..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/outprocessapplication.h +++ /dev/null @@ -1,30 +0,0 @@ -#pragma once - -class OUT_OF_PROCESS_APPLICATION : public APPLICATION -{ - -public: - OUT_OF_PROCESS_APPLICATION(IHttpServer* pHttpServer, ASPNETCORE_CONFIG *pConfig); - - ~OUT_OF_PROCESS_APPLICATION(); - - HRESULT - Initialize(); - - HRESULT - GetProcess( - _Out_ SERVER_PROCESS **ppServerProcess - ); - - __override - VOID - ShutDown(); - - __override - VOID - Recycle(); - -private: - PROCESS_MANAGER * m_pProcessManager; - SRWLOCK rwlock; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx deleted file mode 100644 index 7e8c58462a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.cxx +++ /dev/null @@ -1,274 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" - -volatile BOOL PROCESS_MANAGER::sm_fWSAStartupDone = FALSE; - -HRESULT -PROCESS_MANAGER::Initialize( - VOID -) -{ - HRESULT hr = S_OK; - WSADATA wsaData; - int result; - BOOL fLocked = FALSE; - - if( !sm_fWSAStartupDone ) - { - AcquireSRWLockExclusive( &m_srwLock ); - fLocked = TRUE; - - if( !sm_fWSAStartupDone ) - { - if( (result = WSAStartup(MAKEWORD(2, 2), &wsaData)) != 0 ) - { - hr = HRESULT_FROM_WIN32( result ); - goto Finished; - } - sm_fWSAStartupDone = TRUE; - } - - ReleaseSRWLockExclusive( &m_srwLock ); - fLocked = FALSE; - } - - m_dwRapidFailTickStart = GetTickCount(); - - if( m_hNULHandle == NULL ) - { - SECURITY_ATTRIBUTES saAttr; - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - m_hNULHandle = CreateFileW( L"NUL", - FILE_WRITE_DATA, - FILE_SHARE_READ, - &saAttr, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL ); - if( m_hNULHandle == INVALID_HANDLE_VALUE ) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - -Finished: - - if(fLocked) - { - ReleaseSRWLockExclusive( &m_srwLock ); - } - - return hr; -} - -PROCESS_MANAGER::~PROCESS_MANAGER() -{ - AcquireSRWLockExclusive(&m_srwLock); - - //if( m_ppServerProcessList != NULL ) - //{ - // for( DWORD i = 0; i < m_dwProcessesPerApplication; ++i ) - // { - // if( m_ppServerProcessList[i] != NULL ) - // { - // m_ppServerProcessList[i]->DereferenceServerProcess(); - // m_ppServerProcessList[i] = NULL; - // } - // } - - // delete[] m_ppServerProcessList; - // m_ppServerProcessList = NULL; - //} - - //if( m_hNULHandle != NULL ) - //{ - // CloseHandle( m_hNULHandle ); - // m_hNULHandle = NULL; - //} - - //if( sm_fWSAStartupDone ) - //{ - // WSACleanup(); - // sm_fWSAStartupDone = FALSE; - //} - - ReleaseSRWLockExclusive(&m_srwLock); -} - -HRESULT -PROCESS_MANAGER::GetProcess( - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ SERVER_PROCESS **ppServerProcess -) -{ - HRESULT hr = S_OK; - BOOL fSharedLock = FALSE; - BOOL fExclusiveLock = FALSE; - DWORD dwProcessIndex = 0; - SERVER_PROCESS *pSelectedServerProcess = NULL; - - if (!m_fServerProcessListReady) - { - AcquireSRWLockExclusive(&m_srwLock); - fExclusiveLock = TRUE; - - if (!m_fServerProcessListReady) - { - m_dwProcessesPerApplication = pConfig->QueryProcessesPerApplication(); - m_ppServerProcessList = new SERVER_PROCESS*[m_dwProcessesPerApplication]; - if (m_ppServerProcessList == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - for (DWORD i = 0; i < m_dwProcessesPerApplication; ++i) - { - m_ppServerProcessList[i] = NULL; - } - } - m_fServerProcessListReady = TRUE; - ReleaseSRWLockExclusive(&m_srwLock); - fExclusiveLock = FALSE; - } - - AcquireSRWLockShared(&m_srwLock); - fSharedLock = TRUE; - - // - // round robin through to the next available process. - // - dwProcessIndex = (DWORD)InterlockedIncrement64((LONGLONG*)&m_dwRouteToProcessIndex); - dwProcessIndex = dwProcessIndex % m_dwProcessesPerApplication; - - if (m_ppServerProcessList[dwProcessIndex] != NULL && - m_ppServerProcessList[dwProcessIndex]->IsReady()) - { - *ppServerProcess = m_ppServerProcessList[dwProcessIndex]; - goto Finished; - } - - ReleaseSRWLockShared(&m_srwLock); - fSharedLock = FALSE; - - // should make the lock per process so that we can start processes simultaneously ? - if (m_ppServerProcessList[dwProcessIndex] == NULL || - !m_ppServerProcessList[dwProcessIndex]->IsReady()) - { - AcquireSRWLockExclusive(&m_srwLock); - fExclusiveLock = TRUE; - - if (m_ppServerProcessList[dwProcessIndex] != NULL) - { - if (!m_ppServerProcessList[dwProcessIndex]->IsReady()) - { - // - // terminate existing process that is not ready - // before creating new one. - // - ShutdownProcessNoLock( m_ppServerProcessList[dwProcessIndex] ); - } - else - { - // server is already up and ready to serve requests. - //m_ppServerProcessList[dwProcessIndex]->ReferenceServerProcess(); - *ppServerProcess = m_ppServerProcessList[dwProcessIndex]; - goto Finished; - } - } - - if (RapidFailsPerMinuteExceeded(pConfig->QueryRapidFailsPerMinute())) - { - // - // rapid fails per minute exceeded, do not create new process. - // - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED, - ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED_MSG, - pConfig->QueryRapidFailsPerMinute()); - - hr = HRESULT_FROM_WIN32(ERROR_SERVER_DISABLED); - goto Finished; - } - - if (m_ppServerProcessList[dwProcessIndex] == NULL) - { - - pSelectedServerProcess = new SERVER_PROCESS(); - if (pSelectedServerProcess == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - - hr = pSelectedServerProcess->Initialize( - this, //ProcessManager - pConfig->QueryProcessPath(), // - pConfig->QueryArguments(), // - pConfig->QueryStartupTimeLimitInMS(), - pConfig->QueryShutdownTimeLimitInMS(), - pConfig->QueryWindowsAuthEnabled(), - pConfig->QueryBasicAuthEnabled(), - pConfig->QueryAnonymousAuthEnabled(), - pConfig->QueryEnvironmentVariables(), - pConfig->QueryStdoutLogEnabled(), - pConfig->QueryWebSocketEnabled(), - pConfig->QueryStdoutLogFile(), - pConfig->QueryApplicationPhysicalPath(), // physical path - pConfig->QueryApplicationPath(), // app path - pConfig->QueryApplicationVirtualPath() // App relative virtual path - ); - if (FAILED(hr)) - { - goto Finished; - } - - hr = pSelectedServerProcess->StartProcess(); - if (FAILED(hr)) - { - goto Finished; - } - } - - if (!pSelectedServerProcess->IsReady()) - { - hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED); - goto Finished; - } - - m_ppServerProcessList[dwProcessIndex] = pSelectedServerProcess; - pSelectedServerProcess = NULL; - - } - *ppServerProcess = m_ppServerProcessList[dwProcessIndex]; - -Finished: - - if (fSharedLock) - { - ReleaseSRWLockShared(&m_srwLock); - fSharedLock = FALSE; - } - - if (fExclusiveLock) - { - ReleaseSRWLockExclusive(&m_srwLock); - fExclusiveLock = FALSE; - } - - if (pSelectedServerProcess != NULL) - { - delete pSelectedServerProcess; - pSelectedServerProcess = NULL; - } - - return hr; -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h deleted file mode 100644 index 9523e8a819..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/processmanager.h +++ /dev/null @@ -1,195 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define ONE_MINUTE_IN_MILLISECONDS 60000 -class SERVER_PROCESS; - -class PROCESS_MANAGER -{ -public: - - virtual - ~PROCESS_MANAGER(); - - VOID - ReferenceProcessManager() const - { - InterlockedIncrement(&m_cRefs); - } - - VOID - DereferenceProcessManager() const - { - if (InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - } - } - - HRESULT - GetProcess( - _In_ ASPNETCORE_CONFIG *pConfig, - _Out_ SERVER_PROCESS **ppServerProcess - ); - - HANDLE - QueryNULHandle() - { - return m_hNULHandle; - } - - HRESULT - Initialize( - VOID - ); - - VOID - SendShutdownSignal() - { - AcquireSRWLockExclusive( &m_srwLock ); - - for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i ) - { - if( m_ppServerProcessList != NULL && - m_ppServerProcessList[i] != NULL ) - { - m_ppServerProcessList[i]->SendSignal(); - m_ppServerProcessList[i]->DereferenceServerProcess(); - m_ppServerProcessList[i] = NULL; - } - } - - ReleaseSRWLockExclusive( &m_srwLock ); - } - - VOID - ShutdownProcess( - SERVER_PROCESS* pServerProcess - ) - { - AcquireSRWLockExclusive( &m_srwLock ); - - ShutdownProcessNoLock( pServerProcess ); - - ReleaseSRWLockExclusive( &m_srwLock ); - } - - VOID - ShutdownAllProcesses( - ) - { - AcquireSRWLockExclusive( &m_srwLock ); - - ShutdownAllProcessesNoLock(); - - ReleaseSRWLockExclusive( &m_srwLock ); - } - - VOID - IncrementRapidFailCount( - VOID - ) - { - InterlockedIncrement(&m_cRapidFailCount); - } - - PROCESS_MANAGER() : - m_ppServerProcessList( NULL ), - m_hNULHandle( NULL ), - m_cRapidFailCount( 0 ), - m_dwProcessesPerApplication( 1 ), - m_dwRouteToProcessIndex( 0 ), - m_fServerProcessListReady(FALSE), - m_cRefs( 1 ) - { - m_ppServerProcessList = NULL; - m_fServerProcessListReady = FALSE; - InitializeSRWLock( &m_srwLock ); - } - -private: - - BOOL - RapidFailsPerMinuteExceeded( - LONG dwRapidFailsPerMinute - ) - { - DWORD dwCurrentTickCount = GetTickCount(); - - if( (dwCurrentTickCount - m_dwRapidFailTickStart) - >= ONE_MINUTE_IN_MILLISECONDS ) - { - // - // reset counters every minute. - // - - InterlockedExchange(&m_cRapidFailCount, 0); - m_dwRapidFailTickStart = dwCurrentTickCount; - } - - return m_cRapidFailCount > dwRapidFailsPerMinute; - } - - VOID - ShutdownProcessNoLock( - SERVER_PROCESS* pServerProcess - ) - { - for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i ) - { - if( m_ppServerProcessList != NULL && - m_ppServerProcessList[i] != NULL && - m_ppServerProcessList[i]->GetPort() == pServerProcess->GetPort() ) - { - // shutdown pServerProcess if not already shutdown. - m_ppServerProcessList[i]->StopProcess(); - m_ppServerProcessList[i]->DereferenceServerProcess(); - m_ppServerProcessList[i] = NULL; - } - } - } - - VOID - ShutdownAllProcessesNoLock( - VOID - ) - { - for(DWORD i = 0; i < m_dwProcessesPerApplication; ++i ) - { - if( m_ppServerProcessList != NULL && - m_ppServerProcessList[i] != NULL ) - { - // shutdown pServerProcess if not already shutdown. - m_ppServerProcessList[i]->SendSignal(); - m_ppServerProcessList[i]->DereferenceServerProcess(); - m_ppServerProcessList[i] = NULL; - } - } - } - - volatile LONG m_cRapidFailCount; - DWORD m_dwRapidFailTickStart; - DWORD m_dwProcessesPerApplication; - volatile DWORD m_dwRouteToProcessIndex; - - SRWLOCK m_srwLock; - SERVER_PROCESS **m_ppServerProcessList; - - // - // m_hNULHandle is used to redirect stdout/stderr to NUL. - // If Createprocess is called to launch a batch file for example, - // it tries to write to the console buffer by default. It fails to - // start if the console buffer is owned by the parent process i.e - // in our case w3wp.exe. So we have to redirect the stdout/stderr - // of the child process to NUL or to a file (anything other than - // the console buffer of the parent process). - // - - HANDLE m_hNULHandle; - mutable LONG m_cRefs; - - volatile static BOOL sm_fWSAStartupDone; - volatile BOOL m_fServerProcessListReady; -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx deleted file mode 100644 index 9faebab82a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.cxx +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" - -HRESULT -PROTOCOL_CONFIG::Initialize() -{ - HRESULT hr; - STRU strTemp; - - m_fKeepAlive = TRUE; - m_msTimeout = 120000; - m_fPreserveHostHeader = TRUE; - m_fReverseRewriteHeaders = FALSE; - - if (FAILED(hr = m_strXForwardedForName.CopyW(L"X-Forwarded-For"))) - { - goto Finished; - } - - if (FAILED(hr = m_strSslHeaderName.CopyW(L"X-Forwarded-Proto"))) - { - goto Finished; - } - - if (FAILED(hr = m_strClientCertName.CopyW(L"MS-ASPNETCORE-CLIENTCERT"))) - { - goto Finished; - } - - m_fIncludePortInXForwardedFor = TRUE; - m_dwMinResponseBuffer = 0; // no response buffering - m_dwResponseBufferLimit = 4096*1024; - m_dwMaxResponseHeaderSize = 65536; - -Finished: - - return hr; -} - -VOID -PROTOCOL_CONFIG::OverrideConfig( - ASPNETCORE_CONFIG *pAspNetCoreConfig -) -{ - m_msTimeout = pAspNetCoreConfig->QueryRequestTimeoutInMS(); -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h deleted file mode 100644 index 0bb34aa53d..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/protocolconfig.h +++ /dev/null @@ -1,103 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -class PROTOCOL_CONFIG -{ - public: - - PROTOCOL_CONFIG() - { - } - - HRESULT - Initialize(); - - VOID - OverrideConfig( - ASPNETCORE_CONFIG *pAspNetCoreConfig - ); - - BOOL - QueryDoKeepAlive() const - { - return m_fKeepAlive; - } - - DWORD - QueryTimeout() const - { - return m_msTimeout; - } - - BOOL - QueryPreserveHostHeader() const - { - return m_fPreserveHostHeader; - } - - BOOL - QueryReverseRewriteHeaders() const - { - return m_fReverseRewriteHeaders; - } - - const STRA * - QueryXForwardedForName() const - { - return &m_strXForwardedForName; - } - - BOOL - QueryIncludePortInXForwardedFor() const - { - return m_fIncludePortInXForwardedFor; - } - - DWORD - QueryMinResponseBuffer() const - { - return m_dwMinResponseBuffer; - } - - DWORD - QueryResponseBufferLimit() const - { - return m_dwResponseBufferLimit; - } - - DWORD - QueryMaxResponseHeaderSize() const - { - return m_dwMaxResponseHeaderSize; - } - - const STRA* - QuerySslHeaderName() const - { - return &m_strSslHeaderName; - } - - const STRA * - QueryClientCertName() const - { - return &m_strClientCertName; - } - - private: - - BOOL m_fKeepAlive; - BOOL m_fPreserveHostHeader; - BOOL m_fReverseRewriteHeaders; - BOOL m_fIncludePortInXForwardedFor; - - DWORD m_msTimeout; - DWORD m_dwMinResponseBuffer; - DWORD m_dwResponseBufferLimit; - DWORD m_dwMaxResponseHeaderSize; - - STRA m_strXForwardedForName; - STRA m_strSslHeaderName; - STRA m_strClientCertName; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.cxx deleted file mode 100644 index f2fae274d5..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.cxx +++ /dev/null @@ -1,98 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" - -HEADER_RECORD RESPONSE_HEADER_HASH::sm_rgHeaders[] = -{ - { "Cache-Control", HttpHeaderCacheControl }, - { "Connection", HttpHeaderConnection }, - { "Date", HttpHeaderDate }, - { "Keep-Alive", HttpHeaderKeepAlive }, - { "Pragma", HttpHeaderPragma }, - { "Trailer", HttpHeaderTrailer }, - { "Transfer-Encoding", HttpHeaderTransferEncoding }, - { "Upgrade", HttpHeaderUpgrade }, - { "Via", HttpHeaderVia }, - { "Warning", HttpHeaderWarning }, - { "Allow", HttpHeaderAllow }, - { "Content-Length", HttpHeaderContentLength }, - { "Content-Type", HttpHeaderContentType }, - { "Content-Encoding", HttpHeaderContentEncoding }, - { "Content-Language", HttpHeaderContentLanguage }, - { "Content-Location", HttpHeaderContentLocation }, - { "Content-MD5", HttpHeaderContentMd5 }, - { "Content-Range", HttpHeaderContentRange }, - { "Expires", HttpHeaderExpires }, - { "Last-Modified", HttpHeaderLastModified }, - { "Accept-Ranges", HttpHeaderAcceptRanges }, - { "Age", HttpHeaderAge }, - { "ETag", HttpHeaderEtag }, - { "Location", HttpHeaderLocation }, - { "Proxy-Authenticate", HttpHeaderProxyAuthenticate }, - { "Retry-After", HttpHeaderRetryAfter }, - { "Server", HttpHeaderServer }, - // Set it to something which cannot be a header name, in effect - // making Server an unknown header. w:w is used to avoid collision with Keep-Alive. - { "w:w\r\n", HttpHeaderServer }, - // Set it to something which cannot be a header name, in effect - // making Set-Cookie an unknown header - { "y:y\r\n", HttpHeaderSetCookie }, - { "Vary", HttpHeaderVary }, - // Set it to something which cannot be a header name, in effect - // making WWW-Authenticate an unknown header - { "z:z\r\n", HttpHeaderWwwAuthenticate } - -}; - -HRESULT -RESPONSE_HEADER_HASH::Initialize( - VOID -) -/*++ - -Routine Description: - - Initialize global header hash table - -Arguments: - - None - -Return Value: - - HRESULT - ---*/ -{ - HRESULT hr; - - // - // 31 response headers. - // Make sure to update the number of buckets it new headers - // are added. Test it to avoid collisions. - // - C_ASSERT(_countof(sm_rgHeaders) == 31); - - // - // 79 buckets will have less collisions for the 31 response headers. - // Known collisions are "Age" colliding with "Expire" and "Location" - // colliding with both "Expire" and "Age". - // - hr = HASH_TABLE::Initialize(79); - if (FAILED(hr)) - { - return hr; - } - - for ( DWORD Index = 0; Index < _countof(sm_rgHeaders); ++Index ) - { - if (FAILED(hr = InsertRecord(&sm_rgHeaders[Index]))) - { - return hr; - } - } - - return S_OK; -} - diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.h deleted file mode 100644 index 54f9c82954..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/responseheaderhash.h +++ /dev/null @@ -1,108 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -// -// *_HEADER_HASH maps strings to UlHeader* values -// - -#define UNKNOWN_INDEX (0xFFFFFFFF) - -struct HEADER_RECORD -{ - PCSTR _pszName; - ULONG _ulHeaderIndex; -}; - -class RESPONSE_HEADER_HASH: public HASH_TABLE -{ -public: - RESPONSE_HEADER_HASH() - {} - - VOID - ReferenceRecord( - HEADER_RECORD * - ) - {} - - VOID - DereferenceRecord( - HEADER_RECORD * - ) - {} - - PCSTR - ExtractKey( - HEADER_RECORD * pRecord - ) - { - return pRecord->_pszName; - } - - DWORD - CalcKeyHash( - PCSTR key - ) - { - return HashStringNoCase(key); - } - - BOOL - EqualKeys( - PCSTR key1, - PCSTR key2 - ) - { - return (_stricmp(key1, key2) == 0); - } - - HRESULT - Initialize( - VOID - ); - - VOID - Terminate( - VOID - ); - - DWORD - GetIndex( - PCSTR pszName - ) - { - HEADER_RECORD * pRecord = NULL; - - FindKey(pszName, &pRecord); - if (pRecord != NULL) - { - return pRecord->_ulHeaderIndex; - } - - return UNKNOWN_INDEX; - } - - static - PCSTR - GetString( - ULONG ulIndex - ) - { - if (ulIndex < HttpHeaderResponseMaximum) - { - DBG_ASSERT(sm_rgHeaders[ulIndex]._ulHeaderIndex == ulIndex); - return sm_rgHeaders[ulIndex]._pszName; - } - - return NULL; - } - -private: - - static HEADER_RECORD sm_rgHeaders[]; - - RESPONSE_HEADER_HASH(const RESPONSE_HEADER_HASH &); - void operator=(const RESPONSE_HEADER_HASH &); -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx deleted file mode 100644 index de309bf643..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.cxx +++ /dev/null @@ -1,2148 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" -#include -//#include - -//extern BOOL g_fNsiApiNotSupported; - -#define STARTUP_TIME_LIMIT_INCREMENT_IN_MILLISECONDS 5000 - - -HRESULT -SERVER_PROCESS::Initialize( - PROCESS_MANAGER *pProcessManager, - STRU *pszProcessExePath, - STRU *pszArguments, - DWORD dwStartupTimeLimitInMS, - DWORD dwShtudownTimeLimitInMS, - BOOL fWindowsAuthEnabled, - BOOL fBasicAuthEnabled, - BOOL fAnonymousAuthEnabled, - ENVIRONMENT_VAR_HASH *pEnvironmentVariables, - BOOL fStdoutLogEnabled, - BOOL fWebsocketsEnabled, - STRU *pstruStdoutLogFile, - STRU *pszAppPhysicalPath, - STRU *pszAppPath, - STRU *pszAppVirtualPath -) -{ - HRESULT hr = S_OK; - - m_pProcessManager = pProcessManager; - m_dwStartupTimeLimitInMS = dwStartupTimeLimitInMS; - m_dwShutdownTimeLimitInMS = dwShtudownTimeLimitInMS; - m_fStdoutLogEnabled = fStdoutLogEnabled; - m_fWindowsAuthEnabled = fWindowsAuthEnabled; - m_fBasicAuthEnabled = fBasicAuthEnabled; - m_fAnonymousAuthEnabled = fAnonymousAuthEnabled; - m_fWebsocketsEnabled = fWebsocketsEnabled; - m_pProcessManager->ReferenceProcessManager(); - - if (FAILED(hr = m_ProcessPath.Copy(*pszProcessExePath)) || - FAILED(hr = m_struLogFile.Copy(*pstruStdoutLogFile))|| - FAILED(hr = m_struPhysicalPath.Copy(*pszAppPhysicalPath))|| - FAILED(hr = m_struAppFullPath.Copy(*pszAppPath))|| - FAILED(hr = m_struAppVirtualPath.Copy(*pszAppVirtualPath))|| - FAILED(hr = m_Arguments.Copy(*pszArguments)) || - FAILED(hr = SetupJobObject())) - { - goto Finished; - } - - m_pEnvironmentVarTable = pEnvironmentVariables; - -Finished: - return hr; -} - -HRESULT -SERVER_PROCESS::SetupJobObject(VOID) -{ - HRESULT hr = S_OK; - JOBOBJECT_EXTENDED_LIMIT_INFORMATION jobInfo = { 0 }; - - if (m_hJobObject == NULL) - { - m_hJobObject = CreateJobObject(NULL, // LPSECURITY_ATTRIBUTES - NULL); // LPCTSTR lpName -#pragma warning( disable : 4312) - // 0xdeadbeef is used by Antares - if (m_hJobObject == NULL || m_hJobObject == (HANDLE)0xdeadbeef) - { - m_hJobObject = NULL; - // ignore job object creation error. - } -#pragma warning( error : 4312) - if (m_hJobObject != NULL) - { - jobInfo.BasicLimitInformation.LimitFlags = - JOB_OBJECT_LIMIT_KILL_ON_JOB_CLOSE; - - if (!SetInformationJobObject(m_hJobObject, - JobObjectExtendedLimitInformation, - &jobInfo, - sizeof jobInfo)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - } - } - } - - return hr; -} - -HRESULT -SERVER_PROCESS::GetRandomPort -( - DWORD* pdwPickedPort, - DWORD dwExcludedPort = 0 -) -{ - HRESULT hr = S_OK; - BOOL fPortInUse = FALSE; - DWORD dwActualProcessId = 0; - - if (g_fNsiApiNotSupported) - { - // - // the default value for optional parameter dwExcludedPort is 0 which is reserved - // a random number between MIN_PORT and MAX_PORT - // - while ((*pdwPickedPort = (rand() % (MAX_PORT - MIN_PORT)) + MIN_PORT + 1) == dwExcludedPort); - } - else - { - DWORD cRetry = 0; - do - { - // - // ignore dwActualProcessId because here we are - // determing whether the randomly generated port is - // in use by any other process. - // - while ((*pdwPickedPort = (rand() % (MAX_PORT - MIN_PORT)) + MIN_PORT + 1) == dwExcludedPort); - hr = CheckIfServerIsUp(*pdwPickedPort, &dwActualProcessId, &fPortInUse); - } while (fPortInUse && ++cRetry < MAX_RETRY); - - if (cRetry >= MAX_RETRY) - { - hr = HRESULT_FROM_WIN32(ERROR_PORT_NOT_SET); - } - } - - return hr; -} - -HRESULT -SERVER_PROCESS::SetupListenPort( - ENVIRONMENT_VAR_HASH *pEnvironmentVarTable, - BOOL* pfCriticalError -) -{ - HRESULT hr = S_OK; - ENVIRONMENT_VAR_ENTRY *pEntry = NULL; - *pfCriticalError = FALSE; - - pEnvironmentVarTable->FindKey(ASPNETCORE_PORT_ENV_STR, &pEntry); - if (pEntry != NULL) - { - if (pEntry->QueryValue() != NULL || pEntry->QueryValue()[0] != L'\0') - { - m_dwPort = (DWORD)_wtoi(pEntry->QueryValue()); - if (m_dwPort >MAX_PORT || m_dwPort < MIN_PORT) - { - hr = E_INVALIDARG; - *pfCriticalError = TRUE; - goto Finished; - // need add log for this one - } - hr = m_struPort.Copy(pEntry->QueryValue()); - goto Finished; - } - else - { - // - // user set the env variable but did not give value, let's set it up - // - pEnvironmentVarTable->DeleteKey(ASPNETCORE_PORT_ENV_STR); - } - pEntry->Dereference(); - pEntry = NULL; - } - - WCHAR buffer[15]; - if (FAILED(hr = GetRandomPort(&m_dwPort))) - { - goto Finished; - } - - if (swprintf_s(buffer, 15, L"%d", m_dwPort) <= 0) - { - hr = E_INVALIDARG; - goto Finished; - } - - pEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if (FAILED(hr = pEntry->Initialize(ASPNETCORE_PORT_ENV_STR, buffer)) || - FAILED(hr = pEnvironmentVarTable->InsertRecord(pEntry)) || - FAILED(hr = m_struPort.Copy(buffer))) - { - goto Finished; - } - -Finished: - if (pEntry != NULL) - { - pEntry->Dereference(); - pEntry = NULL; - } - - if (FAILED(hr)) - { - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_PROCESS_START_SUCCESS, - ASPNETCORE_EVENT_PROCESS_START_PORTSETUP_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_dwPort, - MIN_PORT, - MAX_PORT, - hr); - } - - return hr; -} - -HRESULT -SERVER_PROCESS::SetupAppPath( - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable -) -{ - HRESULT hr = S_OK; - ENVIRONMENT_VAR_ENTRY* pEntry = NULL; - - pEnvironmentVarTable->FindKey(ASPNETCORE_APP_PATH_ENV_STR, &pEntry); - if (pEntry != NULL) - { - // user should not set this environment variable in configuration - pEnvironmentVarTable->DeleteKey(ASPNETCORE_APP_PATH_ENV_STR); - pEntry->Dereference(); - pEntry = NULL; - } - - pEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if (FAILED(hr = pEntry->Initialize(ASPNETCORE_APP_PATH_ENV_STR, m_struAppVirtualPath.QueryStr())) || - FAILED(hr = pEnvironmentVarTable->InsertRecord(pEntry))) - { - goto Finished; - } - -Finished: - if (pEntry != NULL) - { - pEntry->Dereference(); - pEntry = NULL; - } - return hr; -} - -HRESULT -SERVER_PROCESS::SetupAppToken( - ENVIRONMENT_VAR_HASH *pEnvironmentVarTable -) -{ - HRESULT hr = S_OK; - UUID logUuid; - PSTR pszLogUuid = NULL; - BOOL fRpcStringAllocd = FALSE; - RPC_STATUS rpcStatus; - STRU strAppToken; - ENVIRONMENT_VAR_ENTRY* pEntry = NULL; - - pEnvironmentVarTable->FindKey(ASPNETCORE_APP_TOKEN_ENV_STR, &pEntry); - if (pEntry != NULL) - { - // user sets the environment variable - m_straGuid.Reset(); - hr = m_straGuid.CopyW(pEntry->QueryValue()); - pEntry->Dereference(); - pEntry = NULL; - goto Finished; - } - else - { - if (m_straGuid.IsEmpty()) - { - // the GUID has not been set yet - rpcStatus = UuidCreate(&logUuid); - if (rpcStatus != RPC_S_OK) - { - hr = rpcStatus; - goto Finished; - } - - rpcStatus = UuidToStringA(&logUuid, (BYTE **)&pszLogUuid); - if (rpcStatus != RPC_S_OK) - { - hr = rpcStatus; - goto Finished; - } - - fRpcStringAllocd = TRUE; - - if (FAILED(hr = m_straGuid.Copy(pszLogUuid))) - { - goto Finished; - } - } - - pEntry = new ENVIRONMENT_VAR_ENTRY(); - if (pEntry == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if (FAILED(strAppToken.CopyA(m_straGuid.QueryStr())) || - FAILED(hr = pEntry->Initialize(ASPNETCORE_APP_TOKEN_ENV_STR, strAppToken.QueryStr())) || - FAILED(hr = pEnvironmentVarTable->InsertRecord(pEntry))) - { - goto Finished; - } - } - -Finished: - - if (fRpcStringAllocd) - { - RpcStringFreeA((BYTE **)&pszLogUuid); - pszLogUuid = NULL; - } - if (pEntry != NULL) - { - pEntry->Dereference(); - pEntry = NULL; - } - return hr; -} - -HRESULT -SERVER_PROCESS::OutputEnvironmentVariables -( - MULTISZ* pmszOutput, - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable -) -{ - HRESULT hr = S_OK; - LPWSTR pszEnvironmentVariables = NULL; - LPWSTR pszCurrentVariable = NULL; - LPWSTR pszNextVariable = NULL; - LPWSTR pszEqualChar = NULL; - STRU strEnvVar; - ENVIRONMENT_VAR_ENTRY* pEntry = NULL; - - DBG_ASSERT(pmszOutput); - DBG_ASSERT(pEnvironmentVarTable); // We added some startup variables - DBG_ASSERT(pEnvironmentVarTable->Count() >0); - - // cleanup, as we may in retry logic - pmszOutput->Reset(); - - pszEnvironmentVariables = GetEnvironmentStringsW(); - if (pszEnvironmentVariables == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_ENVIRONMENT); - goto Finished; - } - pszCurrentVariable = pszEnvironmentVariables; - while (*pszCurrentVariable != L'\0') - { - pszNextVariable = pszCurrentVariable + wcslen(pszCurrentVariable) + 1; - pszEqualChar = wcschr(pszCurrentVariable, L'='); - if (pszEqualChar != NULL) - { - if (FAILED(hr = strEnvVar.Copy(pszCurrentVariable, (DWORD)(pszEqualChar - pszCurrentVariable) + 1))) - { - goto Finished; - } - pEnvironmentVarTable->FindKey(strEnvVar.QueryStr(), &pEntry); - if (pEntry != NULL) - { - // same env variable is defined in configuration, use it - if (FAILED(hr = strEnvVar.Append(pEntry->QueryValue()))) - { - goto Finished; - } - pmszOutput->Append(strEnvVar); //should we check the returned bool - // remove the record from hash table as we already output it - pEntry->Dereference(); - pEnvironmentVarTable->DeleteKey(pEntry->QueryName()); - strEnvVar.Reset(); - pEntry = NULL; - } - else - { - pmszOutput->Append(pszCurrentVariable); - } - } - else - { - // env varaible is not well formated - hr = HRESULT_FROM_WIN32(ERROR_INVALID_ENVIRONMENT); - goto Finished; - } - // move to next env variable - pszCurrentVariable = pszNextVariable; - } - // append the remaining env variable in hash table - pEnvironmentVarTable->Apply(ENVIRONMENT_VAR_HELPERS::CopyToMultiSz, pmszOutput); - -Finished: - if (pszEnvironmentVariables != NULL) - { - FreeEnvironmentStringsW(pszEnvironmentVariables); - pszEnvironmentVariables = NULL; - } - return hr; -} - -HRESULT -SERVER_PROCESS::SetupCommandLine( - STRU* pstrCommandLine -) -{ - HRESULT hr = S_OK; - LPWSTR pszPath = NULL; - LPWSTR pszFullPath = NULL; - STRU strRelativePath; - DWORD dwBufferSize = 0; - FILE *file = NULL; - - DBG_ASSERT(pstrCommandLine); - - if (!m_struCommandLine.IsEmpty() && - pstrCommandLine == (&m_struCommandLine)) - { - // already set up the commandline string, skip - goto Finished; - } - - pszPath = m_ProcessPath.QueryStr(); - - if ((wcsstr(pszPath, L":") == NULL) && (wcsstr(pszPath, L"%") == NULL)) - { - // let's check whether it is a relative path - if (FAILED(hr = strRelativePath.Copy(m_struPhysicalPath.QueryStr())) || - FAILED(hr = strRelativePath.Append(L"\\")) || - FAILED(hr = strRelativePath.Append(pszPath))) - { - goto Finished; - } - - dwBufferSize = strRelativePath.QueryCCH() + 1; - pszFullPath = new WCHAR[dwBufferSize]; - if (pszFullPath == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - if (_wfullpath(pszFullPath, - strRelativePath.QueryStr(), - dwBufferSize) == NULL) - { - hr = HRESULT_FROM_WIN32(ERROR_INVALID_PARAMETER); - goto Finished; - } - - if ((file = _wfsopen(pszFullPath, L"r", _SH_DENYNO)) != NULL) - { - fclose(file); - pszPath = pszFullPath; - } - } - if (FAILED(hr = pstrCommandLine->Copy(pszPath)) || - FAILED(hr = pstrCommandLine->Append(L" ")) || - FAILED(hr = pstrCommandLine->Append(m_Arguments.QueryStr()))) - { - goto Finished; - } - -Finished: - if (pszFullPath != NULL) - { - delete pszFullPath; - } - return hr; -} - -HRESULT -SERVER_PROCESS::PostStartCheck( - VOID -) -{ - HRESULT hr = S_OK; - - BOOL fReady = FALSE; - BOOL fProcessMatch = FALSE; - BOOL fDebuggerAttached = FALSE; - DWORD dwTickCount = 0; - DWORD dwTimeDifference = 0; - DWORD dwActualProcessId = 0; - INT iChildProcessIndex = -1; - STACK_STRU(strEventMsg, 256); - - if (CheckRemoteDebuggerPresent(m_hProcessHandle, &fDebuggerAttached) == 0) - { - // some error occurred - assume debugger is not attached; - fDebuggerAttached = FALSE; - } - - dwTickCount = GetTickCount(); - do - { - DWORD processStatus = 0; - if (GetExitCodeProcess(m_hProcessHandle, &processStatus)) - { - // make sure the process is still running - if (processStatus != STILL_ACTIVE) - { - // double check - if (GetExitCodeProcess(m_hProcessHandle, &processStatus) && processStatus != STILL_ACTIVE) - { - hr = E_APPLICATION_ACTIVATION_EXEC_FAILURE; - strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_PROCESS_START_STATUS_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - hr, - m_dwProcessId, - processStatus); - goto Finished; - } - } - } - // - // dwActualProcessId will be set only when NsiAPI(GetExtendedTcpTable) is supported - // - hr = CheckIfServerIsUp(m_dwPort, &dwActualProcessId, &fReady); - fDebuggerAttached = IsDebuggerIsAttached(); - - if (!fReady) - { - Sleep(250); - } - - dwTimeDifference = (GetTickCount() - dwTickCount); - } while (fReady == FALSE && - ((dwTimeDifference < m_dwStartupTimeLimitInMS) || fDebuggerAttached)); - - if (!fReady) - { - hr = E_APPLICATION_ACTIVATION_TIMED_OUT; - goto Finished; - } - - // register call back with the created process - if (FAILED(hr = RegisterProcessWait(&m_hProcessWaitHandle, m_hProcessHandle))) - { - goto Finished; - } - - // - // check if debugger is attached after startupTimeout. - // - if (!fDebuggerAttached && - CheckRemoteDebuggerPresent(m_hProcessHandle, &fDebuggerAttached) == 0) - { - // some error occurred - assume debugger is not attached; - fDebuggerAttached = FALSE; - } - - if (!g_fNsiApiNotSupported) - { - // - // NsiAPI(GetExtendedTcpTable) is supported. we should check whether processIds matche - // - if (dwActualProcessId == m_dwProcessId) - { - m_dwListeningProcessId = m_dwProcessId; - fProcessMatch = TRUE; - } - - if (!fProcessMatch) - { - // could be the scenario that backend creates child process - if (FAILED(hr = GetChildProcessHandles())) - { - goto Finished; - } - - for (DWORD i = 0; i < m_cChildProcess; ++i) - { - // a child process listen on the assigned port - if (dwActualProcessId == m_dwChildProcessIds[i]) - { - m_dwListeningProcessId = m_dwChildProcessIds[i]; - fProcessMatch = TRUE; - - if (m_hChildProcessHandles[i] != NULL) - { - if (fDebuggerAttached == FALSE && - CheckRemoteDebuggerPresent(m_hChildProcessHandles[i], &fDebuggerAttached) == 0) - { - // some error occurred - assume debugger is not attached; - fDebuggerAttached = FALSE; - } - - if (FAILED(hr = RegisterProcessWait(&m_hChildProcessWaitHandles[i], - m_hChildProcessHandles[i]))) - { - goto Finished; - } - iChildProcessIndex = i; - } - break; - } - } - } - - if(!fProcessMatch) - { - // - // process that we created is not listening - // on the port we specified. - // - fReady = FALSE; - hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED); - strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_PROCESS_START_WRONGPORT_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - m_dwPort, - hr); - goto Finished; - } - } - - if (!fReady) - { - // - // hr is already set by CheckIfServerIsUp - // - if (dwTimeDifference >= m_dwStartupTimeLimitInMS) - { - hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT); - strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - m_dwPort, - hr); - } - goto Finished; - } - - if (iChildProcessIndex >= 0) - { - // - // final check to make sure child process listening on HTTP is still UP - // This is needed because, the child process might have crashed/exited between - // the previous call to checkIfServerIsUp and RegisterProcessWait - // and we would not know about it. - // - - hr = CheckIfServerIsUp(m_dwPort, &dwActualProcessId, &fReady); - - if ((FAILED(hr) || fReady == FALSE)) - { - strEventMsg.SafeSnwprintf( - ASPNETCORE_EVENT_PROCESS_START_NOTREADY_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - m_dwPort, - hr); - goto Finished; - } - } - - // - // ready to mark the server process ready but before this, - // create and initialize the FORWARDER_CONNECTION - // - if (m_pForwarderConnection == NULL) - { - m_pForwarderConnection = new FORWARDER_CONNECTION(); - if (m_pForwarderConnection == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - hr = m_pForwarderConnection->Initialize(m_dwPort); - if (FAILED(hr)) - { - goto Finished; - } - } - - if (!g_fNsiApiNotSupported) - { - m_hListeningProcessHandle = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE | PROCESS_DUP_HANDLE, - FALSE, - m_dwListeningProcessId); - } - - // - // mark server process as Ready - // - m_fReady = TRUE; - -Finished: - if (FAILED(hr)) - { - if (m_pForwarderConnection != NULL) - { - m_pForwarderConnection->DereferenceForwarderConnection(); - m_pForwarderConnection = NULL; - } - - if (!strEventMsg.IsEmpty()) - { - UTILITY::LogEvent( - g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_PROCESS_START_ERROR, - strEventMsg.QueryStr()); - } - } - return hr; -} - -HRESULT -SERVER_PROCESS::StartProcess( - VOID -) -{ - HRESULT hr = S_OK; - PROCESS_INFORMATION processInformation = {0}; - STARTUPINFOW startupInfo = {0}; - DWORD dwRetryCount = 2; // should we allow customer to config it - DWORD dwCreationFlags = 0; - MULTISZ mszNewEnvironment; - ENVIRONMENT_VAR_HASH *pHashTable = NULL; - PWSTR pStrStage = NULL; - BOOL fCriticalError = FALSE; - GetStartupInfoW(&startupInfo); - - // - // setup stdout and stderr handles to our stdout handle only if - // the handle is valid. - // - SetupStdHandles(&startupInfo); - - while (dwRetryCount > 0) - { - m_dwPort = 0; - dwRetryCount--; - // - // generate process command line. - // - if (FAILED(hr = SetupCommandLine(&m_struCommandLine))) - { - pStrStage = L"SetupCommandLine"; - goto Failure; - } - - if (FAILED(hr = ENVIRONMENT_VAR_HELPERS::InitEnvironmentVariablesTable( - m_pEnvironmentVarTable, - m_fWindowsAuthEnabled, - m_fBasicAuthEnabled, - m_fAnonymousAuthEnabled, - &pHashTable))) - { - pStrStage = L"InitEnvironmentVariablesTable"; - goto Failure; - } - - if (FAILED(hr = ENVIRONMENT_VAR_HELPERS::AddWebsocketEnabledToEnvironmentVariables( - pHashTable, - m_fWebsocketsEnabled - ))) - { - pStrStage = L"AddWebsocketEnabledToEnvironmentVariables"; - goto Failure; - - } - - // - // setup the the port that the backend process will listen on - // - if (FAILED(hr = SetupListenPort(pHashTable, &fCriticalError))) - { - pStrStage = L"SetupListenPort"; - goto Failure; - } - - // - // get app path - // - if (FAILED(hr = SetupAppPath(pHashTable))) - { - pStrStage = L"SetupAppPath"; - goto Failure; - } - - // - // generate new guid for each process - // - if (FAILED(hr = SetupAppToken(pHashTable))) - { - pStrStage = L"SetupAppToken"; - goto Failure; - } - - // - // setup environment variables for new process - // - if (FAILED(hr = OutputEnvironmentVariables(&mszNewEnvironment, pHashTable))) - { - pStrStage = L"OutputEnvironmentVariables"; - goto Failure; - } - - dwCreationFlags = CREATE_NO_WINDOW | - CREATE_UNICODE_ENVIRONMENT | - CREATE_SUSPENDED | - CREATE_NEW_PROCESS_GROUP; - - if (!CreateProcessW( - NULL, // applicationName - m_struCommandLine.QueryStr(), - NULL, // processAttr - NULL, // threadAttr - TRUE, // inheritHandles - dwCreationFlags, - mszNewEnvironment.QueryStr(), - m_struPhysicalPath.QueryStr(), // currentDir - &startupInfo, - &processInformation)) - { - pStrStage = L"CreateProcessW"; - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - - m_hProcessHandle = processInformation.hProcess; - m_dwProcessId = processInformation.dwProcessId; - - if (FAILED(hr = SetupJobObject())) - { - pStrStage = L"SetupJobObject"; - goto Failure; - } - - if (m_hJobObject != NULL) - { - if (!AssignProcessToJobObject(m_hJobObject, m_hProcessHandle)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - if (hr != HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED)) - { - pStrStage = L"AssignProcessToJobObject"; - goto Failure; - } - } - } - - if (ResumeThread(processInformation.hThread) == -1) - { - pStrStage = L"ResumeThread"; - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Failure; - } - - // - // need to make sure the server is up and listening on the port specified. - // - if (FAILED(hr = PostStartCheck())) - { - pStrStage = L"PostStartCheck"; - goto Failure; - } - - // Backend process starts successfully. Set retry counter to 0 - dwRetryCount = 0; - - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_PROCESS_START_SUCCESS, - ASPNETCORE_EVENT_PROCESS_START_SUCCESS_MSG, - m_struAppFullPath.QueryStr(), - m_dwProcessId, - m_dwListeningProcessId, - m_dwPort); - - goto Finished; - - Failure: - if (fCriticalError) - { - // Critical error, no retry need to avoid wasting resource and polluting log - dwRetryCount = 0; - } - - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_PROCESS_START_ERROR, - ASPNETCORE_EVENT_PROCESS_START_ERROR_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - pStrStage, - hr, - m_dwPort, - dwRetryCount); - - if (processInformation.hThread != NULL) - { - CloseHandle(processInformation.hThread); - processInformation.hThread = NULL; - } - - if (pHashTable != NULL) - { - pHashTable->Clear(); - delete pHashTable; - pHashTable = NULL; - } - - CleanUp(); - } - -Finished: - if (FAILED(hr) || m_fReady == FALSE) - { - if (m_hStdoutHandle != NULL) - { - if (m_hStdoutHandle != INVALID_HANDLE_VALUE) - { - CloseHandle(m_hStdoutHandle); - } - m_hStdoutHandle = NULL; - } - - if (m_fStdoutLogEnabled) - { - m_Timer.CancelTimer(); - } - - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_ERROR_TYPE, - ASPNETCORE_EVENT_PROCESS_START_FAILURE, - ASPNETCORE_EVENT_PROCESS_START_FAILURE_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_struCommandLine.QueryStr(), - m_dwPort); - } - return hr; -} - -HRESULT -SERVER_PROCESS::SetWindowsAuthToken( - HANDLE hToken, - LPHANDLE pTargetTokenHandle -) -{ - HRESULT hr = S_OK; - - if (m_hListeningProcessHandle != NULL && m_hListeningProcessHandle != INVALID_HANDLE_VALUE) - { - if (!DuplicateHandle( GetCurrentProcess(), - hToken, - m_hListeningProcessHandle, - pTargetTokenHandle, - 0, - FALSE, - DUPLICATE_SAME_ACCESS )) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - } - -Finished: - - return hr; -} - -HRESULT -SERVER_PROCESS::SetupStdHandles( - LPSTARTUPINFOW pStartupInfo -) -{ - HRESULT hr = S_OK; - SYSTEMTIME systemTime; - SECURITY_ATTRIBUTES saAttr = { 0 }; - - STRU struPath; - - DBG_ASSERT(pStartupInfo); - - if (!m_fStdoutLogEnabled) - { - pStartupInfo->dwFlags = STARTF_USESTDHANDLES; - pStartupInfo->hStdInput = INVALID_HANDLE_VALUE; - pStartupInfo->hStdError = INVALID_HANDLE_VALUE; - pStartupInfo->hStdOutput = INVALID_HANDLE_VALUE; - return hr; - } - if (m_hStdoutHandle != NULL && m_hStdoutHandle != INVALID_HANDLE_VALUE) - { - if (!CloseHandle(m_hStdoutHandle)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - m_hStdoutHandle = NULL; - } - - hr = UTILITY::ConvertPathToFullPath( - m_struLogFile.QueryStr(), - m_struPhysicalPath.QueryStr(), - &struPath); - if (FAILED(hr)) - { - goto Finished; - } - - GetSystemTime(&systemTime); - hr = m_struFullLogFile.SafeSnwprintf(L"%s_%d%02d%02d%02d%02d%02d_%d.log", - struPath.QueryStr(), - systemTime.wYear, - systemTime.wMonth, - systemTime.wDay, - systemTime.wHour, - systemTime.wMinute, - systemTime.wSecond, - GetCurrentProcessId()); - if (FAILED(hr)) - { - goto Finished; - } - - hr = UTILITY::EnsureDirectoryPathExist(struPath.QueryStr()); - if (FAILED(hr)) - { - goto Finished; - } - - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - m_hStdoutHandle = CreateFileW(m_struFullLogFile.QueryStr(), - FILE_WRITE_DATA, - FILE_SHARE_READ, - &saAttr, - CREATE_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - - if (m_hStdoutHandle == INVALID_HANDLE_VALUE) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - pStartupInfo->dwFlags = STARTF_USESTDHANDLES; - pStartupInfo->hStdInput = INVALID_HANDLE_VALUE; - pStartupInfo->hStdError = m_hStdoutHandle; - pStartupInfo->hStdOutput = m_hStdoutHandle; - // start timer to open and close handles regularly. - m_Timer.InitializeTimer(STTIMER::TimerCallback, &m_struFullLogFile, 3000, 3000); - -Finished: - if (FAILED(hr)) - { - pStartupInfo->dwFlags = STARTF_USESTDHANDLES; - pStartupInfo->hStdInput = INVALID_HANDLE_VALUE; - pStartupInfo->hStdError = INVALID_HANDLE_VALUE; - pStartupInfo->hStdOutput = INVALID_HANDLE_VALUE; - - if (m_fStdoutLogEnabled) - { - // Log the error - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_CONFIG_ERROR, - ASPNETCORE_EVENT_INVALID_STDOUT_LOG_FILE_MSG, - m_struFullLogFile.IsEmpty()? m_struLogFile.QueryStr() : m_struFullLogFile.QueryStr(), - hr); - } - // The log file was not created yet in case of failure. No need to clean it - m_struFullLogFile.Reset(); - } - return hr; -} - -HRESULT -SERVER_PROCESS::CheckIfServerIsUp( - _In_ DWORD dwPort, - _Out_ DWORD * pdwProcessId, - _Out_ BOOL * pfReady -) -{ - HRESULT hr = S_OK; - DWORD dwResult = ERROR_INSUFFICIENT_BUFFER; - MIB_TCPTABLE_OWNER_PID *pTCPInfo = NULL; - MIB_TCPROW_OWNER_PID *pOwner = NULL; - DWORD dwSize = 1000; // Initial size for pTCPInfo buffer - int iResult = 0; - SOCKADDR_IN sockAddr; - SOCKET socketCheck = INVALID_SOCKET; - - DBG_ASSERT(pfReady); - DBG_ASSERT(pdwProcessId); - - *pfReady = FALSE; - // - // it's OK for us to return processID 0 in case we cannot detect the real one - // - *pdwProcessId = 0; - - if (!g_fNsiApiNotSupported) - { - while (dwResult == ERROR_INSUFFICIENT_BUFFER) - { - // Increase the buffer size with additional space, MIB_TCPROW 20 bytes - // New entries may be added by other processes before calling GetExtendedTcpTable - dwSize += 200; - - if (pTCPInfo != NULL) - { - HeapFree(GetProcessHeap(), 0, pTCPInfo); - } - - pTCPInfo = (MIB_TCPTABLE_OWNER_PID*)HeapAlloc(GetProcessHeap(), 0, dwSize); - if (pTCPInfo == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - dwResult = GetExtendedTcpTable(pTCPInfo, - &dwSize, - FALSE, - AF_INET, - TCP_TABLE_OWNER_PID_LISTENER, - 0); - - if (dwResult != NO_ERROR && dwResult != ERROR_INSUFFICIENT_BUFFER) - { - hr = HRESULT_FROM_WIN32(dwResult); - goto Finished; - } - } - - // iterate pTcpInfo struct to find PID/PORT entry - for (DWORD dwLoop = 0; dwLoop < pTCPInfo->dwNumEntries; dwLoop++) - { - pOwner = &pTCPInfo->table[dwLoop]; - if (ntohs((USHORT)pOwner->dwLocalPort) == dwPort) - { - *pdwProcessId = pOwner->dwOwningPid; - *pfReady = TRUE; - break; - } - } - } - else - { - // - // We have to open socket to ping the service - // - socketCheck = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); - - if (socketCheck == INVALID_SOCKET) - { - hr = HRESULT_FROM_WIN32(WSAGetLastError()); - goto Finished; - } - - sockAddr.sin_family = AF_INET; - if (!inet_pton(AF_INET, LOCALHOST, &(sockAddr.sin_addr))) - { - hr = HRESULT_FROM_WIN32(WSAGetLastError()); - goto Finished; - } - - //sockAddr.sin_addr.s_addr = inet_addr( LOCALHOST ); - sockAddr.sin_port = htons((u_short)dwPort); - - // - // Connect to server. - // if connection fails, socket is not closed, we reuse the same socket - // while retrying - // - iResult = connect(socketCheck, (SOCKADDR *)&sockAddr, sizeof(sockAddr)); - if (iResult == SOCKET_ERROR) - { - hr = HRESULT_FROM_WIN32(WSAGetLastError()); - if (hr == HRESULT_FROM_WIN32(WSAECONNREFUSED)) - { - // WSAECONNREFUSED means no application listen on the given port. - // This is not a failure. Reset the hresult to S_OK and return fReady to false - hr = S_OK; - } - goto Finished; - } - *pfReady = TRUE; - } - -Finished: - - if (socketCheck != INVALID_SOCKET) - { - iResult = closesocket(socketCheck); - if (iResult == SOCKET_ERROR) - { - hr = HRESULT_FROM_WIN32(WSAGetLastError()); - } - socketCheck = INVALID_SOCKET; - } - - if (pTCPInfo != NULL) - { - HeapFree(GetProcessHeap(), 0, pTCPInfo); - pTCPInfo = NULL; - } - - return hr; -} - -// send signal to the process to let it gracefully shutdown -// if the process cannot shutdown within given time, terminate it -VOID -SERVER_PROCESS::SendSignal( - VOID -) -{ - HRESULT hr = S_OK; - HANDLE hThread = NULL; - - ReferenceServerProcess(); - - m_hShutdownHandle = OpenProcess(SYNCHRONIZE | PROCESS_TERMINATE, FALSE, m_dwProcessId); - - if (m_hShutdownHandle == NULL) - { - // since we cannot open the process. let's terminate the process - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - hThread = CreateThread( - NULL, // default security attributes - 0, // default stack size - (LPTHREAD_START_ROUTINE)SendShutDownSignal, - this, // thread function arguments - 0, // default creation flags - NULL); // receive thread identifier - - if (hThread == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (WaitForSingleObject(m_hShutdownHandle, m_dwShutdownTimeLimitInMS) != WAIT_OBJECT_0) - { - hr = HRESULT_FROM_WIN32(ERROR_TIMEOUT); - goto Finished; - } - // thread should already exit - CloseHandle(hThread); - hThread = NULL; - -Finished: - if (hThread != NULL) - { - // if the send shutdown message thread is still running, terminate it - DWORD dwThreadStatus = 0; - if (GetExitCodeThread(hThread, &dwThreadStatus)!= 0 && dwThreadStatus == STILL_ACTIVE) - { - TerminateThread(hThread, STATUS_CONTROL_C_EXIT); - } - CloseHandle(hThread); - hThread = NULL; - } - - if (FAILED(hr)) - { - TerminateBackendProcess(); - } - - if (m_hShutdownHandle != NULL && m_hShutdownHandle != INVALID_HANDLE_VALUE) - { - CloseHandle(m_hShutdownHandle); - m_hShutdownHandle = NULL; - } - - DereferenceServerProcess(); -} - - -// -// StopProcess is only called if process crashes OR if the process -// creation failed and calling this counts towards RapidFailCounts. -// -VOID -SERVER_PROCESS::StopProcess( - VOID -) -{ - m_fReady = FALSE; - - m_pProcessManager->IncrementRapidFailCount(); - - for (INT i=0; iNumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || - processList->NumberOfProcessIdsInList == 0)); - - if (dwError == ERROR_MORE_DATA) - { - hr = E_OUTOFMEMORY; - // some error - goto Finished; - } - - if (processList == NULL || - (processList->NumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || - processList->NumberOfProcessIdsInList == 0)) - { - hr = HRESULT_FROM_WIN32(ERROR_PROCESS_ABORTED); - // some error - goto Finished; - } - - if (processList->NumberOfProcessIdsInList > MAX_ACTIVE_CHILD_PROCESSES) - { - hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED); - goto Finished; - } - - for (DWORD i=0; iNumberOfProcessIdsInList; i++) - { - dwPid = (DWORD)processList->ProcessIdList[i]; - if (dwPid != dwWorkerProcessPid) - { - HANDLE hProcess = OpenProcess( - PROCESS_QUERY_INFORMATION | SYNCHRONIZE | PROCESS_TERMINATE | PROCESS_DUP_HANDLE, - FALSE, - dwPid); - - BOOL returnValue = CheckRemoteDebuggerPresent(hProcess, &fDebuggerPresent); - if (hProcess != NULL) - { - CloseHandle(hProcess); - hProcess = NULL; - } - - if (!returnValue) - { - goto Finished; - } - - if (fDebuggerPresent) - { - break; - } - } - } - -Finished: - - if (processList != NULL) - { - HeapFree(GetProcessHeap(), 0, processList); - } - - return fDebuggerPresent; -} - -HRESULT -SERVER_PROCESS::GetChildProcessHandles( - VOID -) -{ - HRESULT hr = S_OK; - PJOBOBJECT_BASIC_PROCESS_ID_LIST processList = NULL; - DWORD dwPid = 0; - DWORD dwWorkerProcessPid = 0; - DWORD cbNumBytes = 1024; - DWORD dwRetries = 0; - DWORD dwError = NO_ERROR; - - dwWorkerProcessPid = GetCurrentProcessId(); - - do - { - dwError = NO_ERROR; - - if (processList != NULL) - { - HeapFree(GetProcessHeap(), 0, processList); - processList = NULL; - - // resize - cbNumBytes = cbNumBytes * 2; - } - - processList = (PJOBOBJECT_BASIC_PROCESS_ID_LIST) HeapAlloc( - GetProcessHeap(), - 0, - cbNumBytes - ); - if (processList == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - RtlZeroMemory(processList, cbNumBytes); - - if (!QueryInformationJobObject( - m_hJobObject, - JobObjectBasicProcessIdList, - processList, - cbNumBytes, - NULL)) - { - dwError = GetLastError(); - if (dwError != ERROR_MORE_DATA) - { - hr = HRESULT_FROM_WIN32(dwError); - goto Finished; - } - } - - } while (dwRetries++ < 5 && - processList != NULL && - (processList->NumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || processList->NumberOfProcessIdsInList == 0)); - - if (dwError == ERROR_MORE_DATA) - { - hr = E_OUTOFMEMORY; - // some error - goto Finished; - } - - if (processList == NULL || (processList->NumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || processList->NumberOfProcessIdsInList == 0)) - { - hr = HRESULT_FROM_WIN32(ERROR_PROCESS_ABORTED); - // some error - goto Finished; - } - - if (processList->NumberOfProcessIdsInList > MAX_ACTIVE_CHILD_PROCESSES) - { - hr = HRESULT_FROM_WIN32(ERROR_CREATE_FAILED); - goto Finished; - } - - for (DWORD i=0; iNumberOfProcessIdsInList; i++) - { - dwPid = (DWORD)processList->ProcessIdList[i]; - if (dwPid != m_dwProcessId && - dwPid != dwWorkerProcessPid ) - { - m_hChildProcessHandles[m_cChildProcess] = OpenProcess( - PROCESS_QUERY_INFORMATION | SYNCHRONIZE | PROCESS_TERMINATE | PROCESS_DUP_HANDLE, - FALSE, - dwPid - ); - m_dwChildProcessIds[m_cChildProcess] = dwPid; - m_cChildProcess ++; - } - } - -Finished: - - if (processList != NULL) - { - HeapFree(GetProcessHeap(), 0, processList); - } - - return hr; -} - -HRESULT -SERVER_PROCESS::StopAllProcessesInJobObject( - VOID -) -{ - HRESULT hr = S_OK; - PJOBOBJECT_BASIC_PROCESS_ID_LIST processList = NULL; - HANDLE hProcess = NULL; - DWORD dwWorkerProcessPid = 0; - DWORD cbNumBytes = 1024; - DWORD dwRetries = 0; - - dwWorkerProcessPid = GetCurrentProcessId(); - - do - { - if (processList != NULL) - { - HeapFree(GetProcessHeap(), 0, processList); - processList = NULL; - - // resize - cbNumBytes = cbNumBytes * 2; - } - - processList = (PJOBOBJECT_BASIC_PROCESS_ID_LIST) HeapAlloc( - GetProcessHeap(), - 0, - cbNumBytes - ); - if (processList == NULL) - { - hr = E_OUTOFMEMORY; - goto Finished; - } - - RtlZeroMemory(processList, cbNumBytes); - - if (!QueryInformationJobObject( - m_hJobObject, - JobObjectBasicProcessIdList, - processList, - cbNumBytes, - NULL)) - { - DWORD dwError = GetLastError(); - if (dwError != ERROR_MORE_DATA) - { - hr = HRESULT_FROM_WIN32(dwError); - goto Finished; - } - } - - } while (dwRetries++ < 5 && - processList != NULL && - (processList->NumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || processList->NumberOfProcessIdsInList == 0)); - - if (processList == NULL || (processList->NumberOfAssignedProcesses > processList->NumberOfProcessIdsInList || processList->NumberOfProcessIdsInList == 0)) - { - hr = HRESULT_FROM_WIN32(ERROR_NOT_ENOUGH_MEMORY); - // some error - goto Finished; - } - - for (DWORD i=0; iNumberOfProcessIdsInList; i++) - { - if (dwWorkerProcessPid != (DWORD)processList->ProcessIdList[i]) - { - hProcess = OpenProcess(PROCESS_TERMINATE, - FALSE, - (DWORD)processList->ProcessIdList[i]); - if (hProcess != NULL) - { - if (!TerminateProcess(hProcess, 1)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - } - else - { - WaitForSingleObject(hProcess, INFINITE); - } - - if (hProcess != NULL) - { - CloseHandle(hProcess); - hProcess = NULL; - } - } - } - } - -Finished: - - if (processList != NULL) - { - HeapFree(GetProcessHeap(), 0, processList); - } - - return hr; -} - -SERVER_PROCESS::SERVER_PROCESS() : - m_cRefs(1), - m_hProcessHandle(NULL), - m_hProcessWaitHandle(NULL), - m_dwProcessId(0), - m_cChildProcess(0), - m_fReady(FALSE), - m_lStopping(0L), - m_hStdoutHandle(NULL), - m_fStdoutLogEnabled(FALSE), - m_hJobObject(NULL), - m_pForwarderConnection(NULL), - m_dwListeningProcessId(0), - m_hListeningProcessHandle(NULL), - m_hShutdownHandle(NULL) -{ - //InterlockedIncrement(&g_dwActiveServerProcesses); - srand(GetTickCount()); - - for (INT i=0; iDereferenceForwarderConnection(); - m_pForwarderConnection = NULL; - } - -} - -SERVER_PROCESS::~SERVER_PROCESS() -{ - - CleanUp(); - - m_pEnvironmentVarTable = NULL; - // no need to free m_pEnvironmentVarTable, as it references to - // the same hash table hold by configuration. - // the hashtable memory will be freed once onfiguration got recycled - - if (m_pProcessManager != NULL) - { - m_pProcessManager->DereferenceProcessManager(); - m_pProcessManager = NULL; - } - - if (m_hStdoutHandle != NULL) - { - if (m_hStdoutHandle != INVALID_HANDLE_VALUE) - { - CloseHandle(m_hStdoutHandle); - } - m_hStdoutHandle = NULL; - } - - if (m_fStdoutLogEnabled) - { - m_Timer.CancelTimer(); - } - - if (!m_fStdoutLogEnabled && !m_struFullLogFile.IsEmpty()) - { - WIN32_FIND_DATA fileData; - HANDLE handle = FindFirstFile(m_struFullLogFile.QueryStr(), &fileData); - if (handle != INVALID_HANDLE_VALUE && - fileData.nFileSizeHigh == 0 && - fileData.nFileSizeLow == 0) - { - FindClose(handle); - // no need to check whether the deletion succeeds - // as nothing can be done - DeleteFile(m_struFullLogFile.QueryStr()); - } - } -} - -//static -VOID -CALLBACK -SERVER_PROCESS::ProcessHandleCallback( - _In_ PVOID pContext, - _In_ BOOL -) -{ - SERVER_PROCESS *pServerProcess = (SERVER_PROCESS*) pContext; - pServerProcess->HandleProcessExit(); -} - -HRESULT -SERVER_PROCESS::RegisterProcessWait( - PHANDLE phWaitHandle, - HANDLE hProcessToWaitOn -) -{ - HRESULT hr = S_OK; - NTSTATUS status = 0; - - _ASSERT(phWaitHandle != NULL && *phWaitHandle == NULL); - - *phWaitHandle = NULL; - - // wait thread will dereference. - ReferenceServerProcess(); - - status = RegisterWaitForSingleObject( - phWaitHandle, - hProcessToWaitOn, - (WAITORTIMERCALLBACKFUNC)&ProcessHandleCallback, - this, - INFINITE, - WT_EXECUTEONLYONCE | WT_EXECUTEINWAITTHREAD - ); - - if (status < 0) - { - hr = HRESULT_FROM_NT(status); - goto Finished; - } - -Finished: - - if (FAILED(hr)) - { - *phWaitHandle = NULL; - DereferenceServerProcess(); - } - - return hr; -} - -VOID -SERVER_PROCESS::HandleProcessExit( VOID ) -{ - BOOL fReady = FALSE; - DWORD dwProcessId = 0; - - if (InterlockedCompareExchange(&m_lStopping, 1L, 0L) == 0L) - { - CheckIfServerIsUp(m_dwPort, &dwProcessId, &fReady); - - if (!fReady) - { - UTILITY::LogEventF( - g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_PROCESS_SHUTDOWN, - ASPNETCORE_EVENT_PROCESS_SHUTDOWN_MSG, - m_struAppFullPath.QueryStr(), - m_struPhysicalPath.QueryStr(), - m_dwProcessId, - m_dwPort); - - m_pProcessManager->ShutdownProcess(this); - } - - DereferenceServerProcess(); - } -} - -HRESULT -SERVER_PROCESS::SendShutdownHttpMessage( VOID ) -{ - HRESULT hr = S_OK; - HINTERNET hSession = NULL; - HINTERNET hConnect = NULL; - HINTERNET hRequest = NULL; - - STACK_STRU(strHeaders, 256); - STRU strAppToken; - STRU strUrl; - DWORD dwStatusCode = 0; - DWORD dwSize = sizeof(dwStatusCode); - - hSession = WinHttpOpen(L"", - WINHTTP_ACCESS_TYPE_DEFAULT_PROXY, - WINHTTP_NO_PROXY_NAME, - WINHTTP_NO_PROXY_BYPASS, - 0); - - if (hSession == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - hConnect = WinHttpConnect(hSession, - L"127.0.0.1", - (USHORT)m_dwPort, - 0); - - if (hConnect == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - if (m_struAppVirtualPath.QueryCCH() > 1) - { - // app path size is 1 means site root, i.e., "/" - // we don't want to add duplicated '/' to the request url - // otherwise the request will fail - strUrl.Copy(m_struAppVirtualPath); - } - strUrl.Append(L"/iisintegration"); - - hRequest = WinHttpOpenRequest(hConnect, - L"POST", - strUrl.QueryStr(), - NULL, - WINHTTP_NO_REFERER, - NULL, - 0); - - if (hRequest == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // set timeout - if (!WinHttpSetTimeouts(hRequest, - m_dwShutdownTimeLimitInMS, // dwResolveTimeout - m_dwShutdownTimeLimitInMS, // dwConnectTimeout - m_dwShutdownTimeLimitInMS, // dwSendTimeout - m_dwShutdownTimeLimitInMS)) // dwReceiveTimeout - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - // set up the shutdown headers - if (FAILED(hr = strHeaders.Append(L"MS-ASPNETCORE-EVENT:shutdown \r\n")) || - FAILED(hr = strAppToken.Append(L"MS-ASPNETCORE-TOKEN:")) || - FAILED(hr = strAppToken.AppendA(m_straGuid.QueryStr())) || - FAILED(hr = strHeaders.Append(strAppToken.QueryStr()))) - { - goto Finished; - } - - if (!WinHttpSendRequest(hRequest, - strHeaders.QueryStr(), // pwszHeaders - strHeaders.QueryCCH(), // dwHeadersLength - WINHTTP_NO_REQUEST_DATA, - 0, // dwOptionalLength - 0, // dwTotalLength - 0)) // dwContext - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (!WinHttpReceiveResponse(hRequest , NULL)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (!WinHttpQueryHeaders(hRequest, - WINHTTP_QUERY_STATUS_CODE | WINHTTP_QUERY_FLAG_NUMBER, - WINHTTP_HEADER_NAME_BY_INDEX, - &dwStatusCode, - &dwSize, - WINHTTP_NO_HEADER_INDEX)) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - if (dwStatusCode != 202) - { - // not expected http status - hr = E_FAIL; - } - - // log - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_INFORMATION_TYPE, - ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST, - ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST_MSG, - m_dwProcessId, - dwStatusCode); - -Finished: - if (hRequest) - { - WinHttpCloseHandle(hRequest); - hRequest = NULL; - } - if (hConnect) - { - WinHttpCloseHandle(hConnect); - hConnect = NULL; - } - if (hSession) - { - WinHttpCloseHandle(hSession); - hSession = NULL; - } - return hr; -} - -//static -VOID -SERVER_PROCESS::SendShutDownSignal( - LPVOID lpParam -) -{ - SERVER_PROCESS* pThis = static_cast(lpParam); - DBG_ASSERT(pThis); - pThis->SendShutDownSignalInternal(); -} - -// -// send shutdown message first, if fail then send -// ctrl-c to the backend process to let it gracefully shutdown -// -VOID -SERVER_PROCESS::SendShutDownSignalInternal( - VOID -) -{ - ReferenceServerProcess(); - - if (FAILED(SendShutdownHttpMessage())) - { - // - // failed to send shutdown http message - // try send ctrl signal - // - HWND hCurrentConsole = NULL; - BOOL fFreeConsole = FALSE; - hCurrentConsole = GetConsoleWindow(); - if (hCurrentConsole) - { - // free current console first, as we may have one, e.g., hostedwebcore case - fFreeConsole = FreeConsole(); - } - - if (AttachConsole(m_dwProcessId)) - { - // As we called CreateProcess with CREATE_NEW_PROCESS_GROUP - // call ctrl-break instead of ctrl-c as child process ignores ctrl-c - if (!GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT, m_dwProcessId)) - { - // failed to send the ctrl signal. terminate the backend process immediately instead of waiting for timeout - TerminateBackendProcess(); - } - FreeConsole(); - - if (fFreeConsole) - { - // IISExpress and hostedwebcore w3wp run as background process - // have to attach console back to ensure post app_offline scenario still works - AttachConsole(ATTACH_PARENT_PROCESS); - } - } - else - { - // terminate the backend process immediately instead of waiting for timeout - TerminateBackendProcess(); - } - } - - DereferenceServerProcess(); -} - -VOID -SERVER_PROCESS::TerminateBackendProcess( - VOID -) -{ - if (InterlockedCompareExchange(&m_lStopping, 1L, 0L) == 0L) - { - // backend process will be terminated, remove the waitcallback - if (m_hProcessWaitHandle != NULL) - { - UnregisterWait(m_hProcessWaitHandle); - - // as we skipped process exit callback (ProcessHandleCallback), - // need to dereference the object otherwise memory leak - DereferenceServerProcess(); - - m_hProcessWaitHandle = NULL; - } - - // cannot gracefully shutdown or timeout, terminate the process - if (m_hProcessHandle != NULL && m_hProcessHandle != INVALID_HANDLE_VALUE) - { - TerminateProcess(m_hProcessHandle, 0); - m_hProcessHandle = NULL; - } - - // log a warning for ungraceful shutdown - UTILITY::LogEventF(g_hEventLog, - EVENTLOG_WARNING_TYPE, - ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE, - ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE_MSG, - m_dwProcessId); - } -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h deleted file mode 100644 index ff76297a1c..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/serverprocess.h +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#define MIN_PORT 1025 -#define MAX_PORT 48000 -#define MAX_RETRY 10 -#define MAX_ACTIVE_CHILD_PROCESSES 16 -#define LOCALHOST "127.0.0.1" -#define ASPNETCORE_PORT_STR L"ASPNETCORE_PORT" -#define ASPNETCORE_PORT_ENV_STR L"ASPNETCORE_PORT=" -#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH=" -#define ASPNETCORE_APP_TOKEN_ENV_STR L"ASPNETCORE_TOKEN=" -#define ASPNETCORE_APP_PATH_ENV_STR L"ASPNETCORE_APPL_PATH=" - -class PROCESS_MANAGER; - -class SERVER_PROCESS -{ -public: - SERVER_PROCESS(); - - HRESULT - Initialize( - _In_ PROCESS_MANAGER *pProcessManager, - _In_ STRU *pszProcessExePath, - _In_ STRU *pszArguments, - _In_ DWORD dwStartupTimeLimitInMS, - _In_ DWORD dwShtudownTimeLimitInMS, - _In_ BOOL fWindowsAuthEnabled, - _In_ BOOL fBasicAuthEnabled, - _In_ BOOL fAnonymousAuthEnabled, - _In_ ENVIRONMENT_VAR_HASH* pEnvironmentVariables, - _In_ BOOL fStdoutLogEnabled, - _In_ BOOL fWebsocketsEnabled, - _In_ STRU *pstruStdoutLogFile, - _In_ STRU *pszAppPhysicalPath, - _In_ STRU *pszAppPath, - _In_ STRU *pszAppVirtualPath - ); - - HRESULT - StartProcess( VOID ); - - HRESULT - SetWindowsAuthToken( - _In_ HANDLE hToken, - _Out_ LPHANDLE pTargeTokenHandle - ); - - BOOL - IsReady( - VOID - ) - { - return m_fReady; - } - - VOID - StopProcess( - VOID - ); - - DWORD - GetPort() - { - return m_dwPort; - } - - VOID - ReferenceServerProcess( - VOID - ) - { - InterlockedIncrement(&m_cRefs); - } - - VOID - DereferenceServerProcess( - VOID - ) - { - _ASSERT(m_cRefs != 0 ); - if (InterlockedDecrement(&m_cRefs) == 0) - { - delete this; - } - } - - virtual - ~SERVER_PROCESS(); - - static - VOID - CALLBACK - ProcessHandleCallback( - _In_ PVOID pContext, - _In_ BOOL - ); - - VOID - HandleProcessExit( - VOID - ); - - FORWARDER_CONNECTION* - QueryWinHttpConnection( - VOID - ) - { - return m_pForwarderConnection; - } - - LPCSTR - QueryGuid() - { - return m_straGuid.QueryStr(); - }; - - VOID - SendSignal( - VOID - ); - -private: - VOID - CleanUp(); - - HRESULT - SetupJobObject( - VOID - ); - - BOOL - IsDebuggerIsAttached( - VOID - ); - - HRESULT - StopAllProcessesInJobObject( - VOID - ); - - HRESULT - SetupStdHandles( - _Inout_ LPSTARTUPINFOW pStartupInfo - ); - - HRESULT - CheckIfServerIsUp( - _In_ DWORD dwPort, - _Out_ DWORD * pdwProcessId, - _Out_ BOOL * pfReady - ); - - HRESULT - RegisterProcessWait( - _In_ PHANDLE phWaitHandle, - _In_ HANDLE hProcessToWaitOn - ); - - HRESULT - GetChildProcessHandles( - VOID - ); - - HRESULT - SetupListenPort( - ENVIRONMENT_VAR_HASH *pEnvironmentVarTable, - BOOL *pfCriticalError - ); - - HRESULT - SetupAppPath( - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable - ); - - HRESULT - SetupAppToken( - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable - ); - - HRESULT - OutputEnvironmentVariables( - MULTISZ* pmszOutput, - ENVIRONMENT_VAR_HASH* pEnvironmentVarTable - ); - - HRESULT - SetupCommandLine( - STRU* pstrCommandLine - ); - - HRESULT - PostStartCheck( - VOID - ); - - HRESULT - GetRandomPort( - DWORD* pdwPickedPort, - DWORD dwExcludedPort - ); - - static - VOID - SendShutDownSignal( - LPVOID lpParam - ); - - VOID - SendShutDownSignalInternal( - VOID - ); - - HRESULT - SendShutdownHttpMessage( - VOID - ); - - VOID - TerminateBackendProcess( - VOID - ); - - FORWARDER_CONNECTION *m_pForwarderConnection; - BOOL m_fStdoutLogEnabled; - BOOL m_fWindowsAuthEnabled; - BOOL m_fBasicAuthEnabled; - BOOL m_fAnonymousAuthEnabled; - BOOL m_fWebsocketsEnabled; - - STTIMER m_Timer; - SOCKET m_socket; - - STRU m_struLogFile; - STRU m_struFullLogFile; - STRU m_ProcessPath; - STRU m_Arguments; - STRU m_struAppVirtualPath; // e.g., '/' for site - STRU m_struAppFullPath; // e.g., /LM/W3SVC/4/ROOT/Inproc - STRU m_struPhysicalPath; // e.g., c:/test/mysite - STRU m_struPort; - STRU m_struCommandLine; - - volatile LONG m_lStopping; - volatile BOOL m_fReady; - mutable LONG m_cRefs; - - DWORD m_dwPort; - DWORD m_dwStartupTimeLimitInMS; - DWORD m_dwShutdownTimeLimitInMS; - DWORD m_cChildProcess; - DWORD m_dwChildProcessIds[MAX_ACTIVE_CHILD_PROCESSES]; - DWORD m_dwProcessId; - DWORD m_dwListeningProcessId; - - STRA m_straGuid; - - HANDLE m_hJobObject; - HANDLE m_hStdoutHandle; - // - // m_hProcessHandle is the handle to process this object creates. - // - HANDLE m_hProcessHandle; - HANDLE m_hListeningProcessHandle; - HANDLE m_hProcessWaitHandle; - HANDLE m_hShutdownHandle; - // - // m_hChildProcessHandle is the handle to process created by - // m_hProcessHandle process if it does. - // - HANDLE m_hChildProcessHandles[MAX_ACTIVE_CHILD_PROCESSES]; - HANDLE m_hChildProcessWaitHandles[MAX_ACTIVE_CHILD_PROCESSES]; - - PROCESS_MANAGER *m_pProcessManager; - ENVIRONMENT_VAR_HASH *m_pEnvironmentVarTable ; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx deleted file mode 100644 index ae7ecf697e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.cxx +++ /dev/null @@ -1,1151 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -/*++ - -Abstract: - - Main Handler for websocket requests. - - Initiates websocket connection to backend. - Uses WinHttp API's for backend connections, - and IIS Websocket API's for sending/receiving - websocket traffic. - - Transfers data between the two IO endpoints. - ------------------ -Read Loop Design ------------------ -When a read IO completes successfully on any endpoints, Asp.Net Core Module doesn't -immediately issue the next read. The next read is initiated only after -the read data is sent to the other endpoint. As soon as this send completes, -we initiate the next IO. It should be noted that the send complete merely -indicates the API completion from HTTP, and not necessarily over the network. - -This prevents the need for data buffering at the Asp.Net Core Module level. - ---*/ - -#include "..\precomp.hxx" - -SRWLOCK WEBSOCKET_HANDLER::sm_RequestsListLock; - -LIST_ENTRY WEBSOCKET_HANDLER::sm_RequestsListHead; - -TRACE_LOG * WEBSOCKET_HANDLER::sm_pTraceLog; - -WEBSOCKET_HANDLER::WEBSOCKET_HANDLER() : - _pHttpContext(NULL), - _pWebSocketContext(NULL), - _hWebSocketRequest(NULL), - _pHandler(NULL), - _dwOutstandingIo(0), - _fCleanupInProgress(FALSE), - _fIndicateCompletionToIis(FALSE), - _fHandleClosed(FALSE), - _fReceivedCloseMsg(FALSE) -{ - DebugPrintf (ASPNETCORE_DEBUG_FLAG_INFO, "WEBSOCKET_HANDLER::WEBSOCKET_HANDLER"); - - InitializeCriticalSectionAndSpinCount(&_RequestLock, 1000); - InsertRequest(); -} - -VOID -WEBSOCKET_HANDLER::Terminate( - VOID - ) -{ - DebugPrintf (ASPNETCORE_DEBUG_FLAG_INFO, "WEBSOCKET_HANDLER::Terminate"); - if (!_fHandleClosed) - { - RemoveRequest(); - _fCleanupInProgress = TRUE; - - if (_pHttpContext != NULL) - { - _pHttpContext->CancelIo(); - _pHttpContext = NULL; - } - if (_hWebSocketRequest) - { - WinHttpCloseHandle(_hWebSocketRequest); - _hWebSocketRequest = NULL; - } - - _pWebSocketContext = NULL; - DeleteCriticalSection(&_RequestLock); - - delete this; - } -} - -//static -HRESULT -WEBSOCKET_HANDLER::StaticInitialize( - BOOL fEnableReferenceCountTracing - ) -/*++ - - Routine Description: - - Initialize structures required for idle connection cleanup. - ---*/ -{ - if (!g_fWebSocketSupported) - { - return S_OK; - } - - if (fEnableReferenceCountTracing) - { - // - // If tracing is enabled, keep track of all websocket requests - // for debugging purposes. - // - InitializeListHead (&sm_RequestsListHead); - sm_pTraceLog = CreateRefTraceLog( 10000, 0 ); - } - - InitializeSRWLock(&sm_RequestsListLock); - - return S_OK; -} - -//static -VOID -WEBSOCKET_HANDLER::StaticTerminate( - VOID - ) -{ - if (!g_fWebSocketSupported) - { - return; - } - - if (sm_pTraceLog) - { - DestroyRefTraceLog(sm_pTraceLog); - sm_pTraceLog = NULL; - } -} - -VOID -WEBSOCKET_HANDLER::InsertRequest( - VOID - ) -{ - if (g_fEnableReferenceCountTracing) - { - AcquireSRWLockExclusive(&sm_RequestsListLock); - InsertTailList(&sm_RequestsListHead, &_listEntry); - ReleaseSRWLockExclusive( &sm_RequestsListLock); - } -} - -//static -VOID -WEBSOCKET_HANDLER::RemoveRequest( - VOID - ) -{ - if (g_fEnableReferenceCountTracing) - { - AcquireSRWLockExclusive(&sm_RequestsListLock); - RemoveEntryList(&_listEntry); - ReleaseSRWLockExclusive( &sm_RequestsListLock); - } -} - -VOID -WEBSOCKET_HANDLER::IncrementOutstandingIo( - VOID - ) -{ - LONG dwOutstandingIo = InterlockedIncrement(&_dwOutstandingIo); - if (sm_pTraceLog) - { - WriteRefTraceLog(sm_pTraceLog, dwOutstandingIo, this); - } -} - -VOID -WEBSOCKET_HANDLER::DecrementOutstandingIo( - VOID - ) -/*++ - Routine Description: - Decrements outstanding IO count. - - This indicates completion to IIS if all outstanding IO - has been completed, and a Cleanup was triggered for this - connection (denoted by _fIndicateCompletionToIis). - ---*/ -{ - LONG dwOutstandingIo = InterlockedDecrement (&_dwOutstandingIo); - - if (sm_pTraceLog) - { - WriteRefTraceLog(sm_pTraceLog, dwOutstandingIo, this); - } - - if (dwOutstandingIo == 0 && _fIndicateCompletionToIis) - { - IndicateCompletionToIIS(); - } -} - -VOID -WEBSOCKET_HANDLER::IndicateCompletionToIIS( - VOID - ) -/*++ - Routine Description: - Indicates completion to IIS. - - This returns a Pending Status, so that forwarding handler has a chance - to do book keeping when request is finally done. - ---*/ -{ - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::IndicateCompletionToIIS called %d", _dwOutstandingIo); - - // - // close Websocket handle. This will triger a WinHttp callback - // on handle close, then let IIS pipeline continue. - // Make sure no pending IO as there is no IIS websocket cancelation, - // any unexpected callback will lead to AV. Revisit it once CanelOutGoingIO works - // - if (_hWebSocketRequest != NULL && _dwOutstandingIo == 0) - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::IndicateCompletionToIIS"); - - _pHandler->SetStatus(FORWARDER_DONE); - _fHandleClosed = TRUE; - WinHttpCloseHandle(_hWebSocketRequest); - _hWebSocketRequest = NULL; - } -} - -HRESULT -WEBSOCKET_HANDLER::ProcessRequest( - FORWARDING_HANDLER *pHandler, - IHttpContext *pHttpContext, - HINTERNET hRequest, - BOOL* pfHandleCreated -) -/*++ - -Routine Description: - - Entry point to WebSocket Handler: - - This routine is called after the 101 response was successfully sent to - the client. - This routine get's a websocket handle to winhttp, - websocket handle to IIS's websocket context, and initiates IO - in these two endpoints. - - ---*/ -{ - HRESULT hr = S_OK; - //DWORD dwBuffSize = RECEIVE_BUFFER_SIZE; - - *pfHandleCreated = FALSE; - _pHandler = pHandler; - - EnterCriticalSection(&_RequestLock); - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::ProcessRequest"); - - // - // Cache the points to IHttpContext3 - // - hr = HttpGetExtendedInterface(g_pHttpServer, - pHttpContext, - &_pHttpContext); - if (FAILED (hr)) - { - goto Finished; - } - - // - // Get pointer to IWebSocketContext for IIS websocket IO. - // - - _pWebSocketContext = (IWebSocketContext *) _pHttpContext-> - GetNamedContextContainer()->GetNamedContext(IIS_WEBSOCKET); - if ( _pWebSocketContext == NULL ) - { - hr = HRESULT_FROM_WIN32( ERROR_FILE_NOT_FOUND ); - goto Finished; - } - - // - // Get Handle to Winhttp's websocket context. - // - _hWebSocketRequest = WINHTTP_HELPER::sm_pfnWinHttpWebSocketCompleteUpgrade( - hRequest, - (DWORD_PTR) pHandler); - - if (_hWebSocketRequest == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - *pfHandleCreated = TRUE; - - // - // Resize the send & receive buffers to be more conservative (and avoid DoS attacks). - // NOTE: The two WinHTTP options below were added for WinBlue, so we can't - // rely on their existence. - // - - //if (!WinHttpSetOption(_hWebSocketRequest, - // WINHTTP_OPTION_WEB_SOCKET_RECEIVE_BUFFER_SIZE, - // &dwBuffSize, - // sizeof(dwBuffSize))) - //{ - // DWORD dwRet = GetLastError(); - // if ( dwRet != ERROR_WINHTTP_INVALID_OPTION ) - // { - // hr = HRESULT_FROM_WIN32(dwRet); - // goto Finished; - // } - //} - - //if (!WinHttpSetOption(_hWebSocketRequest, - // WINHTTP_OPTION_WEB_SOCKET_SEND_BUFFER_SIZE, - // &dwBuffSize, - // sizeof(dwBuffSize))) - //{ - // DWORD dwRet = GetLastError(); - // if ( dwRet != ERROR_WINHTTP_INVALID_OPTION ) - // { - // hr = HRESULT_FROM_WIN32(dwRet); - // goto Finished; - // } - //} - - // - // Initiate Read on IIS - // - hr = DoIisWebSocketReceive(); - if (FAILED(hr)) - { - goto Finished; - } - - // - // Initiate Read on WinHttp - // - - hr = DoWinHttpWebSocketReceive(); - if (FAILED(hr)) - { - goto Finished; - } - -Finished: - LeaveCriticalSection(&_RequestLock); - - if (FAILED (hr)) - { - DebugPrintf (ASPNETCORE_DEBUG_FLAG_ERROR, - "Process Request Failed with HR=%08x", hr); - } - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::DoIisWebSocketReceive( - VOID -) -/*++ - -Routine Description: - - Initiates a websocket receive on the IIS Websocket Context. - - ---*/ -{ - HRESULT hr = S_OK; - DWORD dwBufferSize = RECEIVE_BUFFER_SIZE; - BOOL fUtf8Encoded; - BOOL fFinalFragment; - BOOL fClose; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoIisWebSocketReceive"); - - IncrementOutstandingIo(); - - hr = _pWebSocketContext->ReadFragment( - &_IisReceiveBuffer, - &dwBufferSize, - TRUE, - &fUtf8Encoded, - &fFinalFragment, - &fClose, - OnReadIoCompletion, - this, - NULL); - if (FAILED(hr)) - { - DecrementOutstandingIo(); - DebugPrintf(ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::DoIisWebSocketSend failed with %08x", hr); - } - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::DoWinHttpWebSocketReceive( - VOID -) -/*++ - -Routine Description: - - Initiates a websocket receive on WinHttp - - ---*/ -{ - HRESULT hr = S_OK; - DWORD dwError = NO_ERROR; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoWinHttpWebSocketReceive"); - - IncrementOutstandingIo(); - - dwError = WINHTTP_HELPER::sm_pfnWinHttpWebSocketReceive( - _hWebSocketRequest, - &_WinHttpReceiveBuffer, - RECEIVE_BUFFER_SIZE, - NULL, - NULL); - - if (dwError != NO_ERROR) - { - DecrementOutstandingIo(); - hr = HRESULT_FROM_WIN32(dwError); - DebugPrintf(ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::DoWinHttpWebSocketReceive failed with %08x", hr); - } - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::DoIisWebSocketSend( - DWORD cbData, - WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType -) -/*++ - -Routine Description: - - Initiates a websocket send on IIS - ---*/ -{ - HRESULT hr = S_OK; - BOOL fUtf8Encoded = FALSE; - BOOL fFinalFragment = FALSE; - BOOL fClose = FALSE; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoIisWebSocketSend %d", eBufferType); - - if (eBufferType == WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE) - { - // - // Query Close Status from WinHttp - // - - DWORD dwError = NO_ERROR; - USHORT uStatus; - DWORD dwReceived = 0; - STACK_STRU(strCloseReason, 128); - - dwError = WINHTTP_HELPER::sm_pfnWinHttpWebSocketQueryCloseStatus( - _hWebSocketRequest, - &uStatus, - &_WinHttpReceiveBuffer, - RECEIVE_BUFFER_SIZE, - &dwReceived); - - if (dwError != NO_ERROR) - { - hr = HRESULT_FROM_WIN32(dwError); - goto Finished; - } - - // - // Convert close reason to WCHAR - // - hr = strCloseReason.CopyA((PCSTR)&_WinHttpReceiveBuffer, - dwReceived); - if (FAILED(hr)) - { - goto Finished; - } - - IncrementOutstandingIo(); - // - // Backend end may start close hand shake first - // Need to indicate no more receive should be called on WinHttp connection - // - _fReceivedCloseMsg = TRUE; - _fIndicateCompletionToIis = TRUE; - - // - // Send close to IIS. - // - hr = _pWebSocketContext->SendConnectionClose( - TRUE, - uStatus, - uStatus == 1005 ? NULL : strCloseReason.QueryStr(), - OnWriteIoCompletion, - this, - NULL); - } - else - { - // - // Get equivalant flags for IIS API from buffer type. - // - - WINHTTP_HELPER::GetFlagsFromBufferType(eBufferType, - &fUtf8Encoded, - &fFinalFragment, - &fClose); - - IncrementOutstandingIo(); - - // - // Do the Send. - // - hr = _pWebSocketContext->WriteFragment( - &_WinHttpReceiveBuffer, - &cbData, - TRUE, - fUtf8Encoded, - fFinalFragment, - OnWriteIoCompletion, - this, - NULL); - } - - if (FAILED(hr)) - { - DecrementOutstandingIo(); - } - -Finished: - if (FAILED(hr)) - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::DoIisWebSocketSend failed with %08x", hr); - } - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::DoWinHttpWebSocketSend( - DWORD cbData, - WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType -) -/*++ - -Routine Description: - - Initiates a websocket send on WinHttp - ---*/ -{ - DWORD dwError = NO_ERROR; - HRESULT hr = S_OK; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoWinHttpWebSocketSend, %d", eBufferType); - - if (eBufferType == WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE) - { - USHORT uStatus; - LPCWSTR pszReason; - STACK_STRA(strCloseReason, 128); - - // - // Get Close status from IIS. - // - hr = _pWebSocketContext->GetCloseStatus(&uStatus, - &pszReason); - - if (FAILED(hr)) - { - goto Finished; - } - - // - // Convert status to UTF8 - // - hr = strCloseReason.CopyWToUTF8Unescaped(pszReason); - if (FAILED(hr)) - { - goto Finished; - } - - IncrementOutstandingIo(); - - // - // Send Close. - // - dwError = WINHTTP_HELPER::sm_pfnWinHttpWebSocketShutdown( - _hWebSocketRequest, - uStatus, - strCloseReason.QueryCCH() == 0 ? NULL : (PVOID) strCloseReason.QueryStr(), - strCloseReason.QueryCCH()); - - if (dwError == ERROR_IO_PENDING) - { - // - // Call will complete asynchronously, return. - // ignore error. - // - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoWinhttpWebSocketSend IO_PENDING"); - - dwError = NO_ERROR; - } - else - { - if (dwError == NO_ERROR) - { - // - // Call completed synchronously. - // - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::DoWinhttpWebSocketSend Shutdown successful."); - } - } - } - else - { - IncrementOutstandingIo(); - - dwError = WINHTTP_HELPER::sm_pfnWinHttpWebSocketSend( - _hWebSocketRequest, - eBufferType, - cbData == 0 ? NULL : &_IisReceiveBuffer, - cbData - ); - } - - if (dwError != NO_ERROR) - { - hr = HRESULT_FROM_WIN32(dwError); - DecrementOutstandingIo(); - goto Finished; - } - -Finished: - if (FAILED(hr)) - { - DebugPrintf(ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::DoWinHttpWebSocketSend failed with %08x", hr); - } - - return hr; -} - -//static -VOID -WINAPI -WEBSOCKET_HANDLER::OnReadIoCompletion( - HRESULT hrError, - VOID * pvCompletionContext, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ) -/*++ - - Routine Description: - - Completion routine for Read's from IIS pipeline. - ---*/ -{ - WEBSOCKET_HANDLER * pHandler = (WEBSOCKET_HANDLER *) - pvCompletionContext; - - pHandler->OnIisReceiveComplete( - hrError, - cbIO, - fUTF8Encoded, - fFinalFragment, - fClose - ); -} - -//static -VOID -WINAPI -WEBSOCKET_HANDLER::OnWriteIoCompletion( - HRESULT hrError, - VOID * pvCompletionContext, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ) -/*++ - Routine Description: - - Completion routine for Write's from IIS pipeline. - ---*/ -{ - WEBSOCKET_HANDLER * pHandler = (WEBSOCKET_HANDLER *) - pvCompletionContext; - - UNREFERENCED_PARAMETER(fUTF8Encoded); - UNREFERENCED_PARAMETER(fFinalFragment); - UNREFERENCED_PARAMETER(fClose); - - pHandler->OnIisSendComplete( - hrError, - cbIO - ); -} - - -HRESULT -WEBSOCKET_HANDLER::OnWinHttpSendComplete( - WINHTTP_WEB_SOCKET_STATUS * - ) -/*++ - -Routine Description: - Completion callback executed when a send to backend - server completes. - - If the send was successful, issue the next read - on the client's endpoint. - -++*/ -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - CleanupReason cleanupReason = CleanupReasonUnknown; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::OnWinHttpSendComplete"); - - if (_fCleanupInProgress) - { - goto Finished; - } - - EnterCriticalSection (&_RequestLock); - - fLocked = TRUE; - - if (_fCleanupInProgress) - { - goto Finished; - } - // - // Data was successfully sent to backend. - // Initiate next receive from IIS. - // - - hr = DoIisWebSocketReceive(); - if (FAILED(hr)) - { - goto Finished; - } - -Finished: - if (fLocked) - { - LeaveCriticalSection(&_RequestLock); - } - - if (FAILED (hr)) - { - Cleanup (cleanupReason); - - DebugPrintf (ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::OnWinsockSendComplete failed with HR=%08x", hr); - } - - // - // The handler object can be gone after this call. - // do not reference it after this statement. - // - DecrementOutstandingIo(); - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::OnWinHttpShutdownComplete( - VOID - ) -{ - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::OnWinHttpShutdownComplete --%p", _pHandler); - - DecrementOutstandingIo(); - - return S_OK; -} - -HRESULT -WEBSOCKET_HANDLER::OnWinHttpIoError( - WINHTTP_WEB_SOCKET_ASYNC_RESULT *pCompletionStatus -) -{ - HRESULT hr = HRESULT_FROM_WIN32(pCompletionStatus->AsyncResult.dwError); - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::OnWinHttpIoError HR = %08x, Operation = %d", - hr, pCompletionStatus->AsyncResult.dwResult); - - Cleanup(ServerDisconnect); - DecrementOutstandingIo(); - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::OnWinHttpReceiveComplete( - WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus - ) -/*++ - -Routine Description: - - Completion callback executed when a receive completes - on the backend server winhttp endpoint. - - Issue send on the Client(IIS) if the receive was - successful. - - If the receive completed with zero bytes, that - indicates that the server has disconnected the connection. - Issue cleanup for the websocket handler. ---*/ -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - CleanupReason cleanupReason = CleanupReasonUnknown; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::OnWinHttpReceiveComplete --%p", _pHandler); - - if (_fCleanupInProgress) - { - goto Finished; - } - - EnterCriticalSection(&_RequestLock); - - fLocked = TRUE; - if (_fCleanupInProgress) - { - goto Finished; - } - hr = DoIisWebSocketSend( - pCompletionStatus->dwBytesTransferred, - pCompletionStatus->eBufferType - ); - - if (FAILED (hr)) - { - cleanupReason = ClientDisconnect; - goto Finished; - } - -Finished: - if (fLocked) - { - LeaveCriticalSection(&_RequestLock); - } - if (FAILED (hr)) - { - Cleanup (cleanupReason); - - DebugPrintf (ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::OnWinsockReceiveComplete failed with HR=%08x", hr); - } - - // - // The handler object can be gone after this call. - // do not reference it after this statement. - // - - DecrementOutstandingIo(); - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::OnIisSendComplete( - HRESULT hrCompletion, - DWORD cbIo - ) -/*++ -Routine Description: - - Completion callback executed when a send - completes from the client. - - If send was successful,issue read on the - server endpoint, to continue the readloop. - ---*/ -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - CleanupReason cleanupReason = CleanupReasonUnknown; - - UNREFERENCED_PARAMETER(cbIo); - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, "WEBSOCKET_HANDLER::OnIisSendComplete"); - - if (FAILED(hrCompletion)) - { - hr = hrCompletion; - cleanupReason = ClientDisconnect; - goto Finished; - } - - if (_fCleanupInProgress) - { - goto Finished; - } - EnterCriticalSection(&_RequestLock); - fLocked = TRUE; - if (_fCleanupInProgress) - { - goto Finished; - } - - // - // Only call read if no close hand shake was received from backend - // - if (!_fReceivedCloseMsg) - { - // - // Write Completed, initiate next read from backend server. - // - hr = DoWinHttpWebSocketReceive(); - if (FAILED(hr)) - { - cleanupReason = ServerDisconnect; - goto Finished; - } - } - -Finished: - if (fLocked) - { - LeaveCriticalSection(&_RequestLock); - } - if (FAILED (hr)) - { - Cleanup (cleanupReason); - - DebugPrintf (ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::OnIisSendComplete failed with HR=%08x", hr); - } - - // - // The handler object can be gone after this call. - // do not reference it after this statement. - // - - DecrementOutstandingIo(); - - return hr; -} - -HRESULT -WEBSOCKET_HANDLER::OnIisReceiveComplete( - HRESULT hrCompletion, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ) -/*++ -Routine Description: - - Completion routine executed when a receive completes - from the client (IIS endpoint). - - If the receive was successful, initiate a send on - the backend server (winhttp) endpoint. - - If the receive failed, initiate cleanup. - ---*/ -{ - HRESULT hr = S_OK; - BOOL fLocked = FALSE; - CleanupReason cleanupReason = CleanupReasonUnknown; - WINHTTP_WEB_SOCKET_BUFFER_TYPE BufferType; - - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::OnIisReceiveComplete"); - - if (FAILED(hrCompletion)) - { - cleanupReason = ClientDisconnect; - hr = hrCompletion; - goto Finished; - } - - if (_fCleanupInProgress) - { - goto Finished; - } - - EnterCriticalSection(&_RequestLock); - - fLocked = TRUE; - if (_fCleanupInProgress) - { - goto Finished; - } - // - // Get Buffer Type from flags. - // - - WINHTTP_HELPER::GetBufferTypeFromFlags(fUTF8Encoded, - fFinalFragment, - fClose, - &BufferType); - - // - // Initiate Send. - // - - hr = DoWinHttpWebSocketSend(cbIO, BufferType); - if (FAILED (hr)) - { - cleanupReason = ServerDisconnect; - goto Finished; - } - -Finished: - if (fLocked) - { - LeaveCriticalSection(&_RequestLock); - } - if (FAILED (hr)) - { - Cleanup (cleanupReason); - - DebugPrintf (ASPNETCORE_DEBUG_FLAG_ERROR, - "WEBSOCKET_HANDLER::OnIisReceiveComplete failed with HR=%08x", hr); - } - - // - // The handler object can be gone after this call. - // do not reference it after this statement. - // - - DecrementOutstandingIo(); - - return hr; -} - -VOID -WEBSOCKET_HANDLER::Cleanup( - CleanupReason reason -) -/*++ - -Routine Description: - - Cleanup function for the websocket handler. - - Initiates cancelIo on the two IO endpoints: - IIS, WinHttp client. - -Arguments: - CleanupReason ---*/ -{ - BOOL fLocked = FALSE; - DebugPrintf(ASPNETCORE_DEBUG_FLAG_INFO, - "WEBSOCKET_HANDLER::Cleanup Initiated with reason %d", reason); - - if (_fCleanupInProgress) - { - goto Finished; - } - - EnterCriticalSection(&_RequestLock); - - fLocked = TRUE; - if (_fCleanupInProgress) - { - goto Finished; - } - - _fCleanupInProgress = TRUE; - - _fIndicateCompletionToIis = TRUE; - - // - // TODO:: Raise FREB event with cleanup reason. - // - if (reason == ClientDisconnect || reason == ServerStateUnavailable) - { - // - // Calling shutdown to notify the backend about disonnect - // - WINHTTP_HELPER::sm_pfnWinHttpWebSocketShutdown( - _hWebSocketRequest, - 1011, // indicate that a server is terminating the connection because it encountered - // an unexpected condition that prevent it from fulfilling the request - NULL, // Reason - 0); // length og Reason - - } - - if (reason == ServerDisconnect || reason == ServerStateUnavailable) - { - _pHttpContext->CancelIo(); - // - // CancelIo sometime may not be able to cannel pending websocket IO - // ResetConnection to force IISWebsocket module to release the pipeline - // - _pHttpContext->GetResponse()->ResetConnection(); - } - -Finished: - if (fLocked) - { - LeaveCriticalSection(&_RequestLock); - } -} diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.h deleted file mode 100644 index 2256e5d70e..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/websockethandler.h +++ /dev/null @@ -1,225 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -extern IHttpServer * g_pHttpServer; -class FORWARDING_HANDLER; - -class WEBSOCKET_HANDLER -{ -public: - WEBSOCKET_HANDLER(); - - static - HRESULT - StaticInitialize( - BOOL fEnableReferenceTraceLogging - ); - - static - VOID - StaticTerminate( - VOID - ); - - VOID - Terminate( - VOID - ); - - VOID - TerminateRequest( - VOID - ) - { - Cleanup(ServerStateUnavailable); - } - - HRESULT - ProcessRequest( - FORWARDING_HANDLER *pHandler, - IHttpContext * pHttpContext, - HINTERNET hRequest, - BOOL* pfHandleCreated - ); - - REQUEST_NOTIFICATION_STATUS - OnAsyncCompletion( - VOID - ); - - HRESULT - OnWinHttpSendComplete( - WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus - ); - - HRESULT - OnWinHttpShutdownComplete( - VOID - ); - - HRESULT - OnWinHttpReceiveComplete( - WINHTTP_WEB_SOCKET_STATUS * pCompletionStatus - ); - - HRESULT - OnWinHttpIoError( - WINHTTP_WEB_SOCKET_ASYNC_RESULT *pCompletionStatus - ); - - -private: - enum CleanupReason - { - CleanupReasonUnknown = 0, - IdleTimeout = 1, - ConnectFailed = 2, - ClientDisconnect = 3, - ServerDisconnect = 4, - ServerStateUnavailable = 5 - }; - - virtual - ~WEBSOCKET_HANDLER() - { - } - - WEBSOCKET_HANDLER(const WEBSOCKET_HANDLER &); - void operator=(const WEBSOCKET_HANDLER &); - - VOID - InsertRequest( - VOID - ); - - VOID - RemoveRequest( - VOID - ); - - static - VOID - WINAPI - OnReadIoCompletion( - HRESULT hrError, - VOID * pvCompletionContext, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ); - - static - VOID - WINAPI - OnWriteIoCompletion( - HRESULT hrError, - VOID * pvCompletionContext, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ); - - VOID - Cleanup( - CleanupReason reason - ); - - HRESULT - DoIisWebSocketReceive( - VOID - ); - - HRESULT - DoWinHttpWebSocketReceive( - VOID - ); - - HRESULT - DoIisWebSocketSend( - DWORD cbData, - WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType - ); - - HRESULT - DoWinHttpWebSocketSend( - DWORD cbData, - WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType - ); - - HRESULT - OnIisSendComplete( - HRESULT hrError, - DWORD cbIO - ); - - HRESULT - OnIisReceiveComplete( - HRESULT hrError, - DWORD cbIO, - BOOL fUTF8Encoded, - BOOL fFinalFragment, - BOOL fClose - ); - - VOID - IncrementOutstandingIo( - VOID - ); - - VOID - DecrementOutstandingIo( - VOID - ); - - VOID - IndicateCompletionToIIS( - VOID - ); - -private: - static const - DWORD RECEIVE_BUFFER_SIZE = 4*1024; - - LIST_ENTRY _listEntry; - - IHttpContext3 * _pHttpContext; - - IWebSocketContext * _pWebSocketContext; - - FORWARDING_HANDLER *_pHandler; - - HINTERNET _hWebSocketRequest; - - BYTE _WinHttpReceiveBuffer[RECEIVE_BUFFER_SIZE]; - - BYTE _IisReceiveBuffer[RECEIVE_BUFFER_SIZE]; - - CRITICAL_SECTION _RequestLock; - - LONG _dwOutstandingIo; - - volatile - BOOL _fCleanupInProgress; - - volatile - BOOL _fIndicateCompletionToIis; - - volatile - BOOL _fHandleClosed; - - volatile - BOOL _fReceivedCloseMsg; - - static - LIST_ENTRY sm_RequestsListHead; - - static - SRWLOCK sm_RequestsListLock; - - static - TRACE_LOG * sm_pTraceLog; -}; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx deleted file mode 100644 index ce4256a710..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.cxx +++ /dev/null @@ -1,176 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#include "..\precomp.hxx" - -PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE -WINHTTP_HELPER::sm_pfnWinHttpWebSocketCompleteUpgrade; - -PFN_WINHTTP_WEBSOCKET_SEND -WINHTTP_HELPER::sm_pfnWinHttpWebSocketSend; - -PFN_WINHTTP_WEBSOCKET_RECEIVE -WINHTTP_HELPER::sm_pfnWinHttpWebSocketReceive; - -PFN_WINHTTP_WEBSOCKET_SHUTDOWN -WINHTTP_HELPER::sm_pfnWinHttpWebSocketShutdown; - -PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS -WINHTTP_HELPER::sm_pfnWinHttpWebSocketQueryCloseStatus; - -//static -HRESULT -WINHTTP_HELPER::StaticInitialize( - VOID -) -{ - HRESULT hr = S_OK; - - if (!g_fWebSocketSupported) - { - return S_OK; - } - - // - // Initialize the function pointers for WinHttp Websocket API's. - // - - HMODULE hWinHttp = GetModuleHandleA("winhttp.dll"); - if (hWinHttp == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - sm_pfnWinHttpWebSocketCompleteUpgrade = (PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE) - GetProcAddress(hWinHttp, "WinHttpWebSocketCompleteUpgrade"); - if (sm_pfnWinHttpWebSocketCompleteUpgrade == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - sm_pfnWinHttpWebSocketQueryCloseStatus = (PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS) - GetProcAddress(hWinHttp, "WinHttpWebSocketQueryCloseStatus"); - if (sm_pfnWinHttpWebSocketQueryCloseStatus == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - sm_pfnWinHttpWebSocketReceive = (PFN_WINHTTP_WEBSOCKET_RECEIVE) - GetProcAddress(hWinHttp, "WinHttpWebSocketReceive"); - if (sm_pfnWinHttpWebSocketReceive == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - sm_pfnWinHttpWebSocketSend = (PFN_WINHTTP_WEBSOCKET_SEND) - GetProcAddress(hWinHttp, "WinHttpWebSocketSend"); - if (sm_pfnWinHttpWebSocketSend == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - - sm_pfnWinHttpWebSocketShutdown = (PFN_WINHTTP_WEBSOCKET_SHUTDOWN) - GetProcAddress(hWinHttp, "WinHttpWebSocketShutdown"); - if (sm_pfnWinHttpWebSocketShutdown == NULL) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - goto Finished; - } - -Finished: - return hr; -} - - -//static -VOID -WINHTTP_HELPER::GetFlagsFromBufferType( - __in WINHTTP_WEB_SOCKET_BUFFER_TYPE BufferType, - __out BOOL * pfUtf8Encoded, - __out BOOL * pfFinalFragment, - __out BOOL * pfClose -) -{ - switch (BufferType) - { - case WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE: - *pfUtf8Encoded = FALSE; - *pfFinalFragment = TRUE; - *pfClose = FALSE; - - break; - - case WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE: - *pfUtf8Encoded = FALSE; - *pfFinalFragment = FALSE; - *pfClose = FALSE; - - break; - - case WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE: - *pfUtf8Encoded = TRUE; - *pfFinalFragment = TRUE; - *pfClose = FALSE; - - break; - - case WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE: - *pfUtf8Encoded = TRUE; - *pfFinalFragment = FALSE; - *pfClose = FALSE; - - break; - - case WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE: - *pfUtf8Encoded = FALSE; - *pfFinalFragment = FALSE; - *pfClose = TRUE; - - break; - } -} - -//static -VOID -WINHTTP_HELPER::GetBufferTypeFromFlags( - __in BOOL fUtf8Encoded, - __in BOOL fFinalFragment, - __in BOOL fClose, - __out WINHTTP_WEB_SOCKET_BUFFER_TYPE* pBufferType -) -{ - if (fClose) - { - *pBufferType = WINHTTP_WEB_SOCKET_CLOSE_BUFFER_TYPE; - } - else - if (fUtf8Encoded) - { - if (fFinalFragment) - { - *pBufferType = WINHTTP_WEB_SOCKET_UTF8_MESSAGE_BUFFER_TYPE; - } - else - { - *pBufferType = WINHTTP_WEB_SOCKET_UTF8_FRAGMENT_BUFFER_TYPE; - } - } - else - { - if (fFinalFragment) - { - *pBufferType = WINHTTP_WEB_SOCKET_BINARY_MESSAGE_BUFFER_TYPE; - } - else - { - *pBufferType = WINHTTP_WEB_SOCKET_BINARY_FRAGMENT_BUFFER_TYPE; - } - } - - return; -} \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.h deleted file mode 100644 index d583f6fb10..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/outofprocess/winhttphelper.h +++ /dev/null @@ -1,91 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -typedef -HINTERNET -(WINAPI * PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE)( - _In_ HINTERNET hRequest, - _In_opt_ DWORD_PTR pContext -); - - -typedef -DWORD -(WINAPI * PFN_WINHTTP_WEBSOCKET_SEND)( - _In_ HINTERNET hWebSocket, - _In_ WINHTTP_WEB_SOCKET_BUFFER_TYPE eBufferType, - _In_reads_opt_(dwBufferLength) PVOID pvBuffer, - _In_ DWORD dwBufferLength -); - -typedef -DWORD -(WINAPI * PFN_WINHTTP_WEBSOCKET_RECEIVE)( - _In_ HINTERNET hWebSocket, - _Out_writes_bytes_to_(dwBufferLength, *pdwBytesRead) PVOID pvBuffer, - _In_ DWORD dwBufferLength, - _Out_range_(0, dwBufferLength) DWORD *pdwBytesRead, - _Out_ WINHTTP_WEB_SOCKET_BUFFER_TYPE *peBufferType -); - -typedef -DWORD -(WINAPI * PFN_WINHTTP_WEBSOCKET_SHUTDOWN)( - _In_ HINTERNET hWebSocket, - _In_ USHORT usStatus, - _In_reads_bytes_opt_(dwReasonLength) PVOID pvReason, - _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD dwReasonLength -); - -typedef -DWORD -(WINAPI * PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS)( - _In_ HINTERNET hWebSocket, - _Out_ USHORT *pusStatus, - _Out_writes_bytes_to_opt_(dwReasonLength, *pdwReasonLengthConsumed) PVOID pvReason, - _In_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD dwReasonLength, - _Out_range_(0, WINHTTP_WEB_SOCKET_MAX_CLOSE_REASON_LENGTH) DWORD *pdwReasonLengthConsumed -); - -class WINHTTP_HELPER -{ -public: - static - HRESULT - StaticInitialize(); - - static - VOID - GetFlagsFromBufferType( - __in WINHTTP_WEB_SOCKET_BUFFER_TYPE BufferType, - __out BOOL * pfUtf8Encoded, - __out BOOL * pfFinalFragment, - __out BOOL * pfClose - ); - - static - VOID - GetBufferTypeFromFlags( - __in BOOL fUtf8Encoded, - __in BOOL fFinalFragment, - __in BOOL fClose, - __out WINHTTP_WEB_SOCKET_BUFFER_TYPE* pBufferType - ); - - static - PFN_WINHTTP_WEBSOCKET_COMPLETE_UPGRADE sm_pfnWinHttpWebSocketCompleteUpgrade; - - static - PFN_WINHTTP_WEBSOCKET_SEND sm_pfnWinHttpWebSocketSend; - - static - PFN_WINHTTP_WEBSOCKET_RECEIVE sm_pfnWinHttpWebSocketReceive; - - static - PFN_WINHTTP_WEBSOCKET_SHUTDOWN sm_pfnWinHttpWebSocketShutdown; - - static - PFN_WINHTTP_WEBSOCKET_QUERY_CLOSE_STATUS sm_pfnWinHttpWebSocketQueryCloseStatus; -}; \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx deleted file mode 100644 index 2fa43aac17..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/precomp.hxx +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once -#pragma warning( disable : 4091) - -// -// System related headers -// -#define _WINSOCKAPI_ - -#define NTDDI_VERSION 0x06010000 -#define WINVER 0x0601 -#define _WIN32_WINNT 0x0601 - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -// This should remove our issue of compiling for win7 without header files. -// We force the Windows 8 version check logic in iiswebsocket.h to succeed even though we're compiling for Windows 7. -// Then, we set the version defines back to Windows 7 to for the remainder of the compilation. -#undef NTDDI_VERSION -#undef WINVER -#undef _WIN32_WINNT -#define NTDDI_VERSION 0x06020000 -#define WINVER 0x0602 -#define _WIN32_WINNT 0x0602 -#include -#undef NTDDI_VERSION -#undef WINVER -#undef _WIN32_WINNT - -#define NTDDI_VERSION 0x06010000 -#define WINVER 0x0601 -#define _WIN32_WINNT 0x0601 - -#include "..\IISLib\acache.h" -#include "..\IISLib\multisz.h" -#include "..\IISLib\multisza.h" -#include "..\IISLib\base64.h" -#include "..\IISLib\listentry.h" -#include "..\CommonLib\fx_ver.h" -#include "..\CommonLib\debugutil.h" -#include "..\CommonLib\requesthandler.h" -#include "..\CommonLib\aspnetcoreconfig.h" -#include "..\CommonLib\utility.h" -#include "..\CommonLib\application.h" -#include "..\CommonLib\resources.h" -#include "aspnetcore_event.h" -#include "aspnetcore_msg.h" -#include "disconnectcontext.h" -#include "environmentvariablehelpers.h" -#include "sttimer.h" -#include ".\inprocess\InProcessHandler.h" -#include ".\inprocess\inprocessapplication.h" -#include ".\outofprocess\responseheaderhash.h" -#include ".\outofprocess\protocolconfig.h" -#include ".\outofprocess\forwarderconnection.h" -#include ".\outofprocess\serverprocess.h" -#include ".\outofprocess\processmanager.h" -#include ".\outofprocess\websockethandler.h" -#include ".\outofprocess\forwardinghandler.h" -#include ".\outofprocess\outprocessapplication.h" -#include ".\outofprocess\winhttphelper.h" - -#ifdef max -#undef max -template inline T max(T a, T b) -{ - return a > b ? a : b; -} -#endif - -#ifdef min -#undef min -template inline T min(T a, T b) -{ - return a < b ? a : b; -} -#endif - - -inline bool IsSpace(char ch) -{ - switch (ch) - { - case 32: // ' ' - case 9: // '\t' - case 10: // '\n' - case 13: // '\r' - case 11: // '\v' - case 12: // '\f' - return true; - default: - return false; - } -} - -extern BOOL g_fAsyncDisconnectAvailable; -extern BOOL g_fWinHttpNonBlockingCallbackAvailable; -extern BOOL g_fWebSocketSupported; -extern BOOL g_fNsiApiNotSupported; -extern BOOL g_fEnableReferenceCountTracing; -extern BOOL g_fProcessDetach; -extern DWORD g_dwActiveServerProcesses; -extern DWORD g_OptionalWinHttpFlags; -extern SRWLOCK g_srwLockRH; -extern HINTERNET g_hWinhttpSession; -extern DWORD g_dwTlsIndex; -extern HANDLE g_hEventLog; diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/requesthandler.rc b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/requesthandler.rc deleted file mode 100644 index 2cc99c2331..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/requesthandler.rc +++ /dev/null @@ -1,119 +0,0 @@ -// Microsoft Visual C++ generated resource script. -// -#include -#include "version.h" -#include "..\CommonLib\resources.h" -///////////////////////////////////////////////////////////////////////////// -// English (United States) resources - -#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_ENU) -LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_US - -#define FileDescription "IIS ASP.NET Core Module Request Handler. Commit: " CommitHash - -///////////////////////////////////////////////////////////////////////////// -// -// 11 -// - -//1 11 -//BEGIN -// 0x0001, 0x0000, 0x03e8, 0x0000, 0x03ed, 0x0000, 0x0010, 0x0000, 0x0010, -// 0x0001, 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, -// 0x0025, 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, -// 0x0031, 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, -// 0x000d, 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d, -// 0x000a, 0x0000, 0x0000, 0x0010, 0x0001, 0x0025, 0x0031, 0x000d, 0x000a, -// 0x0000, 0x0000 -//END - - -#ifdef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// TEXTINCLUDE -// - -1 TEXTINCLUDE -BEGIN - "..\CommonLib\resources.h\0" -END - -2 TEXTINCLUDE -BEGIN - "\0" -END - -3 TEXTINCLUDE -BEGIN - "\r\n" - "\0" -END - -#endif // APSTUDIO_INVOKED - - -///////////////////////////////////////////////////////////////////////////// -// -// Version -// - -VS_VERSION_INFO VERSIONINFO - FILEVERSION FileVersion - PRODUCTVERSION ProductVersion - FILEFLAGSMASK 0x3fL -#ifdef _DEBUG - FILEFLAGS 0x1L -#else - FILEFLAGS 0x0L -#endif - FILEOS 0x40004L - FILETYPE 0x2L - FILESUBTYPE 0x0L -BEGIN - BLOCK "StringFileInfo" - BEGIN - BLOCK "040904b0" - BEGIN - VALUE "CompanyName", "Microsoft" - VALUE "FileDescription", FileDescription - VALUE "FileVersion", FileVersionStr - VALUE "InternalName", "aspnetcorerh.dll" - VALUE "LegalCopyright", "Copyright (C) Microsoft Corporation" - VALUE "OriginalFilename", "aspnetcorerh.dll" - VALUE "ProductName", "ASP.NET Core Module Request Handler" - VALUE "ProductVersion", ProductVersionStr - END - END - BLOCK "VarFileInfo" - BEGIN - VALUE "Translation", 0x409, 1200 - END -END - - -///////////////////////////////////////////////////////////////////////////// -// -// String Table -// - -STRINGTABLE -BEGIN - IDS_INVALID_PROPERTY "Property name '%s' in system.webServer/aspNetCore section has invalid value '%s' which does not conform to the prescribed format" - IDS_SERVER_ERROR "There was a connection error while trying to route the request." -END - -#endif // English (United States) resources -///////////////////////////////////////////////////////////////////////////// - - - -#ifndef APSTUDIO_INVOKED -///////////////////////////////////////////////////////////////////////////// -// -// Generated from the TEXTINCLUDE 3 resource. -// - - -///////////////////////////////////////////////////////////////////////////// -#endif // not APSTUDIO_INVOKED diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/sttimer.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/sttimer.h deleted file mode 100644 index dfb79e7a6a..0000000000 --- a/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandler/sttimer.h +++ /dev/null @@ -1,279 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#ifndef _STTIMER_H -#define _STTIMER_H - -class STTIMER -{ -public: - - STTIMER() - : _pTimer( NULL ) - { - fInCanel = FALSE; - } - - virtual - ~STTIMER() - { - if ( _pTimer ) - { - CancelTimer(); - CloseThreadpoolTimer( _pTimer ); - _pTimer = NULL; - } - } - - HRESULT - InitializeTimer( - PTP_TIMER_CALLBACK pfnCallback, - VOID * pContext, - DWORD dwInitialWait = 0, - DWORD dwPeriod = 0 - ) - { - _pTimer = CreateThreadpoolTimer( pfnCallback, - pContext, - NULL ); - - if ( !_pTimer ) - { - return HRESULT_FROM_WIN32( GetLastError() ); - } - - if ( dwInitialWait ) - { - SetTimer( dwInitialWait, - dwPeriod ); - } - - return S_OK; - } - - VOID - SetTimer( - DWORD dwInitialWait, - DWORD dwPeriod = 0 - ) - { - FILETIME ftInitialWait; - - if ( dwInitialWait == 0 && dwPeriod == 0 ) - { - // - // Special case. We are preventing new callbacks - // from being queued. Any existing callbacks in the - // queue will still run. - // - // This effectively disables the timer. It can be - // re-enabled by setting non-zero initial wait or - // period values. - // - if (_pTimer != NULL) - { - SetThreadpoolTimer(_pTimer, NULL, 0, 0); - } - - return; - } - - InitializeRelativeFileTime( &ftInitialWait, dwInitialWait ); - - SetThreadpoolTimer( _pTimer, - &ftInitialWait, - dwPeriod, - 0 ); - } - - VOID - CancelTimer() - { - // - // Disable the timer - // - if (fInCanel) - return; - - fInCanel = TRUE; - SetTimer( 0 ); - - // - // Wait until any callbacks queued prior to disabling - // have completed. - // - if (_pTimer != NULL) - { - WaitForThreadpoolTimerCallbacks(_pTimer, TRUE); - } - - fInCanel = FALSE; - } - - static - VOID - CALLBACK - TimerCallback( - _In_ PTP_CALLBACK_INSTANCE Instance, - _In_ PVOID Context, - _In_ PTP_TIMER Timer - ) - { - Instance; - Timer; - STRU* pstruLogFilePath = (STRU*)Context; - HANDLE hStdoutHandle = NULL; - SECURITY_ATTRIBUTES saAttr = { 0 }; - HRESULT hr = S_OK; - - saAttr.nLength = sizeof(SECURITY_ATTRIBUTES); - saAttr.bInheritHandle = TRUE; - saAttr.lpSecurityDescriptor = NULL; - - hStdoutHandle = CreateFileW(pstruLogFilePath->QueryStr(), - FILE_READ_DATA, - FILE_SHARE_WRITE, - &saAttr, - OPEN_ALWAYS, - FILE_ATTRIBUTE_NORMAL, - NULL); - if (hStdoutHandle == INVALID_HANDLE_VALUE) - { - hr = HRESULT_FROM_WIN32(GetLastError()); - } - - CloseHandle(hStdoutHandle); - } - -private: - - VOID - InitializeRelativeFileTime( - FILETIME * pft, - DWORD dwMilliseconds - ) - { - LARGE_INTEGER li; - - // - // The pftDueTime parameter expects the time to be - // expressed as the number of 100 nanosecond intervals - // times -1. - // - // To convert from milliseconds, we'll multiply by - // -10000 - // - - li.QuadPart = (LONGLONG)dwMilliseconds * -10000; - - pft->dwHighDateTime = li.HighPart; - pft->dwLowDateTime = li.LowPart; - }; - - TP_TIMER * _pTimer; - BOOL fInCanel; -}; - -class STELAPSED -{ -public: - - STELAPSED() - : _dwInitTime( 0 ), - _dwInitTickCount( 0 ), - _dwPerfCountsPerMillisecond( 0 ), - _fUsingHighResolution( FALSE ) - { - LARGE_INTEGER li; - BOOL fResult; - - _dwInitTickCount = GetTickCount64(); - - fResult = QueryPerformanceFrequency( &li ); - - if ( !fResult ) - { - goto Finished; - } - - _dwPerfCountsPerMillisecond = li.QuadPart / 1000; - - fResult = QueryPerformanceCounter( &li ); - - if ( !fResult ) - { - goto Finished; - } - - _dwInitTime = li.QuadPart / _dwPerfCountsPerMillisecond; - - _fUsingHighResolution = TRUE; - -Finished: - - return; - } - - virtual - ~STELAPSED() - { - } - - LONGLONG - QueryElapsedTime() - { - LARGE_INTEGER li; - - if ( _fUsingHighResolution && QueryPerformanceCounter( &li ) ) - { - DWORD64 dwCurrentTime = li.QuadPart / _dwPerfCountsPerMillisecond; - - if ( dwCurrentTime < _dwInitTime ) - { - // - // It's theoretically possible that QueryPerformanceCounter - // may return slightly different values on different CPUs. - // In this case, we don't want to return an unexpected value - // so we'll return zero. This is acceptable because - // presumably such a case would only happen for a very short - // time window. - // - // It would be possible to prevent this by ensuring processor - // affinity for all calls to QueryPerformanceCounter, but that - // would be undesirable in the general case because it could - // introduce unnecessary context switches and potentially a - // CPU bottleneck. - // - // Note that this issue also applies to callers doing rapid - // calls to this function. If a caller wants to mitigate - // that, they could enforce the affinitization, or they - // could implement a similar sanity check when comparing - // returned values from this function. - // - - return 0; - } - - return dwCurrentTime - _dwInitTime; - } - - return GetTickCount64() - _dwInitTickCount; - } - - BOOL - QueryUsingHighResolution() - { - return _fUsingHighResolution; - } - -private: - - DWORD64 _dwInitTime; - DWORD64 _dwInitTickCount; - DWORD64 _dwPerfCountsPerMillisecond; - BOOL _fUsingHighResolution; -}; - -#endif // _STTIMER_H \ No newline at end of file diff --git a/src/IISIntegration/src/Directory.Build.props b/src/IISIntegration/src/Directory.Build.props deleted file mode 100644 index 4b89a431e7..0000000000 --- a/src/IISIntegration/src/Directory.Build.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj deleted file mode 100644 index a3814f318b..0000000000 --- a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj +++ /dev/null @@ -1,33 +0,0 @@ - - - - ASP.NET Core components for working with the IIS AspNetCoreModule. - netstandard2.0 - $(NoWarn);CS1591 - true - aspnetcore;iis - true - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/AspNetCoreModuleTests/AspNetCoreModuleTests.vcxproj b/src/IISIntegration/test/AspNetCoreModuleTests/AspNetCoreModuleTests.vcxproj deleted file mode 100644 index 8f12548e9f..0000000000 --- a/src/IISIntegration/test/AspNetCoreModuleTests/AspNetCoreModuleTests.vcxproj +++ /dev/null @@ -1,184 +0,0 @@ - - - - - Debug - Win32 - - - Release - Win32 - - - Debug - x64 - - - Release - x64 - - - - 15.0 - {0692D963-DB10-4387-B3EA-460FBB9BD9A3} - Win32Proj - AspNetCoreModuleTests - 10.0.15063.0 - NativeUnitTestProject - - - - DynamicLibrary - true - v141 - Unicode - false - - - DynamicLibrary - false - v141 - true - Unicode - false - - - DynamicLibrary - true - v141 - Unicode - false - - - DynamicLibrary - false - v141 - true - Unicode - false - - - - - - - - - - - - - - - - - - - - - true - - - true - - - true - - - true - - - - Use - Level3 - Disabled - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\CommonLib;..\..\src\AspNetCoreModuleV2\IISLib - _DEBUG;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Windows - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - Use - Level3 - Disabled - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\CommonLib;..\..\src\AspNetCoreModuleV2\IISLib - WIN32;_DEBUG;%(PreprocessorDefinitions) - true - MultiThreadedDebug - - - Windows - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - Level3 - Use - MaxSpeed - true - true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\CommonLib;..\..\src\AspNetCoreModuleV2\IISLib - WIN32;NDEBUG;%(PreprocessorDefinitions) - true - MultiThreaded - - - Windows - true - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - Level3 - Use - MaxSpeed - true - true - $(VCInstallDir)UnitTest\include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\CommonLib;..\..\src\AspNetCoreModuleV2\IISLib - NDEBUG;%(PreprocessorDefinitions) - true - MultiThreaded - - - Windows - true - true - $(VCInstallDir)UnitTest\lib;%(AdditionalLibraryDirectories) - - - - - - - - - Create - Create - Create - Create - - - - - - - {55494e58-e061-4c4c-a0a8-837008e72f85} - - - {4787a64f-9a3e-4867-a55a-70cb4b2b2ffe} - - - - - - - \ No newline at end of file diff --git a/src/IISIntegration/test/AspNetCoreModuleTests/stdafx.h b/src/IISIntegration/test/AspNetCoreModuleTests/stdafx.h deleted file mode 100644 index 67bd5aa27b..0000000000 --- a/src/IISIntegration/test/AspNetCoreModuleTests/stdafx.h +++ /dev/null @@ -1,56 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the MIT License. See License.txt in the project root for license information. - -#pragma once - -#include "targetver.h" - -#define WIN32_LEAN_AND_MEAN - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include "stringa.h" -#include "stringu.h" -#include "dbgutil.h" -#include "ahutil.h" -#include "multisz.h" -#include "multisza.h" -#include "base64.h" -#include -#include -#include -#include -#include - -#include "..\..\src\AspNetCoreModuleV2\IISLib\hashtable.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\stringu.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\stringa.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\multisz.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\dbgutil.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\ahutil.h" -#include "..\..\src\AspNetCoreModuleV2\IISLib\hashfn.h" - -#include "..\..\src\AspNetCoreModuleV2\CommonLib\hostfxr_utility.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\environmentvariablehash.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\aspnetcoreconfig.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\application.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\utility.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\debugutil.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\requesthandler.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\resources.h" -#include "..\..\src\AspNetCoreModuleV2\CommonLib\aspnetcore_msg.h" - -#include "CppUnitTest.h" diff --git a/src/IISIntegration/test/Directory.Build.props b/src/IISIntegration/test/Directory.Build.props deleted file mode 100644 index 3a74fe4d2a..0000000000 --- a/src/IISIntegration/test/Directory.Build.props +++ /dev/null @@ -1,14 +0,0 @@ - - - - - netcoreapp2.1 - $(DeveloperBuildTestTfms) - $(StandardTestTfms);netcoreapp2.0 - $(StandardTestTfms);net461 - - - - - - diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj b/src/IISIntegration/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj deleted file mode 100644 index d79a5ec5d9..0000000000 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj +++ /dev/null @@ -1,29 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - False - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISExpressSupportsInProcessHostingAttribute.cs b/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISExpressSupportsInProcessHostingAttribute.cs deleted file mode 100644 index 5f2edd22f6..0000000000 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISExpressSupportsInProcessHostingAttribute.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Linq; -using System.Runtime.InteropServices; -using System.Xml.Linq; -using Microsoft.AspNetCore.Testing.xunit; - -namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests -{ - [AttributeUsage(AttributeTargets.Method | AttributeTargets.Assembly | AttributeTargets.Class)] - public sealed class IISExpressSupportsInProcessHostingAttribute : Attribute, ITestCondition - { - public bool IsMet => AncmSchema.SupportsInProcessHosting; - - public string SkipReason => AncmSchema.SkipReason; - - private class AncmSchema - { - public static bool SupportsInProcessHosting { get; } - public static string SkipReason { get; } = "IIS Express must be upgraded to support in-process hosting."; - - static AncmSchema() - { - if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) - { - SkipReason = "IIS Express tests can only be run on Windows"; - return; - } - - var ancmConfigPath = Path.Combine( - Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles), - "IIS Express", "config", "schema", "aspnetcore_schema.xml"); - - if (!File.Exists(ancmConfigPath)) - { - SkipReason = "IIS Express is not installed."; - return; - } - - XDocument ancmConfig; - - try - { - ancmConfig = XDocument.Load(ancmConfigPath); - } - catch - { - SkipReason = "Could not read ANCM schema configuration"; - return; - } - - SupportsInProcessHosting = ancmConfig - .Root - .Descendants("attribute") - .Any(n => "hostingModel".Equals(n.Attribute("name")?.Value, StringComparison.Ordinal)); - } - } - } -} diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteCollection.cs b/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteCollection.cs deleted file mode 100644 index 8d53affc98..0000000000 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteCollection.cs +++ /dev/null @@ -1,16 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Xunit; - -namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests -{ - /// - /// This type just maps collection names to available fixtures - /// - [CollectionDefinition(Name)] - public class IISTestSiteCollection : ICollectionFixture - { - public const string Name = nameof(IISTestSiteCollection); - } -} diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteFixture.cs b/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteFixture.cs deleted file mode 100644 index 763603508d..0000000000 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/IISTestSiteFixture.cs +++ /dev/null @@ -1,53 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Net.Http; -using System.Threading; -using Microsoft.AspNetCore.Server.IntegrationTesting; -using Microsoft.Extensions.Logging.Abstractions; - -namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests -{ - public class IISTestSiteFixture : IDisposable - { - private readonly IApplicationDeployer _deployer; - - public IISTestSiteFixture() - { - var deploymentParameters = new DeploymentParameters(Helpers.GetInProcessTestSitesPath(), - ServerType.IISExpress, - RuntimeFlavor.CoreClr, - RuntimeArchitecture.x64) - { - ServerConfigTemplateContent = File.ReadAllText("AppHostConfig/Http.config"), - SiteName = "HttpTestSite", - TargetFramework = "netcoreapp2.1", - ApplicationType = ApplicationType.Portable, - Configuration = -#if DEBUG - "Debug" -#else - "Release" -#endif - }; - - _deployer = ApplicationDeployerFactory.Create(deploymentParameters, NullLoggerFactory.Instance); - DeploymentResult = _deployer.DeployAsync().Result; - Client = DeploymentResult.HttpClient; - BaseUri = DeploymentResult.ApplicationBaseUri; - ShutdownToken = DeploymentResult.HostShutdownToken; - } - - public string BaseUri { get; } - public HttpClient Client { get; } - public CancellationToken ShutdownToken { get; } - public DeploymentResult DeploymentResult { get; } - - public void Dispose() - { - _deployer.Dispose(); - } - } -} diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj deleted file mode 100644 index ea19c2a1fc..0000000000 --- a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs b/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs deleted file mode 100644 index 639428ebd1..0000000000 --- a/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs +++ /dev/null @@ -1,62 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Linq; -using Newtonsoft.Json; -using Newtonsoft.Json.Linq; - -namespace TestTasks -{ - public class InjectRequestHandler - { - private static void Main(string[] args) - { - var depsFile = args[2]; - var rid = args[0]; - var libraryLocation = args[1]; - - JToken deps; - using (var file = File.OpenText(depsFile)) - using (JsonTextReader reader = new JsonTextReader(file)) - { - deps = JObject.ReadFrom(reader); - } - - var libraryName = "ANCMRH/1.0"; - var libraries = (JObject)deps["libraries"]; - var targetName = (JValue)deps["runtimeTarget"]["name"]; - - var target = (JObject)deps["targets"][targetName.Value]; - var targetLibrary = target.Properties().FirstOrDefault(p => p.Name == libraryName); - targetLibrary?.Remove(); - targetLibrary = - new JProperty(libraryName, new JObject( - new JProperty("runtimeTargets", new JObject( - new JProperty(libraryLocation.Replace('\\', '/'), new JObject( - new JProperty("rid", rid), - new JProperty("assetType", "native") - )))))); - target.AddFirst(targetLibrary); - - var library = libraries.Properties().FirstOrDefault(p => p.Name == libraryName); - library?.Remove(); - library = - new JProperty(libraryName, new JObject( - new JProperty("type", "package"), - new JProperty("serviceable", true), - new JProperty("sha512", ""), - new JProperty("path", libraryName), - new JProperty("hashPath", ""))); - libraries.AddFirst(library); - - using (var file = File.CreateText(depsFile)) - using (var writer = new JsonTextWriter(file) { Formatting = Formatting.Indented }) - { - deps.WriteTo(writer); - } - } - } -} diff --git a/src/IISIntegration/test/TestTasks/TestTasks.csproj b/src/IISIntegration/test/TestTasks/TestTasks.csproj deleted file mode 100644 index aa4c144936..0000000000 --- a/src/IISIntegration/test/TestTasks/TestTasks.csproj +++ /dev/null @@ -1,12 +0,0 @@ - - - - Exe - $(StandardTestTfms) - - - - - - - diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj b/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj deleted file mode 100644 index c615d460ee..0000000000 --- a/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj +++ /dev/null @@ -1,21 +0,0 @@ - - - - - $(StandardTestTfms) - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs deleted file mode 100644 index 0550f0f1fd..0000000000 --- a/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Logging; - -namespace IISTestSite -{ - public static class Program - { - public static void Main(string[] args) - { - var host = new WebHostBuilder() - .ConfigureLogging((_, factory) => - { - factory.AddConsole(); - factory.AddFilter("Console", level => level >= LogLevel.Information); - }) - .UseIISIntegration() - .UseStartup(typeof(Program).Assembly.FullName) - .Build(); - - host.Run(); - } - } -} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs deleted file mode 100644 index 23cec82f79..0000000000 --- a/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs +++ /dev/null @@ -1,684 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Diagnostics; -using System.IO; -using System.Net; -using System.Reflection; -using System.Text; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Authentication; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.AspNetCore.Server.IIS; -using Microsoft.AspNetCore.Server.IISIntegration; -using Microsoft.Extensions.Primitives; -using Xunit; - -namespace IISTestSite -{ - public class Startup - { - public void Configure(IApplicationBuilder app) - { - foreach (var method in GetType().GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) - { - var parameters = method.GetParameters(); - if (method.Name != nameof(Configure) && - parameters.Length == 1 && - parameters[0].ParameterType == typeof(IApplicationBuilder)) - { - app.Map("/" + method.Name, innerAppBuilder => method.Invoke(this, new[] { innerAppBuilder })); - } - } - } - - private void ServerVariable(IApplicationBuilder app) - { - app.Run(async ctx => - { - var varName = ctx.Request.Query["q"]; - await ctx.Response.WriteAsync($"{varName}: {ctx.GetIISServerVariable(varName) ?? "(null)"}"); - }); - } - - public void AuthenticationAnonymous(IApplicationBuilder app) - { - app.Run(async ctx => - { - await ctx.Response.WriteAsync("Anonymous?" + !ctx.User.Identity.IsAuthenticated); - }); - } - - private void AuthenticationRestricted(IApplicationBuilder app) - { - app.Run(async ctx => - { - if (ctx.User.Identity.IsAuthenticated) - { - await ctx.Response.WriteAsync(ctx.User.Identity.AuthenticationType); - } - else - { - await ctx.ChallengeAsync(IISDefaults.AuthenticationScheme); - } - }); - } - - public void AuthenticationForbidden(IApplicationBuilder app) - { - app.Run(async ctx => - { - await ctx.ForbidAsync(IISDefaults.AuthenticationScheme); - }); - } - - public void AuthenticationRestrictedNTLM(IApplicationBuilder app) - { - app.Run(async ctx => - { - if (string.Equals("NTLM", ctx.User.Identity.AuthenticationType, StringComparison.Ordinal)) - { - await ctx.Response.WriteAsync("NTLM"); - } - else - { - await ctx.ChallengeAsync(IISDefaults.AuthenticationScheme); - } - }); - } - - private void FeatureCollectionSetRequestFeatures(IApplicationBuilder app) - { - app.Run(async context => - { - try - { - Assert.Equal("GET", context.Request.Method); - context.Request.Method = "test"; - Assert.Equal("test", context.Request.Method); - - Assert.Equal("http", context.Request.Scheme); - context.Request.Scheme = "test"; - Assert.Equal("test", context.Request.Scheme); - - Assert.Equal("/FeatureCollectionSetRequestFeatures", context.Request.PathBase); - context.Request.PathBase = "/base"; - Assert.Equal("/base", context.Request.PathBase); - - Assert.Equal("/path", context.Request.Path); - context.Request.Path = "/path"; - Assert.Equal("/path", context.Request.Path); - - Assert.Equal("?query", context.Request.QueryString.Value); - context.Request.QueryString = QueryString.Empty; - Assert.Equal("", context.Request.QueryString.Value); - - Assert.Equal("HTTP/1.1", context.Request.Protocol); - context.Request.Protocol = "HTTP/1.0"; - Assert.Equal("HTTP/1.0", context.Request.Protocol); - - Assert.NotNull(context.Request.Headers); - var headers = new HeaderDictionary(); - context.Features.Get().Headers = headers; - Assert.Same(headers, context.Features.Get().Headers); - - Assert.NotNull(context.Request.Body); - var body = new MemoryStream(); - context.Request.Body = body; - Assert.Same(body, context.Request.Body); - - //Assert.NotNull(context.Features.Get().TraceIdentifier); - //Assert.NotEqual(CancellationToken.None, context.RequestAborted); - //var token = new CancellationTokenSource().Token; - //context.RequestAborted = token; - //Assert.Equal(token, context.RequestAborted); - - await context.Response.WriteAsync("Success"); - return; - } - catch (Exception exception) - { - context.Response.StatusCode = 500; - await context.Response.WriteAsync(exception.ToString()); - } - await context.Response.WriteAsync("_Failure"); - }); - } - - private void FeatureCollectionSetResponseFeatures(IApplicationBuilder app) - { - app.Run(async context => - { - try - { - Assert.Equal(200, context.Response.StatusCode); - context.Response.StatusCode = 404; - Assert.Equal(404, context.Response.StatusCode); - context.Response.StatusCode = 200; - - Assert.Null(context.Features.Get().ReasonPhrase); - context.Features.Get().ReasonPhrase = "Set Response"; - Assert.Equal("Set Response", context.Features.Get().ReasonPhrase); - - Assert.NotNull(context.Response.Headers); - var headers = new HeaderDictionary(); - context.Features.Get().Headers = headers; - Assert.Same(headers, context.Features.Get().Headers); - - var originalBody = context.Response.Body; - Assert.NotNull(originalBody); - var body = new MemoryStream(); - context.Response.Body = body; - Assert.Same(body, context.Response.Body); - context.Response.Body = originalBody; - - await context.Response.WriteAsync("Success"); - return; - } - catch (Exception exception) - { - context.Response.StatusCode = 500; - await context.Response.WriteAsync(exception.ToString()); - } - await context.Response.WriteAsync("_Failure"); - }); - } - - private void FeatureCollectionSetConnectionFeatures(IApplicationBuilder app) - { - app.Run(async context => - { - try - { - Assert.True(IPAddress.IsLoopback(context.Connection.LocalIpAddress)); - context.Connection.LocalIpAddress = IPAddress.IPv6Any; - Assert.Equal(IPAddress.IPv6Any, context.Connection.LocalIpAddress); - - Assert.True(IPAddress.IsLoopback(context.Connection.RemoteIpAddress)); - context.Connection.RemoteIpAddress = IPAddress.IPv6Any; - Assert.Equal(IPAddress.IPv6Any, context.Connection.RemoteIpAddress); - await context.Response.WriteAsync("Success"); - return; - } - catch (Exception exception) - { - context.Response.StatusCode = 500; - await context.Response.WriteAsync(exception.ToString()); - } - await context.Response.WriteAsync("_Failure"); - }); - } - - private void Throw(IApplicationBuilder app) - { - app.Run(ctx => { throw new Exception(); }); - } - - private void SetCustomErorCode(IApplicationBuilder app) - { - app.Run(async ctx => { - var feature = ctx.Features.Get(); - feature.ReasonPhrase = ctx.Request.Query["reason"]; - feature.StatusCode = int.Parse(ctx.Request.Query["code"]); - await ctx.Response.WriteAsync("Body"); - }); - } - - private void HelloWorld(IApplicationBuilder app) - { - app.Run(async ctx => - { - if (ctx.Request.Path.Value.StartsWith("/Path")) - { - await ctx.Response.WriteAsync(ctx.Request.Path.Value); - return; - } - if (ctx.Request.Path.Value.StartsWith("/Query")) - { - await ctx.Response.WriteAsync(ctx.Request.QueryString.Value); - return; - } - - await ctx.Response.WriteAsync("Hello World"); - }); - } - - private void LargeResponseBody(IApplicationBuilder app) - { - app.Run(async context => - { - if (int.TryParse(context.Request.Query["length"], out var length)) - { - await context.Response.WriteAsync(new string('a', length)); - } - }); - } - - private void ResponseHeaders(IApplicationBuilder app) - { - app.Run(async context => - { - context.Response.Headers["UnknownHeader"] = "test123=foo"; - context.Response.ContentType = "text/plain"; - context.Response.Headers["MultiHeader"] = new StringValues(new string[] { "1", "2" }); - await context.Response.WriteAsync("Request Complete"); - }); - } - - private void ResponseInvalidOrdering(IApplicationBuilder app) - { - app.Run(async context => - { - if (context.Request.Path.Equals("/SetStatusCodeAfterWrite")) - { - await context.Response.WriteAsync("Started_"); - try - { - context.Response.StatusCode = 200; - } - catch (InvalidOperationException) - { - await context.Response.WriteAsync("SetStatusCodeAfterWriteThrew_"); - } - await context.Response.WriteAsync("Finished"); - return; - } - else if (context.Request.Path.Equals("/SetHeaderAfterWrite")) - { - await context.Response.WriteAsync("Started_"); - try - { - context.Response.Headers["This will fail"] = "some value"; - } - catch (InvalidOperationException) - { - await context.Response.WriteAsync("SetHeaderAfterWriteThrew_"); - } - await context.Response.WriteAsync("Finished"); - return; - } - }); - } - - private void CheckEnvironmentVariable(IApplicationBuilder app) - { - app.Run(async context => - { - var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_VALUE"); - await context.Response.WriteAsync(variable); - }); - } - - private void CheckEnvironmentLongValueVariable(IApplicationBuilder app) - { - app.Run(async context => - { - var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_LONG_VALUE"); - await context.Response.WriteAsync(variable); - }); - } - - private void CheckAppendedEnvironmentVariable(IApplicationBuilder app) - { - app.Run(async context => - { - var variable = Environment.GetEnvironmentVariable("ProgramFiles"); - await context.Response.WriteAsync(variable); - }); - } - - private void CheckRemoveAuthEnvironmentVariable(IApplicationBuilder app) - { - app.Run(async context => - { - var variable = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_HTTPAUTH"); - await context.Response.WriteAsync(variable); - }); - } - private void ReadAndWriteSynchronously(IApplicationBuilder app) - { - app.Run(async context => - { - var t2 = Task.Run(() => WriteManyTimesToResponseBody(context)); - var t1 = Task.Run(() => ReadRequestBody(context)); - await Task.WhenAll(t1, t2); - }); - } - - private async Task ReadRequestBody(HttpContext context) - { - var readBuffer = new byte[1]; - var result = await context.Request.Body.ReadAsync(readBuffer, 0, 1); - while (result != 0) - { - result = await context.Request.Body.ReadAsync(readBuffer, 0, 1); - } - } - - private async Task WriteManyTimesToResponseBody(HttpContext context) - { - for (var i = 0; i < 10000; i++) - { - await context.Response.WriteAsync("hello world"); - } - } - - private void ReadAndWriteEcho(IApplicationBuilder app) - { - app.Run(async context => - { - var readBuffer = new byte[4096]; - var result = await context.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); - while (result != 0) - { - await context.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); - result = await context.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); - } - }); - } - - private void ReadAndWriteEchoTwice(IApplicationBuilder app) - { - app.Run(async context => - { - var readBuffer = new byte[4096]; - var result = await context.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); - while (result != 0) - { - await context.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); - await context.Response.Body.FlushAsync(); - await context.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); - await context.Response.Body.FlushAsync(); - result = await context.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); - } - }); - } - - private void ReadAndWriteSlowConnection(IApplicationBuilder app) - { - app.Run(async context => - { - var t2 = Task.Run(() => WriteResponseBodyAFewTimes(context)); - var t1 = Task.Run(() => ReadRequestBody(context)); - await Task.WhenAll(t1, t2); - }); - } - - private async Task WriteResponseBodyAFewTimes(HttpContext context) - { - for (var i = 0; i < 100; i++) - { - await context.Response.WriteAsync("hello world"); - } - } - - private void WebsocketRequest(IApplicationBuilder app) - { - app.Run(async context => - { - await context.Response.WriteAsync("test"); - }); - } - - private void ReadAndWriteCopyToAsync(IApplicationBuilder app) - { - app.Run(async context => - { - await context.Request.Body.CopyToAsync(context.Response.Body); - }); - } - - private void UpgradeFeatureDetection(IApplicationBuilder app) - { - app.Run(async ctx => - { - if (ctx.Features.Get() != null) - { - await ctx.Response.WriteAsync("Enabled"); - } - else - { - await ctx.Response.WriteAsync("Disabled"); - } - }); - } - - private void TestReadOffsetWorks(IApplicationBuilder app) - { - app.Run(async ctx => - { - var buffer = new byte[11]; - ctx.Request.Body.Read(buffer, 0, 6); - ctx.Request.Body.Read(buffer, 6, 5); - - await ctx.Response.WriteAsync(Encoding.UTF8.GetString(buffer)); - }); - } - - private void TestInvalidReadOperations(IApplicationBuilder app) - { - app.Run(async context => - { - var success = false; - if (context.Request.Path.StartsWithSegments("/NullBuffer")) - { - try - { - await context.Request.Body.ReadAsync(null, 0, 0); - } - catch (Exception) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidOffsetSmall")) - { - try - { - await context.Request.Body.ReadAsync(new byte[1], -1, 0); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidOffsetLarge")) - { - try - { - await context.Request.Body.ReadAsync(new byte[1], 2, 0); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountSmall")) - { - try - { - await context.Request.Body.ReadAsync(new byte[1], 0, -1); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountLarge")) - { - try - { - await context.Request.Body.ReadAsync(new byte[1], 0, -1); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountWithOffset")) - { - try - { - await context.Request.Body.ReadAsync(new byte[3], 1, 3); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - - - await context.Response.WriteAsync(success ? "Success" : "Failure"); - }); - } - - private void TestValidReadOperations(IApplicationBuilder app) - { - app.Run(async context => - { - var count = -1; - - if (context.Request.Path.StartsWithSegments("/NullBuffer")) - { - count = await context.Request.Body.ReadAsync(null, 0, 0); - } - else if (context.Request.Path.StartsWithSegments("/NullBufferPost")) - { - count = await context.Request.Body.ReadAsync(null, 0, 0); - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountZeroRead")) - { - count = await context.Request.Body.ReadAsync(new byte[1], 0, 0); - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountZeroReadPost")) - { - count = await context.Request.Body.ReadAsync(new byte[1], 0, 0); - } - - await context.Response.WriteAsync(count == 0 ? "Success" : "Failure"); - }); - } - - private void TestInvalidWriteOperations(IApplicationBuilder app) - { - app.Run(async context => - { - var success = false; - - if (context.Request.Path.StartsWithSegments("/InvalidOffsetSmall")) - { - try - { - await context.Response.Body.WriteAsync(new byte[1], -1, 0); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidOffsetLarge")) - { - try - { - await context.Response.Body.WriteAsync(new byte[1], 2, 0); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountSmall")) - { - try - { - await context.Response.Body.WriteAsync(new byte[1], 0, -1); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountLarge")) - { - try - { - await context.Response.Body.WriteAsync(new byte[1], 0, -1); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - else if (context.Request.Path.StartsWithSegments("/InvalidCountWithOffset")) - { - try - { - await context.Response.Body.WriteAsync(new byte[3], 1, 3); - } - catch (ArgumentOutOfRangeException) - { - success = true; - } - } - - await context.Response.WriteAsync(success ? "Success" : "Failure"); - }); - } - - private void TestValidWriteOperations(IApplicationBuilder app) - { - app.Run(async context => - { - - if (context.Request.Path.StartsWithSegments("/NullBuffer")) - { - await context.Response.Body.WriteAsync(null, 0, 0); - } - else if (context.Request.Path.StartsWithSegments("/NullBufferPost")) - { - await context.Response.Body.WriteAsync(null, 0, 0); - } - - await context.Response.WriteAsync("Success"); - }); - } - - private void LargeResponseFile(IApplicationBuilder app) - { - app.Run(async ctx => - { - var tempFile = Path.GetTempFileName(); - var fileContent = new string('a', 200000); - var fileStream = File.OpenWrite(tempFile); - - for (var i = 0; i < 1000; i++) - { - await fileStream.WriteAsync(Encoding.UTF8.GetBytes(fileContent), 0, fileContent.Length); - } - fileStream.Close(); - - await ctx.Response.SendFileAsync(tempFile, 0, null); - - // Try to delete the file from the temp directory. If it fails, don't report an error - // to the application. File should eventually be cleaned up from the temp directory - // by OS. - try - { - File.Delete(tempFile); - } - catch (Exception) - { - } - }); - } - - private void BasePath(IApplicationBuilder app) - { - app.Run(async ctx => { await ctx.Response.WriteAsync(AppDomain.CurrentDomain.BaseDirectory); }); - } - } -} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/web.config b/src/IISIntegration/test/WebSites/InProcessWebSite/web.config deleted file mode 100644 index 8ba96a4e9e..0000000000 --- a/src/IISIntegration/test/WebSites/InProcessWebSite/web.config +++ /dev/null @@ -1,16 +0,0 @@ - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj deleted file mode 100644 index 0b96c98c36..0000000000 --- a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj +++ /dev/null @@ -1,22 +0,0 @@ - - - - - - $(StandardTestTfms) - - - - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/OverriddenServerWebSite.csproj b/src/IISIntegration/test/WebSites/OverriddenServerWebSite/OverriddenServerWebSite.csproj deleted file mode 100644 index 4332ea3fd1..0000000000 --- a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/OverriddenServerWebSite.csproj +++ /dev/null @@ -1,17 +0,0 @@ - - - - - - $(StandardTestTfms) - - - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Program.cs b/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Program.cs deleted file mode 100644 index bb65e03004..0000000000 --- a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Program.cs +++ /dev/null @@ -1,48 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Threading; -using System.Threading.Tasks; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.Extensions.DependencyInjection; - -namespace IISTestSite -{ - public static class Program - { - public static void Main(string[] args) - { - var host = new WebHostBuilder() - .UseIISIntegration() - .ConfigureServices(services => services.AddSingleton()) - .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })) - .Build(); - - host.Run(); - } - } - - public class DummyServer: IServer - { - public void Dispose() - { - } - - public Task StartAsync(IHttpApplication application, CancellationToken cancellationToken) - { - return Task.Delay(TimeSpan.MaxValue); - } - - public Task StopAsync(CancellationToken cancellationToken) - { - return Task.Delay(TimeSpan.MaxValue); - } - - public IFeatureCollection Features { get; } - } -} diff --git a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Properties/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/web.config b/src/IISIntegration/test/WebSites/OverriddenServerWebSite/web.config deleted file mode 100644 index f125d57107..0000000000 --- a/src/IISIntegration/test/WebSites/OverriddenServerWebSite/web.config +++ /dev/null @@ -1,9 +0,0 @@ - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs deleted file mode 100644 index e8e5392c2c..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs +++ /dev/null @@ -1,26 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using Microsoft.AspNetCore.Hosting; -using Microsoft.Extensions.Logging; - -namespace ANCMStressTestApp -{ - public class Program - { - public static void Main(string[] args) - { - var host = new WebHostBuilder() - .ConfigureLogging((_, factory) => - { - factory.AddConsole(); - }) - .UseKestrel() - .UseIISIntegration() - .UseStartup() - .Build(); - - host.Run(); - } - } -} diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json deleted file mode 100644 index 6d5ce43f73..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": true, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:5762/", - "sslPort": 0 - } - }, - "profiles": { - "ANCM IIS Express": { - "commandName": "Executable", - "executablePath": "$(IISExpressPath)", - "commandLineArgs": "$(IISExpressArguments)", - "nativeDebugging": true, - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - }, - "ANCM IIS": { - "commandName": "Executable", - "executablePath": "$(IISPath)", - "commandLineArgs": "$(IISArguments)", - "environmentVariables": { - "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", - "ANCM_PATH": "$(TargetDir)$(AncmPath)", - "LAUNCHER_ARGS": "$(TargetPath)", - "ASPNETCORE_ENVIRONMENT": "Development", - "LAUNCHER_PATH": "$(DotNetPath)" - } - } - } -} diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs deleted file mode 100644 index be0969ec77..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs +++ /dev/null @@ -1,231 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.IO; -using System.Linq; -using System.Threading.Tasks; -using System.Threading; -using System.Text; -using System.Net.WebSockets; -using Microsoft.AspNetCore.Builder; -using Microsoft.AspNetCore.Hosting; -using Microsoft.AspNetCore.Http; -using Microsoft.AspNetCore.Http.Features; -using Microsoft.Net.Http.Headers; -using Microsoft.Extensions.DependencyInjection; -using Microsoft.Extensions.Primitives; - -namespace ANCMStressTestApp -{ - public class Startup - { - // This method gets called by the runtime. Use this method to add services to the container. - // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940 - public void ConfigureServices(IServiceCollection services) - { - } - - public void Configure(IApplicationBuilder app) - { - app.Map("/HelloWorld", HelloWorld); - app.Map("/ConnectionClose", ConnectionClose); - app.Map("/EchoPostData", EchoPostData); - app.Map("/LargeResponseBody", LargeResponseBody); - app.Map("/ResponseHeaders", ResponseHeaders); - app.Map("/EnvironmentVariables", EnvironmentVariables); - app.Map("/RequestInformation", RequestInformation); - app.Map("/WebSocket", WebSocket); - - app.Run(async context => - { - await context.Response.WriteAsync("Default Page"); - }); - } - - private void HelloWorld(IApplicationBuilder app) - { - app.Run(async context => - { - await context.Response.WriteAsync("Hello World"); - }); - } - - private void ConnectionClose(IApplicationBuilder app) - { - app.Run(async context => - { - context.Response.Headers[HeaderNames.Connection] = "close"; - await context.Response.WriteAsync("Connnection Close"); - await context.Response.Body.FlushAsync(); - }); - } - - private void EchoPostData(IApplicationBuilder app) - { - app.Run(async context => - { - string responseBody = string.Empty; - - if (string.Equals(context.Request.Method, "POST", StringComparison.OrdinalIgnoreCase)) - { - using (StreamReader reader = new StreamReader(context.Request.Body, Encoding.UTF8)) - { - responseBody = await reader.ReadToEndAsync(); - } - } - else - { - responseBody = "NoAction"; - } - - await context.Response.WriteAsync(responseBody); - }); - } - - private void LargeResponseBody(IApplicationBuilder app) - { - app.Run(async context => - { - if (int.TryParse(context.Request.Query["length"], out var length)) - { - await context.Response.WriteAsync(new string('a', length)); - } - }); - } - - private void ResponseHeaders(IApplicationBuilder app) - { - app.Run(async context => - { - context.Response.Headers["UnknownHeader"] = "test123=foo"; - context.Response.ContentType = "text/plain"; - context.Response.Headers["MultiHeader"] = new StringValues(new string[] { "1", "2" }); - await context.Response.WriteAsync("Request Complete"); - }); - } - - private void EnvironmentVariables(IApplicationBuilder app) - { - app.Run(async context => - { - context.Response.ContentType = "text/plain"; - await context.Response.WriteAsync("Environment Variables:" + Environment.NewLine); - var vars = Environment.GetEnvironmentVariables(); - foreach (var key in vars.Keys.Cast().OrderBy(key => key, StringComparer.OrdinalIgnoreCase)) - { - var value = vars[key]; - await context.Response.WriteAsync(key + ": " + value + Environment.NewLine); - } - await context.Response.WriteAsync(Environment.NewLine); - }); - } - - private void RequestInformation(IApplicationBuilder app) - { - app.Run(async context => - { - context.Response.ContentType = "text/plain"; - - await context.Response.WriteAsync("Address:" + Environment.NewLine); - await context.Response.WriteAsync("Scheme: " + context.Request.Scheme + Environment.NewLine); - await context.Response.WriteAsync("Host: " + context.Request.Headers["Host"] + Environment.NewLine); - await context.Response.WriteAsync("PathBase: " + context.Request.PathBase.Value + Environment.NewLine); - await context.Response.WriteAsync("Path: " + context.Request.Path.Value + Environment.NewLine); - await context.Response.WriteAsync("Query: " + context.Request.QueryString.Value + Environment.NewLine); - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Connection:" + Environment.NewLine); - await context.Response.WriteAsync("RemoteIp: " + context.Connection.RemoteIpAddress + Environment.NewLine); - await context.Response.WriteAsync("RemotePort: " + context.Connection.RemotePort + Environment.NewLine); - await context.Response.WriteAsync("LocalIp: " + context.Connection.LocalIpAddress + Environment.NewLine); - await context.Response.WriteAsync("LocalPort: " + context.Connection.LocalPort + Environment.NewLine); - await context.Response.WriteAsync(Environment.NewLine); - - await context.Response.WriteAsync("Headers:" + Environment.NewLine); - foreach (var header in context.Request.Headers) - { - await context.Response.WriteAsync(header.Key + ": " + header.Value + Environment.NewLine); - } - await context.Response.WriteAsync(Environment.NewLine); - }); - } - - private void WebSocket(IApplicationBuilder app) - { - app.Run(async context => - { - var upgradeFeature = context.Features.Get(); - - // Generate WebSocket response headers - string key = context.Request.Headers[Constants.Headers.SecWebSocketKey].ToString(); - var responseHeaders = HandshakeHelpers.GenerateResponseHeaders(key); - foreach (var headerPair in responseHeaders) - { - context.Response.Headers[headerPair.Key] = headerPair.Value; - } - - // Upgrade the connection - Stream opaqueTransport = await upgradeFeature.UpgradeAsync(); - - // Get the WebSocket object - var ws = WebSocketProtocol.CreateFromStream(opaqueTransport, isServer: true, subProtocol: null, keepAliveInterval: TimeSpan.FromMinutes(2)); - - var appLifetime = app.ApplicationServices.GetRequiredService(); - - await Echo(ws, appLifetime.ApplicationStopping); - }); - } - - private async Task Echo(WebSocket webSocket, CancellationToken token) - { - try - { - var buffer = new byte[1024 * 4]; - var result = await webSocket.ReceiveAsync(new ArraySegment(buffer), token); - bool closeFromServer = false; - string closeFromServerCmd = "CloseFromServer"; - int closeFromServerLength = closeFromServerCmd.Length; - - while (!result.CloseStatus.HasValue && !token.IsCancellationRequested && !closeFromServer) - { - if (result.Count == closeFromServerLength && - Encoding.ASCII.GetString(buffer).Substring(0, result.Count) == closeFromServerCmd) - { - // The client sent "CloseFromServer" text message to request the server to close (a test scenario). - closeFromServer = true; - } - else - { - await webSocket.SendAsync(new ArraySegment(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, token); - result = await webSocket.ReceiveAsync(new ArraySegment(buffer), token); - } - } - - if (result.CloseStatus.HasValue) - { - // Client-initiated close handshake - await webSocket.CloseAsync(result.CloseStatus.Value, result.CloseStatusDescription, CancellationToken.None); - } - else - { - // Server-initiated close handshake due to either of the two conditions: - // (1) The applicaton host is performing a graceful shutdown. - // (2) The client sent "CloseFromServer" text message to request the server to close (a test scenario). - await webSocket.CloseOutputAsync(WebSocketCloseStatus.NormalClosure, closeFromServerCmd, CancellationToken.None); - - // The server has sent the Close frame. - // Stop sending but keep receiving until we get the Close frame from the client. - while (!result.CloseStatus.HasValue) - { - result = await webSocket.ReceiveAsync(new ArraySegment(buffer), CancellationToken.None); - } - } - } - catch (Exception e) - { - Console.WriteLine("{0} Exception caught!", e); - } - } - } -} diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj b/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj deleted file mode 100644 index 3566143fcd..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj +++ /dev/null @@ -1,19 +0,0 @@ - - - - - - $(StandardTestTfms) - - - - - - - - - - - - - diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/Constants.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/Constants.cs deleted file mode 100644 index bcf5462558..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/Constants.cs +++ /dev/null @@ -1,17 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -namespace ANCMStressTestApp -{ - public static class Constants - { - public static class Headers - { - public const string Upgrade = "Upgrade"; - public const string UpgradeWebSocket = "websocket"; - public const string Connection = "Connection"; - public const string SecWebSocketKey = "Sec-WebSocket-Key"; - public const string SecWebSocketAccept = "Sec-WebSocket-Accept"; - } - } -} diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/HandshakeHelpers.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/HandshakeHelpers.cs deleted file mode 100644 index 331f415013..0000000000 --- a/src/IISIntegration/test/WebSites/StressTestWebSite/WebSockets/HandshakeHelpers.cs +++ /dev/null @@ -1,42 +0,0 @@ -// Copyright (c) .NET Foundation. All rights reserved. -// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. - -using System; -using System.Collections.Generic; -using System.Security.Cryptography; -using System.Text; - -namespace ANCMStressTestApp -{ - // Removed all the - internal static class HandshakeHelpers - { - public static IEnumerable> GenerateResponseHeaders(string key) - { - yield return new KeyValuePair(Constants.Headers.Connection, Constants.Headers.Upgrade); - yield return new KeyValuePair(Constants.Headers.Upgrade, Constants.Headers.UpgradeWebSocket); - yield return new KeyValuePair(Constants.Headers.SecWebSocketAccept, CreateResponseKey(key)); - } - - public static string CreateResponseKey(string requestKey) - { - // "The value of this header field is constructed by concatenating /key/, defined above in step 4 - // in Section 4.2.2, with the string "258EAFA5- E914-47DA-95CA-C5AB0DC85B11", taking the SHA-1 hash of - // this concatenated value to obtain a 20-byte value and base64-encoding" - // https://tools.ietf.org/html/rfc6455#section-4.2.2 - - if (requestKey == null) - { - throw new ArgumentNullException(nameof(requestKey)); - } - - using (var algorithm = SHA1.Create()) - { - string merged = requestKey + "258EAFA5-E914-47DA-95CA-C5AB0DC85B11"; - byte[] mergedBytes = Encoding.UTF8.GetBytes(merged); - byte[] hashedBytes = algorithm.ComputeHash(mergedBytes); - return Convert.ToBase64String(hashedBytes); - } - } - } -} diff --git a/src/IISIntegration/version.props b/src/IISIntegration/version.props deleted file mode 100644 index eb76a7c8ee..0000000000 --- a/src/IISIntegration/version.props +++ /dev/null @@ -1,18 +0,0 @@ - - - 2 - 1 - 7 - $(DotNetMajorVersion).$(DotNetMinorVersion).$(DotNetPatchVersion) - 12 - $(DotNetMinorVersion) - $(DotNetPatchVersion) - rtm - $(VersionPrefix) - $(VersionPrefix)-$(VersionSuffix)-final - t000 - a- - $(FeatureBranchVersionPrefix)$(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) - $(VersionSuffix)-$(BuildNumber) - - diff --git a/src/Servers/HttpSys/test/FunctionalTests/HttpsTests.cs b/src/Servers/HttpSys/test/FunctionalTests/HttpsTests.cs index b3ae85687a..47b02a3092 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/HttpsTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/HttpsTests.cs @@ -99,7 +99,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys } } - private async Task SendRequestAsync(string uri, + private async Task SendRequestAsync(string uri, X509Certificate cert = null) { var handler = new WinHttpHandler(); diff --git a/src/IISIntegration/.gitignore b/src/Servers/IIS/.gitignore similarity index 97% rename from src/IISIntegration/.gitignore rename to src/Servers/IIS/.gitignore index f86f68b748..dc2b157fe0 100644 --- a/src/IISIntegration/.gitignore +++ b/src/Servers/IIS/.gitignore @@ -31,24 +31,20 @@ project.lock.json *.bin *.vs/ .testPublish/ - *.obj *.tlog *.CppClean.log *msbuild.log - src/*/*/Debug/ src/*/*/x64/Debug/ src/*/*/Release/ src/*/*/x64/Release/ x64/ - *vcxproj.filters *.aps *.pdb *.lib *.idb - src/*/AspNetCore/aspnetcoremodule.h src/*/AspNetCore/aspnetcore_msg.h src/*/AspNetCore/aspnetcore_msg.rc @@ -61,7 +57,6 @@ test/*/Release test/gtest-1.8.0/msvc/Debug test/gtest-1.8.0/msvc/Release .build - *.VC.*db global.json -msbuild.binlog +msbuild.binlog \ No newline at end of file diff --git a/src/Servers/IIS/IISIntegration.sln b/src/Servers/IIS/IISIntegration.sln new file mode 100644 index 0000000000..85a5d7ebcd --- /dev/null +++ b/src/Servers/IIS/IISIntegration.sln @@ -0,0 +1,163 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.27130.2036 +MinimumVisualStudioVersion = 15.0.26730.03 +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{04B1EDB6-E967-4D25-89B9-E6F8304038CD}" + ProjectSection(SolutionItems) = preProject + src\Directory.Build.props = src\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{0EF45656-B25D-40D8-959C-726EAF185E60}" + ProjectSection(SolutionItems) = preProject + .editorconfig = .editorconfig + Directory.Build.props = Directory.Build.props + Directory.Build.targets = Directory.Build.targets + NuGet.Config = NuGet.Config + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{EF30B533-D715-421A-92B7-92FEF460AC9C}" + ProjectSection(SolutionItems) = preProject + test\Directory.Build.props = test\Directory.Build.props + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{C74B8F36-FD2F-45C9-9B8A-00E7CF0126A9}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IISSample", "samples\IISSample\IISSample.csproj", "{E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration", "src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj", "{8B3446E8-E6A8-4591-AA63-A95837C6E97C}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IISIntegration.Tests", "test\Microsoft.AspNetCore.Server.IISIntegration.Tests\Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj", "{4106DB10-E09F-480E-9CE6-B39235512EE6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "OutOfProcessWebSite", "test\testassets\OutOfProcessWebSite\OutOfProcessWebSite.csproj", "{F54715C3-88D8-49E3-A291-C13570FE81FC}" + ProjectSection(ProjectDependencies) = postProject + {439824F9-1455-4CC4-BD79-B44FA0A16552} = {439824F9-1455-4CC4-BD79-B44FA0A16552} + EndProjectSection +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{7E80C58E-9CC8-450C-8A8D-94FC76428150}" + ProjectSection(SolutionItems) = preProject + build\applicationhost.config = build\applicationhost.config + build\applicationhost.iis.config = build\applicationhost.iis.config + build\dependencies.props = build\dependencies.props + build\native.targets = build\native.targets + build\repo.props = build\repo.props + build\testsite.props = build\testsite.props + EndProjectSection +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "IISIntegration.FunctionalTests", "test\IISIntegration.FunctionalTests\IISIntegration.FunctionalTests.csproj", "{4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{744ACDC6-F6A0-4FF9-9421-F25C5F2DC520}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "AspNetCoreModuleV1", "AspNetCoreModuleV1", "{16E521CE-77F1-4B1C-A183-520A41C4F372}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "IISLib", "src\AspNetCoreModuleV1\IISLib\IISLib.vcxproj", "{4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AspNetCore", "src\AspNetCoreModuleV1\AspNetCore\AspNetCore.vcxproj", "{439824F9-1455-4CC4-BD79-B44FA0A16552}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|Any CPU.Build.0 = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.ActiveCfg = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x64.Build.0 = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.ActiveCfg = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Debug|x86.Build.0 = Debug|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.ActiveCfg = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|Any CPU.Build.0 = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.ActiveCfg = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x64.Build.0 = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.ActiveCfg = Release|Any CPU + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64}.Release|x86.Build.0 = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.ActiveCfg = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x64.Build.0 = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.ActiveCfg = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Debug|x86.Build.0 = Debug|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|Any CPU.Build.0 = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.ActiveCfg = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x64.Build.0 = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.ActiveCfg = Release|Any CPU + {8B3446E8-E6A8-4591-AA63-A95837C6E97C}.Release|x86.Build.0 = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.ActiveCfg = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x64.Build.0 = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.ActiveCfg = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Debug|x86.Build.0 = Debug|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|Any CPU.Build.0 = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.ActiveCfg = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x64.Build.0 = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.ActiveCfg = Release|Any CPU + {4106DB10-E09F-480E-9CE6-B39235512EE6}.Release|x86.Build.0 = Release|Any CPU + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|Any CPU.ActiveCfg = Debug|x86 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.ActiveCfg = Debug|x64 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x64.Build.0 = Debug|x64 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.ActiveCfg = Debug|x86 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Debug|x86.Build.0 = Debug|x86 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|Any CPU.ActiveCfg = Release|x86 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.ActiveCfg = Release|x64 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x64.Build.0 = Release|x64 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.ActiveCfg = Release|x86 + {F54715C3-88D8-49E3-A291-C13570FE81FC}.Release|x86.Build.0 = Release|x86 + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x64.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.ActiveCfg = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Debug|x86.Build.0 = Debug|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|Any CPU.Build.0 = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x64.Build.0 = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.ActiveCfg = Release|Any CPU + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA}.Release|x86.Build.0 = Release|Any CPU + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x64.ActiveCfg = Debug|x64 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x64.Build.0 = Debug|x64 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x86.ActiveCfg = Debug|Win32 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Debug|x86.Build.0 = Debug|Win32 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|Any CPU.ActiveCfg = Release|Win32 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x64.ActiveCfg = Release|x64 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x64.Build.0 = Release|x64 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x86.ActiveCfg = Release|Win32 + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE}.Release|x86.Build.0 = Release|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x64.ActiveCfg = Debug|x64 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x64.Build.0 = Debug|x64 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x86.ActiveCfg = Debug|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Debug|x86.Build.0 = Debug|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|Any CPU.ActiveCfg = Release|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x64.ActiveCfg = Release|x64 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x64.Build.0 = Release|x64 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x86.ActiveCfg = Release|Win32 + {439824F9-1455-4CC4-BD79-B44FA0A16552}.Release|x86.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {E4E2BDC4-A9C6-4AE9-B429-032EC83EDE64} = {C74B8F36-FD2F-45C9-9B8A-00E7CF0126A9} + {8B3446E8-E6A8-4591-AA63-A95837C6E97C} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} + {4106DB10-E09F-480E-9CE6-B39235512EE6} = {EF30B533-D715-421A-92B7-92FEF460AC9C} + {F54715C3-88D8-49E3-A291-C13570FE81FC} = {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} + {4E3E1F5C-CD52-4CC0-A35F-D1FA1685D2FA} = {EF30B533-D715-421A-92B7-92FEF460AC9C} + {744ACDC6-F6A0-4FF9-9421-F25C5F2DC520} = {EF30B533-D715-421A-92B7-92FEF460AC9C} + {16E521CE-77F1-4B1C-A183-520A41C4F372} = {04B1EDB6-E967-4D25-89B9-E6F8304038CD} + {4787A64F-9A3E-4867-A55A-70CB4B2B2FFE} = {16E521CE-77F1-4B1C-A183-520A41C4F372} + {439824F9-1455-4CC4-BD79-B44FA0A16552} = {16E521CE-77F1-4B1C-A183-520A41C4F372} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {DB4F868D-E1AE-4FD7-9333-69FA15B268C5} + EndGlobalSection +EndGlobal diff --git a/src/IISIntegration/LICENSE.txt b/src/Servers/IIS/LICENSE.txt similarity index 100% rename from src/IISIntegration/LICENSE.txt rename to src/Servers/IIS/LICENSE.txt diff --git a/src/IISIntegration/NuGetPackageVerifier.json b/src/Servers/IIS/NuGetPackageVerifier.json similarity index 80% rename from src/IISIntegration/NuGetPackageVerifier.json rename to src/Servers/IIS/NuGetPackageVerifier.json index eea701bb65..e4dda240ca 100644 --- a/src/IISIntegration/NuGetPackageVerifier.json +++ b/src/Servers/IIS/NuGetPackageVerifier.json @@ -2,7 +2,6 @@ "adx-nonshipping": { "rules": [], "packages": { - "Microsoft.AspNetCore.AspNetCoreModule": {}, "Microsoft.AspNetCore.AspNetCoreModuleV1": {} } }, diff --git a/src/IISIntegration/NuGetPackageVerifier.xplat.json b/src/Servers/IIS/NuGetPackageVerifier.xplat.json similarity index 100% rename from src/IISIntegration/NuGetPackageVerifier.xplat.json rename to src/Servers/IIS/NuGetPackageVerifier.xplat.json diff --git a/src/IISIntegration/build/Build.Settings b/src/Servers/IIS/build/Build.Settings similarity index 92% rename from src/IISIntegration/build/Build.Settings rename to src/Servers/IIS/build/Build.Settings index 9daccf4aaa..6180860c51 100644 --- a/src/IISIntegration/build/Build.Settings +++ b/src/Servers/IIS/build/Build.Settings @@ -4,24 +4,22 @@ $(MSBuildThisFileDirectory)..\ Debug Win32 - v120 - v140 - v120 + v141 $(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\ $(OutputPath) aspnetcore - + true false - + false true - + Use @@ -39,13 +37,13 @@ true - + Disabled - + MaxSpeed @@ -53,19 +51,19 @@ true - + WIN32;_DEBUG;%(PreprocessorDefinitions) - + _WIN64;_DEBUG;%(PreprocessorDefinitions) - + WIN32;NDEBUG;%(PreprocessorDefinitions) @@ -74,7 +72,7 @@ true - + _WIN64;NDEBUG;%(PreprocessorDefinitions) @@ -83,7 +81,7 @@ true - + <_TwoDigitYear>$([MSBuild]::Subtract($([System.DateTime]::UtcNow.Year), 2000)) <_ThreeDigitDayOfYear>$([System.DateTime]::UtcNow.DayOfYear.ToString().PadLeft(3, '0')) diff --git a/src/IISIntegration/build/Config.Definitions.Props b/src/Servers/IIS/build/Config.Definitions.Props similarity index 100% rename from src/IISIntegration/build/Config.Definitions.Props rename to src/Servers/IIS/build/Config.Definitions.Props diff --git a/src/IISIntegration/build/applicationhost.config b/src/Servers/IIS/build/applicationhost.config similarity index 100% rename from src/IISIntegration/build/applicationhost.config rename to src/Servers/IIS/build/applicationhost.config diff --git a/src/IISIntegration/build/applicationhost.iis.config b/src/Servers/IIS/build/applicationhost.iis.config similarity index 100% rename from src/IISIntegration/build/applicationhost.iis.config rename to src/Servers/IIS/build/applicationhost.iis.config diff --git a/src/Servers/IIS/build/build.msbuild b/src/Servers/IIS/build/build.msbuild new file mode 100644 index 0000000000..6b260d5bae --- /dev/null +++ b/src/Servers/IIS/build/build.msbuild @@ -0,0 +1,6 @@ + + + + + diff --git a/src/IISIntegration/build/native.targets b/src/Servers/IIS/build/native.targets similarity index 99% rename from src/IISIntegration/build/native.targets rename to src/Servers/IIS/build/native.targets index 1c5a981691..6e4af1fe7e 100644 --- a/src/IISIntegration/build/native.targets +++ b/src/Servers/IIS/build/native.targets @@ -1,5 +1,4 @@ - diff --git a/src/Servers/IIS/build/testsite.props b/src/Servers/IIS/build/testsite.props new file mode 100644 index 0000000000..d1f746bb2e --- /dev/null +++ b/src/Servers/IIS/build/testsite.props @@ -0,0 +1,44 @@ + + + + win7-x64;win7-x86 + x64;x86 + $(MSBuildThisFileDirectory)applicationhost.config + $(MSBuildThisFileDirectory)applicationhost.iis.config + x64 + $(Platform) + + + + $(MSBuildProgramFiles32)\IIS Express\iisexpress.exe + $(SystemRoot)\SysWOW64\inetsrv\w3wp.exe + Win32 + + + + $(ProgramW6432)\IIS Express\iisexpress.exe + $(SystemRoot)\System32\inetsrv\w3wp.exe + x64 + + + + + $(NativePlatform)\ + + + + + + + + + /config:"$(IISExpressAppHostConfig)" + -h "$(IISAppHostConfig)" + + $(NativePlatform)\aspnetcore.dll + $(userprofile)\.dotnet\$(NativePlatform)\dotnet.exe + + + diff --git a/src/Servers/IIS/samples/IISSample/IISSample.csproj b/src/Servers/IIS/samples/IISSample/IISSample.csproj new file mode 100644 index 0000000000..21e5953c9a --- /dev/null +++ b/src/Servers/IIS/samples/IISSample/IISSample.csproj @@ -0,0 +1,15 @@ + + + + netcoreapp2.1;net461 + + + + + + + + + + + diff --git a/src/IISIntegration/samples/IISSample/Startup.cs b/src/Servers/IIS/samples/IISSample/Startup.cs similarity index 100% rename from src/IISIntegration/samples/IISSample/Startup.cs rename to src/Servers/IIS/samples/IISSample/Startup.cs diff --git a/src/IISIntegration/samples/IISSample/web.config b/src/Servers/IIS/samples/IISSample/web.config similarity index 100% rename from src/IISIntegration/samples/IISSample/web.config rename to src/Servers/IIS/samples/IISSample/web.config diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj similarity index 99% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj index e1c11dddb6..7e2d840f0c 100644 --- a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj +++ b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj @@ -281,4 +281,5 @@ %(Filename).rc;%(Filename).h;MSG0409.bin + \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Source.def similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/Source.def diff --git a/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.h new file mode 100644 index 0000000000..3c95a91f47 --- /dev/null +++ b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.h @@ -0,0 +1,129 @@ +/*++ + +Copyright (c) 2014 Microsoft Corporation + +Module Name: + + aspnetcore_msg.mc + +Abstract: + + Asp.Net Core Module localizable messages. + +--*/ + + +#ifndef _ASPNETCORE_MSG_H_ +#define _ASPNETCORE_MSG_H_ + +// +// Values are 32 bit values laid out as follows: +// +// 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1 +// 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 +// +---+-+-+-----------------------+-------------------------------+ +// |Sev|C|R| Facility | Code | +// +---+-+-+-----------------------+-------------------------------+ +// +// where +// +// Sev - is the severity code +// +// 00 - Success +// 01 - Informational +// 10 - Warning +// 11 - Error +// +// C - is the Customer code flag +// +// R - is a reserved bit +// +// Facility - is the facility code +// +// Code - is the facility's status code +// +// +// Define the facility codes +// + + +// +// Define the severity codes +// + + +// +// MessageId: ASPNETCORE_EVENT_PROCESS_START_ERROR +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_PROCESS_START_ERROR ((DWORD)0x000003E8L) + +// +// MessageId: ASPNETCORE_EVENT_PROCESS_START_SUCCESS +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_PROCESS_START_SUCCESS ((DWORD)0x000003E9L) + +// +// MessageId: ASPNETCORE_EVENT_PROCESS_CRASH +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_PROCESS_CRASH ((DWORD)0x000003EAL) + +// +// MessageId: ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_RAPID_FAIL_COUNT_EXCEEDED ((DWORD)0x000003EBL) + +// +// MessageId: ASPNETCORE_EVENT_CONFIG_ERROR +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_CONFIG_ERROR ((DWORD)0x000003ECL) + +// +// MessageId: ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_GRACEFUL_SHUTDOWN_FAILURE ((DWORD)0x000003EDL) + +// +// MessageId: ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_SENT_SHUTDOWN_HTTP_REQUEST ((DWORD)0x000003EEL) + +// +// MessageId: ASPNETCORE_EVENT_RECYCLE_APPOFFLINE +// +// MessageText: +// +// %1 +// +#define ASPNETCORE_EVENT_RECYCLE_APPOFFLINE ((DWORD)0x000003F4L) + + +#endif // _ASPNETCORE_MODULE_MSG_H_ + diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc diff --git a/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.rc b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.rc similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.rc rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.rc diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_schema.xml b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_schema.xml similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_schema.xml rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_schema.xml diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/resource.h similarity index 99% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/resource.h index 493c3e2797..3545b36bbe 100644 --- a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h +++ b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/resource.h @@ -7,7 +7,7 @@ #define IDS_SERVER_ERROR 1001 // Next default values for new objects -// +// #ifdef APSTUDIO_INVOKED #ifndef APSTUDIO_READONLY_SYMBOLS #define _APS_NEXT_RESOURCE_VALUE 101 diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj similarity index 99% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj index bb8795992b..addf6ce98b 100644 --- a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj +++ b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj @@ -198,4 +198,7 @@ + + + \ No newline at end of file diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/acache.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/acache.cxx diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/acache.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/acache.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ahutil.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ahutil.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ahutil.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ahutil.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/base64.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/base64.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/base64.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/base64.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/buffer.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/buffer.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/datetime.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/datetime.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/dbgutil.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/dbgutil.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/hashfn.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/hashfn.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/hashtable.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/hashtable.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/listentry.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/listentry.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/macros.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/macros.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisz.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisz.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisz.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisz.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisza.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisza.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisza.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/multisza.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ntassert.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/ntassert.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/percpu.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/percpu.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/precomp.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/precomp.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/prime.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/prime.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/pudebug.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/pudebug.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/reftrace.c similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/reftrace.c diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/reftrace.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/reftrace.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/rwlock.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/rwlock.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringa.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringa.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringa.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringa.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringu.cpp similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringu.cpp diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringu.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/stringu.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/tracelog.c similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/tracelog.c diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/tracelog.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/tracelog.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/treehash.h similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/treehash.h diff --git a/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx b/src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/util.cxx similarity index 100% rename from src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx rename to src/Servers/IIS/src/AspNetCoreModuleV1/IISLib/util.cxx diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Directory.Build.targets new file mode 100644 index 0000000000..21ff857b22 --- /dev/null +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Directory.Build.targets @@ -0,0 +1,34 @@ + + + + + + + false + + false + + false + + true + + true + + false + + false + + + + + + + NuGetPackage + $(PackageId) + $(PackageVersion) + + + + + + \ No newline at end of file diff --git a/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModule.props similarity index 53% rename from src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props rename to src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModule.props index 5b01ee63a4..4e6fbe80e8 100644 --- a/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModule.props @@ -3,8 +3,6 @@ $(MSBuildThisFileDirectory)..\contentFiles\any\any\x64\aspnetcore.dll $(MSBuildThisFileDirectory)..\contentFiles\any\any\x86\aspnetcore.dll - $(MSBuildThisFileDirectory)..\contentFiles\any\any\x64\aspnetcorerh.dll - $(MSBuildThisFileDirectory)..\contentFiles\any\any\x86\aspnetcorerh.dll - + \ No newline at end of file diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModuleV1.pkgproj b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModuleV1.pkgproj new file mode 100644 index 0000000000..3a5ad7aba9 --- /dev/null +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/Microsoft.AspNetCore.AspNetCoreModuleV1.pkgproj @@ -0,0 +1,36 @@ + + + + + false + netcoreapp2.1 + aspnetcore + Microsoft ASP.NET Core Module + true + content + true + ASP.NET Core Module + + + + + + + + + + + + + + True + lib + + + + + + + + + \ No newline at end of file diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/lib/netcoreapp2.1/_._ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV1/lib/netcoreapp2.1/_._ new file mode 100644 index 0000000000..e69de29bb2 diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj new file mode 100644 index 0000000000..2bddeaaabb --- /dev/null +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj @@ -0,0 +1,42 @@ + + + + + ASP.NET Core components for working with the IIS AspNetCoreModule. + netstandard2.0 + $(NoWarn);CS1591 + true + aspnetcore;iis + true + + + + + + + + + False + + + False + + + + + + + + + + + + + + + + + + + + diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs similarity index 92% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs index 02fc967f1a..4ecb5018a2 100644 --- a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs @@ -3,6 +3,7 @@ using System; using System.Runtime.InteropServices; +using Microsoft.AspNetCore.HttpSys.Internal; namespace Microsoft.AspNetCore.Server.IISIntegration { diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs diff --git a/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json similarity index 100% rename from src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json rename to src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/Http.config b/src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/Http.config similarity index 100% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/Http.config rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/Http.config diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/Https.config b/src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/Https.config similarity index 100% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/Https.config rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/Https.config diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/NtlmAuthentation.config b/src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/NtlmAuthentation.config similarity index 100% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/NtlmAuthentation.config rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/NtlmAuthentation.config diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/WebsocketsNotSupported.config b/src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/WebsocketsNotSupported.config similarity index 100% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/AppHostConfig/WebsocketsNotSupported.config rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/AppHostConfig/WebsocketsNotSupported.config diff --git a/src/Servers/IIS/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj b/src/Servers/IIS/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj new file mode 100644 index 0000000000..58e9e115d7 --- /dev/null +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/IISIntegration.FunctionalTests.csproj @@ -0,0 +1,20 @@ + + + + $(StandardTestTfms) + + + + + + + + + + + + + + + + diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs similarity index 89% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs index 370ce2cf63..fc5ab5abef 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HelloWorldTest.cs @@ -19,20 +19,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { } - [Theory(Skip = "Full framework web.config generation is currently incorrect. See https://github.com/aspnet/websdk/pull/322")] - [InlineData("V1")] - [InlineData("V2")] - public Task HelloWorld_IISExpress_Clr_X64_Portable(string ancmVersion) + [Fact(Skip = "Full framework web.config generation is currently incorrect. See https://github.com/aspnet/websdk/pull/322")] + public Task HelloWorld_IISExpress_Clr_X64_Portable() { - return HelloWorld(RuntimeFlavor.Clr, ApplicationType.Portable, ancmVersion); + return HelloWorld(RuntimeFlavor.Clr, ApplicationType.Portable, "V1"); } - [Theory] - [InlineData("V1")] - [InlineData("V2")] - public Task HelloWorld_IISExpress_CoreClr_X64_Portable(string ancmVersion) + [Fact] + public Task HelloWorld_IISExpress_CoreClr_X64_Portable() { - return HelloWorld(RuntimeFlavor.CoreClr, ApplicationType.Portable, ancmVersion); + return HelloWorld(RuntimeFlavor.CoreClr, ApplicationType.Portable, "V1"); } private async Task HelloWorld(RuntimeFlavor runtimeFlavor, ApplicationType applicationType, string ancmVersion) @@ -49,7 +45,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests EnvironmentName = "HelloWorld", // Will pick the Start class named 'StartupHelloWorld', ServerConfigTemplateContent = (serverType == ServerType.IISExpress) ? File.ReadAllText("AppHostConfig/Http.config") : null, SiteName = "HttpTestSite", // This is configured in the Http.config - TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.0", + TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.1", ApplicationType = applicationType, Configuration = #if DEBUG diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs similarity index 85% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs index 0e71a21fdc..ab6aa0a315 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/HttpsTest.cs @@ -25,20 +25,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { } - [Theory(Skip = "Full framework web.config generation is currently incorrect. See: https://github.com/aspnet/websdk/pull/322")] - [InlineData("V1")] - [InlineData("V2")] - public Task Https_HelloWorld_CLR_X64(string ancmVersion) + [Fact] + public Task Https_HelloWorld_CLR_X64() { - return HttpsHelloWorld(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44396, ancmVersion); + return HttpsHelloWorld(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44396, "V1"); } - [Theory] - [InlineData("V1")] - [InlineData("V2")] - public Task Https_HelloWorld_CoreCLR_X64_Portable(string ancmVersion) + [Fact] + public Task Https_HelloWorld_CoreCLR_X64_Portable() { - return HttpsHelloWorld(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 44394, ancmVersion); + return HttpsHelloWorld(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 44394, "V1"); } private async Task HttpsHelloWorld(RuntimeFlavor runtimeFlavor, ApplicationType applicationType, int port, string ancmVersion) @@ -58,7 +54,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests EnvironmentName = "HttpsHelloWorld", // Will pick the Start class named 'StartupHttpsHelloWorld', ServerConfigTemplateContent = (serverType == ServerType.IISExpress) ? File.ReadAllText("AppHostConfig/Https.config") : null, SiteName = "HttpsTestSite", // This is configured in the Https.config - TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.0", + TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.1", ApplicationType = applicationType, Configuration = #if DEBUG @@ -99,40 +95,32 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests } } - [Theory] - [InlineData("V1")] - [InlineData("V2")] - public Task Https_HelloWorld_NoClientCert_CoreCLR_X64_Portable(string ancmVersion) + [Fact] + public Task Https_HelloWorld_NoClientCert_CoreCLR_X64_Portable() { - return HttpsHelloWorldCerts(RuntimeFlavor.CoreClr, ApplicationType.Portable , port: 44397, sendClientCert: false, ancmVersion); + return HttpsHelloWorldCerts(RuntimeFlavor.CoreClr, ApplicationType.Portable , port: 44397, sendClientCert: false, "V1"); } - [Theory(Skip = "Full framework web.config generation is currently incorrect. See https://github.com/aspnet/websdk/pull/322")] - [InlineData("V1")] - [InlineData("V2")] - public Task Https_HelloWorld_NoClientCert_Clr_X64(string ancmVersion) + [Fact] + public Task Https_HelloWorld_NoClientCert_Clr_X64() { - return HttpsHelloWorldCerts(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44398, sendClientCert: false, ancmVersion); + return HttpsHelloWorldCerts(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44398, sendClientCert: false, "V1"); } #pragma warning disable xUnit1004 // Test methods should not be skipped - [Theory(Skip = "Manual test only, selecting a client cert is non-determanistic on different machines.")] - [InlineData("V1")] - [InlineData("V2")] + [Fact(Skip = "Manual test only, selecting a client cert is non-determanistic on different machines.")] #pragma warning restore xUnit1004 // Test methods should not be skipped - public Task Https_HelloWorld_ClientCert_Clr_X64(string ancmVersion) + public Task Https_HelloWorld_ClientCert_Clr_X64() { - return HttpsHelloWorldCerts(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44301, sendClientCert: true, ancmVersion); + return HttpsHelloWorldCerts(RuntimeFlavor.Clr, ApplicationType.Portable, port: 44301, sendClientCert: true, "V1"); } #pragma warning disable xUnit1004 // Test methods should not be skipped - [Theory(Skip = "Manual test only, selecting a client cert is non-determanistic on different machines.")] - [InlineData("V1")] - [InlineData("V2")] + [Fact(Skip = "Manual test only, selecting a client cert is non-determanistic on different machines.")] #pragma warning restore xUnit1004 // Test methods should not be skipped - public Task Https_HelloWorld_ClientCert_CoreCLR_X64_Portable(string ancmVersion) + public Task Https_HelloWorld_ClientCert_CoreCLR_X64_Portable() { - return HttpsHelloWorldCerts(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 44302, sendClientCert: true, ancmVersion); + return HttpsHelloWorldCerts(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 44302, sendClientCert: true, "V1"); } private async Task HttpsHelloWorldCerts(RuntimeFlavor runtimeFlavor, ApplicationType applicationType, int port, bool sendClientCert, string ancmVersion) @@ -151,7 +139,7 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests EnvironmentName = "HttpsHelloWorld", // Will pick the Start class named 'StartupHttpsHelloWorld', ServerConfigTemplateContent = (serverType == ServerType.IISExpress) ? File.ReadAllText("AppHostConfig/Https.config") : null, SiteName = "HttpsTestSite", // This is configured in the Https.config - TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.0", + TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.1", ApplicationType = applicationType, Configuration = #if DEBUG diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs similarity index 92% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs index 809c213b27..a643a15bcb 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs @@ -25,20 +25,16 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { } - [Theory(Skip = "Full framework web.config generation is currently incorrect. See https://github.com/aspnet/websdk/pull/322")] - [InlineData("V1")] - [InlineData("V2")] - public Task NtlmAuthentication_Clr_X64(string ancmVersion) + [Fact(Skip = "Full framework web.config generation is currently incorrect. See https://github.com/aspnet/websdk/pull/322")] + public Task NtlmAuthentication_Clr_X64_Portable() { - return NtlmAuthentication(RuntimeFlavor.Clr, ApplicationType.Portable, port: 5051, ancmVersion); + return NtlmAuthentication(RuntimeFlavor.Clr, ApplicationType.Portable, port: 5051, "V1"); } - [Theory] - [InlineData("V1")] - [InlineData("V2")] - public Task NtlmAuthentication_CoreClr_X64_Portable(string ancmVersion) + [Fact] + public Task NtlmAuthentication_CoreClr_X64_Portable() { - return NtlmAuthentication(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 5052, ancmVersion); + return NtlmAuthentication(RuntimeFlavor.CoreClr, ApplicationType.Portable, port: 5052, "V1"); } private async Task NtlmAuthentication(RuntimeFlavor runtimeFlavor, ApplicationType applicationType, int port, string ancmVersion) @@ -59,14 +55,14 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests additionalPublishParameters += " -r " + windowsRid; } - + var deploymentParameters = new DeploymentParameters(Helpers.GetOutOfProcessTestSitesPath(), serverType, runtimeFlavor, architecture) { ApplicationBaseUriHint = $"http://localhost:{port}", EnvironmentName = "NtlmAuthentication", // Will pick the Start class named 'StartupNtlmAuthentication' ServerConfigTemplateContent = (serverType == ServerType.IISExpress) ? File.ReadAllText("AppHostConfig/NtlmAuthentation.config") : null, SiteName = "NtlmAuthenticationTestSite", // This is configured in the NtlmAuthentication.config - TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.0", + TargetFramework = runtimeFlavor == RuntimeFlavor.Clr ? "net461" : "netcoreapp2.1", ApplicationType = applicationType, AdditionalPublishParameters = additionalPublishParameters, Configuration = diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs similarity index 76% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs index 240f2d35c0..a150572c1f 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/Properties/AssemblyInfo.cs @@ -4,5 +4,4 @@ // All functional tests in this project require a version of IIS express with an updated schema using Xunit; -[assembly: Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests.IISExpressSupportsInProcessHosting] [assembly: CollectionBehavior(DisableTestParallelization = true)] diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs similarity index 90% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs index 8627334de7..0e4dd61e78 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/UpgradeFeatureDetectionTests.cs @@ -22,16 +22,6 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests { } - [Fact] - public Task UpgradeFeatureDetectionEnabled_OutOfProcess_IISExpress_CoreClr_x64_Portable() - { - return UpgradeFeatureDetectionDeployer(RuntimeFlavor.CoreClr, - ApplicationType.Portable, - "AppHostConfig/WebsocketsNotSupported.config", - Helpers.GetOutOfProcessTestSitesPath(), - "Disabled"); - } - [Fact] public Task UpgradeFeatureDetectionDisabled_OutOfProcess_IISExpress_CoreClr_x64_Portable() { diff --git a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs b/src/Servers/IIS/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs similarity index 90% rename from src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs rename to src/Servers/IIS/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs index 5cda360005..fcb5dda5ad 100644 --- a/src/IISIntegration/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs +++ b/src/Servers/IIS/test/IISIntegration.FunctionalTests/Utilities/Helpers.cs @@ -12,19 +12,19 @@ namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests public class Helpers { public static string GetTestWebSitePath(string name) - { + { return Path.GetFullPath( Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "..", // tfm "..", // debug "..", // obj "..", // projectfolder - "WebSites", + "iis", + "test", + "testassets", name)); } - public static string GetInProcessTestSitesPath() => GetTestWebSitePath("InProcessWebSite"); - public static string GetOutOfProcessTestSitesPath() => GetTestWebSitePath("OutOfProcessWebSite"); public static void ModifyAspNetCoreSectionInWebConfig(DeploymentResult deploymentResult, string key, string value) diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs b/src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs similarity index 100% rename from src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs rename to src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs b/src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs similarity index 100% rename from src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs rename to src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs diff --git a/src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj b/src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj new file mode 100644 index 0000000000..6567415b2f --- /dev/null +++ b/src/Servers/IIS/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj @@ -0,0 +1,15 @@ + + + + $(StandardTestTfms) + + + + + + + + + + + diff --git a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj new file mode 100644 index 0000000000..1b08374643 --- /dev/null +++ b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj @@ -0,0 +1,18 @@ + + + + + + $(StandardTestTfms) + + + + + + + + + + + + diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs similarity index 100% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupHelloWorld.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupHelloWorld.cs similarity index 100% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupHelloWorld.cs rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupHelloWorld.cs diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupHttpsHelloWorld.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupHttpsHelloWorld.cs similarity index 100% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupHttpsHelloWorld.cs rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupHttpsHelloWorld.cs diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupNtlmAuthentication.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupNtlmAuthentication.cs similarity index 96% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupNtlmAuthentication.cs rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupNtlmAuthentication.cs index 29098ca702..eda1493fbb 100644 --- a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupNtlmAuthentication.cs +++ b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupNtlmAuthentication.cs @@ -8,7 +8,6 @@ using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Server.IISIntegration; using Microsoft.Extensions.Logging; -using Xunit; namespace TestSites { @@ -47,7 +46,6 @@ namespace TestSites { if (context.User.Identity.IsAuthenticated) { - Assert.IsType(context.User); return context.Response.WriteAsync(context.User.Identity.AuthenticationType); } else diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupUpgradeFeatureDetection.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupUpgradeFeatureDetection.cs similarity index 100% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/StartupUpgradeFeatureDetection.cs rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/StartupUpgradeFeatureDetection.cs diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/web.config b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/web.config similarity index 100% rename from src/IISIntegration/test/WebSites/OutOfProcessWebSite/web.config rename to src/Servers/IIS/test/testassets/OutOfProcessWebSite/web.config diff --git a/src/IISIntegration/tools/SetupTestEnvironment.ps1 b/src/Servers/IIS/tools/SetupTestEnvironment.ps1 similarity index 100% rename from src/IISIntegration/tools/SetupTestEnvironment.ps1 rename to src/Servers/IIS/tools/SetupTestEnvironment.ps1 diff --git a/src/IISIntegration/tools/UpdateIISExpressCertificate.ps1 b/src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1 similarity index 100% rename from src/IISIntegration/tools/UpdateIISExpressCertificate.ps1 rename to src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1 diff --git a/src/IISIntegration/tools/certificate.ps1 b/src/Servers/IIS/tools/certificate.ps1 similarity index 100% rename from src/IISIntegration/tools/certificate.ps1 rename to src/Servers/IIS/tools/certificate.ps1 diff --git a/src/IISIntegration/tools/httpsys.ps1 b/src/Servers/IIS/tools/httpsys.ps1 similarity index 100% rename from src/IISIntegration/tools/httpsys.ps1 rename to src/Servers/IIS/tools/httpsys.ps1 diff --git a/src/IISIntegration/tools/installancm.ps1 b/src/Servers/IIS/tools/installancm.ps1 similarity index 100% rename from src/IISIntegration/tools/installancm.ps1 rename to src/Servers/IIS/tools/installancm.ps1 diff --git a/src/IISIntegration/tools/stresstest.ps1 b/src/Servers/IIS/tools/stresstest.ps1 similarity index 100% rename from src/IISIntegration/tools/stresstest.ps1 rename to src/Servers/IIS/tools/stresstest.ps1 diff --git a/src/IISIntegration/tools/update_schema.ps1 b/src/Servers/IIS/tools/update_schema.ps1 similarity index 100% rename from src/IISIntegration/tools/update_schema.ps1 rename to src/Servers/IIS/tools/update_schema.ps1 diff --git a/version.props b/version.props index f0cbed211d..08bb4a8c92 100644 --- a/version.props +++ b/version.props @@ -8,6 +8,12 @@ t000 $(AspNetCoreMajorVersion).$(AspNetCoreMinorVersion).$(AspNetCorePatchVersion) 0.1.$(AspNetCorePatchVersion) + + + 1$(AspNetCoreMajorVersion) + $(AspNetCoreMinorVersion) + $(AspNetCorePatchVersion) + $(PreReleaseLabel)-$(BuildNumber) $(PreReleaseBrandingLabel) Build $(BuildNumber) From a3c99028b2a2f2ab7971633aad1a01eef1160899 Mon Sep 17 00:00:00 2001 From: Chris Ross Date: Wed, 12 Dec 2018 17:14:46 -0800 Subject: [PATCH 02/10] Fix HttpSys Caching_SendFileWithFullContentLength_Cached test (#4630) --- .../HttpSys/test/FunctionalTests/ResponseCachingTests.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Servers/HttpSys/test/FunctionalTests/ResponseCachingTests.cs b/src/Servers/HttpSys/test/FunctionalTests/ResponseCachingTests.cs index acac2989fd..ce226cc20e 100644 --- a/src/Servers/HttpSys/test/FunctionalTests/ResponseCachingTests.cs +++ b/src/Servers/HttpSys/test/FunctionalTests/ResponseCachingTests.cs @@ -21,7 +21,7 @@ namespace Microsoft.AspNetCore.Server.HttpSys.FunctionalTests public ResponseCachingTests() { - _absoluteFilePath = Directory.GetFiles(Directory.GetCurrentDirectory()).First(); + _absoluteFilePath = Path.Combine(Directory.GetCurrentDirectory(), "Microsoft.AspNetCore.Server.HttpSys.dll"); _fileLength = new FileInfo(_absoluteFilePath).Length; } From a026e7a4e7537292c8f375974914a1b7b4ac8252 Mon Sep 17 00:00:00 2001 From: John Luo Date: Thu, 13 Dec 2018 11:39:15 -0800 Subject: [PATCH 03/10] Convert MetaPackages to Reference and move to DefauldBuilder folder (#4687) * Convert ServerTests to Reference and move to Server folder * Fix NU1105 --- build/buildorder.props | 1 - build/repo.props | 1 + build/submodules.props | 1 - eng/Baseline.Designer.props | 60 +++-- eng/Baseline.xml | 1 + eng/ProjectReferences.props | 13 +- src/DefaultBuilder/DefaultBuilder.sln | 205 ++++++++++++++++++ .../samples/SampleApp/Program.cs | 0 .../samples/SampleApp/SampleApp.csproj | 6 +- .../samples/SampleApp/Startup.cs | 0 .../samples/SampleApp/appsettings.json | 0 .../samples/SampleApp/wwwroot/htmlpage.html | 0 .../src}/HostFilteringStartupFilter.cs | 0 .../src/Microsoft.AspNetCore.csproj | 30 +++ .../src}/WebHost.cs | 0 .../src}/baseline.netcore.json | 0 ...icrosoft.AspNetCore.FunctionalTests.csproj | 21 ++ .../WebHostFunctionalTests.cs | 4 +- .../testCert.pfx | Bin .../Microsoft.AspNetCore.Tests.csproj | 11 + .../WebHostTests.cs | 0 .../CreateDefaultBuilderApp.csproj | 4 +- .../CreateDefaultBuilderApp/Program.cs | 0 .../appsettings.Development.json | 0 .../CreateDefaultBuilderApp/appsettings.json | 0 .../CreateDefaultBuilderOfTApp.csproj | 4 +- .../CreateDefaultBuilderOfTApp/Program.cs | 0 .../CreateDefaultBuilderOfTApp/Startup.cs | 0 .../appsettings.Development.json | 0 .../appsettings.json | 0 .../DependencyInjectionApp.csproj | 4 +- .../DependencyInjectionApp/Program.cs | 0 .../StartRequestDelegateUrlApp/Program.cs | 0 .../StartRequestDelegateUrlApp.csproj | 4 +- .../StartRouteBuilderUrlApp/Program.cs | 0 .../StartRouteBuilderUrlApp.csproj | 4 +- .../Program.cs | 0 .../StartWithIApplicationBuilderUrlApp.csproj | 4 +- src/MetaPackages/.gitignore | 37 ---- src/MetaPackages/Directory.Build.props | 21 -- src/MetaPackages/Directory.Build.targets | 7 - src/MetaPackages/MetaPackages.sln | 116 ---------- src/MetaPackages/NuGetPackageVerifier.json | 7 - src/MetaPackages/README.md | 7 - src/MetaPackages/build/dependencies.props | 41 ---- src/MetaPackages/build/repo.props | 8 - src/MetaPackages/build/sources.props | 17 -- .../SampleApp/Properties/launchSettings.json | 27 --- src/MetaPackages/src/Directory.Build.props | 7 - .../Microsoft.AspNetCore.csproj | 30 --- src/MetaPackages/test/Directory.Build.props | 14 -- ...icrosoft.AspNetCore.FunctionalTests.csproj | 28 --- .../Microsoft.AspNetCore.Tests.csproj | 18 -- src/MetaPackages/version.props | 12 - 54 files changed, 334 insertions(+), 441 deletions(-) create mode 100644 src/DefaultBuilder/DefaultBuilder.sln rename src/{MetaPackages => DefaultBuilder}/samples/SampleApp/Program.cs (100%) rename src/{MetaPackages => DefaultBuilder}/samples/SampleApp/SampleApp.csproj (52%) rename src/{MetaPackages => DefaultBuilder}/samples/SampleApp/Startup.cs (100%) rename src/{MetaPackages => DefaultBuilder}/samples/SampleApp/appsettings.json (100%) rename src/{MetaPackages => DefaultBuilder}/samples/SampleApp/wwwroot/htmlpage.html (100%) rename src/{MetaPackages/src/Microsoft.AspNetCore => DefaultBuilder/src}/HostFilteringStartupFilter.cs (100%) create mode 100644 src/DefaultBuilder/src/Microsoft.AspNetCore.csproj rename src/{MetaPackages/src/Microsoft.AspNetCore => DefaultBuilder/src}/WebHost.cs (100%) rename src/{MetaPackages/src/Microsoft.AspNetCore => DefaultBuilder/src}/baseline.netcore.json (100%) create mode 100644 src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj rename src/{MetaPackages => DefaultBuilder}/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs (99%) rename src/{MetaPackages => DefaultBuilder}/test/Microsoft.AspNetCore.FunctionalTests/testCert.pfx (100%) create mode 100644 src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj rename src/{MetaPackages => DefaultBuilder}/test/Microsoft.AspNetCore.Tests/WebHostTests.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj (65%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderApp/appsettings.Development.json (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderApp/appsettings.json (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj (65%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderOfTApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderOfTApp/Startup.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderOfTApp/appsettings.Development.json (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/CreateDefaultBuilderOfTApp/appsettings.json (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/DependencyInjectionApp/DependencyInjectionApp.csproj (55%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/DependencyInjectionApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartRequestDelegateUrlApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj (55%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartRouteBuilderUrlApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj (55%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartWithIApplicationBuilderUrlApp/Program.cs (100%) rename src/{MetaPackages/test/TestSites => DefaultBuilder/testassets}/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj (55%) delete mode 100644 src/MetaPackages/.gitignore delete mode 100644 src/MetaPackages/Directory.Build.props delete mode 100644 src/MetaPackages/Directory.Build.targets delete mode 100644 src/MetaPackages/MetaPackages.sln delete mode 100644 src/MetaPackages/NuGetPackageVerifier.json delete mode 100644 src/MetaPackages/README.md delete mode 100644 src/MetaPackages/build/dependencies.props delete mode 100644 src/MetaPackages/build/repo.props delete mode 100644 src/MetaPackages/build/sources.props delete mode 100644 src/MetaPackages/samples/SampleApp/Properties/launchSettings.json delete mode 100644 src/MetaPackages/src/Directory.Build.props delete mode 100644 src/MetaPackages/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj delete mode 100644 src/MetaPackages/test/Directory.Build.props delete mode 100644 src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj delete mode 100644 src/MetaPackages/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj delete mode 100644 src/MetaPackages/version.props diff --git a/build/buildorder.props b/build/buildorder.props index 2338a88d73..937df0f56a 100644 --- a/build/buildorder.props +++ b/build/buildorder.props @@ -11,7 +11,6 @@ - diff --git a/build/repo.props b/build/repo.props index 4ee59e96d7..881ac8ee77 100644 --- a/build/repo.props +++ b/build/repo.props @@ -66,6 +66,7 @@ diff --git a/eng/Baseline.Designer.props b/eng/Baseline.Designer.props index c7b8c6bc76..ec7d5961c0 100644 --- a/eng/Baseline.Designer.props +++ b/eng/Baseline.Designer.props @@ -24,6 +24,28 @@ 2.1.1 + + + 2.1.6 + + + + + + + + + + + + + + + + + + + 2.1.1 @@ -296,25 +318,6 @@ - - - 2.1.2 - - - - - - - - - - - - - - - - 2.1.1 @@ -417,6 +420,25 @@ + + + 2.1.2 + + + + + + + + + + + + + + + + 2.1.3 diff --git a/eng/Baseline.xml b/eng/Baseline.xml index 4886e244a3..070816457b 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -3,6 +3,7 @@ + diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index 0b3bc1f6aa..ea6ac86aac 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -1,7 +1,7 @@ - + @@ -12,6 +12,7 @@ + @@ -39,12 +40,12 @@ - + @@ -54,12 +55,12 @@ + + - - - - + + diff --git a/src/DefaultBuilder/DefaultBuilder.sln b/src/DefaultBuilder/DefaultBuilder.sln new file mode 100644 index 0000000000..30d7765447 --- /dev/null +++ b/src/DefaultBuilder/DefaultBuilder.sln @@ -0,0 +1,205 @@ + +Microsoft Visual Studio Solution File, Format Version 12.00 +# Visual Studio 15 +VisualStudioVersion = 15.0.26124.0 +MinimumVisualStudioVersion = 15.0.26124.0 +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleApp", "samples\SampleApp\SampleApp.csproj", "{C19108F8-667B-4CF9-B227-CDD2290224BC}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Tests", "test\Microsoft.AspNetCore.Tests\Microsoft.AspNetCore.Tests.csproj", "{1CD49F15-D381-4C7E-8E12-A85E7753B110}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.FunctionalTests", "test\Microsoft.AspNetCore.FunctionalTests\Microsoft.AspNetCore.FunctionalTests.csproj", "{766C394B-ABBB-4624-A071-C806C0A2CD3E}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "testassets", "testassets", "{3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreateDefaultBuilderApp", "testassets\CreateDefaultBuilderApp\CreateDefaultBuilderApp.csproj", "{BE8D7353-692B-4B5B-ADFD-32632AE758E3}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreateDefaultBuilderOfTApp", "testassets\CreateDefaultBuilderOfTApp\CreateDefaultBuilderOfTApp.csproj", "{AE1F0124-996E-476A-9331-FB789F3D0577}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DependencyInjectionApp", "testassets\DependencyInjectionApp\DependencyInjectionApp.csproj", "{03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartRequestDelegateUrlApp", "testassets\StartRequestDelegateUrlApp\StartRequestDelegateUrlApp.csproj", "{4B69520E-CB30-4B20-BCA7-9378EAC322A6}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartRouteBuilderUrlApp", "testassets\StartRouteBuilderUrlApp\StartRouteBuilderUrlApp.csproj", "{AC847245-BFC3-4BEB-915C-FCD932359A5F}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartWithIApplicationBuilderUrlApp", "testassets\StartWithIApplicationBuilderUrlApp\StartWithIApplicationBuilderUrlApp.csproj", "{92F27C24-44CA-4C2B-867E-1A4D776B03E0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore", "src\Microsoft.AspNetCore.csproj", "{BEB88AF7-67EB-4754-A5CD-89C0388974C9}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "_dependencies", "_dependencies", "{31D4AC03-410F-476C-A0C8-E9E9490289B1}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.Server.IntegrationTesting", "..\Hosting\Server.IntegrationTesting\src\Microsoft.AspNetCore.Server.IntegrationTesting.csproj", "{BF5885C7-F975-4652-9C11-093781FC16C5}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.StaticFiles", "..\Middleware\StaticFiles\src\Microsoft.AspNetCore.StaticFiles.csproj", "{D46E4E5D-0846-4574-A8BA-30D040A6254D}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 + Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|x64.ActiveCfg = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|x64.Build.0 = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|x86.ActiveCfg = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Debug|x86.Build.0 = Debug|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|Any CPU.Build.0 = Release|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|x64.ActiveCfg = Release|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|x64.Build.0 = Release|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|x86.ActiveCfg = Release|Any CPU + {C19108F8-667B-4CF9-B227-CDD2290224BC}.Release|x86.Build.0 = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|Any CPU.Build.0 = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|x64.ActiveCfg = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|x64.Build.0 = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|x86.ActiveCfg = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Debug|x86.Build.0 = Debug|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|Any CPU.ActiveCfg = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|Any CPU.Build.0 = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|x64.ActiveCfg = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|x64.Build.0 = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|x86.ActiveCfg = Release|Any CPU + {1CD49F15-D381-4C7E-8E12-A85E7753B110}.Release|x86.Build.0 = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|Any CPU.Build.0 = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|x64.ActiveCfg = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|x64.Build.0 = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|x86.ActiveCfg = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Debug|x86.Build.0 = Debug|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|Any CPU.ActiveCfg = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|Any CPU.Build.0 = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|x64.ActiveCfg = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|x64.Build.0 = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|x86.ActiveCfg = Release|Any CPU + {766C394B-ABBB-4624-A071-C806C0A2CD3E}.Release|x86.Build.0 = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|x64.ActiveCfg = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|x64.Build.0 = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|x86.ActiveCfg = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Debug|x86.Build.0 = Debug|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|Any CPU.Build.0 = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|x64.ActiveCfg = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|x64.Build.0 = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|x86.ActiveCfg = Release|Any CPU + {BE8D7353-692B-4B5B-ADFD-32632AE758E3}.Release|x86.Build.0 = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|x64.ActiveCfg = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|x64.Build.0 = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|x86.ActiveCfg = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Debug|x86.Build.0 = Debug|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|Any CPU.Build.0 = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|x64.ActiveCfg = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|x64.Build.0 = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|x86.ActiveCfg = Release|Any CPU + {AE1F0124-996E-476A-9331-FB789F3D0577}.Release|x86.Build.0 = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|x64.ActiveCfg = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|x64.Build.0 = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|x86.ActiveCfg = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Debug|x86.Build.0 = Debug|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|Any CPU.Build.0 = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|x64.ActiveCfg = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|x64.Build.0 = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|x86.ActiveCfg = Release|Any CPU + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6}.Release|x86.Build.0 = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|x64.ActiveCfg = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|x64.Build.0 = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|x86.ActiveCfg = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Debug|x86.Build.0 = Debug|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|Any CPU.Build.0 = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|x64.ActiveCfg = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|x64.Build.0 = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|x86.ActiveCfg = Release|Any CPU + {4B69520E-CB30-4B20-BCA7-9378EAC322A6}.Release|x86.Build.0 = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|x64.ActiveCfg = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|x64.Build.0 = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|x86.ActiveCfg = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Debug|x86.Build.0 = Debug|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|Any CPU.Build.0 = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|x64.ActiveCfg = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|x64.Build.0 = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|x86.ActiveCfg = Release|Any CPU + {AC847245-BFC3-4BEB-915C-FCD932359A5F}.Release|x86.Build.0 = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|x64.ActiveCfg = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|x64.Build.0 = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|x86.ActiveCfg = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Debug|x86.Build.0 = Debug|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|Any CPU.Build.0 = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|x64.ActiveCfg = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|x64.Build.0 = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|x86.ActiveCfg = Release|Any CPU + {92F27C24-44CA-4C2B-867E-1A4D776B03E0}.Release|x86.Build.0 = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|x64.ActiveCfg = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|x64.Build.0 = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|x86.ActiveCfg = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Debug|x86.Build.0 = Debug|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|Any CPU.Build.0 = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|x64.ActiveCfg = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|x64.Build.0 = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|x86.ActiveCfg = Release|Any CPU + {BEB88AF7-67EB-4754-A5CD-89C0388974C9}.Release|x86.Build.0 = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|x64.Build.0 = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Debug|x86.Build.0 = Debug|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|Any CPU.ActiveCfg = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|Any CPU.Build.0 = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|x64.ActiveCfg = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|x64.Build.0 = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|x86.ActiveCfg = Release|Any CPU + {BF5885C7-F975-4652-9C11-093781FC16C5}.Release|x86.Build.0 = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|Any CPU.Build.0 = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|x64.ActiveCfg = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|x64.Build.0 = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|x86.ActiveCfg = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Debug|x86.Build.0 = Debug|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|Any CPU.ActiveCfg = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|Any CPU.Build.0 = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|x64.ActiveCfg = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|x64.Build.0 = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|x86.ActiveCfg = Release|Any CPU + {D46E4E5D-0846-4574-A8BA-30D040A6254D}.Release|x86.Build.0 = Release|Any CPU + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection + GlobalSection(NestedProjects) = preSolution + {BE8D7353-692B-4B5B-ADFD-32632AE758E3} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {AE1F0124-996E-476A-9331-FB789F3D0577} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {03C1BD3F-6F6D-4D8F-9BD9-205D059723B6} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {4B69520E-CB30-4B20-BCA7-9378EAC322A6} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {AC847245-BFC3-4BEB-915C-FCD932359A5F} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {92F27C24-44CA-4C2B-867E-1A4D776B03E0} = {3C38AE63-E4F4-4BCA-97C1-F0A96A06BA88} + {BF5885C7-F975-4652-9C11-093781FC16C5} = {31D4AC03-410F-476C-A0C8-E9E9490289B1} + {D46E4E5D-0846-4574-A8BA-30D040A6254D} = {31D4AC03-410F-476C-A0C8-E9E9490289B1} + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + SolutionGuid = {3A0191FF-7538-4406-BD4A-4883C0E1B72C} + EndGlobalSection +EndGlobal diff --git a/src/MetaPackages/samples/SampleApp/Program.cs b/src/DefaultBuilder/samples/SampleApp/Program.cs similarity index 100% rename from src/MetaPackages/samples/SampleApp/Program.cs rename to src/DefaultBuilder/samples/SampleApp/Program.cs diff --git a/src/MetaPackages/samples/SampleApp/SampleApp.csproj b/src/DefaultBuilder/samples/SampleApp/SampleApp.csproj similarity index 52% rename from src/MetaPackages/samples/SampleApp/SampleApp.csproj rename to src/DefaultBuilder/samples/SampleApp/SampleApp.csproj index 622f64cc4c..55069f2a58 100644 --- a/src/MetaPackages/samples/SampleApp/SampleApp.csproj +++ b/src/DefaultBuilder/samples/SampleApp/SampleApp.csproj @@ -1,4 +1,4 @@ - + netcoreapp2.1;net461 @@ -10,7 +10,7 @@ - - + + diff --git a/src/MetaPackages/samples/SampleApp/Startup.cs b/src/DefaultBuilder/samples/SampleApp/Startup.cs similarity index 100% rename from src/MetaPackages/samples/SampleApp/Startup.cs rename to src/DefaultBuilder/samples/SampleApp/Startup.cs diff --git a/src/MetaPackages/samples/SampleApp/appsettings.json b/src/DefaultBuilder/samples/SampleApp/appsettings.json similarity index 100% rename from src/MetaPackages/samples/SampleApp/appsettings.json rename to src/DefaultBuilder/samples/SampleApp/appsettings.json diff --git a/src/MetaPackages/samples/SampleApp/wwwroot/htmlpage.html b/src/DefaultBuilder/samples/SampleApp/wwwroot/htmlpage.html similarity index 100% rename from src/MetaPackages/samples/SampleApp/wwwroot/htmlpage.html rename to src/DefaultBuilder/samples/SampleApp/wwwroot/htmlpage.html diff --git a/src/MetaPackages/src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs b/src/DefaultBuilder/src/HostFilteringStartupFilter.cs similarity index 100% rename from src/MetaPackages/src/Microsoft.AspNetCore/HostFilteringStartupFilter.cs rename to src/DefaultBuilder/src/HostFilteringStartupFilter.cs diff --git a/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj b/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj new file mode 100644 index 0000000000..a9d69c1c2e --- /dev/null +++ b/src/DefaultBuilder/src/Microsoft.AspNetCore.csproj @@ -0,0 +1,30 @@ + + + + netstandard2.0 + aspnetcore + Microsoft.AspNetCore + true + false + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/MetaPackages/src/Microsoft.AspNetCore/WebHost.cs b/src/DefaultBuilder/src/WebHost.cs similarity index 100% rename from src/MetaPackages/src/Microsoft.AspNetCore/WebHost.cs rename to src/DefaultBuilder/src/WebHost.cs diff --git a/src/MetaPackages/src/Microsoft.AspNetCore/baseline.netcore.json b/src/DefaultBuilder/src/baseline.netcore.json similarity index 100% rename from src/MetaPackages/src/Microsoft.AspNetCore/baseline.netcore.json rename to src/DefaultBuilder/src/baseline.netcore.json diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj new file mode 100644 index 0000000000..ac104253eb --- /dev/null +++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj @@ -0,0 +1,21 @@ + + + + $(StandardTestTfms) + + + true + + + + + + + + + + + diff --git a/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs similarity index 99% rename from src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs rename to src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs index b882205779..3e62638d40 100644 --- a/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs +++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/WebHostFunctionalTests.cs @@ -217,10 +217,10 @@ namespace Microsoft.AspNetCore.Tests var directoryInfo = new DirectoryInfo(applicationBasePath); do { - var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, "MetaPackages.sln")); + var solutionFileInfo = new FileInfo(Path.Combine(directoryInfo.FullName, "DefaultBuilder.sln")); if (solutionFileInfo.Exists) { - return Path.GetFullPath(Path.Combine(directoryInfo.FullName, "test", "TestSites")); + return Path.GetFullPath(Path.Combine(directoryInfo.FullName, "testassets")); } directoryInfo = directoryInfo.Parent; diff --git a/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/testCert.pfx b/src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/testCert.pfx similarity index 100% rename from src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/testCert.pfx rename to src/DefaultBuilder/test/Microsoft.AspNetCore.FunctionalTests/testCert.pfx diff --git a/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj new file mode 100644 index 0000000000..9fe73037b0 --- /dev/null +++ b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj @@ -0,0 +1,11 @@ + + + + $(StandardTestTfms) + + + + + + + diff --git a/src/MetaPackages/test/Microsoft.AspNetCore.Tests/WebHostTests.cs b/src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebHostTests.cs similarity index 100% rename from src/MetaPackages/test/Microsoft.AspNetCore.Tests/WebHostTests.cs rename to src/DefaultBuilder/test/Microsoft.AspNetCore.Tests/WebHostTests.cs diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj b/src/DefaultBuilder/testassets/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj similarity index 65% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj rename to src/DefaultBuilder/testassets/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj index 7b43959e2f..07dbfce7a9 100644 --- a/src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj +++ b/src/DefaultBuilder/testassets/CreateDefaultBuilderApp/CreateDefaultBuilderApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -7,7 +7,7 @@ - + diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/Program.cs b/src/DefaultBuilder/testassets/CreateDefaultBuilderApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/Program.cs rename to src/DefaultBuilder/testassets/CreateDefaultBuilderApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/appsettings.Development.json b/src/DefaultBuilder/testassets/CreateDefaultBuilderApp/appsettings.Development.json similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/appsettings.Development.json rename to src/DefaultBuilder/testassets/CreateDefaultBuilderApp/appsettings.Development.json diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/appsettings.json b/src/DefaultBuilder/testassets/CreateDefaultBuilderApp/appsettings.json similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderApp/appsettings.json rename to src/DefaultBuilder/testassets/CreateDefaultBuilderApp/appsettings.json diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj similarity index 65% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj rename to src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj index c73ee499ff..9a9a7a06e6 100644 --- a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj +++ b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/CreateDefaultBuilderOfTApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -7,7 +7,7 @@ - + diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/Program.cs b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/Program.cs rename to src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/Startup.cs similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/Startup.cs rename to src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/Startup.cs diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.Development.json b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/appsettings.Development.json similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.Development.json rename to src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/appsettings.Development.json diff --git a/src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json b/src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/appsettings.json similarity index 100% rename from src/MetaPackages/test/TestSites/CreateDefaultBuilderOfTApp/appsettings.json rename to src/DefaultBuilder/testassets/CreateDefaultBuilderOfTApp/appsettings.json diff --git a/src/MetaPackages/test/TestSites/DependencyInjectionApp/DependencyInjectionApp.csproj b/src/DefaultBuilder/testassets/DependencyInjectionApp/DependencyInjectionApp.csproj similarity index 55% rename from src/MetaPackages/test/TestSites/DependencyInjectionApp/DependencyInjectionApp.csproj rename to src/DefaultBuilder/testassets/DependencyInjectionApp/DependencyInjectionApp.csproj index 7930c4a822..9a225f9d5f 100644 --- a/src/MetaPackages/test/TestSites/DependencyInjectionApp/DependencyInjectionApp.csproj +++ b/src/DefaultBuilder/testassets/DependencyInjectionApp/DependencyInjectionApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -6,7 +6,7 @@ - + diff --git a/src/MetaPackages/test/TestSites/DependencyInjectionApp/Program.cs b/src/DefaultBuilder/testassets/DependencyInjectionApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/DependencyInjectionApp/Program.cs rename to src/DefaultBuilder/testassets/DependencyInjectionApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/StartRequestDelegateUrlApp/Program.cs b/src/DefaultBuilder/testassets/StartRequestDelegateUrlApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/StartRequestDelegateUrlApp/Program.cs rename to src/DefaultBuilder/testassets/StartRequestDelegateUrlApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj b/src/DefaultBuilder/testassets/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj similarity index 55% rename from src/MetaPackages/test/TestSites/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj rename to src/DefaultBuilder/testassets/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj index 7930c4a822..9a225f9d5f 100644 --- a/src/MetaPackages/test/TestSites/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj +++ b/src/DefaultBuilder/testassets/StartRequestDelegateUrlApp/StartRequestDelegateUrlApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -6,7 +6,7 @@ - + diff --git a/src/MetaPackages/test/TestSites/StartRouteBuilderUrlApp/Program.cs b/src/DefaultBuilder/testassets/StartRouteBuilderUrlApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/StartRouteBuilderUrlApp/Program.cs rename to src/DefaultBuilder/testassets/StartRouteBuilderUrlApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj b/src/DefaultBuilder/testassets/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj similarity index 55% rename from src/MetaPackages/test/TestSites/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj rename to src/DefaultBuilder/testassets/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj index 7930c4a822..9a225f9d5f 100644 --- a/src/MetaPackages/test/TestSites/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj +++ b/src/DefaultBuilder/testassets/StartRouteBuilderUrlApp/StartRouteBuilderUrlApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -6,7 +6,7 @@ - + diff --git a/src/MetaPackages/test/TestSites/StartWithIApplicationBuilderUrlApp/Program.cs b/src/DefaultBuilder/testassets/StartWithIApplicationBuilderUrlApp/Program.cs similarity index 100% rename from src/MetaPackages/test/TestSites/StartWithIApplicationBuilderUrlApp/Program.cs rename to src/DefaultBuilder/testassets/StartWithIApplicationBuilderUrlApp/Program.cs diff --git a/src/MetaPackages/test/TestSites/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj b/src/DefaultBuilder/testassets/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj similarity index 55% rename from src/MetaPackages/test/TestSites/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj rename to src/DefaultBuilder/testassets/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj index 7930c4a822..9a225f9d5f 100644 --- a/src/MetaPackages/test/TestSites/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj +++ b/src/DefaultBuilder/testassets/StartWithIApplicationBuilderUrlApp/StartWithIApplicationBuilderUrlApp.csproj @@ -1,4 +1,4 @@ - + Exe @@ -6,7 +6,7 @@ - + diff --git a/src/MetaPackages/.gitignore b/src/MetaPackages/.gitignore deleted file mode 100644 index 3af0091ea3..0000000000 --- a/src/MetaPackages/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -[Oo]bj/ -[Bb]in/ -TestResults/ -.nuget/ -_ReSharper.*/ -packages/ -artifacts/ -PublishProfiles/ -*.user -*.suo -*.cache -*.docstates -_ReSharper.* -nuget.exe -*net45.csproj -*net451.csproj -*k10.csproj -*.psess -*.vsp -*.pidb -*.userprefs -*DS_Store -*.ncrunchsolution -*.*sdf -*.ipch -*.sln.ide -project.lock.json -.vs -.vscode/ -.build/ -.testPublish/ -global.json - -# Dependencies from pre-requisite builds -.deps/ -.rw/ -.ro/ diff --git a/src/MetaPackages/Directory.Build.props b/src/MetaPackages/Directory.Build.props deleted file mode 100644 index 9ed621177a..0000000000 --- a/src/MetaPackages/Directory.Build.props +++ /dev/null @@ -1,21 +0,0 @@ - - - - - - - - - Microsoft ASP.NET Core - https://github.com/aspnet/AspnetCore - git - $(MSBuildThisFileDirectory) - false - $(MSBuildThisFileDirectory)..\..\eng\AspNetCore.snk - true - true - true - - diff --git a/src/MetaPackages/Directory.Build.targets b/src/MetaPackages/Directory.Build.targets deleted file mode 100644 index 53b3f6e1da..0000000000 --- a/src/MetaPackages/Directory.Build.targets +++ /dev/null @@ -1,7 +0,0 @@ - - - $(MicrosoftNETCoreApp20PackageVersion) - $(MicrosoftNETCoreApp21PackageVersion) - $(NETStandardLibrary20PackageVersion) - - diff --git a/src/MetaPackages/MetaPackages.sln b/src/MetaPackages/MetaPackages.sln deleted file mode 100644 index 659427dfcb..0000000000 --- a/src/MetaPackages/MetaPackages.sln +++ /dev/null @@ -1,116 +0,0 @@ -Microsoft Visual Studio Solution File, Format Version 12.00 -# Visual Studio 15 -VisualStudioVersion = 15.0.27005.2 -MinimumVisualStudioVersion = 15.0.26730.03 -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "src", "src", "{ED834E68-51C3-4ADE-ACC8-6BA6D4207C09}" - ProjectSection(SolutionItems) = preProject - src\Directory.Build.props = src\Directory.Build.props - EndProjectSection -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore", "src\Microsoft.AspNetCore\Microsoft.AspNetCore.csproj", "{6F3D43F7-9546-4B41-AF04-CF4708B62051}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Solution Items", "Solution Items", "{97D53BEB-A511-4FBE-B784-AB407D9A219F}" - ProjectSection(SolutionItems) = preProject - Directory.Build.props = Directory.Build.props - Directory.Build.targets = Directory.Build.targets - NuGet.config = NuGet.config - version.xml = version.xml - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{F92CB7A1-C38E-408C-A7EC-A5C040D041E1}" - ProjectSection(SolutionItems) = preProject - build\dependencies.props = build\dependencies.props - build\repo.targets = build\repo.targets - EndProjectSection -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "samples", "samples", "{192F583C-C4CA-43E5-B31C-D21B7806E274}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "SampleApp", "samples\SampleApp\SampleApp.csproj", "{AF5BB04E-92F7-4737-8B98-F86F6244FAB2}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "test", "test", "{9E49B5B9-9E72-42FB-B684-90CA1B1BCF9C}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.FunctionalTests", "test\Microsoft.AspNetCore.FunctionalTests\Microsoft.AspNetCore.FunctionalTests.csproj", "{C72A756A-D29D-44C7-83D4-821DBE82DBCA}" -EndProject -Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "TestSites", "TestSites", "{EC22261D-0DE1-47DE-8F7C-072675D6F5B4}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartRouteBuilderUrlApp", "test\TestSites\StartRouteBuilderUrlApp\StartRouteBuilderUrlApp.csproj", "{AB42054B-1801-4FEE-B5C3-8529C6D7BFDA}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartWithIApplicationBuilderUrlApp", "test\TestSites\StartWithIApplicationBuilderUrlApp\StartWithIApplicationBuilderUrlApp.csproj", "{3A85FA52-F601-422E-A42E-9F187DB28492}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "StartRequestDelegateUrlApp", "test\TestSites\StartRequestDelegateUrlApp\StartRequestDelegateUrlApp.csproj", "{401C741B-6C7C-4E08-9F09-C3D43D22C0DE}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CreateDefaultBuilderApp", "test\TestSites\CreateDefaultBuilderApp\CreateDefaultBuilderApp.csproj", "{79CF58CE-B020-45D8-BDB5-2D8036BEAD14}" -EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "DependencyInjectionApp", "test\TestSites\DependencyInjectionApp\DependencyInjectionApp.csproj", "{65FE2E38-4529-4C93-A7B0-CF12DD7A70C3}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "CreateDefaultBuilderOfTApp", "test\TestSites\CreateDefaultBuilderOfTApp\CreateDefaultBuilderOfTApp.csproj", "{A922B5AC-836B-44F4-83F1-3CB9EB08A3F8}" -EndProject -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.Tests", "test\Microsoft.AspNetCore.Tests\Microsoft.AspNetCore.Tests.csproj", "{BD08F027-3BB9-427B-9367-19534B7376B3}" -EndProject -Global - GlobalSection(SolutionConfigurationPlatforms) = preSolution - Debug|Any CPU = Debug|Any CPU - Release|Any CPU = Release|Any CPU - EndGlobalSection - GlobalSection(ProjectConfigurationPlatforms) = postSolution - {6F3D43F7-9546-4B41-AF04-CF4708B62051}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {6F3D43F7-9546-4B41-AF04-CF4708B62051}.Debug|Any CPU.Build.0 = Debug|Any CPU - {6F3D43F7-9546-4B41-AF04-CF4708B62051}.Release|Any CPU.ActiveCfg = Release|Any CPU - {6F3D43F7-9546-4B41-AF04-CF4708B62051}.Release|Any CPU.Build.0 = Release|Any CPU - {AF5BB04E-92F7-4737-8B98-F86F6244FAB2}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AF5BB04E-92F7-4737-8B98-F86F6244FAB2}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AF5BB04E-92F7-4737-8B98-F86F6244FAB2}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AF5BB04E-92F7-4737-8B98-F86F6244FAB2}.Release|Any CPU.Build.0 = Release|Any CPU - {C72A756A-D29D-44C7-83D4-821DBE82DBCA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {C72A756A-D29D-44C7-83D4-821DBE82DBCA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {C72A756A-D29D-44C7-83D4-821DBE82DBCA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {C72A756A-D29D-44C7-83D4-821DBE82DBCA}.Release|Any CPU.Build.0 = Release|Any CPU - {AB42054B-1801-4FEE-B5C3-8529C6D7BFDA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {AB42054B-1801-4FEE-B5C3-8529C6D7BFDA}.Debug|Any CPU.Build.0 = Debug|Any CPU - {AB42054B-1801-4FEE-B5C3-8529C6D7BFDA}.Release|Any CPU.ActiveCfg = Release|Any CPU - {AB42054B-1801-4FEE-B5C3-8529C6D7BFDA}.Release|Any CPU.Build.0 = Release|Any CPU - {3A85FA52-F601-422E-A42E-9F187DB28492}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3A85FA52-F601-422E-A42E-9F187DB28492}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3A85FA52-F601-422E-A42E-9F187DB28492}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3A85FA52-F601-422E-A42E-9F187DB28492}.Release|Any CPU.Build.0 = Release|Any CPU - {401C741B-6C7C-4E08-9F09-C3D43D22C0DE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {401C741B-6C7C-4E08-9F09-C3D43D22C0DE}.Debug|Any CPU.Build.0 = Debug|Any CPU - {401C741B-6C7C-4E08-9F09-C3D43D22C0DE}.Release|Any CPU.ActiveCfg = Release|Any CPU - {401C741B-6C7C-4E08-9F09-C3D43D22C0DE}.Release|Any CPU.Build.0 = Release|Any CPU - {79CF58CE-B020-45D8-BDB5-2D8036BEAD14}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {79CF58CE-B020-45D8-BDB5-2D8036BEAD14}.Debug|Any CPU.Build.0 = Debug|Any CPU - {79CF58CE-B020-45D8-BDB5-2D8036BEAD14}.Release|Any CPU.ActiveCfg = Release|Any CPU - {79CF58CE-B020-45D8-BDB5-2D8036BEAD14}.Release|Any CPU.Build.0 = Release|Any CPU - {65FE2E38-4529-4C93-A7B0-CF12DD7A70C3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {65FE2E38-4529-4C93-A7B0-CF12DD7A70C3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {65FE2E38-4529-4C93-A7B0-CF12DD7A70C3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {65FE2E38-4529-4C93-A7B0-CF12DD7A70C3}.Release|Any CPU.Build.0 = Release|Any CPU - {A922B5AC-836B-44F4-83F1-3CB9EB08A3F8}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {A922B5AC-836B-44F4-83F1-3CB9EB08A3F8}.Debug|Any CPU.Build.0 = Debug|Any CPU - {A922B5AC-836B-44F4-83F1-3CB9EB08A3F8}.Release|Any CPU.ActiveCfg = Release|Any CPU - {A922B5AC-836B-44F4-83F1-3CB9EB08A3F8}.Release|Any CPU.Build.0 = Release|Any CPU - {BD08F027-3BB9-427B-9367-19534B7376B3}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {BD08F027-3BB9-427B-9367-19534B7376B3}.Debug|Any CPU.Build.0 = Debug|Any CPU - {BD08F027-3BB9-427B-9367-19534B7376B3}.Release|Any CPU.ActiveCfg = Release|Any CPU - {BD08F027-3BB9-427B-9367-19534B7376B3}.Release|Any CPU.Build.0 = Release|Any CPU - EndGlobalSection - GlobalSection(SolutionProperties) = preSolution - HideSolutionNode = FALSE - EndGlobalSection - GlobalSection(NestedProjects) = preSolution - {6F3D43F7-9546-4B41-AF04-CF4708B62051} = {ED834E68-51C3-4ADE-ACC8-6BA6D4207C09} - {AF5BB04E-92F7-4737-8B98-F86F6244FAB2} = {192F583C-C4CA-43E5-B31C-D21B7806E274} - {C72A756A-D29D-44C7-83D4-821DBE82DBCA} = {9E49B5B9-9E72-42FB-B684-90CA1B1BCF9C} - {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} = {9E49B5B9-9E72-42FB-B684-90CA1B1BCF9C} - {AB42054B-1801-4FEE-B5C3-8529C6D7BFDA} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {3A85FA52-F601-422E-A42E-9F187DB28492} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {401C741B-6C7C-4E08-9F09-C3D43D22C0DE} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {79CF58CE-B020-45D8-BDB5-2D8036BEAD14} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {65FE2E38-4529-4C93-A7B0-CF12DD7A70C3} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {A922B5AC-836B-44F4-83F1-3CB9EB08A3F8} = {EC22261D-0DE1-47DE-8F7C-072675D6F5B4} - {BD08F027-3BB9-427B-9367-19534B7376B3} = {9E49B5B9-9E72-42FB-B684-90CA1B1BCF9C} - EndGlobalSection - GlobalSection(ExtensibilityGlobals) = postSolution - SolutionGuid = {A666E9B0-125B-4975-B35B-09A6D68A5047} - EndGlobalSection -EndGlobal diff --git a/src/MetaPackages/NuGetPackageVerifier.json b/src/MetaPackages/NuGetPackageVerifier.json deleted file mode 100644 index b153ab1515..0000000000 --- a/src/MetaPackages/NuGetPackageVerifier.json +++ /dev/null @@ -1,7 +0,0 @@ -{ - "Default": { - "rules": [ - "DefaultCompositeRule" - ] - } -} \ No newline at end of file diff --git a/src/MetaPackages/README.md b/src/MetaPackages/README.md deleted file mode 100644 index d35e5f0866..0000000000 --- a/src/MetaPackages/README.md +++ /dev/null @@ -1,7 +0,0 @@ -Meta packages -======== - -This repo contains NuGet meta packages that help quickly reference sets of common packages. - -This project is part of ASP.NET Core. You can find samples, documentation and getting started instructions for ASP.NET Core at the [Home](https://github.com/aspnet/home) repo. - diff --git a/src/MetaPackages/build/dependencies.props b/src/MetaPackages/build/dependencies.props deleted file mode 100644 index bca0b5e999..0000000000 --- a/src/MetaPackages/build/dependencies.props +++ /dev/null @@ -1,41 +0,0 @@ - - - $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - - - - 2.1.3-rtm-15802 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 0.5.1 - 2.1.2 - 2.1.2 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.0.0 - 2.1.2 - 15.6.1 - 4.7.49 - 2.0.3 - 2.3.1 - 2.4.0-beta.1.build3945 - - - - - - - - diff --git a/src/MetaPackages/build/repo.props b/src/MetaPackages/build/repo.props deleted file mode 100644 index 1dc8b8100d..0000000000 --- a/src/MetaPackages/build/repo.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - - diff --git a/src/MetaPackages/build/sources.props b/src/MetaPackages/build/sources.props deleted file mode 100644 index 9215df9751..0000000000 --- a/src/MetaPackages/build/sources.props +++ /dev/null @@ -1,17 +0,0 @@ - - - - - $(DotNetRestoreSources) - - $(RestoreSources); - https://dotnet.myget.org/F/dotnet-core/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-dev/api/v3/index.json; - https://dotnet.myget.org/F/aspnetcore-tools/api/v3/index.json; - - - $(RestoreSources); - https://api.nuget.org/v3/index.json; - - - diff --git a/src/MetaPackages/samples/SampleApp/Properties/launchSettings.json b/src/MetaPackages/samples/SampleApp/Properties/launchSettings.json deleted file mode 100644 index f0370cf22b..0000000000 --- a/src/MetaPackages/samples/SampleApp/Properties/launchSettings.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:53432/", - "sslPort": 0 - } - }, - "profiles": { - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } - }, - "SampleApp": { - "commandName": "Project", - "launchBrowser": true, - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - }, - "applicationUrl": "http://localhost:53433" - } - } -} diff --git a/src/MetaPackages/src/Directory.Build.props b/src/MetaPackages/src/Directory.Build.props deleted file mode 100644 index 410f24daa9..0000000000 --- a/src/MetaPackages/src/Directory.Build.props +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/src/MetaPackages/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj b/src/MetaPackages/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj deleted file mode 100644 index e52a4f74ed..0000000000 --- a/src/MetaPackages/src/Microsoft.AspNetCore/Microsoft.AspNetCore.csproj +++ /dev/null @@ -1,30 +0,0 @@ - - - - netstandard2.0 - aspnetcore - Microsoft.AspNetCore - true - false - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/MetaPackages/test/Directory.Build.props b/src/MetaPackages/test/Directory.Build.props deleted file mode 100644 index 2a4205c758..0000000000 --- a/src/MetaPackages/test/Directory.Build.props +++ /dev/null @@ -1,14 +0,0 @@ - - - - - netcoreapp2.1 - $(DeveloperBuildTestTfms) - netcoreapp2.1;netcoreapp2.0 - $(StandardTestTfms);net461 - - - - - - diff --git a/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj b/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj deleted file mode 100644 index d4a5bbdf12..0000000000 --- a/src/MetaPackages/test/Microsoft.AspNetCore.FunctionalTests/Microsoft.AspNetCore.FunctionalTests.csproj +++ /dev/null @@ -1,28 +0,0 @@ - - - - $(StandardTestTfms) - - - true - - - - - - - - - - - - - - - - - - diff --git a/src/MetaPackages/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj b/src/MetaPackages/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj deleted file mode 100644 index 1b8156a1ca..0000000000 --- a/src/MetaPackages/test/Microsoft.AspNetCore.Tests/Microsoft.AspNetCore.Tests.csproj +++ /dev/null @@ -1,18 +0,0 @@ - - - - $(StandardTestTfms) - - - - - - - - - - - - - - diff --git a/src/MetaPackages/version.props b/src/MetaPackages/version.props deleted file mode 100644 index c5a1f7a6cf..0000000000 --- a/src/MetaPackages/version.props +++ /dev/null @@ -1,12 +0,0 @@ - - - 2.1.7 - servicing - $(VersionPrefix) - $(VersionPrefix)-$(VersionSuffix)-final - t000 - a- - $(FeatureBranchVersionPrefix)$(VersionSuffix)-$([System.Text.RegularExpressions.Regex]::Replace('$(FeatureBranchVersionSuffix)', '[^\w-]', '-')) - $(VersionSuffix)-$(BuildNumber) - - From 96ea32666448a054f70305b8b6cf1a7cd4821c5e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 13 Dec 2018 14:35:02 -0800 Subject: [PATCH 04/10] Document custom reference resolution (#4806) --- build/repo.targets | 6 +++- docs/README.md | 5 ++++ docs/ReferenceResolution.md | 34 +++++++++++++++++++++++ eng/Baseline.xml | 6 ++++ eng/Dependencies.props | 28 +++++++++++-------- eng/PatchConfig.props | 10 +++++++ eng/ProjectReferences.props | 6 +++- eng/Versions.props | 8 ++++++ eng/targets/CSharp.Common.props | 9 ++++++ eng/targets/ResolveReferences.targets | 40 ++++++++++++++++++++++++--- 10 files changed, 135 insertions(+), 17 deletions(-) create mode 100644 docs/README.md create mode 100644 docs/ReferenceResolution.md create mode 100644 eng/Versions.props diff --git a/build/repo.targets b/build/repo.targets index 1bb8d78971..59785014b5 100644 --- a/build/repo.targets +++ b/build/repo.targets @@ -60,7 +60,11 @@ $(MSBuildThisFileDirectory)..\eng\ProjectReferences.props + @(_ProjectReferenceProvider->'', '%0A ') diff --git a/docs/README.md b/docs/README.md new file mode 100644 index 0000000000..98fe46e403 --- /dev/null +++ b/docs/README.md @@ -0,0 +1,5 @@ +Contributor documentation +========================= + +The primary audience for documentation in this folder is contributors to ASP.NET Core. +If you are looking for documentation on to *use* ASP.NET Core, go to . diff --git a/docs/ReferenceResolution.md b/docs/ReferenceResolution.md new file mode 100644 index 0000000000..e0c3dbf6f4 --- /dev/null +++ b/docs/ReferenceResolution.md @@ -0,0 +1,34 @@ +`` resolution +======================== + +Most project files in this repo should use `` instead of `` or ``. +This was done to enable ASP.NET Core's unique requirements without requiring most ASP.NET Core contributors +to understand the complex rules for how versions and references should work. The build system will resolve +Reference items to the correct type and version of references based on our servicing and update rules. + +See [ResolveReferences.targets](/eng/targets/ResolveReferences.targets) for the exact implementation of custom +`` resolutions. + +The requirements that led to this system are: + +* Versions of external dependencies should be consistent. +* Servicing updates of ASP.NET Core should minimize the number of assemblies which need to re-build and re-ship. +* Newer versions of packages should not have lower dependency versions than previous releases. +* Minimize the cascading effect of servicing updates where possible by keeping a consistent baseline of dependencies. + +## Recommendations for writing a .csproj + +* Use `` +* Do not use `` +* Only use `` in test projects +* Name the .csproj file to match the assembly name. +* Run `build.cmd /t:GenerateProjectList` when adding new projects +* Use [eng/tools/BaseLineGenerator/](/eng/tools/BaselineGenerator/README.md) if you need to update baselines. + +## Important files + +* [eng/Baseline.xml](/eng/Baseline.xml) - this contains the 'baseline' of the latest servicing release for this branch. It should be modified and used to update the generated file, Baseline.Designer.props. +* [eng/Dependencies.props](/eng/Dependencies.props) - contains a list of all package references that might be used in the repo. +* [eng/PatchConfig.props](/eng/PatchConfig.props) - lists which assemblies or packages are patching in the current build. +* [eng/ProjectReferences.props](/eng/ProjectReferences.props) - lists which assemblies or packages might be available to be referenced as a local project +* [eng/Versions.props](/eng/Versions.props) - contains a list of versions which may be updated by automation. diff --git a/eng/Baseline.xml b/eng/Baseline.xml index 070816457b..e27da11e3a 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -1,3 +1,9 @@ + diff --git a/eng/Dependencies.props b/eng/Dependencies.props index b7b342f0e7..7b1eba3c54 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -1,14 +1,29 @@ - + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) + + + + + + + + + - @@ -82,13 +97,4 @@ - - - - - - - - - diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index 91e93a17fe..2fd81f182e 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -1,3 +1,13 @@ + $(MSBuildAllProjects);$(MSBuildThisFileFullPath) diff --git a/eng/ProjectReferences.props b/eng/ProjectReferences.props index ea6ac86aac..2b71425adf 100644 --- a/eng/ProjectReferences.props +++ b/eng/ProjectReferences.props @@ -1,4 +1,8 @@ - + diff --git a/eng/Versions.props b/eng/Versions.props new file mode 100644 index 0000000000..8adc6dcbbd --- /dev/null +++ b/eng/Versions.props @@ -0,0 +1,8 @@ + + diff --git a/eng/targets/CSharp.Common.props b/eng/targets/CSharp.Common.props index b3fc97e2d9..6769d7508f 100644 --- a/eng/targets/CSharp.Common.props +++ b/eng/targets/CSharp.Common.props @@ -11,4 +11,13 @@ + + + + + + + + + diff --git a/eng/targets/ResolveReferences.targets b/eng/targets/ResolveReferences.targets index 7ff54b7d33..3c55bf6f8f 100644 --- a/eng/targets/ResolveReferences.targets +++ b/eng/targets/ResolveReferences.targets @@ -1,3 +1,21 @@ + @@ -31,16 +49,22 @@ + <_ImplicitPackageReference Include="@(PackageReference->WithMetadataValue('IsImplicitlyDefined', 'true'))" /> + <_ExplicitPackageReference Include="@(PackageReference)" Exclude="@(_ImplicitPackageReference)" /> + <_ExplicitPackageReference Remove="Internal.AspNetCore.Sdk" /> - + <_UnusedProjectReferenceProvider Include="@(ProjectReferenceProvider)" Exclude="@(Reference)" /> - + <_ProjectReferenceByAssemblyName Condition="'$(UseProjectReferences)' == 'true'" Include="@(ProjectReferenceProvider)" - Exclude="@(UnusedProjectReferenceProvider)" /> + Exclude="@(_UnusedProjectReferenceProvider)" /> @@ -51,12 +75,18 @@ + <_ReferenceTemp Remove="@(_ReferenceTemp)" /> + + @@ -117,6 +148,7 @@ Text="Could not resolve this reference. Could not locate the package or project for "%(Reference.Identity)"" /> + <_TargetFramework Remove="@(_TargetFramework)" /> From f0990ec53171b9ab76ad1e7ae0cf45ab173ead69 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 13 Dec 2018 22:21:38 -0800 Subject: [PATCH 05/10] Fix build issues with IIS integration projects Changes: * Ensure IIS managed and pkg projects build after the native projects * Update projects to build test * Update CI checks to build on macOS and Linux * Use package baselines to manage ANCM packages --- .azure/pipelines/ci.yml | 62 +-- .azure/pipelines/jobs/iisintegration-job.yml | 6 +- .gitmodules | 4 +- Directory.Build.props | 1 + build/CodeSign.props | 6 + build/artifacts.props | 2 - build/dependencies.props | 1 + build/external-dependencies.props | 1 + build/repo.props | 6 + eng/Baseline.Designer.props | 24 ++ eng/Baseline.xml | 4 +- eng/Dependencies.props | 12 +- eng/PatchConfig.props | 2 + eng/dependencies.temp.props | 8 - .../BaselineGenerator.csproj | 2 +- eng/tools/BaselineGenerator/Program.cs | 21 +- .../test/FunctionalTests/package-lock.json | 41 +- src/Mvc/global.json | 8 - src/Servers/IIS/Directory.Build.props | 10 + src/Servers/IIS/Directory.Build.targets | 5 + src/Servers/IIS/IISIntegration.NoV1.sln | 1 - src/Servers/IIS/ResolveIisReferences.targets | 90 ++++ src/Servers/IIS/build/assets.props | 384 +++++++++--------- .../IIS/build/functional-test-assets.targets | 10 - src/Servers/IIS/build/launchSettings.json | 42 ++ src/Servers/IIS/build/testsite.props | 16 +- .../IIS/samples/IISSample/IISSample.csproj | 3 - .../NativeIISSample/NativeIISSample.csproj | 6 +- .../Directory.Build.targets | 4 +- ...rosoft.AspNetCore.AspNetCoreModule.pkgproj | 11 +- .../{lib/netcoreapp2.2 => }/_._ | 0 .../Directory.Build.targets | 4 +- ...soft.AspNetCore.AspNetCoreModuleV2.pkgproj | 15 +- .../{lib/netcoreapp2.2 => }/_._ | 0 .../Microsoft.AspNetCore.Server.IIS.csproj | 80 +--- ...ft.AspNetCore.Server.IISIntegration.csproj | 32 +- .../NativeMethods.cs | 1 - ...tCore.Server.IntegrationTesting.IIS.csproj | 17 +- .../CommonLibTests/CommonLibTests.vcxproj | 10 +- ...kwardsCompatibility.FunctionalTests.csproj | 14 +- ...rwardsCompatibility.FunctionalTests.csproj | 4 +- .../IIS.FunctionalTests.csproj | 10 +- .../IIS/test/IIS.Tests/IIS.Tests.csproj | 11 +- .../IISExpress.FunctionalTests.csproj | 4 +- src/Servers/IIS/test/gtest/gtest.vcxproj | 14 +- .../InProcessWebSite.csproj | 1 + .../InProcessWebSite/InProcessWebSite.csproj | 11 +- .../OutOfProcessWebSite.csproj | 6 +- .../testassets/OutOfProcessWebSite/Program.cs | 45 ++ .../testassets/OutOfProcessWebSite/Startup.cs | 2 + .../testassets/StressTestWebSite/Program.cs | 26 ++ src/Servers/IIS/version.props | 17 - src/submodules/googletest | 1 + 53 files changed, 643 insertions(+), 475 deletions(-) delete mode 100644 eng/dependencies.temp.props delete mode 100644 src/Mvc/global.json create mode 100644 src/Servers/IIS/Directory.Build.props create mode 100644 src/Servers/IIS/Directory.Build.targets create mode 100644 src/Servers/IIS/ResolveIisReferences.targets delete mode 100644 src/Servers/IIS/build/functional-test-assets.targets create mode 100644 src/Servers/IIS/build/launchSettings.json rename src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/{lib/netcoreapp2.2 => }/_._ (100%) rename src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/{lib/netcoreapp2.2 => }/_._ (100%) create mode 100644 src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs create mode 100644 src/Servers/IIS/test/testassets/StressTestWebSite/Program.cs delete mode 100644 src/Servers/IIS/version.props create mode 160000 src/submodules/googletest diff --git a/.azure/pipelines/ci.yml b/.azure/pipelines/ci.yml index fff712994e..1216abe4e6 100644 --- a/.azure/pipelines/ci.yml +++ b/.azure/pipelines/ci.yml @@ -16,32 +16,42 @@ jobs: beforeBuild: - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1" displayName: Setup IISExpress test certificates and schema -- template: jobs/iisintegration-job.yml +- template: jobs/default-build.yml parameters: - TestGroupName: IIS - SkipIISTests: false - SkipIISExpressTests: true - SkipIISForwardsCompatibilityTests: true - SkipIISBackwardsCompatibilityTests: true -- template: jobs/iisintegration-job.yml + jobName: MacOs_Build + jobDisplayName: "Build and test: macOS" + agentOs: macOs +- template: jobs/default-build.yml parameters: - TestGroupName: IISExpress - SkipIISTests: true - SkipIISExpressTests: false - SkipIISForwardsCompatibilityTests: true - SkipIISBackwardsCompatibilityTests: true -- template: jobs/iisintegration-job.yml - parameters: - TestGroupName: IISForwardCompat - SkipIISTests: true - SkipIISExpressTests: true - SkipIISForwardsCompatibilityTests: false - SkipIISBackwardsCompatibilityTests: true -- template: jobs/iisintegration-job.yml - parameters: - TestGroupName: IISBackCompat - SkipIISTests: true - SkipIISExpressTests: true - SkipIISForwardsCompatibilityTests: true - SkipIISBackwardsCompatibilityTests: false + jobName: Linux_Build + jobDisplayName: "Build and test: Linux" + agentOs: Linux +# - template: jobs/iisintegration-job.yml +# parameters: +# TestGroupName: IIS +# SkipIISTests: false +# SkipIISExpressTests: true +# SkipIISForwardsCompatibilityTests: true +# SkipIISBackwardsCompatibilityTests: true +# - template: jobs/iisintegration-job.yml +# parameters: +# TestGroupName: IISExpress +# SkipIISTests: true +# SkipIISExpressTests: false +# SkipIISForwardsCompatibilityTests: true +# SkipIISBackwardsCompatibilityTests: true +# - template: jobs/iisintegration-job.yml +# parameters: +# TestGroupName: IISForwardCompat +# SkipIISTests: true +# SkipIISExpressTests: true +# SkipIISForwardsCompatibilityTests: false +# SkipIISBackwardsCompatibilityTests: true +# - template: jobs/iisintegration-job.yml +# parameters: +# TestGroupName: IISBackCompat +# SkipIISTests: true +# SkipIISExpressTests: true +# SkipIISForwardsCompatibilityTests: true +# SkipIISBackwardsCompatibilityTests: false diff --git a/.azure/pipelines/jobs/iisintegration-job.yml b/.azure/pipelines/jobs/iisintegration-job.yml index 7d43e744f3..af3006a5b9 100644 --- a/.azure/pipelines/jobs/iisintegration-job.yml +++ b/.azure/pipelines/jobs/iisintegration-job.yml @@ -2,10 +2,10 @@ jobs: - template: default-build.yml parameters: beforeBuild: - - powershell: "& ./src/servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/servers/IIS/tools/update_schema.ps1; & ./src/servers/IIS/tools/SetupTestEnvironment.ps1 Setup" + - powershell: "& ./src/Servers/IIS/tools/UpdateIISExpressCertificate.ps1; & ./src/Servers/IIS/tools/update_schema.ps1; & ./src/Servers/IIS/tools/SetupTestEnvironment.ps1 Setup" displayName: Prepare repo afterBuild: - - powershell: "& ./src/servers/IIS/tools/SetupTestEnvironment.ps1 Shutdown" + - powershell: "& ./src/Servers/IIS/tools/SetupTestEnvironment.ps1 Shutdown" displayName: Stop AppVerifier condition: always() - task: PublishBuildArtifacts@1 @@ -15,7 +15,7 @@ jobs: artifactName: logs artifactType: Container pathtoPublish: src/IISIntegration/artifacts/logs - buildDirectory: src/servers/IIS + buildDirectory: src/Servers/IIS buildArgs: "/p:SkipIISBackwardsCompatibilityTests=${{ parameters.SkipIISBackwardsCompatibilityTests }} /p:SkipIISTests=${{ parameters.SkipIISTests }} /p:SkipIISExpressTests=${{ parameters.SkipIISExpressTests }} /p:SkipIISForwardsCompatibilityTests=${{ parameters.SkipIISBackwardsCompatibilityTests }}" jobName: IISIntegration_${{ parameters.TestGroupName }} jobDisplayName: IISIntegration_${{ parameters.TestGroupName }} diff --git a/.gitmodules b/.gitmodules index 7491ba8bcd..7f40f37aa7 100644 --- a/.gitmodules +++ b/.gitmodules @@ -6,6 +6,6 @@ path = modules/Scaffolding url = https://github.com/aspnet/Scaffolding.git branch = release/2.2 -[submodule "src/IISIntegration/test/gtest/googletest"] - path = src/IISIntegration/test/gtest/googletest +[submodule "googletest"] + path = src/submodules/googletest url = https://github.com/google/googletest diff --git a/Directory.Build.props b/Directory.Build.props index b6f859c19e..a6bd4a8657 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -85,6 +85,7 @@ true $(MSBuildThisFileDirectory)src\Shared\ + $(RepositoryRoot)src\submodules\googletest\ true diff --git a/build/CodeSign.props b/build/CodeSign.props index 4b3dbe6103..5b48abcb11 100644 --- a/build/CodeSign.props +++ b/build/CodeSign.props @@ -65,6 +65,12 @@ + + + + + + diff --git a/build/artifacts.props b/build/artifacts.props index 14ebbfd29c..baae9b0890 100644 --- a/build/artifacts.props +++ b/build/artifacts.props @@ -126,8 +126,6 @@ - - diff --git a/build/dependencies.props b/build/dependencies.props index 7ae5853c6c..0f81352533 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -108,6 +108,7 @@ 2.2.0 2.2.0 0.6.0-rtm-final + 2.2.0-rtm-35687 0.9.9 diff --git a/build/external-dependencies.props b/build/external-dependencies.props index 6a2f89ce7c..04c60ff7a3 100644 --- a/build/external-dependencies.props +++ b/build/external-dependencies.props @@ -82,6 +82,7 @@ + diff --git a/build/repo.props b/build/repo.props index 964b440da0..e96da8c9f4 100644 --- a/build/repo.props +++ b/build/repo.props @@ -71,6 +71,12 @@ + + + Platform=x64 + Platform=x86 + + + 2.2.0 + + + + 2.2.0 + + + + 2.2.0 + + + + 2.2.0 + + + + 2.2.0 + + + + 2.2.0 + 2.2.0 diff --git a/eng/Baseline.xml b/eng/Baseline.xml index ba526a19e6..cce6ce895c 100644 --- a/eng/Baseline.xml +++ b/eng/Baseline.xml @@ -3,6 +3,8 @@ + + @@ -47,7 +49,7 @@ - + diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 56e79bbe40..789d0e20f3 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -5,8 +5,6 @@ $(MSBuildAllProjects);$(MSBuildThisFileFullPath) - - @@ -51,22 +49,22 @@ - + + - + + - - - + diff --git a/eng/PatchConfig.props b/eng/PatchConfig.props index dcda7bfa6e..62e4561ae5 100644 --- a/eng/PatchConfig.props +++ b/eng/PatchConfig.props @@ -5,6 +5,8 @@ + Microsoft.AspNetCore.AspNetCoreModule; + Microsoft.AspNetCore.AspNetCoreModuleV2; Microsoft.AspNetCore.Server.IIS; Microsoft.AspNetCore.Server.IISIntegration; Microsoft.AspNetCore.Server.IntegrationTesting.IIS; diff --git a/eng/dependencies.temp.props b/eng/dependencies.temp.props deleted file mode 100644 index ae186fbe66..0000000000 --- a/eng/dependencies.temp.props +++ /dev/null @@ -1,8 +0,0 @@ - - - - - diff --git a/eng/tools/BaselineGenerator/BaselineGenerator.csproj b/eng/tools/BaselineGenerator/BaselineGenerator.csproj index 8e7d5913a6..2f43472aeb 100644 --- a/eng/tools/BaselineGenerator/BaselineGenerator.csproj +++ b/eng/tools/BaselineGenerator/BaselineGenerator.csproj @@ -3,7 +3,7 @@ Exe netcoreapp2.1 - -o "$(MSBuildThisFileDirectory)../../Baseline.Designer.props" + -o "$(MSBuildThisFileDirectory)../../Baseline.Designer.props" --v3 -s https://dotnetfeed.blob.core.windows.net/dotnet-core/flatcontainer $(MSBuildThisFileDirectory)../../ diff --git a/eng/tools/BaselineGenerator/Program.cs b/eng/tools/BaselineGenerator/Program.cs index 4a6177ebec..bf9ee83687 100644 --- a/eng/tools/BaselineGenerator/Program.cs +++ b/eng/tools/BaselineGenerator/Program.cs @@ -96,20 +96,15 @@ namespace PackageBaselineGenerator using (var reader = new PackageArchiveReader(nupkgPath)) { - var first = true; + doc.Root.Add(new XComment($" Package: {id}")); + + var propertyGroup = new XElement("PropertyGroup", + new XAttribute("Condition", $" '$(PackageId)' == '{id}' "), + new XElement("BaselinePackageVersion", version)); + doc.Root.Add(propertyGroup); + foreach (var group in reader.NuspecReader.GetDependencyGroups()) { - if (first) - { - first = false; - doc.Root.Add(new XComment($" Package: {id}")); - - var propertyGroup = new XElement("PropertyGroup", - new XAttribute("Condition", $" '$(PackageId)' == '{id}' "), - new XElement("BaselinePackageVersion", version)); - doc.Root.Add(propertyGroup); - } - var itemGroup = new XElement("ItemGroup", new XAttribute("Condition", $" '$(PackageId)' == '{id}' AND '$(TargetFramework)' == '{group.TargetFramework.GetShortFolderName()}' ")); doc.Root.Add(itemGroup); @@ -131,7 +126,7 @@ namespace PackageBaselineGenerator { doc.Save(writer); } - + Console.WriteLine($"Generated file in {output}"); return 0; } } diff --git a/src/Middleware/CORS/test/FunctionalTests/package-lock.json b/src/Middleware/CORS/test/FunctionalTests/package-lock.json index 3db2468bdf..c2a6f2c7d6 100644 --- a/src/Middleware/CORS/test/FunctionalTests/package-lock.json +++ b/src/Middleware/CORS/test/FunctionalTests/package-lock.json @@ -1668,7 +1668,8 @@ "ansi-regex": { "version": "2.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "aproba": { "version": "1.2.0", @@ -1689,12 +1690,14 @@ "balanced-match": { "version": "1.0.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "brace-expansion": { "version": "1.1.11", "bundled": true, "dev": true, + "optional": true, "requires": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -1709,17 +1712,20 @@ "code-point-at": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "concat-map": { "version": "0.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "console-control-strings": { "version": "1.1.0", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "core-util-is": { "version": "1.0.2", @@ -1836,7 +1842,8 @@ "inherits": { "version": "2.0.3", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "ini": { "version": "1.3.5", @@ -1848,6 +1855,7 @@ "version": "1.0.0", "bundled": true, "dev": true, + "optional": true, "requires": { "number-is-nan": "^1.0.0" } @@ -1862,6 +1870,7 @@ "version": "3.0.4", "bundled": true, "dev": true, + "optional": true, "requires": { "brace-expansion": "^1.1.7" } @@ -1869,12 +1878,14 @@ "minimist": { "version": "0.0.8", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "minipass": { "version": "2.2.4", "bundled": true, "dev": true, + "optional": true, "requires": { "safe-buffer": "^5.1.1", "yallist": "^3.0.0" @@ -1893,6 +1904,7 @@ "version": "0.5.1", "bundled": true, "dev": true, + "optional": true, "requires": { "minimist": "0.0.8" } @@ -1973,7 +1985,8 @@ "number-is-nan": { "version": "1.0.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "object-assign": { "version": "4.1.1", @@ -1985,6 +1998,7 @@ "version": "1.4.0", "bundled": true, "dev": true, + "optional": true, "requires": { "wrappy": "1" } @@ -2070,7 +2084,8 @@ "safe-buffer": { "version": "5.1.1", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "safer-buffer": { "version": "2.1.2", @@ -2106,6 +2121,7 @@ "version": "1.0.2", "bundled": true, "dev": true, + "optional": true, "requires": { "code-point-at": "^1.0.0", "is-fullwidth-code-point": "^1.0.0", @@ -2125,6 +2141,7 @@ "version": "3.0.1", "bundled": true, "dev": true, + "optional": true, "requires": { "ansi-regex": "^2.0.0" } @@ -2168,12 +2185,14 @@ "wrappy": { "version": "1.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true }, "yallist": { "version": "3.0.2", "bundled": true, - "dev": true + "dev": true, + "optional": true } } }, diff --git a/src/Mvc/global.json b/src/Mvc/global.json deleted file mode 100644 index b5a5299b58..0000000000 --- a/src/Mvc/global.json +++ /dev/null @@ -1,8 +0,0 @@ -{ - "sdk": { - "version": "2.2.100-preview2-009404" - }, - "msbuild-sdks": { - "Internal.AspNetCore.Sdk": "2.2.0-preview2-20181003.2" - } -} diff --git a/src/Servers/IIS/Directory.Build.props b/src/Servers/IIS/Directory.Build.props new file mode 100644 index 0000000000..f4bd362993 --- /dev/null +++ b/src/Servers/IIS/Directory.Build.props @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/Servers/IIS/Directory.Build.targets b/src/Servers/IIS/Directory.Build.targets new file mode 100644 index 0000000000..d6a76c85fe --- /dev/null +++ b/src/Servers/IIS/Directory.Build.targets @@ -0,0 +1,5 @@ + + + + + diff --git a/src/Servers/IIS/IISIntegration.NoV1.sln b/src/Servers/IIS/IISIntegration.NoV1.sln index c0985af555..883c9e7bb6 100644 --- a/src/Servers/IIS/IISIntegration.NoV1.sln +++ b/src/Servers/IIS/IISIntegration.NoV1.sln @@ -38,7 +38,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "build", "build", "{7E80C58E build\applicationhost.iis.config = build\applicationhost.iis.config build\Build.Settings = build\Build.Settings build\Config.Definitions.Props = build\Config.Definitions.Props - build\functional-test-assets.targets = build\functional-test-assets.targets build\Key.snk = build\Key.snk build\launchSettings.json = build\launchSettings.json build\native.targets = build\native.targets diff --git a/src/Servers/IIS/ResolveIisReferences.targets b/src/Servers/IIS/ResolveIisReferences.targets new file mode 100644 index 0000000000..8355fc7c30 --- /dev/null +++ b/src/Servers/IIS/ResolveIisReferences.targets @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + + + + Platform=x64 + + x64\ + + false + + NativeContent + + PreserveNewest + + Build;BuiltProjectOutputGroup;DebugSymbolsProjectOutputGroup + + true + TargetFramework + + All + + true + + + + + Platform=x86 + + x86\ + + false + + NativeContent + + PreserveNewest + + Build;BuiltProjectOutputGroup;DebugSymbolsProjectOutputGroup + + true + TargetFramework + + All + + true + + + + + + + + + + + + + %(LinkBase)%(FileName)%(Extension) + + + + + + + + + diff --git a/src/Servers/IIS/build/assets.props b/src/Servers/IIS/build/assets.props index 13b30556bd..6df77ee807 100644 --- a/src/Servers/IIS/build/assets.props +++ b/src/Servers/IIS/build/assets.props @@ -9,261 +9,261 @@ - $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV1\AspNetCore\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcore.dll - $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV2\AspNetCore\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcorev2.dll - $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV2\InProcessRequestHandler\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcorev2_inprocess.dll + $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV1\AspNetCore\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcore.dll + $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV2\AspNetCore\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcorev2.dll + $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV2\InProcessRequestHandler\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcorev2_inprocess.dll $(MSBuildThisFileDirectory)..\src\AspNetCoreModuleV2\OutOfProcessRequestHandler\bin\$(Configuration)\$(NativeVCPlatform)\aspnetcorev2_outofprocess.dll diff --git a/src/Servers/IIS/build/functional-test-assets.targets b/src/Servers/IIS/build/functional-test-assets.targets deleted file mode 100644 index 81fb82b4a3..0000000000 --- a/src/Servers/IIS/build/functional-test-assets.targets +++ /dev/null @@ -1,10 +0,0 @@ - - - - - - - - - - diff --git a/src/Servers/IIS/build/launchSettings.json b/src/Servers/IIS/build/launchSettings.json new file mode 100644 index 0000000000..246b7a0b47 --- /dev/null +++ b/src/Servers/IIS/build/launchSettings.json @@ -0,0 +1,42 @@ +{ + "iisSettings": { + "windowsAuthentication": true, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:5762/", + "sslPort": 0 + } + }, + "profiles": { + "ANCM IIS Express": { + "commandName": "Executable", + "executablePath": "$(IISExpressPath)", + "commandLineArgs": "$(IISExpressArguments)", + "environmentVariables": { + "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", + "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)", + "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)", + "ANCM_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)", + "LAUNCHER_ARGS": "$(TargetPath)", + "ASPNETCORE_ENVIRONMENT": "Development", + "LAUNCHER_PATH": "$(DotNetPath)", + "ASPNETCORE_MODULE_DEBUG": "console" + } + }, + "ANCM IIS": { + "commandName": "Executable", + "executablePath": "$(IISPath)", + "commandLineArgs": "$(IISArguments)", + "environmentVariables": { + "IIS_SITE_PATH": "$(MSBuildThisFileDirectory)", + "ANCM_PATH": "$(AspNetCoreModuleV1ShimDll)", + "ANCMV2_PATH": "$(AspNetCoreModuleV2ShimDll)", + "ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER": "$(AspNetCoreModuleV2OutOfProcessHandlerDll)", + "LAUNCHER_ARGS": "$(TargetPath)", + "ASPNETCORE_ENVIRONMENT": "Development", + "LAUNCHER_PATH": "$(DotNetPath)", + "ASPNETCORE_MODULE_DEBUG": "console" + } + } + } +} diff --git a/src/Servers/IIS/build/testsite.props b/src/Servers/IIS/build/testsite.props index d650e87592..87998d09cf 100644 --- a/src/Servers/IIS/build/testsite.props +++ b/src/Servers/IIS/build/testsite.props @@ -54,27 +54,33 @@ $(MSBuildThisFileDirectory)..\test\testassets\TestTasks\bin\$(Configuration)\$(TargetFramework)\TestTasks - $(InjectDepsAssembly) + $(InjectDepsAssembly) "win7-$(NativePlatform)" "$(AncmInProcessRHPath)" - + $(InjectDepsAssembly).exe $(InjectDepsAssembly) - + $(InjectDepsAssembly).dll dotnet $(InjectDepsAssembly) $(InjectDepsArguments) - + - + diff --git a/src/Servers/IIS/samples/IISSample/IISSample.csproj b/src/Servers/IIS/samples/IISSample/IISSample.csproj index caa381c20d..605fa12147 100644 --- a/src/Servers/IIS/samples/IISSample/IISSample.csproj +++ b/src/Servers/IIS/samples/IISSample/IISSample.csproj @@ -6,9 +6,6 @@ - - - diff --git a/src/Servers/IIS/samples/NativeIISSample/NativeIISSample.csproj b/src/Servers/IIS/samples/NativeIISSample/NativeIISSample.csproj index 91edd87128..1ceb1e2e3b 100644 --- a/src/Servers/IIS/samples/NativeIISSample/NativeIISSample.csproj +++ b/src/Servers/IIS/samples/NativeIISSample/NativeIISSample.csproj @@ -5,17 +5,15 @@ netcoreapp2.2 true + inprocess + - - - inprocess - diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets index 21ff857b22..8a8fe2dfeb 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets @@ -20,7 +20,7 @@ - + NuGetPackage @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj index 521cb9907a..29465aecb3 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj @@ -10,6 +10,7 @@ content true ASP.NET Core Module + false @@ -19,18 +20,16 @@ + - - True - lib - + - + - \ No newline at end of file + diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/lib/netcoreapp2.2/_._ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/_._ similarity index 100% rename from src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/lib/netcoreapp2.2/_._ rename to src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/_._ diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets index 21ff857b22..8a8fe2dfeb 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets @@ -20,7 +20,7 @@ - + NuGetPackage @@ -31,4 +31,4 @@ - \ No newline at end of file + diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj index fb862184f7..617d35fe82 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj @@ -10,6 +10,7 @@ content true ASP.NET Core Module + false @@ -18,26 +19,24 @@ - - + + + - - True - lib - + - + - \ No newline at end of file + diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/lib/netcoreapp2.2/_._ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/_._ similarity index 100% rename from src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/lib/netcoreapp2.2/_._ rename to src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/_._ diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj index bf6fd7dc54..bc3c92fbb7 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj @@ -13,79 +13,27 @@ True - - - - - - - - - - - - - - - False - - - False - - - - False - - - - False - - - - False - - - False - - - - False - - - False - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + - - diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj index 5e3ef5bd6b..e2fbb5e5b4 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj @@ -12,23 +12,23 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs index 4ecb5018a2..02fc967f1a 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs @@ -3,7 +3,6 @@ using System; using System.Runtime.InteropServices; -using Microsoft.AspNetCore.HttpSys.Internal; namespace Microsoft.AspNetCore.Server.IISIntegration { diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj index e62f4afd0a..8f241ac01b 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj @@ -3,18 +3,16 @@ netstandard2.0 Microsoft.AspNetCore.Server.IntegrationTesting.IIS - - $(VersionPrefix)-$(VersionSuffix) - $(Version) Provides support for integration testing using IIS based servers. $(NoWarn);CS1591 true aspnetcore;iis True + true + true + false - - @@ -26,13 +24,4 @@ - - - - - - - - - diff --git a/src/Servers/IIS/test/CommonLibTests/CommonLibTests.vcxproj b/src/Servers/IIS/test/CommonLibTests/CommonLibTests.vcxproj index 99c7215983..3d5d6efaa4 100644 --- a/src/Servers/IIS/test/CommonLibTests/CommonLibTests.vcxproj +++ b/src/Servers/IIS/test/CommonLibTests/CommonLibTests.vcxproj @@ -93,7 +93,7 @@ EnableFastChecks MultiThreadedDebug Level3 - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" stdcpp17 @@ -120,7 +120,7 @@ EnableFastChecks MultiThreadedDebug Level3 - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" stdcpp17 @@ -145,7 +145,7 @@ MultiThreaded Level3 ProgramDatabase - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" stdcpp17 @@ -173,7 +173,7 @@ MultiThreaded Level3 ProgramDatabase - $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;..\gtest\googletest\googletest\include;..\gtest\googletest\googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ + $(MSBuildThisFileDirectory)include;%(AdditionalIncludeDirectories);..\..\src\AspNetCoreModuleV2\RequestHandlerLib;..\..\src\AspNetCoreModuleV2\IISLib;..\..\src\AspNetCoreModuleV2\CommonLib;$(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googlemock\include;...\..\src\AspNetCoreModuleV2\AspNetCore\Inc;..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\ /D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" stdcpp17 @@ -193,4 +193,4 @@ - \ No newline at end of file + diff --git a/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj index 80fb3a4f43..b86e9482c6 100644 --- a/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj @@ -8,6 +8,8 @@ + + @@ -18,18 +20,16 @@ - - + + - - - - - + + + diff --git a/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj index 451a396a8c..27208537e3 100644 --- a/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj @@ -22,9 +22,9 @@ - - + + diff --git a/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj index 3a276aa358..b6a113cb7f 100644 --- a/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj @@ -11,7 +11,6 @@ - False @@ -23,13 +22,14 @@ - - - + + - + + + diff --git a/src/Servers/IIS/test/IIS.Tests/IIS.Tests.csproj b/src/Servers/IIS/test/IIS.Tests/IIS.Tests.csproj index 330b6a77a4..e164287935 100644 --- a/src/Servers/IIS/test/IIS.Tests/IIS.Tests.csproj +++ b/src/Servers/IIS/test/IIS.Tests/IIS.Tests.csproj @@ -4,19 +4,18 @@ netcoreapp2.2 - - - - - + + - + + + diff --git a/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj index 2eba82046c..1eea688532 100644 --- a/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj @@ -21,9 +21,9 @@ - - + + diff --git a/src/Servers/IIS/test/gtest/gtest.vcxproj b/src/Servers/IIS/test/gtest/gtest.vcxproj index f78530ea12..b4ea90651d 100644 --- a/src/Servers/IIS/test/gtest/gtest.vcxproj +++ b/src/Servers/IIS/test/gtest/gtest.vcxproj @@ -19,8 +19,8 @@ - - + + 15.0 @@ -110,7 +110,7 @@ true WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions) true - googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories) + $(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googletest;$(GoogleTestSubmoduleRoot)googlemock;$(GoogleTestSubmoduleRoot)googlemock\include;%(AdditionalIncludeDirectories) MultiThreadedDebug @@ -126,7 +126,7 @@ true _DEBUG;_LIB;%(PreprocessorDefinitions) true - googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories) + $(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googletest;$(GoogleTestSubmoduleRoot)googlemock;$(GoogleTestSubmoduleRoot)googlemock\include;%(AdditionalIncludeDirectories) MultiThreadedDebug @@ -144,7 +144,7 @@ true WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions) true - googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories) + $(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googletest;$(GoogleTestSubmoduleRoot)googlemock;$(GoogleTestSubmoduleRoot)googlemock\include;%(AdditionalIncludeDirectories) MultiThreaded @@ -164,7 +164,7 @@ true NDEBUG;_LIB;%(PreprocessorDefinitions) true - googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories) + $(GoogleTestSubmoduleRoot)googletest\include;$(GoogleTestSubmoduleRoot)googletest;$(GoogleTestSubmoduleRoot)googlemock;$(GoogleTestSubmoduleRoot)googlemock\include;%(AdditionalIncludeDirectories) MultiThreaded @@ -177,4 +177,4 @@ - \ No newline at end of file + diff --git a/src/Servers/IIS/test/testassets/InProcessForwardsCompatWebSite/InProcessWebSite.csproj b/src/Servers/IIS/test/testassets/InProcessForwardsCompatWebSite/InProcessWebSite.csproj index 0dda2de217..0b4bd072d5 100644 --- a/src/Servers/IIS/test/testassets/InProcessForwardsCompatWebSite/InProcessWebSite.csproj +++ b/src/Servers/IIS/test/testassets/InProcessForwardsCompatWebSite/InProcessWebSite.csproj @@ -25,6 +25,7 @@ + diff --git a/src/Servers/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj b/src/Servers/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj index 695a6d0b5c..3abf38c73c 100644 --- a/src/Servers/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj +++ b/src/Servers/IIS/test/testassets/InProcessWebSite/InProcessWebSite.csproj @@ -7,26 +7,21 @@ true - - - - - - - - + + + diff --git a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj index fc50dcd616..81b924c89e 100644 --- a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj +++ b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/OutOfProcessWebSite.csproj @@ -6,10 +6,6 @@ $(StandardTestTfms) - - - - @@ -20,11 +16,13 @@ + + diff --git a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs new file mode 100644 index 0000000000..90895237d2 --- /dev/null +++ b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Program.cs @@ -0,0 +1,45 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.IO; +using System.Linq; +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; + +namespace TestSite +{ + public static class Program + { + public static int Main(string[] args) + { + var mode = args.FirstOrDefault(); + switch (mode) + { + case "CreateFile": + File.WriteAllText(args[1], ""); + return StartServer(); + } + + return StartServer(); + } + + private static int StartServer() + { + var host = new WebHostBuilder() + .ConfigureLogging( + (_, factory) => { + factory.AddConsole(); + factory.AddFilter("Console", level => level >= LogLevel.Information); + }) + .UseContentRoot(Directory.GetCurrentDirectory()) + .UseIISIntegration() + .UseStartup() + .UseKestrel() + .Build(); + + host.Run(); + return 0; + } + } +} + diff --git a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Startup.cs b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Startup.cs index 6556b5ac41..de54a85a8a 100644 --- a/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Startup.cs +++ b/src/Servers/IIS/test/testassets/OutOfProcessWebSite/Startup.cs @@ -15,6 +15,7 @@ using Microsoft.AspNetCore.Http.Features; using Microsoft.AspNetCore.IISIntegration.FunctionalTests; using Microsoft.AspNetCore.Server.IISIntegration; using Microsoft.Extensions.DependencyInjection; +using Xunit; namespace TestSite { @@ -47,6 +48,7 @@ namespace TestSite { if (context.User.Identity.IsAuthenticated) { + Assert.IsType(context.User); return context.Response.WriteAsync(context.User.Identity.AuthenticationType); } else diff --git a/src/Servers/IIS/test/testassets/StressTestWebSite/Program.cs b/src/Servers/IIS/test/testassets/StressTestWebSite/Program.cs new file mode 100644 index 0000000000..e8e5392c2c --- /dev/null +++ b/src/Servers/IIS/test/testassets/StressTestWebSite/Program.cs @@ -0,0 +1,26 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.AspNetCore.Hosting; +using Microsoft.Extensions.Logging; + +namespace ANCMStressTestApp +{ + public class Program + { + public static void Main(string[] args) + { + var host = new WebHostBuilder() + .ConfigureLogging((_, factory) => + { + factory.AddConsole(); + }) + .UseKestrel() + .UseIISIntegration() + .UseStartup() + .Build(); + + host.Run(); + } + } +} diff --git a/src/Servers/IIS/version.props b/src/Servers/IIS/version.props deleted file mode 100644 index a66579d599..0000000000 --- a/src/Servers/IIS/version.props +++ /dev/null @@ -1,17 +0,0 @@ - - - 2 - 2 - 1 - 1 - $(DotNetMajorVersion).$(DotNetMinorVersion).$(DotNetPatchVersion) - 12 - 2 - $(DotNetPatchVersion) - ancm-oob - $(VersionPrefix) - $(VersionPrefix)-$(PreReleaseLabel)-$(BuildNumber) - $(PackageVersion) - 2.0.0 - - diff --git a/src/submodules/googletest b/src/submodules/googletest new file mode 160000 index 0000000000..4e4df226fc --- /dev/null +++ b/src/submodules/googletest @@ -0,0 +1 @@ +Subproject commit 4e4df226fc197c0dda6e37f5c8c3845ca1e73a49 From 206db0558e56bae216ba94636692c5be899b69c8 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Thu, 13 Dec 2018 23:36:42 -0800 Subject: [PATCH 06/10] Update buildtools and add properties to skip IIS tests --- build/dependencies.folderbuilds.props | 2 +- build/dependencies.props | 2 +- global.json | 2 +- korebuild-lock.txt | 4 ++-- .../Microsoft.AspNetCore.Hosting.FunctionalTests.csproj | 2 +- .../Directory.Build.targets | 4 ++-- .../Microsoft.AspNetCore.AspNetCoreModule.pkgproj | 1 + .../Directory.Build.targets | 3 +-- .../Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj | 1 + .../IIS.BackwardsCompatibility.FunctionalTests.csproj | 1 + .../IIS.ForwardsCompatibility.FunctionalTests.csproj | 1 + .../IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj | 1 + .../IISExpress.FunctionalTests.csproj | 1 + src/SiteExtensions/build/dependencies.props | 2 +- 14 files changed, 16 insertions(+), 11 deletions(-) diff --git a/build/dependencies.folderbuilds.props b/build/dependencies.folderbuilds.props index 4b79b9ef4f..ce3cf06ac9 100644 --- a/build/dependencies.folderbuilds.props +++ b/build/dependencies.folderbuilds.props @@ -1,7 +1,7 @@  - 2.2.1-build-20181114.3 + 2.2.1-build-20181213.2 2.2.0 2.2.0 2.2.0 diff --git a/build/dependencies.props b/build/dependencies.props index 0f81352533..6b0d8fcf9b 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -26,7 +26,7 @@ $(KoreBuildVersion) $(KoreBuildVersion) $(KoreBuildVersion) - 2.2.1-build-20181114.3 + 2.2.1-build-20181213.2 diff --git a/global.json b/global.json index 9997b00a1d..fdc8dcb766 100644 --- a/global.json +++ b/global.json @@ -3,6 +3,6 @@ "version": "2.2.100" }, "msbuild-sdks": { - "Internal.AspNetCore.Sdk": "2.2.1-build-20181207.6" + "Internal.AspNetCore.Sdk": "2.2.1-build-20181213.2" } } diff --git a/korebuild-lock.txt b/korebuild-lock.txt index df21be17c2..0ced696eb0 100644 --- a/korebuild-lock.txt +++ b/korebuild-lock.txt @@ -1,2 +1,2 @@ -version:2.2.1-build-20181207.6 -commithash:d1a9489a535083be907f761827b4b44f4de3c92b +version:2.2.1-build-20181213.2 +commithash:3a55c25b0b17b7ff51010d1b4dfe50a0295c0a4f diff --git a/src/Hosting/test/FunctionalTests/Microsoft.AspNetCore.Hosting.FunctionalTests.csproj b/src/Hosting/test/FunctionalTests/Microsoft.AspNetCore.Hosting.FunctionalTests.csproj index 138043764a..9549fb0a47 100644 --- a/src/Hosting/test/FunctionalTests/Microsoft.AspNetCore.Hosting.FunctionalTests.csproj +++ b/src/Hosting/test/FunctionalTests/Microsoft.AspNetCore.Hosting.FunctionalTests.csproj @@ -1,7 +1,7 @@  - netcoreapp2.0 + netcoreapp2.2 diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets index 8a8fe2dfeb..9837fe8fd4 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets @@ -18,6 +18,8 @@ false + $(MSBuildProjectName) + $(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg @@ -29,6 +31,4 @@ - - diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj index 29465aecb3..97b177aabb 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Microsoft.AspNetCore.AspNetCoreModule.pkgproj @@ -2,6 +2,7 @@ + $(MSBuildProjectName) false netcoreapp2.2 aspnetcore diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets index 8a8fe2dfeb..7163fff522 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets @@ -18,6 +18,7 @@ false + $(PackageOutputPath)$(PackageId).$(PackageVersion).nupkg @@ -29,6 +30,4 @@ - - diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj index 617d35fe82..2cc6e089fd 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Microsoft.AspNetCore.AspNetCoreModuleV2.pkgproj @@ -2,6 +2,7 @@ + $(MSBuildProjectName) false netcoreapp2.2 aspnetcore diff --git a/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj index b86e9482c6..57a12c2e1c 100644 --- a/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj @@ -4,6 +4,7 @@ netcoreapp2.2 IISBackwardsCompatibility.FunctionalTests True + true diff --git a/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj index 27208537e3..70e9db7bc0 100644 --- a/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj @@ -4,6 +4,7 @@ netcoreapp2.2 IISForwardsCompatibility.FunctionalTests True + true diff --git a/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj index b6a113cb7f..9714018f13 100644 --- a/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj @@ -4,6 +4,7 @@ netcoreapp2.2 IIS.FunctionalTests True + true diff --git a/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj index 1eea688532..cfeed6eca7 100644 --- a/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj +++ b/src/Servers/IIS/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj @@ -3,6 +3,7 @@ netcoreapp2.2 True + true diff --git a/src/SiteExtensions/build/dependencies.props b/src/SiteExtensions/build/dependencies.props index 509b6df59d..e78dbcf3ba 100644 --- a/src/SiteExtensions/build/dependencies.props +++ b/src/SiteExtensions/build/dependencies.props @@ -4,7 +4,7 @@ - 2.2.1-build-20181114.3 + 2.2.1-build-20181213.2 2.1.1 2.2.0 15.6.1 From dd662ed2a716c3e0cef792f952c8ed6b3dc43b8b Mon Sep 17 00:00:00 2001 From: James Newton-King Date: Fri, 14 Dec 2018 22:21:44 +1300 Subject: [PATCH 07/10] Fix compiling Mvc.sln in 2.2 (#4955) --- .../Microsoft.AspNetCore.Mvc.Core.csproj | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj index 058afac02d..7fe1a42493 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj @@ -17,7 +17,7 @@ Microsoft.AspNetCore.Mvc.RouteAttribute - + From 13ae0057fbb11fd84fcee8fca46ebc1b2d7c1e6a Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 14 Dec 2018 08:36:36 -0800 Subject: [PATCH 08/10] Replace .Sources package references with local code (#4801) Replaces package references the following packages with local code: Microsoft.AspNetCore.Certificates.Generation.Sources Microsoft.Extensions.CopyOnWriteDictionary.Sources Microsoft.Extensions.ClosedGenericMatcher.Sources Microsoft.Extensions.ObjectMethodExecutor.Sources Microsoft.Extensions.PropertyActivator.Sources Microsoft.Extensions.PropertyHelper.Sources Microsoft.Extensions.RazorViews.Sources Microsoft.Extensions.SecurityHelper.Sources Microsoft.Extensions.StackTrace.Sources Microsoft.Extensions.WebEncoders.Sources --- build/dependencies.props | 11 - build/external-dependencies.props | 11 - build/repo.props | 1 + eng/Dependencies.props | 10 +- src/AuthSamples/build/dependencies.props | 2 - src/AzureIntegration/Directory.Build.props | 1 + src/AzureIntegration/build/dependencies.props | 3 +- ...re.AzureAppServices.FunctionalTests.csproj | 2 +- ...NetCore.DataProtection.Abstractions.csproj | 5 +- .../src/Microsoft.AspNetCore.JsonPatch.csproj | 5 +- .../src/Microsoft.AspNetCore.Hosting.csproj | 7 +- ...spNetCore.Server.IntegrationTesting.csproj | 2 +- .../Http/src/Microsoft.AspNetCore.Http.csproj | 5 +- ...oft.AspNetCore.Routing.Abstractions.csproj | 5 +- .../src/Microsoft.AspNetCore.Routing.csproj | 5 +- .../Microsoft.AspNetCore.WebUtilities.csproj | 5 +- src/Identity/Directory.Build.props | 1 + src/Identity/build/dependencies.props | 2 - ...ore.Diagnostics.EntityFrameworkCore.csproj | 2 +- .../Microsoft.AspNetCore.Diagnostics.csproj | 4 +- src/Mvc/Directory.Build.props | 1 + src/Mvc/build/dependencies.props | 6 - ...crosoft.AspNetCore.Mvc.Abstractions.csproj | 9 +- ...icrosoft.AspNetCore.Mvc.ApiExplorer.csproj | 7 +- .../Microsoft.AspNetCore.Mvc.Core.csproj | 12 +- ...soft.AspNetCore.Mvc.DataAnnotations.csproj | 7 +- ...soft.AspNetCore.Mvc.Formatters.Json.csproj | 5 +- ...osoft.AspNetCore.Mvc.Formatters.Xml.csproj | 8 +- ...crosoft.AspNetCore.Mvc.Localization.csproj | 5 +- .../Microsoft.AspNetCore.Mvc.Razor.csproj | 9 +- ...Microsoft.AspNetCore.Mvc.RazorPages.csproj | 11 +- ...Microsoft.AspNetCore.Mvc.TagHelpers.csproj | 2 +- ...crosoft.AspNetCore.Mvc.ViewFeatures.csproj | 13 +- ...oft.AspNetCore.Mvc.WebApiCompatShim.csproj | 5 +- src/Razor/build/dependencies.props | 1 - .../Microsoft.AspNetCore.Razor.Runtime.csproj | 1 - src/Security/build/dependencies.props | 3 +- ...Microsoft.AspNetCore.Authentication.csproj | 5 +- ...oft.AspNetCore.Authorization.Policy.csproj | 5 +- ...soft.AspNetCore.Server.Kestrel.Core.csproj | 2 +- .../CertificateManager.cs | 720 +++++++++++++++ .../CertificatePurpose.cs | 12 + .../EnsureCertificateResult.cs | 20 + .../ClosedGenericMatcher.cs | 106 +++ .../CopyOnWriteDictionary.cs | 155 ++++ .../CopyOnWriteDictionaryHolder.cs | 166 ++++ .../ObjectMethodExecutor/AwaitableInfo.cs | 127 +++ .../CoercedAwaitableInfo.cs | 55 ++ .../ObjectMethodExecutor.cs | 340 +++++++ .../ObjectMethodExecutorAwaitable.cs | 114 +++ .../ObjectMethodExecutorFSharpSupport.cs | 151 ++++ src/Shared/Process/ProcessExtensions.cs | 113 +++ .../PropertyActivator/PropertyActivator.cs | 110 +++ src/Shared/PropertyHelper/PropertyHelper.cs | 526 +++++++++++ src/Shared/RazorViews/AttributeValue.cs | 38 + src/Shared/RazorViews/BaseView.cs | 279 ++++++ src/Shared/RazorViews/HelperResult.cs | 34 + src/Shared/SecurityHelper/SecurityHelper.cs | 40 + .../ExceptionDetails/ExceptionDetails.cs | 29 + .../ExceptionDetailsProvider.cs | 170 ++++ .../StackFrame/MethodDisplayInfo.cs | 49 ++ .../StackFrame/ParameterDisplayInfo.cs | 33 + .../StackFrame/PortablePdbReader.cs | 135 +++ .../StackTrace/StackFrame/StackFrameInfo.cs | 18 + .../StackFrame/StackFrameSourceCodeInfo.cs | 54 ++ .../StackTrace/StackFrame/StackTraceHelper.cs | 261 ++++++ .../Properties/EncoderResources.cs | 38 + src/Shared/WebEncoders/WebEncoders.cs | 388 ++++++++ .../Shared.Tests/ClosedGenericMatcherTest.cs | 360 ++++++++ .../CopyOnWriteDictionaryHolderTest.cs | 91 ++ .../Shared.Tests/CopyOnWriteDictionaryTest.cs | 109 +++ .../Microsoft.AspNetCore.Shared.Tests.csproj | 29 + .../Shared.Tests/ObjectMethodExecutorTest.cs | 634 +++++++++++++ .../Shared.Tests/PropertyActivatorTest.cs | 187 ++++ .../test/Shared.Tests/PropertyHelperTest.cs | 831 ++++++++++++++++++ .../test/Shared.Tests/SecurityHelperTests.cs | 93 ++ .../test/Shared.Tests/StackTraceHelperTest.cs | 345 ++++++++ .../test/Shared.Tests/WebEncodersTests.cs | 113 +++ .../testassets/ThrowingLibrary/Thrower.cs | 20 + .../ThrowingLibrary/ThrowingLibrary.csproj | 8 + src/SignalR/Directory.Build.props | 1 + src/SignalR/build/dependencies.props | 6 +- ...crosoft.AspNetCore.Http.Connections.csproj | 7 +- .../Microsoft.AspNetCore.SignalR.Core.csproj | 7 +- src/Templating/Directory.Build.props | 1 + src/Templating/build/dependencies.props | 2 - .../test/Templates.Test/Templates.Test.csproj | 4 +- src/Tools/Directory.Build.props | 1 + ...NetCore.DeveloperCertificates.XPlat.csproj | 2 +- .../src/Properties/AssemblyInfo.cs | 6 + .../test/CertificateManagerTests.cs | 300 +++++++ ...e.DeveloperCertificates.XPlat.Tests.csproj | 11 + .../src => Shared/CommandLine}/CliContext.cs | 0 .../CommandLineApplicationExtensions.cs | 0 .../CommandLine}/ConsoleReporter.cs | 0 .../src => Shared/CommandLine}/DebugHelper.cs | 0 .../src => Shared/CommandLine}/Ensure.cs | 0 .../src => Shared/CommandLine}/IConsole.cs | 0 .../src => Shared/CommandLine}/IReporter.cs | 0 .../CommandLine}/NullReporter.cs | 0 .../CommandLine}/PhysicalConsole.cs | 0 .../TestHelpers}/TestConsole.cs | 0 .../TestHelpers}/TestReporter.cs | 0 .../src/dotnet-dev-certs.csproj | 12 +- .../src/dotnet-sql-cache.csproj | 2 +- .../src/dotnet-user-secrets.csproj | 2 +- .../test/dotnet-user-secrets.Tests.csproj | 2 +- .../dotnet-watch/src/dotnet-watch.csproj | 4 +- .../test/dotnet-watch.Tests.csproj | 2 +- 109 files changed, 7552 insertions(+), 127 deletions(-) create mode 100644 src/Shared/CertificateGeneration/CertificateManager.cs create mode 100644 src/Shared/CertificateGeneration/CertificatePurpose.cs create mode 100644 src/Shared/CertificateGeneration/EnsureCertificateResult.cs create mode 100644 src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs create mode 100644 src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs create mode 100644 src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionaryHolder.cs create mode 100644 src/Shared/ObjectMethodExecutor/AwaitableInfo.cs create mode 100644 src/Shared/ObjectMethodExecutor/CoercedAwaitableInfo.cs create mode 100644 src/Shared/ObjectMethodExecutor/ObjectMethodExecutor.cs create mode 100644 src/Shared/ObjectMethodExecutor/ObjectMethodExecutorAwaitable.cs create mode 100644 src/Shared/ObjectMethodExecutor/ObjectMethodExecutorFSharpSupport.cs create mode 100644 src/Shared/Process/ProcessExtensions.cs create mode 100644 src/Shared/PropertyActivator/PropertyActivator.cs create mode 100644 src/Shared/PropertyHelper/PropertyHelper.cs create mode 100644 src/Shared/RazorViews/AttributeValue.cs create mode 100644 src/Shared/RazorViews/BaseView.cs create mode 100644 src/Shared/RazorViews/HelperResult.cs create mode 100644 src/Shared/SecurityHelper/SecurityHelper.cs create mode 100644 src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs create mode 100644 src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs create mode 100644 src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs create mode 100644 src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs create mode 100644 src/Shared/StackTrace/StackFrame/PortablePdbReader.cs create mode 100644 src/Shared/StackTrace/StackFrame/StackFrameInfo.cs create mode 100644 src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs create mode 100644 src/Shared/StackTrace/StackFrame/StackTraceHelper.cs create mode 100644 src/Shared/WebEncoders/Properties/EncoderResources.cs create mode 100644 src/Shared/WebEncoders/WebEncoders.cs create mode 100644 src/Shared/test/Shared.Tests/ClosedGenericMatcherTest.cs create mode 100644 src/Shared/test/Shared.Tests/CopyOnWriteDictionaryHolderTest.cs create mode 100644 src/Shared/test/Shared.Tests/CopyOnWriteDictionaryTest.cs create mode 100644 src/Shared/test/Shared.Tests/Microsoft.AspNetCore.Shared.Tests.csproj create mode 100644 src/Shared/test/Shared.Tests/ObjectMethodExecutorTest.cs create mode 100644 src/Shared/test/Shared.Tests/PropertyActivatorTest.cs create mode 100644 src/Shared/test/Shared.Tests/PropertyHelperTest.cs create mode 100644 src/Shared/test/Shared.Tests/SecurityHelperTests.cs create mode 100644 src/Shared/test/Shared.Tests/StackTraceHelperTest.cs create mode 100644 src/Shared/test/Shared.Tests/WebEncodersTests.cs create mode 100644 src/Shared/test/testassets/ThrowingLibrary/Thrower.cs create mode 100644 src/Shared/test/testassets/ThrowingLibrary/ThrowingLibrary.csproj create mode 100644 src/Tools/FirstRunCertGenerator/src/Properties/AssemblyInfo.cs create mode 100644 src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs create mode 100644 src/Tools/FirstRunCertGenerator/test/Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj rename src/Tools/{shared/src => Shared/CommandLine}/CliContext.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/CommandLineApplicationExtensions.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/ConsoleReporter.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/DebugHelper.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/Ensure.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/IConsole.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/IReporter.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/NullReporter.cs (100%) rename src/Tools/{shared/src => Shared/CommandLine}/PhysicalConsole.cs (100%) rename src/Tools/{shared/test => Shared/TestHelpers}/TestConsole.cs (100%) rename src/Tools/{shared/test => Shared/TestHelpers}/TestReporter.cs (100%) diff --git a/build/dependencies.props b/build/dependencies.props index 1c6eb173a4..1ab5074b56 100644 --- a/build/dependencies.props +++ b/build/dependencies.props @@ -26,14 +26,12 @@ 2.1.1 - 2.1.1 2.1.0 2.1.1 2.1.2 2.1.2 2.1.2 2.1.2 - 2.1.1 2.1.1 2.1.1 2.1.1 @@ -47,7 +45,6 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 2.1.1 2.1.1 @@ -73,22 +70,14 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.6 2.1.1 2.1.1 2.1.1 2.1.6 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 diff --git a/build/external-dependencies.props b/build/external-dependencies.props index 7cb96166b2..f3bf216028 100644 --- a/build/external-dependencies.props +++ b/build/external-dependencies.props @@ -15,14 +15,12 @@ - - @@ -36,7 +34,6 @@ - @@ -62,21 +59,13 @@ - - - - - - - - diff --git a/build/repo.props b/build/repo.props index 881ac8ee77..eb668c963c 100644 --- a/build/repo.props +++ b/build/repo.props @@ -75,6 +75,7 @@ $(RepositoryRoot)src\Html\**\*.*proj; $(RepositoryRoot)src\Servers\**\*.csproj; $(RepositoryRoot)src\Servers\**\*.pkgproj; + $(RepositoryRoot)src\Shared\**\*.*proj; $(RepositoryRoot)src\Tools\**\*.*proj; $(RepositoryRoot)src\Middleware\**\*.*proj; " diff --git a/eng/Dependencies.props b/eng/Dependencies.props index 7b1eba3c54..39c05aae06 100644 --- a/eng/Dependencies.props +++ b/eng/Dependencies.props @@ -25,7 +25,6 @@ and are generated based on the last package release. - @@ -34,14 +33,12 @@ and are generated based on the last package release. - - @@ -56,12 +53,7 @@ and are generated based on the last package release. - - - - - @@ -71,6 +63,7 @@ and are generated based on the last package release. + @@ -79,6 +72,7 @@ and are generated based on the last package release. + diff --git a/src/AuthSamples/build/dependencies.props b/src/AuthSamples/build/dependencies.props index 01ccc8687a..c8622f6dd3 100644 --- a/src/AuthSamples/build/dependencies.props +++ b/src/AuthSamples/build/dependencies.props @@ -57,8 +57,6 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 - 2.1.1 3.14.2 5.2.0 2.0.0 diff --git a/src/AzureIntegration/Directory.Build.props b/src/AzureIntegration/Directory.Build.props index 24c8148124..5785b0e457 100644 --- a/src/AzureIntegration/Directory.Build.props +++ b/src/AzureIntegration/Directory.Build.props @@ -16,6 +16,7 @@ true true true + $(MSBuildThisFileDirectory)..\Shared\ diff --git a/src/AzureIntegration/build/dependencies.props b/src/AzureIntegration/build/dependencies.props index f338fce0d4..640d5a8d6e 100644 --- a/src/AzureIntegration/build/dependencies.props +++ b/src/AzureIntegration/build/dependencies.props @@ -51,6 +51,5 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 - \ No newline at end of file + diff --git a/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Microsoft.AspNetCore.AzureAppServices.FunctionalTests.csproj b/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Microsoft.AspNetCore.AzureAppServices.FunctionalTests.csproj index 6bf10bc884..dd2aa41bb2 100644 --- a/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Microsoft.AspNetCore.AzureAppServices.FunctionalTests.csproj +++ b/src/AzureIntegration/test/Microsoft.AspNetCore.AzureAppServices.FunctionalTests/Microsoft.AspNetCore.AzureAppServices.FunctionalTests.csproj @@ -9,13 +9,13 @@ + - diff --git a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj index 021b3fde2c..e1c44678f6 100644 --- a/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj +++ b/src/DataProtection/Abstractions/src/Microsoft.AspNetCore.DataProtection.Abstractions.csproj @@ -12,10 +12,7 @@ Microsoft.AspNetCore.DataProtection.IDataProtector - - - - + diff --git a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj index 3708e92927..f6f11fd3b3 100644 --- a/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj +++ b/src/Features/JsonPatch/src/Microsoft.AspNetCore.JsonPatch.csproj @@ -8,10 +8,13 @@ aspnetcore;json;jsonpatch + + + + - diff --git a/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj b/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj index 627b36bbc2..fbefc75eef 100644 --- a/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj +++ b/src/Hosting/Hosting/src/Microsoft.AspNetCore.Hosting.csproj @@ -8,6 +8,11 @@ aspnetcore;hosting + + + + + @@ -20,8 +25,6 @@ - - diff --git a/src/Hosting/Server.IntegrationTesting/src/Microsoft.AspNetCore.Server.IntegrationTesting.csproj b/src/Hosting/Server.IntegrationTesting/src/Microsoft.AspNetCore.Server.IntegrationTesting.csproj index e693a22278..d04c320b59 100644 --- a/src/Hosting/Server.IntegrationTesting/src/Microsoft.AspNetCore.Server.IntegrationTesting.csproj +++ b/src/Hosting/Server.IntegrationTesting/src/Microsoft.AspNetCore.Server.IntegrationTesting.csproj @@ -16,6 +16,7 @@ + @@ -25,7 +26,6 @@ - diff --git a/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj index 4344d0ae8e..e9d04e1ebc 100644 --- a/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj +++ b/src/Http/Http/src/Microsoft.AspNetCore.Http.csproj @@ -9,10 +9,13 @@ aspnetcore + + + + - diff --git a/src/Http/Routing.Abstractions/src/Microsoft.AspNetCore.Routing.Abstractions.csproj b/src/Http/Routing.Abstractions/src/Microsoft.AspNetCore.Routing.Abstractions.csproj index edb292bb22..ff154fe535 100644 --- a/src/Http/Routing.Abstractions/src/Microsoft.AspNetCore.Routing.Abstractions.csproj +++ b/src/Http/Routing.Abstractions/src/Microsoft.AspNetCore.Routing.Abstractions.csproj @@ -11,8 +11,11 @@ Microsoft.AspNetCore.Routing.RouteData aspnetcore;routing + + + + - diff --git a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj index cc8684caf4..af4bc3a24f 100644 --- a/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj +++ b/src/Http/Routing/src/Microsoft.AspNetCore.Routing.csproj @@ -11,6 +11,10 @@ Microsoft.AspNetCore.Routing.RouteCollection aspnetcore;routing + + + + @@ -18,6 +22,5 @@ Microsoft.AspNetCore.Routing.RouteCollection - diff --git a/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj b/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj index 3c7d2d8255..fdc9592cc8 100644 --- a/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj +++ b/src/Http/WebUtilities/src/Microsoft.AspNetCore.WebUtilities.csproj @@ -10,7 +10,10 @@ - + + + + diff --git a/src/Identity/Directory.Build.props b/src/Identity/Directory.Build.props index 230ecfc69e..f7f18cf416 100644 --- a/src/Identity/Directory.Build.props +++ b/src/Identity/Directory.Build.props @@ -15,6 +15,7 @@ $(MSBuildThisFileDirectory)build\Key.snk true true + $(MSBuildThisFileDirectory)..\Shared\ diff --git a/src/Identity/build/dependencies.props b/src/Identity/build/dependencies.props index 21e3cb41e5..3ae698e9d8 100644 --- a/src/Identity/build/dependencies.props +++ b/src/Identity/build/dependencies.props @@ -73,8 +73,6 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 - 2.1.1 2.1.1 2.1.1 diff --git a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj index f418a50148..23e9b782f1 100644 --- a/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj +++ b/src/Middleware/Diagnostics.EntityFrameworkCore/src/Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.csproj @@ -10,12 +10,12 @@ + - diff --git a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj index a5ae405dcd..9bdc1cea77 100644 --- a/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj +++ b/src/Middleware/Diagnostics/src/Microsoft.AspNetCore.Diagnostics.csproj @@ -10,6 +10,8 @@ + + @@ -20,8 +22,6 @@ - - diff --git a/src/Mvc/Directory.Build.props b/src/Mvc/Directory.Build.props index fad2bb0610..db07d3358b 100644 --- a/src/Mvc/Directory.Build.props +++ b/src/Mvc/Directory.Build.props @@ -16,6 +16,7 @@ true true true + $(MSBuildThisFileDirectory)..\Shared\ diff --git a/src/Mvc/build/dependencies.props b/src/Mvc/build/dependencies.props index 3e21512352..3b46192a78 100644 --- a/src/Mvc/build/dependencies.props +++ b/src/Mvc/build/dependencies.props @@ -71,10 +71,8 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 2.1.0 2.1.1 @@ -88,13 +86,9 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 2.1.1 2.1.1 - 2.1.1 - 2.1.1 - 2.1.1 2.1.1 2.1.1 2.1.1 diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Abstractions/Microsoft.AspNetCore.Mvc.Abstractions.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Abstractions/Microsoft.AspNetCore.Mvc.Abstractions.csproj index 4ebbaeec61..41cfcba32b 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Abstractions/Microsoft.AspNetCore.Mvc.Abstractions.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Abstractions/Microsoft.AspNetCore.Mvc.Abstractions.csproj @@ -10,12 +10,15 @@ Microsoft.AspNetCore.Mvc.IActionResult aspnetcore;aspnetcoremvc + + + + + + - - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ApiExplorer/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ApiExplorer/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj index 9ea5be90f4..0e6afbe939 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ApiExplorer/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ApiExplorer/Microsoft.AspNetCore.Mvc.ApiExplorer.csproj @@ -8,12 +8,15 @@ aspnetcore;aspnetcoremvc + + + + + - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj index b63ba839ef..a54324689b 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Core/Microsoft.AspNetCore.Mvc.Core.csproj @@ -17,7 +17,12 @@ Microsoft.AspNetCore.Mvc.RouteAttribute - + + + + + + @@ -30,17 +35,12 @@ Microsoft.AspNetCore.Mvc.RouteAttribute - - - - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.DataAnnotations/Microsoft.AspNetCore.Mvc.DataAnnotations.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.DataAnnotations/Microsoft.AspNetCore.Mvc.DataAnnotations.csproj index 336474aae0..542474780e 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.DataAnnotations/Microsoft.AspNetCore.Mvc.DataAnnotations.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.DataAnnotations/Microsoft.AspNetCore.Mvc.DataAnnotations.csproj @@ -8,11 +8,14 @@ aspnetcore;aspnetcoremvc + + + + + - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Microsoft.AspNetCore.Mvc.Formatters.Json.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Microsoft.AspNetCore.Mvc.Formatters.Json.csproj index 608e370257..c57c948d9e 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Microsoft.AspNetCore.Mvc.Formatters.Json.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Json/Microsoft.AspNetCore.Mvc.Formatters.Json.csproj @@ -8,10 +8,13 @@ aspnetcore;aspnetcoremvc;json + + + + - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Xml/Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Xml/Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj index b716f5cbbb..ebcf792899 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Xml/Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Formatters.Xml/Microsoft.AspNetCore.Mvc.Formatters.Xml.csproj @@ -9,9 +9,11 @@ - + + + - - + + diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Localization/Microsoft.AspNetCore.Mvc.Localization.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Localization/Microsoft.AspNetCore.Mvc.Localization.csproj index ea50d25312..c8d53a4da1 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Localization/Microsoft.AspNetCore.Mvc.Localization.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Localization/Microsoft.AspNetCore.Mvc.Localization.csproj @@ -11,13 +11,16 @@ Microsoft.AspNetCore.Mvc.Localization.IViewLocalizer aspnetcore;aspnetcoremvc;localization + + + + - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Microsoft.AspNetCore.Mvc.Razor.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Microsoft.AspNetCore.Mvc.Razor.csproj index 74e943a8d9..2679f72275 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Microsoft.AspNetCore.Mvc.Razor.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.Razor/Microsoft.AspNetCore.Mvc.Razor.csproj @@ -10,6 +10,12 @@ true + + + + + + @@ -19,10 +25,7 @@ - - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Microsoft.AspNetCore.Mvc.RazorPages.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Microsoft.AspNetCore.Mvc.RazorPages.csproj index f0be433ea5..fd59e58282 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Microsoft.AspNetCore.Mvc.RazorPages.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.RazorPages/Microsoft.AspNetCore.Mvc.RazorPages.csproj @@ -8,14 +8,17 @@ aspnetcore;aspnetcoremvc;cshtml;razor + + + + + + + - - - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.TagHelpers/Microsoft.AspNetCore.Mvc.TagHelpers.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.TagHelpers/Microsoft.AspNetCore.Mvc.TagHelpers.csproj index 75d40d73c2..c77fa2c2b4 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.TagHelpers/Microsoft.AspNetCore.Mvc.TagHelpers.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.TagHelpers/Microsoft.AspNetCore.Mvc.TagHelpers.csproj @@ -10,6 +10,7 @@ + @@ -21,6 +22,5 @@ - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj index 27d839320d..54a2f8e042 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.ViewFeatures/Microsoft.AspNetCore.Mvc.ViewFeatures.csproj @@ -13,6 +13,14 @@ Microsoft.AspNetCore.Mvc.ViewComponent aspnetcore;aspnetcoremvc + + + + + + + + @@ -22,12 +30,7 @@ Microsoft.AspNetCore.Mvc.ViewComponent - - - - - diff --git a/src/Mvc/src/Microsoft.AspNetCore.Mvc.WebApiCompatShim/Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj b/src/Mvc/src/Microsoft.AspNetCore.Mvc.WebApiCompatShim/Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj index ab1d11a599..a40f7a0d15 100644 --- a/src/Mvc/src/Microsoft.AspNetCore.Mvc.WebApiCompatShim/Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj +++ b/src/Mvc/src/Microsoft.AspNetCore.Mvc.WebApiCompatShim/Microsoft.AspNetCore.Mvc.WebApiCompatShim.csproj @@ -10,13 +10,16 @@ System.Web.Http.ApiController aspnetcore;aspnetcoremvc;aspnetwebapi + + + + - diff --git a/src/Razor/build/dependencies.props b/src/Razor/build/dependencies.props index e128924edb..294cf2f14e 100644 --- a/src/Razor/build/dependencies.props +++ b/src/Razor/build/dependencies.props @@ -65,7 +65,6 @@ 2.1.1 2.1.0 2.1.1 - 2.1.1 2.1.1 2.1.1 diff --git a/src/Razor/src/Microsoft.AspNetCore.Razor.Runtime/Microsoft.AspNetCore.Razor.Runtime.csproj b/src/Razor/src/Microsoft.AspNetCore.Razor.Runtime/Microsoft.AspNetCore.Razor.Runtime.csproj index b58a7f9c3f..e3102cbf8f 100644 --- a/src/Razor/src/Microsoft.AspNetCore.Razor.Runtime/Microsoft.AspNetCore.Razor.Runtime.csproj +++ b/src/Razor/src/Microsoft.AspNetCore.Razor.Runtime/Microsoft.AspNetCore.Razor.Runtime.csproj @@ -12,7 +12,6 @@ - diff --git a/src/Security/build/dependencies.props b/src/Security/build/dependencies.props index 828f9c7ab2..fb898d743e 100644 --- a/src/Security/build/dependencies.props +++ b/src/Security/build/dependencies.props @@ -52,7 +52,6 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 - \ No newline at end of file + diff --git a/src/Security/src/Microsoft.AspNetCore.Authentication/Microsoft.AspNetCore.Authentication.csproj b/src/Security/src/Microsoft.AspNetCore.Authentication/Microsoft.AspNetCore.Authentication.csproj index 7e3ce4eb39..ce5b4c6f93 100644 --- a/src/Security/src/Microsoft.AspNetCore.Authentication/Microsoft.AspNetCore.Authentication.csproj +++ b/src/Security/src/Microsoft.AspNetCore.Authentication/Microsoft.AspNetCore.Authentication.csproj @@ -8,6 +8,10 @@ aspnetcore;authentication;security + + + + @@ -15,7 +19,6 @@ - diff --git a/src/Security/src/Microsoft.AspNetCore.Authorization.Policy/Microsoft.AspNetCore.Authorization.Policy.csproj b/src/Security/src/Microsoft.AspNetCore.Authorization.Policy/Microsoft.AspNetCore.Authorization.Policy.csproj index 16e4aa2622..9516b08388 100644 --- a/src/Security/src/Microsoft.AspNetCore.Authorization.Policy/Microsoft.AspNetCore.Authorization.Policy.csproj +++ b/src/Security/src/Microsoft.AspNetCore.Authorization.Policy/Microsoft.AspNetCore.Authorization.Policy.csproj @@ -8,13 +8,16 @@ aspnetcore;authorization + + + + - diff --git a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj index dae8056002..55d5278ff9 100644 --- a/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj +++ b/src/Servers/Kestrel/Core/src/Microsoft.AspNetCore.Server.Kestrel.Core.csproj @@ -11,10 +11,10 @@ + - diff --git a/src/Shared/CertificateGeneration/CertificateManager.cs b/src/Shared/CertificateGeneration/CertificateManager.cs new file mode 100644 index 0000000000..4e2a0a9964 --- /dev/null +++ b/src/Shared/CertificateGeneration/CertificateManager.cs @@ -0,0 +1,720 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using System.Text.RegularExpressions; + +namespace Microsoft.AspNetCore.Certificates.Generation +{ + internal class CertificateManager + { + public const string AspNetHttpsOid = "1.3.6.1.4.1.311.84.1.1"; + public const string AspNetHttpsOidFriendlyName = "ASP.NET Core HTTPS development certificate"; + + public const string AspNetIdentityOid = "1.3.6.1.4.1.311.84.1.2"; + public const string AspNetIdentityOidFriendlyName = "ASP.NET Core Identity Json Web Token signing development certificate"; + + private const string ServerAuthenticationEnhancedKeyUsageOid = "1.3.6.1.5.5.7.3.1"; + private const string ServerAuthenticationEnhancedKeyUsageOidFriendlyName = "Server Authentication"; + + private const string LocalhostHttpsDnsName = "localhost"; + private const string LocalhostHttpsDistinguishedName = "CN=" + LocalhostHttpsDnsName; + + private const string IdentityDistinguishedName = "CN=Microsoft.AspNetCore.Identity.Signing"; + + public const int RSAMinimumKeySizeInBits = 2048; + + private static readonly TimeSpan MaxRegexTimeout = TimeSpan.FromMinutes(1); + private const string CertificateSubjectRegex = "CN=(.*[^,]+).*"; + private const string MacOSSystemKeyChain = "/Library/Keychains/System.keychain"; + private static readonly string MacOSUserKeyChain = Environment.GetEnvironmentVariable("HOME") + "/Library/Keychains/login.keychain-db"; + private const string MacOSFindCertificateCommandLine = "security"; +#if NETCOREAPP2_0 || NETCOREAPP2_1 + private static readonly string MacOSFindCertificateCommandLineArgumentsFormat = "find-certificate -c {0} -a -Z -p " + MacOSSystemKeyChain; +#endif + private const string MacOSFindCertificateOutputRegex = "SHA-1 hash: ([0-9A-Z]+)"; + private const string MacOSRemoveCertificateTrustCommandLine = "sudo"; + private const string MacOSRemoveCertificateTrustCommandLineArgumentsFormat = "security remove-trusted-cert -d {0}"; + private const string MacOSDeleteCertificateCommandLine = "sudo"; + private const string MacOSDeleteCertificateCommandLineArgumentsFormat = "security delete-certificate -Z {0} {1}"; + private const string MacOSTrustCertificateCommandLine = "sudo"; +#if NETCOREAPP2_0 || NETCOREAPP2_1 + private static readonly string MacOSTrustCertificateCommandLineArguments = "security add-trusted-cert -d -r trustRoot -k " + MacOSSystemKeyChain + " "; +#endif + private const int UserCancelledErrorCode = 1223; + + public IList ListCertificates( + CertificatePurpose purpose, + StoreName storeName, + StoreLocation location, + bool isValid, + bool requireExportable = true) + { + var certificates = new List(); + try + { + using (var store = new X509Store(storeName, location)) + { + store.Open(OpenFlags.ReadOnly); + certificates.AddRange(store.Certificates.OfType()); + IEnumerable matchingCertificates = certificates; + switch (purpose) + { + case CertificatePurpose.All: + matchingCertificates = matchingCertificates + .Where(c => HasOid(c, AspNetHttpsOid) || HasOid(c, AspNetIdentityOid)); + break; + case CertificatePurpose.HTTPS: + matchingCertificates = matchingCertificates + .Where(c => HasOid(c, AspNetHttpsOid)); + break; + case CertificatePurpose.Signing: + matchingCertificates = matchingCertificates + .Where(c => HasOid(c, AspNetIdentityOid)); + break; + default: + break; + } + if (isValid) + { + // Ensure the certificate hasn't expired, has a private key and its exportable + // (for container/unix scenarios). + var now = DateTimeOffset.Now; + matchingCertificates = matchingCertificates + .Where(c => c.NotBefore <= now && + now <= c.NotAfter && + (!requireExportable || !RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || IsExportable(c))); + } + + // We need to enumerate the certificates early to prevent dispoisng issues. + matchingCertificates = matchingCertificates.ToList(); + + var certificatesToDispose = certificates.Except(matchingCertificates); + DisposeCertificates(certificatesToDispose); + + store.Close(); + + return (IList)matchingCertificates; + } + } + catch + { + DisposeCertificates(certificates); + certificates.Clear(); + return certificates; + } + + bool HasOid(X509Certificate2 certificate, string oid) => + certificate.Extensions.OfType() + .Any(e => string.Equals(oid, e.Oid.Value, StringComparison.Ordinal)); +#if !XPLAT + bool IsExportable(X509Certificate2 c) => + ((c.GetRSAPrivateKey() is RSACryptoServiceProvider rsaPrivateKey && + rsaPrivateKey.CspKeyContainerInfo.Exportable) || + (c.GetRSAPrivateKey() is RSACng cngPrivateKey && + cngPrivateKey.Key.ExportPolicy == CngExportPolicies.AllowExport)); +#else + // Only check for RSA CryptoServiceProvider and do not fail in XPlat tooling as + // System.Security.Cryptography.Cng is not pat of the shared framework and we don't + // want to bring the dependency in on CLI scenarios. This functionality will be used + // on CLI scenarios as part of the first run experience, so checking the exportability + // of the certificate is not important. + bool IsExportable(X509Certificate2 c) => + ((c.GetRSAPrivateKey() is RSACryptoServiceProvider rsaPrivateKey && + rsaPrivateKey.CspKeyContainerInfo.Exportable) || !(c.GetRSAPrivateKey() is RSACryptoServiceProvider)); +#endif + } + + private void DisposeCertificates(IEnumerable disposables) + { + foreach (var disposable in disposables) + { + try + { + disposable.Dispose(); + } + catch + { + } + } + } + +#if NETCOREAPP2_0 || NETCOREAPP2_1 + + public X509Certificate2 CreateAspNetCoreHttpsDevelopmentCertificate(DateTimeOffset notBefore, DateTimeOffset notAfter, string subjectOverride) + { + var subject = new X500DistinguishedName(subjectOverride ?? LocalhostHttpsDistinguishedName); + var extensions = new List(); + var sanBuilder = new SubjectAlternativeNameBuilder(); + sanBuilder.AddDnsName(LocalhostHttpsDnsName); + + var keyUsage = new X509KeyUsageExtension(X509KeyUsageFlags.KeyEncipherment, critical: true); + var enhancedKeyUsage = new X509EnhancedKeyUsageExtension( + new OidCollection() { + new Oid( + ServerAuthenticationEnhancedKeyUsageOid, + ServerAuthenticationEnhancedKeyUsageOidFriendlyName) + }, + critical: true); + + var basicConstraints = new X509BasicConstraintsExtension( + certificateAuthority: false, + hasPathLengthConstraint: false, + pathLengthConstraint: 0, + critical: true); + + var aspNetHttpsExtension = new X509Extension( + new AsnEncodedData( + new Oid(AspNetHttpsOid, AspNetHttpsOidFriendlyName), + Encoding.ASCII.GetBytes(AspNetHttpsOidFriendlyName)), + critical: false); + + extensions.Add(basicConstraints); + extensions.Add(keyUsage); + extensions.Add(enhancedKeyUsage); + extensions.Add(sanBuilder.Build(critical: true)); + extensions.Add(aspNetHttpsExtension); + + var certificate = CreateSelfSignedCertificate(subject, extensions, notBefore, notAfter); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + certificate.FriendlyName = AspNetHttpsOidFriendlyName; + } + + return certificate; + } + + public X509Certificate2 CreateApplicationTokenSigningDevelopmentCertificate(DateTimeOffset notBefore, DateTimeOffset notAfter, string subjectOverride) + { + var subject = new X500DistinguishedName(subjectOverride ?? IdentityDistinguishedName); + var extensions = new List(); + + var keyUsage = new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature, critical: true); + var enhancedKeyUsage = new X509EnhancedKeyUsageExtension( + new OidCollection() { + new Oid( + ServerAuthenticationEnhancedKeyUsageOid, + ServerAuthenticationEnhancedKeyUsageOidFriendlyName) + }, + critical: true); + + var basicConstraints = new X509BasicConstraintsExtension( + certificateAuthority: false, + hasPathLengthConstraint: false, + pathLengthConstraint: 0, + critical: true); + + var aspNetIdentityExtension = new X509Extension( + new AsnEncodedData( + new Oid(AspNetIdentityOid, AspNetIdentityOidFriendlyName), + Encoding.ASCII.GetBytes(AspNetIdentityOidFriendlyName)), + critical: false); + + extensions.Add(basicConstraints); + extensions.Add(keyUsage); + extensions.Add(enhancedKeyUsage); + extensions.Add(aspNetIdentityExtension); + + var certificate = CreateSelfSignedCertificate(subject, extensions, notBefore, notAfter); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + certificate.FriendlyName = AspNetIdentityOidFriendlyName; + } + + return certificate; + } + + public X509Certificate2 CreateSelfSignedCertificate( + X500DistinguishedName subject, + IEnumerable extensions, + DateTimeOffset notBefore, + DateTimeOffset notAfter) + { + var key = CreateKeyMaterial(RSAMinimumKeySizeInBits); + + var request = new CertificateRequest(subject, key, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1); + foreach (var extension in extensions) + { + request.CertificateExtensions.Add(extension); + } + + return request.CreateSelfSigned(notBefore, notAfter); + + RSA CreateKeyMaterial(int minimumKeySize) + { + var rsa = RSA.Create(minimumKeySize); + if (rsa.KeySize < minimumKeySize) + { + throw new InvalidOperationException($"Failed to create a key with a size of {minimumKeySize} bits"); + } + + return rsa; + } + } + + public X509Certificate2 SaveCertificateInStore(X509Certificate2 certificate, StoreName name, StoreLocation location) + { + var imported = certificate; + if (!RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + // On non OSX systems we need to export the certificate and import it so that the transient + // key that we generated gets persisted. + var export = certificate.Export(X509ContentType.Pkcs12, ""); + imported = new X509Certificate2(export, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); + Array.Clear(export, 0, export.Length); + } + + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + imported.FriendlyName = certificate.FriendlyName; + } + + using (var store = new X509Store(name, location)) + { + store.Open(OpenFlags.ReadWrite); + store.Add(imported); + store.Close(); + }; + + return imported; + } + + public void ExportCertificate(X509Certificate2 certificate, string path, bool includePrivateKey, string password) + { + if (Path.GetDirectoryName(path) != "") + { + Directory.CreateDirectory(Path.GetDirectoryName(path)); + } + + if (includePrivateKey) + { + var bytes = certificate.Export(X509ContentType.Pkcs12, password); + try + { + File.WriteAllBytes(path, bytes); + } + finally + { + Array.Clear(bytes, 0, bytes.Length); + } + } + else + { + var bytes = certificate.Export(X509ContentType.Cert); + File.WriteAllBytes(path, bytes); + } + } + + public void TrustCertificate(X509Certificate2 certificate) + { + // Strip certificate of the private key if any. + var publicCertificate = new X509Certificate2(certificate.Export(X509ContentType.Cert)); + + if (!IsTrusted(publicCertificate)) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + TrustCertificateOnWindows(certificate, publicCertificate); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + TrustCertificateOnMac(publicCertificate); + } + } + } + + private void TrustCertificateOnMac(X509Certificate2 publicCertificate) + { + var tmpFile = Path.GetTempFileName(); + try + { + ExportCertificate(publicCertificate, tmpFile, includePrivateKey: false, password: null); + using (var process = Process.Start(MacOSTrustCertificateCommandLine, MacOSTrustCertificateCommandLineArguments + tmpFile)) + { + process.WaitForExit(); + if (process.ExitCode != 0) + { + throw new InvalidOperationException("There was an error trusting the certificate."); + } + } + } + finally + { + try + { + if (File.Exists(tmpFile)) + { + File.Delete(tmpFile); + } + } + catch + { + // We don't care if we can't delete the temp file. + } + } + } + + private static void TrustCertificateOnWindows(X509Certificate2 certificate, X509Certificate2 publicCertificate) + { + publicCertificate.FriendlyName = certificate.FriendlyName; + + using (var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser)) + { + store.Open(OpenFlags.ReadWrite); + try + { + store.Add(publicCertificate); + } + catch (CryptographicException exception) when (exception.HResult == UserCancelledErrorCode) + { + throw new UserCancelledTrustException(); + } + store.Close(); + }; + } + + public bool IsTrusted(X509Certificate2 certificate) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + return ListCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, isValid: true, requireExportable: false) + .Any(c => c.Thumbprint == certificate.Thumbprint); + } + else if (RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) + { + var subjectMatch = Regex.Match(certificate.Subject, CertificateSubjectRegex, RegexOptions.Singleline, MaxRegexTimeout); + if (!subjectMatch.Success) + { + throw new InvalidOperationException($"Can't determine the subject for the certificate with subject '{certificate.Subject}'."); + } + var subject = subjectMatch.Groups[1].Value; + using (var checkTrustProcess = Process.Start(new ProcessStartInfo( + MacOSFindCertificateCommandLine, + string.Format(MacOSFindCertificateCommandLineArgumentsFormat, subject)) + { + RedirectStandardOutput = true + })) + { + var output = checkTrustProcess.StandardOutput.ReadToEnd(); + checkTrustProcess.WaitForExit(); + var matches = Regex.Matches(output, MacOSFindCertificateOutputRegex, RegexOptions.Multiline, MaxRegexTimeout); + var hashes = matches.OfType().Select(m => m.Groups[1].Value).ToList(); + return hashes.Any(h => string.Equals(h, certificate.Thumbprint, StringComparison.Ordinal)); + } + } + else + { + return false; + } + } + + public void CleanupHttpsCertificates(string subject = LocalhostHttpsDistinguishedName) + { + CleanupCertificates(CertificatePurpose.HTTPS, subject); + } + + public void CleanupCertificates(CertificatePurpose purpose, string subject) + { + // On OS X we don't have a good way to manage trusted certificates in the system keychain + // so we do everything by invoking the native toolchain. + // This has some limitations, like for example not being able to identify our custom OID extension. For that + // matter, when we are cleaning up certificates on the machine, we start by removing the trusted certificates. + // To do this, we list the certificates that we can identify on the current user personal store and we invoke + // the native toolchain to remove them from the sytem keychain. Once we have removed the trusted certificates, + // we remove the certificates from the local user store to finish up the cleanup. + var certificates = ListCertificates(purpose, StoreName.My, StoreLocation.CurrentUser, isValid: false); + foreach (var certificate in certificates) + { + RemoveCertificate(certificate, RemoveLocations.All); + } + } + + public void RemoveAllCertificates(CertificatePurpose purpose, StoreName storeName, StoreLocation storeLocation, string subject = null) + { + var certificates = RuntimeInformation.IsOSPlatform(OSPlatform.OSX) ? + ListCertificates(purpose, StoreName.My, StoreLocation.CurrentUser, isValid: false) : + ListCertificates(purpose, storeName, storeLocation, isValid: false); + var certificatesWithName = subject == null ? certificates : certificates.Where(c => c.Subject == subject); + + var removeLocation = storeName == StoreName.My ? RemoveLocations.Local : RemoveLocations.Trusted; + + foreach (var certificate in certificates) + { + RemoveCertificate(certificate, removeLocation); + } + + DisposeCertificates(certificates); + } + + private void RemoveCertificate(X509Certificate2 certificate, RemoveLocations locations) + { + switch (locations) + { + case RemoveLocations.Undefined: + throw new InvalidOperationException($"'{nameof(RemoveLocations.Undefined)}' is not a valid location."); + case RemoveLocations.Local: + RemoveCertificateFromUserStore(certificate); + break; + case RemoveLocations.Trusted when !RuntimeInformation.IsOSPlatform(OSPlatform.Linux): + RemoveCertificateFromTrustedRoots(certificate); + break; + case RemoveLocations.All: + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) + { + RemoveCertificateFromTrustedRoots(certificate); + } + RemoveCertificateFromUserStore(certificate); + break; + default: + throw new InvalidOperationException("Invalid location."); + } + } + + private static void RemoveCertificateFromUserStore(X509Certificate2 certificate) + { + using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) + { + store.Open(OpenFlags.ReadWrite); + var matching = store.Certificates + .OfType() + .Single(c => c.SerialNumber == certificate.SerialNumber); + + store.Remove(matching); + store.Close(); + } + } + + private void RemoveCertificateFromTrustedRoots(X509Certificate2 certificate) + { + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + using (var store = new X509Store(StoreName.Root, StoreLocation.CurrentUser)) + { + store.Open(OpenFlags.ReadWrite); + var matching = store.Certificates + .OfType() + .Single(c => c.SerialNumber == certificate.SerialNumber); + + store.Remove(matching); + store.Close(); + } + } + else + { + if (IsTrusted(certificate)) // On OSX this check just ensures its on the system keychain + { + try + { + RemoveCertificateTrustRule(certificate); + } + catch + { + // We don't care if we fail to remove the trust rule if + // for some reason the certificate became untrusted. + // The delete command will fail if the certificate is + // trusted. + } + RemoveCertificateFromKeyChain(MacOSSystemKeyChain, certificate); + } + } + } + + private static void RemoveCertificateTrustRule(X509Certificate2 certificate) + { + var certificatePath = Path.GetTempFileName(); + try + { + var certBytes = certificate.Export(X509ContentType.Cert); + File.WriteAllBytes(certificatePath, certBytes); + var processInfo = new ProcessStartInfo( + MacOSRemoveCertificateTrustCommandLine, + string.Format( + MacOSRemoveCertificateTrustCommandLineArgumentsFormat, + certificatePath + )); + using (var process = Process.Start(processInfo)) + { + process.WaitForExit(); + } + } + finally + { + try + { + if (File.Exists(certificatePath)) + { + File.Delete(certificatePath); + } + } + catch + { + // We don't care about failing to do clean-up on a temp file. + } + } + } + + private static void RemoveCertificateFromKeyChain(string keyChain, X509Certificate2 certificate) + { + var processInfo = new ProcessStartInfo( + MacOSDeleteCertificateCommandLine, + string.Format( + MacOSDeleteCertificateCommandLineArgumentsFormat, + certificate.Thumbprint.ToUpperInvariant(), + keyChain + )) + { + RedirectStandardOutput = true, + RedirectStandardError = true + }; + + using (var process = Process.Start(processInfo)) + { + var output = process.StandardOutput.ReadToEnd() + process.StandardError.ReadToEnd(); + process.WaitForExit(); + + if (process.ExitCode != 0) + { + throw new InvalidOperationException($@"There was an error removing the certificate with thumbprint '{certificate.Thumbprint}'. + +{output}"); + } + } + } + + public EnsureCertificateResult EnsureAspNetCoreHttpsDevelopmentCertificate( + DateTimeOffset notBefore, + DateTimeOffset notAfter, + string path = null, + bool trust = false, + bool includePrivateKey = false, + string password = null, + string subject = LocalhostHttpsDistinguishedName) + { + return EnsureValidCertificateExists(notBefore, notAfter, CertificatePurpose.HTTPS, path, trust, includePrivateKey, password, subject); + } + + public EnsureCertificateResult EnsureAspNetCoreApplicationTokensDevelopmentCertificate( + DateTimeOffset notBefore, + DateTimeOffset notAfter, + string path = null, + bool trust = false, + bool includePrivateKey = false, + string password = null, + string subject = IdentityDistinguishedName) + { + return EnsureValidCertificateExists(notBefore, notAfter, CertificatePurpose.Signing, path, trust, includePrivateKey, password, subject); + } + + public EnsureCertificateResult EnsureValidCertificateExists( + DateTimeOffset notBefore, + DateTimeOffset notAfter, + CertificatePurpose purpose, + string path = null, + bool trust = false, + bool includePrivateKey = false, + string password = null, + string subjectOverride = null) + { + if (purpose == CertificatePurpose.All) + { + throw new ArgumentException("The certificate must have a specific purpose."); + } + + var certificates = ListCertificates(purpose, StoreName.My, StoreLocation.CurrentUser, isValid: true).Concat( + ListCertificates(purpose, StoreName.My, StoreLocation.LocalMachine, isValid: true)); + + certificates = subjectOverride == null ? certificates : certificates.Where(c => c.Subject == subjectOverride); + + var result = EnsureCertificateResult.Succeeded; + + X509Certificate2 certificate = null; + if (certificates.Count() > 0) + { + certificate = certificates.FirstOrDefault(); + result = EnsureCertificateResult.ValidCertificatePresent; + } + else + { + try + { + switch (purpose) + { + case CertificatePurpose.All: + throw new InvalidOperationException("The certificate must have a specific purpose."); + case CertificatePurpose.HTTPS: + certificate = CreateAspNetCoreHttpsDevelopmentCertificate(notBefore, notAfter, subjectOverride); + break; + case CertificatePurpose.Signing: + certificate = CreateApplicationTokenSigningDevelopmentCertificate(notBefore, notAfter, subjectOverride); + break; + default: + throw new InvalidOperationException("The certificate must have a purpose."); + } + } + catch + { + return EnsureCertificateResult.ErrorCreatingTheCertificate; + } + + try + { + certificate = SaveCertificateInStore(certificate, StoreName.My, StoreLocation.CurrentUser); + } + catch + { + return EnsureCertificateResult.ErrorSavingTheCertificateIntoTheCurrentUserPersonalStore; + } + } + if (path != null) + { + try + { + ExportCertificate(certificate, path, includePrivateKey, password); + } + catch + { + return EnsureCertificateResult.ErrorExportingTheCertificate; + } + } + + if ((RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || RuntimeInformation.IsOSPlatform(OSPlatform.OSX)) && trust) + { + try + { + TrustCertificate(certificate); + } + catch (UserCancelledTrustException) + { + return EnsureCertificateResult.UserCancelledTrustStep; + } + catch + { + return EnsureCertificateResult.FailedToTrustTheCertificate; + } + } + + return result; + } + + private class UserCancelledTrustException : Exception + { + } + + private enum RemoveLocations + { + Undefined, + Local, + Trusted, + All + } +#endif + } +} \ No newline at end of file diff --git a/src/Shared/CertificateGeneration/CertificatePurpose.cs b/src/Shared/CertificateGeneration/CertificatePurpose.cs new file mode 100644 index 0000000000..1ad1a6d79b --- /dev/null +++ b/src/Shared/CertificateGeneration/CertificatePurpose.cs @@ -0,0 +1,12 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +namespace Microsoft.AspNetCore.Certificates.Generation +{ + internal enum CertificatePurpose + { + All, + HTTPS, + Signing + } +} \ No newline at end of file diff --git a/src/Shared/CertificateGeneration/EnsureCertificateResult.cs b/src/Shared/CertificateGeneration/EnsureCertificateResult.cs new file mode 100644 index 0000000000..d3c86ce05d --- /dev/null +++ b/src/Shared/CertificateGeneration/EnsureCertificateResult.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +#if NETCOREAPP2_0 || NETCOREAPP2_1 + +namespace Microsoft.AspNetCore.Certificates.Generation +{ + internal enum EnsureCertificateResult + { + Succeeded = 1, + ValidCertificatePresent, + ErrorCreatingTheCertificate, + ErrorSavingTheCertificateIntoTheCurrentUserPersonalStore, + ErrorExportingTheCertificate, + FailedToTrustTheCertificate, + UserCancelledTrustStep + } +} + +#endif \ No newline at end of file diff --git a/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs b/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs new file mode 100644 index 0000000000..f234c2edbc --- /dev/null +++ b/src/Shared/ClosedGenericMatcher/ClosedGenericMatcher.cs @@ -0,0 +1,106 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Reflection; + +namespace Microsoft.Extensions.Internal +{ + /// + /// Helper related to generic interface definitions and implementing classes. + /// + internal static class ClosedGenericMatcher + { + /// + /// Determine whether is or implements a closed generic + /// created from . + /// + /// The of interest. + /// The open generic to match. Usually an interface. + /// + /// The closed generic created from that + /// is or implements. null if the two s have no such + /// relationship. + /// + /// + /// This method will return if is + /// typeof(KeyValuePair{,}), and is + /// typeof(KeyValuePair{string, object}). + /// + public static Type ExtractGenericInterface(Type queryType, Type interfaceType) + { + if (queryType == null) + { + throw new ArgumentNullException(nameof(queryType)); + } + + if (interfaceType == null) + { + throw new ArgumentNullException(nameof(interfaceType)); + } + + if (IsGenericInstantiation(queryType, interfaceType)) + { + // queryType matches (i.e. is a closed generic type created from) the open generic type. + return queryType; + } + + // Otherwise check all interfaces the type implements for a match. + // - If multiple different generic instantiations exists, we want the most derived one. + // - If that doesn't break the tie, then we sort alphabetically so that it's deterministic. + // + // We do this by looking at interfaces on the type, and recursing to the base type + // if we don't find any matches. + return GetGenericInstantiation(queryType, interfaceType); + } + + private static bool IsGenericInstantiation(Type candidate, Type interfaceType) + { + return + candidate.GetTypeInfo().IsGenericType && + candidate.GetGenericTypeDefinition() == interfaceType; + } + + private static Type GetGenericInstantiation(Type queryType, Type interfaceType) + { + Type bestMatch = null; + var interfaces = queryType.GetInterfaces(); + foreach (var @interface in interfaces) + { + if (IsGenericInstantiation(@interface, interfaceType)) + { + if (bestMatch == null) + { + bestMatch = @interface; + } + else if (StringComparer.Ordinal.Compare(@interface.FullName, bestMatch.FullName) < 0) + { + bestMatch = @interface; + } + else + { + // There are two matches at this level of the class hierarchy, but @interface is after + // bestMatch in the sort order. + } + } + } + + if (bestMatch != null) + { + return bestMatch; + } + + // BaseType will be null for object and interfaces, which means we've reached 'bottom'. + var baseType = queryType?.GetTypeInfo().BaseType; + if (baseType == null) + { + return null; + } + else + { + return GetGenericInstantiation(baseType, interfaceType); + } + } + } +} \ No newline at end of file diff --git a/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs new file mode 100644 index 0000000000..1408059ad9 --- /dev/null +++ b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionary.cs @@ -0,0 +1,155 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; + +namespace Microsoft.Extensions.Internal +{ + internal class CopyOnWriteDictionary : IDictionary + { + private readonly IDictionary _sourceDictionary; + private readonly IEqualityComparer _comparer; + private IDictionary _innerDictionary; + + public CopyOnWriteDictionary( + IDictionary sourceDictionary, + IEqualityComparer comparer) + { + if (sourceDictionary == null) + { + throw new ArgumentNullException(nameof(sourceDictionary)); + } + + if (comparer == null) + { + throw new ArgumentNullException(nameof(comparer)); + } + + _sourceDictionary = sourceDictionary; + _comparer = comparer; + } + + private IDictionary ReadDictionary + { + get + { + return _innerDictionary ?? _sourceDictionary; + } + } + + private IDictionary WriteDictionary + { + get + { + if (_innerDictionary == null) + { + _innerDictionary = new Dictionary(_sourceDictionary, + _comparer); + } + + return _innerDictionary; + } + } + + public virtual ICollection Keys + { + get + { + return ReadDictionary.Keys; + } + } + + public virtual ICollection Values + { + get + { + return ReadDictionary.Values; + } + } + + public virtual int Count + { + get + { + return ReadDictionary.Count; + } + } + + public virtual bool IsReadOnly + { + get + { + return false; + } + } + + public virtual TValue this[TKey key] + { + get + { + return ReadDictionary[key]; + } + set + { + WriteDictionary[key] = value; + } + } + + public virtual bool ContainsKey(TKey key) + { + return ReadDictionary.ContainsKey(key); + } + + public virtual void Add(TKey key, TValue value) + { + WriteDictionary.Add(key, value); + } + + public virtual bool Remove(TKey key) + { + return WriteDictionary.Remove(key); + } + + public virtual bool TryGetValue(TKey key, out TValue value) + { + return ReadDictionary.TryGetValue(key, out value); + } + + public virtual void Add(KeyValuePair item) + { + WriteDictionary.Add(item); + } + + public virtual void Clear() + { + WriteDictionary.Clear(); + } + + public virtual bool Contains(KeyValuePair item) + { + return ReadDictionary.Contains(item); + } + + public virtual void CopyTo(KeyValuePair[] array, int arrayIndex) + { + ReadDictionary.CopyTo(array, arrayIndex); + } + + public bool Remove(KeyValuePair item) + { + return WriteDictionary.Remove(item); + } + + public virtual IEnumerator> GetEnumerator() + { + return ReadDictionary.GetEnumerator(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + return GetEnumerator(); + } + } +} \ No newline at end of file diff --git a/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionaryHolder.cs b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionaryHolder.cs new file mode 100644 index 0000000000..7cd935e940 --- /dev/null +++ b/src/Shared/CopyOnWriteDictionary/CopyOnWriteDictionaryHolder.cs @@ -0,0 +1,166 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Extensions.Internal +{ + internal struct CopyOnWriteDictionaryHolder + { + private readonly Dictionary _source; + private Dictionary _copy; + + public CopyOnWriteDictionaryHolder(Dictionary source) + { + if (source == null) + { + throw new ArgumentNullException(nameof(source)); + } + + _source = source; + _copy = null; + } + + public CopyOnWriteDictionaryHolder(CopyOnWriteDictionaryHolder source) + { + _source = source._copy ?? source._source; + _copy = null; + } + + public bool HasBeenCopied => _copy != null; + + public Dictionary ReadDictionary + { + get + { + if (_copy != null) + { + return _copy; + } + else if (_source != null) + { + return _source; + } + else + { + // Default-Constructor case + _copy = new Dictionary(); + return _copy; + } + } + } + + public Dictionary WriteDictionary + { + get + { + if (_copy == null && _source == null) + { + // Default-Constructor case + _copy = new Dictionary(); + } + else if (_copy == null) + { + _copy = new Dictionary(_source, _source.Comparer); + } + + return _copy; + } + } + + public Dictionary.KeyCollection Keys + { + get + { + return ReadDictionary.Keys; + } + } + + public Dictionary.ValueCollection Values + { + get + { + return ReadDictionary.Values; + } + } + + public int Count + { + get + { + return ReadDictionary.Count; + } + } + + public bool IsReadOnly + { + get + { + return false; + } + } + + public TValue this[TKey key] + { + get + { + return ReadDictionary[key]; + } + set + { + WriteDictionary[key] = value; + } + } + + public bool ContainsKey(TKey key) + { + return ReadDictionary.ContainsKey(key); + } + + public void Add(TKey key, TValue value) + { + WriteDictionary.Add(key, value); + } + + public bool Remove(TKey key) + { + return WriteDictionary.Remove(key); + } + + public bool TryGetValue(TKey key, out TValue value) + { + return ReadDictionary.TryGetValue(key, out value); + } + + public void Add(KeyValuePair item) + { + ((ICollection>)WriteDictionary).Add(item); + } + + public void Clear() + { + WriteDictionary.Clear(); + } + + public bool Contains(KeyValuePair item) + { + return ((ICollection>)ReadDictionary).Contains(item); + } + + public void CopyTo(KeyValuePair[] array, int arrayIndex) + { + ((ICollection>)ReadDictionary).CopyTo(array, arrayIndex); + } + + public bool Remove(KeyValuePair item) + { + return ((ICollection>)WriteDictionary).Remove(item); + } + + public Dictionary.Enumerator GetEnumerator() + { + return ReadDictionary.GetEnumerator(); + } + } +} diff --git a/src/Shared/ObjectMethodExecutor/AwaitableInfo.cs b/src/Shared/ObjectMethodExecutor/AwaitableInfo.cs new file mode 100644 index 0000000000..431b83a6e5 --- /dev/null +++ b/src/Shared/ObjectMethodExecutor/AwaitableInfo.cs @@ -0,0 +1,127 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; + +namespace Microsoft.Extensions.Internal +{ + internal struct AwaitableInfo + { + public Type AwaiterType { get; } + public PropertyInfo AwaiterIsCompletedProperty { get; } + public MethodInfo AwaiterGetResultMethod { get; } + public MethodInfo AwaiterOnCompletedMethod { get; } + public MethodInfo AwaiterUnsafeOnCompletedMethod { get; } + public Type ResultType { get; } + public MethodInfo GetAwaiterMethod { get; } + + public AwaitableInfo( + Type awaiterType, + PropertyInfo awaiterIsCompletedProperty, + MethodInfo awaiterGetResultMethod, + MethodInfo awaiterOnCompletedMethod, + MethodInfo awaiterUnsafeOnCompletedMethod, + Type resultType, + MethodInfo getAwaiterMethod) + { + AwaiterType = awaiterType; + AwaiterIsCompletedProperty = awaiterIsCompletedProperty; + AwaiterGetResultMethod = awaiterGetResultMethod; + AwaiterOnCompletedMethod = awaiterOnCompletedMethod; + AwaiterUnsafeOnCompletedMethod = awaiterUnsafeOnCompletedMethod; + ResultType = resultType; + GetAwaiterMethod = getAwaiterMethod; + } + + public static bool IsTypeAwaitable(Type type, out AwaitableInfo awaitableInfo) + { + // Based on Roslyn code: http://source.roslyn.io/#Microsoft.CodeAnalysis.Workspaces/Shared/Extensions/ISymbolExtensions.cs,db4d48ba694b9347 + + // Awaitable must have method matching "object GetAwaiter()" + var getAwaiterMethod = type.GetRuntimeMethods().FirstOrDefault(m => + m.Name.Equals("GetAwaiter", StringComparison.OrdinalIgnoreCase) + && m.GetParameters().Length == 0 + && m.ReturnType != null); + if (getAwaiterMethod == null) + { + awaitableInfo = default(AwaitableInfo); + return false; + } + + var awaiterType = getAwaiterMethod.ReturnType; + + // Awaiter must have property matching "bool IsCompleted { get; }" + var isCompletedProperty = awaiterType.GetRuntimeProperties().FirstOrDefault(p => + p.Name.Equals("IsCompleted", StringComparison.OrdinalIgnoreCase) + && p.PropertyType == typeof(bool) + && p.GetMethod != null); + if (isCompletedProperty == null) + { + awaitableInfo = default(AwaitableInfo); + return false; + } + + // Awaiter must implement INotifyCompletion + var awaiterInterfaces = awaiterType.GetInterfaces(); + var implementsINotifyCompletion = awaiterInterfaces.Any(t => t == typeof(INotifyCompletion)); + if (!implementsINotifyCompletion) + { + awaitableInfo = default(AwaitableInfo); + return false; + } + + // INotifyCompletion supplies a method matching "void OnCompleted(Action action)" + var iNotifyCompletionMap = awaiterType + .GetTypeInfo() + .GetRuntimeInterfaceMap(typeof(INotifyCompletion)); + var onCompletedMethod = iNotifyCompletionMap.InterfaceMethods.Single(m => + m.Name.Equals("OnCompleted", StringComparison.OrdinalIgnoreCase) + && m.ReturnType == typeof(void) + && m.GetParameters().Length == 1 + && m.GetParameters()[0].ParameterType == typeof(Action)); + + // Awaiter optionally implements ICriticalNotifyCompletion + var implementsICriticalNotifyCompletion = awaiterInterfaces.Any(t => t == typeof(ICriticalNotifyCompletion)); + MethodInfo unsafeOnCompletedMethod; + if (implementsICriticalNotifyCompletion) + { + // ICriticalNotifyCompletion supplies a method matching "void UnsafeOnCompleted(Action action)" + var iCriticalNotifyCompletionMap = awaiterType + .GetTypeInfo() + .GetRuntimeInterfaceMap(typeof(ICriticalNotifyCompletion)); + unsafeOnCompletedMethod = iCriticalNotifyCompletionMap.InterfaceMethods.Single(m => + m.Name.Equals("UnsafeOnCompleted", StringComparison.OrdinalIgnoreCase) + && m.ReturnType == typeof(void) + && m.GetParameters().Length == 1 + && m.GetParameters()[0].ParameterType == typeof(Action)); + } + else + { + unsafeOnCompletedMethod = null; + } + + // Awaiter must have method matching "void GetResult" or "T GetResult()" + var getResultMethod = awaiterType.GetRuntimeMethods().FirstOrDefault(m => + m.Name.Equals("GetResult") + && m.GetParameters().Length == 0); + if (getResultMethod == null) + { + awaitableInfo = default(AwaitableInfo); + return false; + } + + awaitableInfo = new AwaitableInfo( + awaiterType, + isCompletedProperty, + getResultMethod, + onCompletedMethod, + unsafeOnCompletedMethod, + getResultMethod.ReturnType, + getAwaiterMethod); + return true; + } + } +} diff --git a/src/Shared/ObjectMethodExecutor/CoercedAwaitableInfo.cs b/src/Shared/ObjectMethodExecutor/CoercedAwaitableInfo.cs new file mode 100644 index 0000000000..4e48ef09a1 --- /dev/null +++ b/src/Shared/ObjectMethodExecutor/CoercedAwaitableInfo.cs @@ -0,0 +1,55 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq.Expressions; + +namespace Microsoft.Extensions.Internal +{ + internal struct CoercedAwaitableInfo + { + public AwaitableInfo AwaitableInfo { get; } + public Expression CoercerExpression { get; } + public Type CoercerResultType { get; } + public bool RequiresCoercion => CoercerExpression != null; + + public CoercedAwaitableInfo(AwaitableInfo awaitableInfo) + { + AwaitableInfo = awaitableInfo; + CoercerExpression = null; + CoercerResultType = null; + } + + public CoercedAwaitableInfo(Expression coercerExpression, Type coercerResultType, AwaitableInfo coercedAwaitableInfo) + { + CoercerExpression = coercerExpression; + CoercerResultType = coercerResultType; + AwaitableInfo = coercedAwaitableInfo; + } + + public static bool IsTypeAwaitable(Type type, out CoercedAwaitableInfo info) + { + if (AwaitableInfo.IsTypeAwaitable(type, out var directlyAwaitableInfo)) + { + info = new CoercedAwaitableInfo(directlyAwaitableInfo); + return true; + } + + // It's not directly awaitable, but maybe we can coerce it. + // Currently we support coercing FSharpAsync. + if (ObjectMethodExecutorFSharpSupport.TryBuildCoercerFromFSharpAsyncToAwaitable(type, + out var coercerExpression, + out var coercerResultType)) + { + if (AwaitableInfo.IsTypeAwaitable(coercerResultType, out var coercedAwaitableInfo)) + { + info = new CoercedAwaitableInfo(coercerExpression, coercerResultType, coercedAwaitableInfo); + return true; + } + } + + info = default(CoercedAwaitableInfo); + return false; + } + } +} diff --git a/src/Shared/ObjectMethodExecutor/ObjectMethodExecutor.cs b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutor.cs new file mode 100644 index 0000000000..f8e5b70f0d --- /dev/null +++ b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutor.cs @@ -0,0 +1,340 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq.Expressions; +using System.Reflection; + +namespace Microsoft.Extensions.Internal +{ + internal class ObjectMethodExecutor + { + private readonly object[] _parameterDefaultValues; + private readonly MethodExecutorAsync _executorAsync; + private readonly MethodExecutor _executor; + + private static readonly ConstructorInfo _objectMethodExecutorAwaitableConstructor = + typeof(ObjectMethodExecutorAwaitable).GetConstructor(new[] { + typeof(object), // customAwaitable + typeof(Func), // getAwaiterMethod + typeof(Func), // isCompletedMethod + typeof(Func), // getResultMethod + typeof(Action), // onCompletedMethod + typeof(Action) // unsafeOnCompletedMethod + }); + + private ObjectMethodExecutor(MethodInfo methodInfo, TypeInfo targetTypeInfo, object[] parameterDefaultValues) + { + if (methodInfo == null) + { + throw new ArgumentNullException(nameof(methodInfo)); + } + + MethodInfo = methodInfo; + MethodParameters = methodInfo.GetParameters(); + TargetTypeInfo = targetTypeInfo; + MethodReturnType = methodInfo.ReturnType; + + var isAwaitable = CoercedAwaitableInfo.IsTypeAwaitable(MethodReturnType, out var coercedAwaitableInfo); + + IsMethodAsync = isAwaitable; + AsyncResultType = isAwaitable ? coercedAwaitableInfo.AwaitableInfo.ResultType : null; + + // Upstream code may prefer to use the sync-executor even for async methods, because if it knows + // that the result is a specific Task where T is known, then it can directly cast to that type + // and await it without the extra heap allocations involved in the _executorAsync code path. + _executor = GetExecutor(methodInfo, targetTypeInfo); + + if (IsMethodAsync) + { + _executorAsync = GetExecutorAsync(methodInfo, targetTypeInfo, coercedAwaitableInfo); + } + + _parameterDefaultValues = parameterDefaultValues; + } + + private delegate ObjectMethodExecutorAwaitable MethodExecutorAsync(object target, object[] parameters); + + private delegate object MethodExecutor(object target, object[] parameters); + + private delegate void VoidMethodExecutor(object target, object[] parameters); + + public MethodInfo MethodInfo { get; } + + public ParameterInfo[] MethodParameters { get; } + + public TypeInfo TargetTypeInfo { get; } + + public Type AsyncResultType { get; } + + // This field is made internal set because it is set in unit tests. + public Type MethodReturnType { get; internal set; } + + public bool IsMethodAsync { get; } + + public static ObjectMethodExecutor Create(MethodInfo methodInfo, TypeInfo targetTypeInfo) + { + return new ObjectMethodExecutor(methodInfo, targetTypeInfo, null); + } + + public static ObjectMethodExecutor Create(MethodInfo methodInfo, TypeInfo targetTypeInfo, object[] parameterDefaultValues) + { + if (parameterDefaultValues == null) + { + throw new ArgumentNullException(nameof(parameterDefaultValues)); + } + + return new ObjectMethodExecutor(methodInfo, targetTypeInfo, parameterDefaultValues); + } + + /// + /// Executes the configured method on . This can be used whether or not + /// the configured method is asynchronous. + /// + /// + /// Even if the target method is asynchronous, it's desirable to invoke it using Execute rather than + /// ExecuteAsync if you know at compile time what the return type is, because then you can directly + /// "await" that value (via a cast), and then the generated code will be able to reference the + /// resulting awaitable as a value-typed variable. If you use ExecuteAsync instead, the generated + /// code will have to treat the resulting awaitable as a boxed object, because it doesn't know at + /// compile time what type it would be. + /// + /// The object whose method is to be executed. + /// Parameters to pass to the method. + /// The method return value. + public object Execute(object target, object[] parameters) + { + return _executor(target, parameters); + } + + /// + /// Executes the configured method on . This can only be used if the configured + /// method is asynchronous. + /// + /// + /// If you don't know at compile time the type of the method's returned awaitable, you can use ExecuteAsync, + /// which supplies an awaitable-of-object. This always works, but can incur several extra heap allocations + /// as compared with using Execute and then using "await" on the result value typecasted to the known + /// awaitable type. The possible extra heap allocations are for: + /// + /// 1. The custom awaitable (though usually there's a heap allocation for this anyway, since normally + /// it's a reference type, and you normally create a new instance per call). + /// 2. The custom awaiter (whether or not it's a value type, since if it's not, you need a new instance + /// of it, and if it is, it will have to be boxed so the calling code can reference it as an object). + /// 3. The async result value, if it's a value type (it has to be boxed as an object, since the calling + /// code doesn't know what type it's going to be). + /// + /// The object whose method is to be executed. + /// Parameters to pass to the method. + /// An object that you can "await" to get the method return value. + public ObjectMethodExecutorAwaitable ExecuteAsync(object target, object[] parameters) + { + return _executorAsync(target, parameters); + } + + public object GetDefaultValueForParameter(int index) + { + if (_parameterDefaultValues == null) + { + throw new InvalidOperationException($"Cannot call {nameof(GetDefaultValueForParameter)}, because no parameter default values were supplied."); + } + + if (index < 0 || index > MethodParameters.Length - 1) + { + throw new ArgumentOutOfRangeException(nameof(index)); + } + + return _parameterDefaultValues[index]; + } + + private static MethodExecutor GetExecutor(MethodInfo methodInfo, TypeInfo targetTypeInfo) + { + // Parameters to executor + var targetParameter = Expression.Parameter(typeof(object), "target"); + var parametersParameter = Expression.Parameter(typeof(object[]), "parameters"); + + // Build parameter list + var parameters = new List(); + var paramInfos = methodInfo.GetParameters(); + for (int i = 0; i < paramInfos.Length; i++) + { + var paramInfo = paramInfos[i]; + var valueObj = Expression.ArrayIndex(parametersParameter, Expression.Constant(i)); + var valueCast = Expression.Convert(valueObj, paramInfo.ParameterType); + + // valueCast is "(Ti) parameters[i]" + parameters.Add(valueCast); + } + + // Call method + var instanceCast = Expression.Convert(targetParameter, targetTypeInfo.AsType()); + var methodCall = Expression.Call(instanceCast, methodInfo, parameters); + + // methodCall is "((Ttarget) target) method((T0) parameters[0], (T1) parameters[1], ...)" + // Create function + if (methodCall.Type == typeof(void)) + { + var lambda = Expression.Lambda(methodCall, targetParameter, parametersParameter); + var voidExecutor = lambda.Compile(); + return WrapVoidMethod(voidExecutor); + } + else + { + // must coerce methodCall to match ActionExecutor signature + var castMethodCall = Expression.Convert(methodCall, typeof(object)); + var lambda = Expression.Lambda(castMethodCall, targetParameter, parametersParameter); + return lambda.Compile(); + } + } + + private static MethodExecutor WrapVoidMethod(VoidMethodExecutor executor) + { + return delegate (object target, object[] parameters) + { + executor(target, parameters); + return null; + }; + } + + private static MethodExecutorAsync GetExecutorAsync( + MethodInfo methodInfo, + TypeInfo targetTypeInfo, + CoercedAwaitableInfo coercedAwaitableInfo) + { + // Parameters to executor + var targetParameter = Expression.Parameter(typeof(object), "target"); + var parametersParameter = Expression.Parameter(typeof(object[]), "parameters"); + + // Build parameter list + var parameters = new List(); + var paramInfos = methodInfo.GetParameters(); + for (int i = 0; i < paramInfos.Length; i++) + { + var paramInfo = paramInfos[i]; + var valueObj = Expression.ArrayIndex(parametersParameter, Expression.Constant(i)); + var valueCast = Expression.Convert(valueObj, paramInfo.ParameterType); + + // valueCast is "(Ti) parameters[i]" + parameters.Add(valueCast); + } + + // Call method + var instanceCast = Expression.Convert(targetParameter, targetTypeInfo.AsType()); + var methodCall = Expression.Call(instanceCast, methodInfo, parameters); + + // Using the method return value, construct an ObjectMethodExecutorAwaitable based on + // the info we have about its implementation of the awaitable pattern. Note that all + // the funcs/actions we construct here are precompiled, so that only one instance of + // each is preserved throughout the lifetime of the ObjectMethodExecutor. + + // var getAwaiterFunc = (object awaitable) => + // (object)((CustomAwaitableType)awaitable).GetAwaiter(); + var customAwaitableParam = Expression.Parameter(typeof(object), "awaitable"); + var awaitableInfo = coercedAwaitableInfo.AwaitableInfo; + var postCoercionMethodReturnType = coercedAwaitableInfo.CoercerResultType ?? methodInfo.ReturnType; + var getAwaiterFunc = Expression.Lambda>( + Expression.Convert( + Expression.Call( + Expression.Convert(customAwaitableParam, postCoercionMethodReturnType), + awaitableInfo.GetAwaiterMethod), + typeof(object)), + customAwaitableParam).Compile(); + + // var isCompletedFunc = (object awaiter) => + // ((CustomAwaiterType)awaiter).IsCompleted; + var isCompletedParam = Expression.Parameter(typeof(object), "awaiter"); + var isCompletedFunc = Expression.Lambda>( + Expression.MakeMemberAccess( + Expression.Convert(isCompletedParam, awaitableInfo.AwaiterType), + awaitableInfo.AwaiterIsCompletedProperty), + isCompletedParam).Compile(); + + var getResultParam = Expression.Parameter(typeof(object), "awaiter"); + Func getResultFunc; + if (awaitableInfo.ResultType == typeof(void)) + { + // var getResultFunc = (object awaiter) => + // { + // ((CustomAwaiterType)awaiter).GetResult(); // We need to invoke this to surface any exceptions + // return (object)null; + // }; + getResultFunc = Expression.Lambda>( + Expression.Block( + Expression.Call( + Expression.Convert(getResultParam, awaitableInfo.AwaiterType), + awaitableInfo.AwaiterGetResultMethod), + Expression.Constant(null) + ), + getResultParam).Compile(); + } + else + { + // var getResultFunc = (object awaiter) => + // (object)((CustomAwaiterType)awaiter).GetResult(); + getResultFunc = Expression.Lambda>( + Expression.Convert( + Expression.Call( + Expression.Convert(getResultParam, awaitableInfo.AwaiterType), + awaitableInfo.AwaiterGetResultMethod), + typeof(object)), + getResultParam).Compile(); + } + + // var onCompletedFunc = (object awaiter, Action continuation) => { + // ((CustomAwaiterType)awaiter).OnCompleted(continuation); + // }; + var onCompletedParam1 = Expression.Parameter(typeof(object), "awaiter"); + var onCompletedParam2 = Expression.Parameter(typeof(Action), "continuation"); + var onCompletedFunc = Expression.Lambda>( + Expression.Call( + Expression.Convert(onCompletedParam1, awaitableInfo.AwaiterType), + awaitableInfo.AwaiterOnCompletedMethod, + onCompletedParam2), + onCompletedParam1, + onCompletedParam2).Compile(); + + Action unsafeOnCompletedFunc = null; + if (awaitableInfo.AwaiterUnsafeOnCompletedMethod != null) + { + // var unsafeOnCompletedFunc = (object awaiter, Action continuation) => { + // ((CustomAwaiterType)awaiter).UnsafeOnCompleted(continuation); + // }; + var unsafeOnCompletedParam1 = Expression.Parameter(typeof(object), "awaiter"); + var unsafeOnCompletedParam2 = Expression.Parameter(typeof(Action), "continuation"); + unsafeOnCompletedFunc = Expression.Lambda>( + Expression.Call( + Expression.Convert(unsafeOnCompletedParam1, awaitableInfo.AwaiterType), + awaitableInfo.AwaiterUnsafeOnCompletedMethod, + unsafeOnCompletedParam2), + unsafeOnCompletedParam1, + unsafeOnCompletedParam2).Compile(); + } + + // If we need to pass the method call result through a coercer function to get an + // awaitable, then do so. + var coercedMethodCall = coercedAwaitableInfo.RequiresCoercion + ? Expression.Invoke(coercedAwaitableInfo.CoercerExpression, methodCall) + : (Expression)methodCall; + + // return new ObjectMethodExecutorAwaitable( + // (object)coercedMethodCall, + // getAwaiterFunc, + // isCompletedFunc, + // getResultFunc, + // onCompletedFunc, + // unsafeOnCompletedFunc); + var returnValueExpression = Expression.New( + _objectMethodExecutorAwaitableConstructor, + Expression.Convert(coercedMethodCall, typeof(object)), + Expression.Constant(getAwaiterFunc), + Expression.Constant(isCompletedFunc), + Expression.Constant(getResultFunc), + Expression.Constant(onCompletedFunc), + Expression.Constant(unsafeOnCompletedFunc, typeof(Action))); + + var lambda = Expression.Lambda(returnValueExpression, targetParameter, parametersParameter); + return lambda.Compile(); + } + } +} diff --git a/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorAwaitable.cs b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorAwaitable.cs new file mode 100644 index 0000000000..7509b86b2b --- /dev/null +++ b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorAwaitable.cs @@ -0,0 +1,114 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Runtime.CompilerServices; + +namespace Microsoft.Extensions.Internal +{ + /// + /// Provides a common awaitable structure that can + /// return, regardless of whether the underlying value is a System.Task, an FSharpAsync, or an + /// application-defined custom awaitable. + /// + internal struct ObjectMethodExecutorAwaitable + { + private readonly object _customAwaitable; + private readonly Func _getAwaiterMethod; + private readonly Func _isCompletedMethod; + private readonly Func _getResultMethod; + private readonly Action _onCompletedMethod; + private readonly Action _unsafeOnCompletedMethod; + + // Perf note: since we're requiring the customAwaitable to be supplied here as an object, + // this will trigger a further allocation if it was a value type (i.e., to box it). We can't + // fix this by making the customAwaitable type generic, because the calling code typically + // does not know the type of the awaitable/awaiter at compile-time anyway. + // + // However, we could fix it by not passing the customAwaitable here at all, and instead + // passing a func that maps directly from the target object (e.g., controller instance), + // target method (e.g., action method info), and params array to the custom awaiter in the + // GetAwaiter() method below. In effect, by delaying the actual method call until the + // upstream code calls GetAwaiter on this ObjectMethodExecutorAwaitable instance. + // This optimization is not currently implemented because: + // [1] It would make no difference when the awaitable was an object type, which is + // by far the most common scenario (e.g., System.Task). + // [2] It would be complex - we'd need some kind of object pool to track all the parameter + // arrays until we needed to use them in GetAwaiter(). + // We can reconsider this in the future if there's a need to optimize for ValueTask + // or other value-typed awaitables. + + public ObjectMethodExecutorAwaitable( + object customAwaitable, + Func getAwaiterMethod, + Func isCompletedMethod, + Func getResultMethod, + Action onCompletedMethod, + Action unsafeOnCompletedMethod) + { + _customAwaitable = customAwaitable; + _getAwaiterMethod = getAwaiterMethod; + _isCompletedMethod = isCompletedMethod; + _getResultMethod = getResultMethod; + _onCompletedMethod = onCompletedMethod; + _unsafeOnCompletedMethod = unsafeOnCompletedMethod; + } + + public Awaiter GetAwaiter() + { + var customAwaiter = _getAwaiterMethod(_customAwaitable); + return new Awaiter(customAwaiter, _isCompletedMethod, _getResultMethod, _onCompletedMethod, _unsafeOnCompletedMethod); + } + + public struct Awaiter : ICriticalNotifyCompletion + { + private readonly object _customAwaiter; + private readonly Func _isCompletedMethod; + private readonly Func _getResultMethod; + private readonly Action _onCompletedMethod; + private readonly Action _unsafeOnCompletedMethod; + + public Awaiter( + object customAwaiter, + Func isCompletedMethod, + Func getResultMethod, + Action onCompletedMethod, + Action unsafeOnCompletedMethod) + { + _customAwaiter = customAwaiter; + _isCompletedMethod = isCompletedMethod; + _getResultMethod = getResultMethod; + _onCompletedMethod = onCompletedMethod; + _unsafeOnCompletedMethod = unsafeOnCompletedMethod; + } + + public bool IsCompleted => _isCompletedMethod(_customAwaiter); + + public object GetResult() => _getResultMethod(_customAwaiter); + + public void OnCompleted(Action continuation) + { + _onCompletedMethod(_customAwaiter, continuation); + } + + public void UnsafeOnCompleted(Action continuation) + { + // If the underlying awaitable implements ICriticalNotifyCompletion, use its UnsafeOnCompleted. + // If not, fall back on using its OnCompleted. + // + // Why this is safe: + // - Implementing ICriticalNotifyCompletion is a way of saying the caller can choose whether it + // needs the execution context to be preserved (which it signals by calling OnCompleted), or + // that it doesn't (which it signals by calling UnsafeOnCompleted). Obviously it's faster *not* + // to preserve and restore the context, so we prefer that where possible. + // - If a caller doesn't need the execution context to be preserved and hence calls UnsafeOnCompleted, + // there's no harm in preserving it anyway - it's just a bit of wasted cost. That's what will happen + // if a caller sees that the proxy implements ICriticalNotifyCompletion but the proxy chooses to + // pass the call on to the underlying awaitable's OnCompleted method. + + var underlyingMethodToUse = _unsafeOnCompletedMethod ?? _onCompletedMethod; + underlyingMethodToUse(_customAwaiter, continuation); + } + } + } +} \ No newline at end of file diff --git a/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorFSharpSupport.cs b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorFSharpSupport.cs new file mode 100644 index 0000000000..2198c0ce45 --- /dev/null +++ b/src/Shared/ObjectMethodExecutor/ObjectMethodExecutorFSharpSupport.cs @@ -0,0 +1,151 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Linq.Expressions; +using System.Reflection; +using System.Threading; +using System.Threading.Tasks; + +namespace Microsoft.Extensions.Internal +{ + /// + /// Helper for detecting whether a given type is FSharpAsync`1, and if so, supplying + /// an for mapping instances of that type to a C# awaitable. + /// + /// + /// The main design goal here is to avoid taking a compile-time dependency on + /// FSharp.Core.dll, because non-F# applications wouldn't use it. So all the references + /// to FSharp types have to be constructed dynamically at runtime. + /// + internal static class ObjectMethodExecutorFSharpSupport + { + private static object _fsharpValuesCacheLock = new object(); + private static Assembly _fsharpCoreAssembly; + private static MethodInfo _fsharpAsyncStartAsTaskGenericMethod; + private static PropertyInfo _fsharpOptionOfTaskCreationOptionsNoneProperty; + private static PropertyInfo _fsharpOptionOfCancellationTokenNoneProperty; + + public static bool TryBuildCoercerFromFSharpAsyncToAwaitable( + Type possibleFSharpAsyncType, + out Expression coerceToAwaitableExpression, + out Type awaitableType) + { + var methodReturnGenericType = possibleFSharpAsyncType.IsGenericType + ? possibleFSharpAsyncType.GetGenericTypeDefinition() + : null; + + if (!IsFSharpAsyncOpenGenericType(methodReturnGenericType)) + { + coerceToAwaitableExpression = null; + awaitableType = null; + return false; + } + + var awaiterResultType = possibleFSharpAsyncType.GetGenericArguments().Single(); + awaitableType = typeof(Task<>).MakeGenericType(awaiterResultType); + + // coerceToAwaitableExpression = (object fsharpAsync) => + // { + // return (object)FSharpAsync.StartAsTask( + // (Microsoft.FSharp.Control.FSharpAsync)fsharpAsync, + // FSharpOption.None, + // FSharpOption.None); + // }; + var startAsTaskClosedMethod = _fsharpAsyncStartAsTaskGenericMethod + .MakeGenericMethod(awaiterResultType); + var coerceToAwaitableParam = Expression.Parameter(typeof(object)); + coerceToAwaitableExpression = Expression.Lambda( + Expression.Convert( + Expression.Call( + startAsTaskClosedMethod, + Expression.Convert(coerceToAwaitableParam, possibleFSharpAsyncType), + Expression.MakeMemberAccess(null, _fsharpOptionOfTaskCreationOptionsNoneProperty), + Expression.MakeMemberAccess(null, _fsharpOptionOfCancellationTokenNoneProperty)), + typeof(object)), + coerceToAwaitableParam); + + return true; + } + + private static bool IsFSharpAsyncOpenGenericType(Type possibleFSharpAsyncGenericType) + { + var typeFullName = possibleFSharpAsyncGenericType?.FullName; + if (!string.Equals(typeFullName, "Microsoft.FSharp.Control.FSharpAsync`1", StringComparison.Ordinal)) + { + return false; + } + + lock (_fsharpValuesCacheLock) + { + if (_fsharpCoreAssembly != null) + { + // Since we've already found the real FSharpAsync.Core assembly, we just have + // to check that the supplied FSharpAsync`1 type is the one from that assembly. + return possibleFSharpAsyncGenericType.Assembly == _fsharpCoreAssembly; + } + else + { + // We'll keep trying to find the FSharp types/values each time any type called + // FSharpAsync`1 is supplied. + return TryPopulateFSharpValueCaches(possibleFSharpAsyncGenericType); + } + } + } + + private static bool TryPopulateFSharpValueCaches(Type possibleFSharpAsyncGenericType) + { + var assembly = possibleFSharpAsyncGenericType.Assembly; + var fsharpOptionType = assembly.GetType("Microsoft.FSharp.Core.FSharpOption`1"); + var fsharpAsyncType = assembly.GetType("Microsoft.FSharp.Control.FSharpAsync"); + + if (fsharpOptionType == null || fsharpAsyncType == null) + { + return false; + } + + // Get a reference to FSharpOption.None + var fsharpOptionOfTaskCreationOptionsType = fsharpOptionType + .MakeGenericType(typeof(TaskCreationOptions)); + _fsharpOptionOfTaskCreationOptionsNoneProperty = fsharpOptionOfTaskCreationOptionsType + .GetTypeInfo() + .GetRuntimeProperty("None"); + + // Get a reference to FSharpOption.None + var fsharpOptionOfCancellationTokenType = fsharpOptionType + .MakeGenericType(typeof(CancellationToken)); + _fsharpOptionOfCancellationTokenNoneProperty = fsharpOptionOfCancellationTokenType + .GetTypeInfo() + .GetRuntimeProperty("None"); + + // Get a reference to FSharpAsync.StartAsTask<> + var fsharpAsyncMethods = fsharpAsyncType + .GetRuntimeMethods() + .Where(m => m.Name.Equals("StartAsTask", StringComparison.Ordinal)); + foreach (var candidateMethodInfo in fsharpAsyncMethods) + { + var parameters = candidateMethodInfo.GetParameters(); + if (parameters.Length == 3 + && TypesHaveSameIdentity(parameters[0].ParameterType, possibleFSharpAsyncGenericType) + && parameters[1].ParameterType == fsharpOptionOfTaskCreationOptionsType + && parameters[2].ParameterType == fsharpOptionOfCancellationTokenType) + { + // This really does look like the correct method (and hence assembly). + _fsharpAsyncStartAsTaskGenericMethod = candidateMethodInfo; + _fsharpCoreAssembly = assembly; + break; + } + } + + return _fsharpCoreAssembly != null; + } + + private static bool TypesHaveSameIdentity(Type type1, Type type2) + { + return type1.Assembly == type2.Assembly + && string.Equals(type1.Namespace, type2.Namespace, StringComparison.Ordinal) + && string.Equals(type1.Name, type2.Name, StringComparison.Ordinal); + } + } +} diff --git a/src/Shared/Process/ProcessExtensions.cs b/src/Shared/Process/ProcessExtensions.cs new file mode 100644 index 0000000000..cf42a7e3a7 --- /dev/null +++ b/src/Shared/Process/ProcessExtensions.cs @@ -0,0 +1,113 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Runtime.InteropServices; + +namespace Microsoft.Extensions.Internal +{ + internal static class ProcessExtensions + { + private static readonly bool _isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows); + private static readonly TimeSpan _defaultTimeout = TimeSpan.FromSeconds(30); + + public static void KillTree(this Process process) + { + process.KillTree(_defaultTimeout); + } + + public static void KillTree(this Process process, TimeSpan timeout) + { + string stdout; + if (_isWindows) + { + RunProcessAndWaitForExit( + "taskkill", + $"/T /F /PID {process.Id}", + timeout, + out stdout); + } + else + { + var children = new HashSet(); + GetAllChildIdsUnix(process.Id, children, timeout); + foreach (var childId in children) + { + KillProcessUnix(childId, timeout); + } + KillProcessUnix(process.Id, timeout); + } + } + + private static void GetAllChildIdsUnix(int parentId, ISet children, TimeSpan timeout) + { + string stdout; + var exitCode = RunProcessAndWaitForExit( + "pgrep", + $"-P {parentId}", + timeout, + out stdout); + + if (exitCode == 0 && !string.IsNullOrEmpty(stdout)) + { + using (var reader = new StringReader(stdout)) + { + while (true) + { + var text = reader.ReadLine(); + if (text == null) + { + return; + } + + int id; + if (int.TryParse(text, out id)) + { + children.Add(id); + // Recursively get the children + GetAllChildIdsUnix(id, children, timeout); + } + } + } + } + } + + private static void KillProcessUnix(int processId, TimeSpan timeout) + { + string stdout; + RunProcessAndWaitForExit( + "kill", + $"-TERM {processId}", + timeout, + out stdout); + } + + private static int RunProcessAndWaitForExit(string fileName, string arguments, TimeSpan timeout, out string stdout) + { + var startInfo = new ProcessStartInfo + { + FileName = fileName, + Arguments = arguments, + RedirectStandardOutput = true, + UseShellExecute = false + }; + + var process = Process.Start(startInfo); + + stdout = null; + if (process.WaitForExit((int)timeout.TotalMilliseconds)) + { + stdout = process.StandardOutput.ReadToEnd(); + } + else + { + process.Kill(); + } + + return process.ExitCode; + } + } +} diff --git a/src/Shared/PropertyActivator/PropertyActivator.cs b/src/Shared/PropertyActivator/PropertyActivator.cs new file mode 100644 index 0000000000..925f6a76ae --- /dev/null +++ b/src/Shared/PropertyActivator/PropertyActivator.cs @@ -0,0 +1,110 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Reflection; + +namespace Microsoft.Extensions.Internal +{ + internal class PropertyActivator + { + private readonly Func _valueAccessor; + private readonly Action _fastPropertySetter; + + public PropertyActivator( + PropertyInfo propertyInfo, + Func valueAccessor) + { + if (propertyInfo == null) + { + throw new ArgumentNullException(nameof(propertyInfo)); + } + + if (valueAccessor == null) + { + throw new ArgumentNullException(nameof(valueAccessor)); + } + + PropertyInfo = propertyInfo; + _valueAccessor = valueAccessor; + _fastPropertySetter = PropertyHelper.MakeFastPropertySetter(propertyInfo); + } + + public PropertyInfo PropertyInfo { get; private set; } + + public object Activate(object instance, TContext context) + { + if (instance == null) + { + throw new ArgumentNullException(nameof(instance)); + } + + var value = _valueAccessor(context); + _fastPropertySetter(instance, value); + return value; + } + + public static PropertyActivator[] GetPropertiesToActivate( + Type type, + Type activateAttributeType, + Func> createActivateInfo) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + if (activateAttributeType == null) + { + throw new ArgumentNullException(nameof(activateAttributeType)); + } + + if (createActivateInfo == null) + { + throw new ArgumentNullException(nameof(createActivateInfo)); + } + + return GetPropertiesToActivate(type, activateAttributeType, createActivateInfo, includeNonPublic: false); + } + + public static PropertyActivator[] GetPropertiesToActivate( + Type type, + Type activateAttributeType, + Func> createActivateInfo, + bool includeNonPublic) + { + if (type == null) + { + throw new ArgumentNullException(nameof(type)); + } + + if (activateAttributeType == null) + { + throw new ArgumentNullException(nameof(activateAttributeType)); + } + + if (createActivateInfo == null) + { + throw new ArgumentNullException(nameof(createActivateInfo)); + } + + var properties = type.GetRuntimeProperties() + .Where((property) => + { + return + property.IsDefined(activateAttributeType) && + property.GetIndexParameters().Length == 0 && + property.SetMethod != null && + !property.SetMethod.IsStatic; + }); + + if (!includeNonPublic) + { + properties = properties.Where(property => property.SetMethod.IsPublic); + } + + return properties.Select(createActivateInfo).ToArray(); + } + } +} \ No newline at end of file diff --git a/src/Shared/PropertyHelper/PropertyHelper.cs b/src/Shared/PropertyHelper/PropertyHelper.cs new file mode 100644 index 0000000000..27ba5661a4 --- /dev/null +++ b/src/Shared/PropertyHelper/PropertyHelper.cs @@ -0,0 +1,526 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Concurrent; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; + +namespace Microsoft.Extensions.Internal +{ + internal class PropertyHelper + { + // Delegate type for a by-ref property getter + private delegate TValue ByRefFunc(ref TDeclaringType arg); + + private static readonly MethodInfo CallPropertyGetterOpenGenericMethod = + typeof(PropertyHelper).GetTypeInfo().GetDeclaredMethod(nameof(CallPropertyGetter)); + + private static readonly MethodInfo CallPropertyGetterByReferenceOpenGenericMethod = + typeof(PropertyHelper).GetTypeInfo().GetDeclaredMethod(nameof(CallPropertyGetterByReference)); + + private static readonly MethodInfo CallNullSafePropertyGetterOpenGenericMethod = + typeof(PropertyHelper).GetTypeInfo().GetDeclaredMethod(nameof(CallNullSafePropertyGetter)); + + private static readonly MethodInfo CallNullSafePropertyGetterByReferenceOpenGenericMethod = + typeof(PropertyHelper).GetTypeInfo().GetDeclaredMethod(nameof(CallNullSafePropertyGetterByReference)); + + private static readonly MethodInfo CallPropertySetterOpenGenericMethod = + typeof(PropertyHelper).GetTypeInfo().GetDeclaredMethod(nameof(CallPropertySetter)); + + // Using an array rather than IEnumerable, as target will be called on the hot path numerous times. + private static readonly ConcurrentDictionary PropertiesCache = + new ConcurrentDictionary(); + + private static readonly ConcurrentDictionary VisiblePropertiesCache = + new ConcurrentDictionary(); + + private Action _valueSetter; + private Func _valueGetter; + + /// + /// Initializes a fast . + /// This constructor does not cache the helper. For caching, use . + /// + public PropertyHelper(PropertyInfo property) + { + if (property == null) + { + throw new ArgumentNullException(nameof(property)); + } + + Property = property; + Name = property.Name; + } + + /// + /// Gets the backing . + /// + public PropertyInfo Property { get; } + + /// + /// Gets (or sets in derived types) the property name. + /// + public virtual string Name { get; protected set; } + + /// + /// Gets the property value getter. + /// + public Func ValueGetter + { + get + { + if (_valueGetter == null) + { + _valueGetter = MakeFastPropertyGetter(Property); + } + + return _valueGetter; + } + } + + /// + /// Gets the property value setter. + /// + public Action ValueSetter + { + get + { + if (_valueSetter == null) + { + _valueSetter = MakeFastPropertySetter(Property); + } + + return _valueSetter; + } + } + + /// + /// Returns the property value for the specified . + /// + /// The object whose property value will be returned. + /// The property value. + public object GetValue(object instance) + { + return ValueGetter(instance); + } + + /// + /// Sets the property value for the specified . + /// + /// The object whose property value will be set. + /// The property value. + public void SetValue(object instance, object value) + { + ValueSetter(instance, value); + } + + /// + /// Creates and caches fast property helpers that expose getters for every public get property on the + /// underlying type. + /// + /// The type info to extract property accessors for. + /// A cached array of all public properties of the specified type. + /// + public static PropertyHelper[] GetProperties(TypeInfo typeInfo) + { + return GetProperties(typeInfo.AsType()); + } + + /// + /// Creates and caches fast property helpers that expose getters for every public get property on the + /// specified type. + /// + /// The type to extract property accessors for. + /// A cached array of all public properties of the specified type. + /// + public static PropertyHelper[] GetProperties(Type type) + { + return GetProperties(type, CreateInstance, PropertiesCache); + } + + /// + /// + /// Creates and caches fast property helpers that expose getters for every non-hidden get property + /// on the specified type. + /// + /// + /// excludes properties defined on base types that have been + /// hidden by definitions using the new keyword. + /// + /// + /// The type info to extract property accessors for. + /// + /// A cached array of all public properties of the specified type. + /// + public static PropertyHelper[] GetVisibleProperties(TypeInfo typeInfo) + { + return GetVisibleProperties(typeInfo.AsType(), CreateInstance, PropertiesCache, VisiblePropertiesCache); + } + + /// + /// + /// Creates and caches fast property helpers that expose getters for every non-hidden get property + /// on the specified type. + /// + /// + /// excludes properties defined on base types that have been + /// hidden by definitions using the new keyword. + /// + /// + /// The type to extract property accessors for. + /// + /// A cached array of all public properties of the specified type. + /// + public static PropertyHelper[] GetVisibleProperties(Type type) + { + return GetVisibleProperties(type, CreateInstance, PropertiesCache, VisiblePropertiesCache); + } + + /// + /// Creates a single fast property getter. The result is not cached. + /// + /// propertyInfo to extract the getter for. + /// a fast getter. + /// + /// This method is more memory efficient than a dynamically compiled lambda, and about the + /// same speed. + /// + public static Func MakeFastPropertyGetter(PropertyInfo propertyInfo) + { + Debug.Assert(propertyInfo != null); + + return MakeFastPropertyGetter( + propertyInfo, + CallPropertyGetterOpenGenericMethod, + CallPropertyGetterByReferenceOpenGenericMethod); + } + + /// + /// Creates a single fast property getter which is safe for a null input object. The result is not cached. + /// + /// propertyInfo to extract the getter for. + /// a fast getter. + /// + /// This method is more memory efficient than a dynamically compiled lambda, and about the + /// same speed. + /// + public static Func MakeNullSafeFastPropertyGetter(PropertyInfo propertyInfo) + { + Debug.Assert(propertyInfo != null); + + return MakeFastPropertyGetter( + propertyInfo, + CallNullSafePropertyGetterOpenGenericMethod, + CallNullSafePropertyGetterByReferenceOpenGenericMethod); + } + + private static Func MakeFastPropertyGetter( + PropertyInfo propertyInfo, + MethodInfo propertyGetterWrapperMethod, + MethodInfo propertyGetterByRefWrapperMethod) + { + Debug.Assert(propertyInfo != null); + + // Must be a generic method with a Func<,> parameter + Debug.Assert(propertyGetterWrapperMethod != null); + Debug.Assert(propertyGetterWrapperMethod.IsGenericMethodDefinition); + Debug.Assert(propertyGetterWrapperMethod.GetParameters().Length == 2); + + // Must be a generic method with a ByRefFunc<,> parameter + Debug.Assert(propertyGetterByRefWrapperMethod != null); + Debug.Assert(propertyGetterByRefWrapperMethod.IsGenericMethodDefinition); + Debug.Assert(propertyGetterByRefWrapperMethod.GetParameters().Length == 2); + + var getMethod = propertyInfo.GetMethod; + Debug.Assert(getMethod != null); + Debug.Assert(!getMethod.IsStatic); + Debug.Assert(getMethod.GetParameters().Length == 0); + + // Instance methods in the CLR can be turned into static methods where the first parameter + // is open over "target". This parameter is always passed by reference, so we have a code + // path for value types and a code path for reference types. + if (getMethod.DeclaringType.GetTypeInfo().IsValueType) + { + // Create a delegate (ref TDeclaringType) -> TValue + return MakeFastPropertyGetter( + typeof(ByRefFunc<,>), + getMethod, + propertyGetterByRefWrapperMethod); + } + else + { + // Create a delegate TDeclaringType -> TValue + return MakeFastPropertyGetter( + typeof(Func<,>), + getMethod, + propertyGetterWrapperMethod); + } + } + + private static Func MakeFastPropertyGetter( + Type openGenericDelegateType, + MethodInfo propertyGetMethod, + MethodInfo openGenericWrapperMethod) + { + var typeInput = propertyGetMethod.DeclaringType; + var typeOutput = propertyGetMethod.ReturnType; + + var delegateType = openGenericDelegateType.MakeGenericType(typeInput, typeOutput); + var propertyGetterDelegate = propertyGetMethod.CreateDelegate(delegateType); + + var wrapperDelegateMethod = openGenericWrapperMethod.MakeGenericMethod(typeInput, typeOutput); + var accessorDelegate = wrapperDelegateMethod.CreateDelegate( + typeof(Func), + propertyGetterDelegate); + + return (Func)accessorDelegate; + } + + /// + /// Creates a single fast property setter for reference types. The result is not cached. + /// + /// propertyInfo to extract the setter for. + /// a fast getter. + /// + /// This method is more memory efficient than a dynamically compiled lambda, and about the + /// same speed. This only works for reference types. + /// + public static Action MakeFastPropertySetter(PropertyInfo propertyInfo) + { + Debug.Assert(propertyInfo != null); + Debug.Assert(!propertyInfo.DeclaringType.GetTypeInfo().IsValueType); + + var setMethod = propertyInfo.SetMethod; + Debug.Assert(setMethod != null); + Debug.Assert(!setMethod.IsStatic); + Debug.Assert(setMethod.ReturnType == typeof(void)); + var parameters = setMethod.GetParameters(); + Debug.Assert(parameters.Length == 1); + + // Instance methods in the CLR can be turned into static methods where the first parameter + // is open over "target". This parameter is always passed by reference, so we have a code + // path for value types and a code path for reference types. + var typeInput = setMethod.DeclaringType; + var parameterType = parameters[0].ParameterType; + + // Create a delegate TDeclaringType -> { TDeclaringType.Property = TValue; } + var propertySetterAsAction = + setMethod.CreateDelegate(typeof(Action<,>).MakeGenericType(typeInput, parameterType)); + var callPropertySetterClosedGenericMethod = + CallPropertySetterOpenGenericMethod.MakeGenericMethod(typeInput, parameterType); + var callPropertySetterDelegate = + callPropertySetterClosedGenericMethod.CreateDelegate( + typeof(Action), propertySetterAsAction); + + return (Action)callPropertySetterDelegate; + } + + /// + /// Given an object, adds each instance property with a public get method as a key and its + /// associated value to a dictionary. + /// + /// If the object is already an instance, then a copy + /// is returned. + /// + /// + /// The implementation of PropertyHelper will cache the property accessors per-type. This is + /// faster when the same type is used multiple times with ObjectToDictionary. + /// + public static IDictionary ObjectToDictionary(object value) + { + var dictionary = value as IDictionary; + if (dictionary != null) + { + return new Dictionary(dictionary, StringComparer.OrdinalIgnoreCase); + } + + dictionary = new Dictionary(StringComparer.OrdinalIgnoreCase); + + if (value != null) + { + foreach (var helper in GetProperties(value.GetType())) + { + dictionary[helper.Name] = helper.GetValue(value); + } + } + + return dictionary; + } + + private static PropertyHelper CreateInstance(PropertyInfo property) + { + return new PropertyHelper(property); + } + + // Called via reflection + private static object CallPropertyGetter( + Func getter, + object target) + { + return getter((TDeclaringType)target); + } + + // Called via reflection + private static object CallPropertyGetterByReference( + ByRefFunc getter, + object target) + { + var unboxed = (TDeclaringType)target; + return getter(ref unboxed); + } + + // Called via reflection + private static object CallNullSafePropertyGetter( + Func getter, + object target) + { + if (target == null) + { + return null; + } + + return getter((TDeclaringType)target); + } + + // Called via reflection + private static object CallNullSafePropertyGetterByReference( + ByRefFunc getter, + object target) + { + if (target == null) + { + return null; + } + + var unboxed = (TDeclaringType)target; + return getter(ref unboxed); + } + + private static void CallPropertySetter( + Action setter, + object target, + object value) + { + setter((TDeclaringType)target, (TValue)value); + } + + protected static PropertyHelper[] GetVisibleProperties( + Type type, + Func createPropertyHelper, + ConcurrentDictionary allPropertiesCache, + ConcurrentDictionary visiblePropertiesCache) + { + PropertyHelper[] result; + if (visiblePropertiesCache.TryGetValue(type, out result)) + { + return result; + } + + // The simple and common case, this is normal POCO object - no need to allocate. + var allPropertiesDefinedOnType = true; + var allProperties = GetProperties(type, createPropertyHelper, allPropertiesCache); + foreach (var propertyHelper in allProperties) + { + if (propertyHelper.Property.DeclaringType != type) + { + allPropertiesDefinedOnType = false; + break; + } + } + + if (allPropertiesDefinedOnType) + { + result = allProperties; + visiblePropertiesCache.TryAdd(type, result); + return result; + } + + // There's some inherited properties here, so we need to check for hiding via 'new'. + var filteredProperties = new List(allProperties.Length); + foreach (var propertyHelper in allProperties) + { + var declaringType = propertyHelper.Property.DeclaringType; + if (declaringType == type) + { + filteredProperties.Add(propertyHelper); + continue; + } + + // If this property was declared on a base type then look for the definition closest to the + // the type to see if we should include it. + var ignoreProperty = false; + + // Walk up the hierarchy until we find the type that actually declares this + // PropertyInfo. + var currentTypeInfo = type.GetTypeInfo(); + var declaringTypeInfo = declaringType.GetTypeInfo(); + while (currentTypeInfo != null && currentTypeInfo != declaringTypeInfo) + { + // We've found a 'more proximal' public definition + var declaredProperty = currentTypeInfo.GetDeclaredProperty(propertyHelper.Name); + if (declaredProperty != null) + { + ignoreProperty = true; + break; + } + + currentTypeInfo = currentTypeInfo.BaseType?.GetTypeInfo(); + } + + if (!ignoreProperty) + { + filteredProperties.Add(propertyHelper); + } + } + + result = filteredProperties.ToArray(); + visiblePropertiesCache.TryAdd(type, result); + return result; + } + + protected static PropertyHelper[] GetProperties( + Type type, + Func createPropertyHelper, + ConcurrentDictionary cache) + { + // Unwrap nullable types. This means Nullable.Value and Nullable.HasValue will not be + // part of the sequence of properties returned by this method. + type = Nullable.GetUnderlyingType(type) ?? type; + + PropertyHelper[] helpers; + if (!cache.TryGetValue(type, out helpers)) + { + // We avoid loading indexed properties using the Where statement. + var properties = type.GetRuntimeProperties().Where(IsInterestingProperty); + + var typeInfo = type.GetTypeInfo(); + if (typeInfo.IsInterface) + { + // Reflection does not return information about inherited properties on the interface itself. + properties = properties.Concat(typeInfo.ImplementedInterfaces.SelectMany( + interfaceType => interfaceType.GetRuntimeProperties().Where(IsInterestingProperty))); + } + + helpers = properties.Select(p => createPropertyHelper(p)).ToArray(); + cache.TryAdd(type, helpers); + } + + return helpers; + } + + // Indexed properties are not useful (or valid) for grabbing properties off an object. + private static bool IsInterestingProperty(PropertyInfo property) + { + // For improving application startup time, do not use GetIndexParameters() api early in this check as it + // creates a copy of parameter array and also we would like to check for the presence of a get method + // and short circuit asap. + return property.GetMethod != null && + property.GetMethod.IsPublic && + !property.GetMethod.IsStatic && + property.GetMethod.GetParameters().Length == 0; + } + } +} diff --git a/src/Shared/RazorViews/AttributeValue.cs b/src/Shared/RazorViews/AttributeValue.cs new file mode 100644 index 0000000000..7a066a7040 --- /dev/null +++ b/src/Shared/RazorViews/AttributeValue.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; + +namespace Microsoft.Extensions.RazorViews +{ + internal class AttributeValue + { + public AttributeValue(string prefix, object value, bool literal) + { + Prefix = prefix; + Value = value; + Literal = literal; + } + + public string Prefix { get; } + + public object Value { get; } + + public bool Literal { get; } + + public static AttributeValue FromTuple(Tuple value) + { + return new AttributeValue(value.Item1, value.Item2, value.Item3); + } + + public static AttributeValue FromTuple(Tuple value) + { + return new AttributeValue(value.Item1, value.Item2, value.Item3); + } + + public static implicit operator AttributeValue(Tuple value) + { + return FromTuple(value); + } + } +} \ No newline at end of file diff --git a/src/Shared/RazorViews/BaseView.cs b/src/Shared/RazorViews/BaseView.cs new file mode 100644 index 0000000000..a171d8d1f2 --- /dev/null +++ b/src/Shared/RazorViews/BaseView.cs @@ -0,0 +1,279 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.Globalization; +using System.IO; +using System.Linq; +using System.Text; +using System.Text.Encodings.Web; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.Extensions.RazorViews +{ + /// + /// Infrastructure + /// + internal abstract class BaseView + { + private static readonly Encoding UTF8NoBOM = new UTF8Encoding(encoderShouldEmitUTF8Identifier: false, throwOnInvalidBytes: true); + private readonly Stack _textWriterStack = new Stack(); + + /// + /// The request context + /// + protected HttpContext Context { get; private set; } + + /// + /// The request + /// + protected HttpRequest Request { get; private set; } + + /// + /// The response + /// + protected HttpResponse Response { get; private set; } + + /// + /// The output stream + /// + protected TextWriter Output { get; private set; } + + /// + /// Html encoder used to encode content. + /// + protected HtmlEncoder HtmlEncoder { get; set; } = HtmlEncoder.Default; + + /// + /// Url encoder used to encode content. + /// + protected UrlEncoder UrlEncoder { get; set; } = UrlEncoder.Default; + + /// + /// JavaScript encoder used to encode content. + /// + protected JavaScriptEncoder JavaScriptEncoder { get; set; } = JavaScriptEncoder.Default; + + /// + /// Execute an individual request + /// + /// + public async Task ExecuteAsync(HttpContext context) + { + Context = context; + Request = Context.Request; + Response = Context.Response; + Output = new StreamWriter(Response.Body, UTF8NoBOM, 4096, leaveOpen: true); + await ExecuteAsync(); + Output.Dispose(); + } + + /// + /// Execute an individual request + /// + public abstract Task ExecuteAsync(); + + protected virtual void PushWriter(TextWriter writer) + { + if (writer == null) + { + throw new ArgumentNullException(nameof(writer)); + } + + _textWriterStack.Push(Output); + Output = writer; + } + + protected virtual TextWriter PopWriter() + { + Output = _textWriterStack.Pop(); + return Output; + } + + /// + /// Write the given value without HTML encoding directly to . + /// + /// The to write. + protected void WriteLiteral(object value) + { + WriteLiteral(Convert.ToString(value, CultureInfo.InvariantCulture)); + } + + /// + /// Write the given value without HTML encoding directly to . + /// + /// The to write. + protected void WriteLiteral(string value) + { + if (!string.IsNullOrEmpty(value)) + { + Output.Write(value); + } + } + + private List AttributeValues { get; set; } + + protected void WriteAttributeValue(string thingy, int startPostion, object value, int endValue, int dealyo, bool yesno) + { + if (AttributeValues == null) + { + AttributeValues = new List(); + } + + AttributeValues.Add(value.ToString()); + } + + private string AttributeEnding { get; set; } + + protected void BeginWriteAttribute(string name, string begining, int startPosition, string ending, int endPosition, int thingy) + { + Debug.Assert(string.IsNullOrEmpty(AttributeEnding)); + + Output.Write(begining); + AttributeEnding = ending; + } + + protected void EndWriteAttribute() + { + Debug.Assert(!string.IsNullOrEmpty(AttributeEnding)); + + var attributes = string.Join(" ", AttributeValues); + Output.Write(attributes); + AttributeValues = null; + + Output.Write(AttributeEnding); + AttributeEnding = null; + } + + /// + /// Writes the given attribute to the given writer + /// + /// The name of the attribute to write + /// The value of the prefix + /// The value of the suffix + /// The s to write. + protected void WriteAttribute( + string name, + string leader, + string trailer, + params AttributeValue[] values) + { + if (name == null) + { + throw new ArgumentNullException(nameof(name)); + } + + if (leader == null) + { + throw new ArgumentNullException(nameof(leader)); + } + + if (trailer == null) + { + throw new ArgumentNullException(nameof(trailer)); + } + + WriteLiteral(leader); + foreach (var value in values) + { + WriteLiteral(value.Prefix); + + // The special cases here are that the value we're writing might already be a string, or that the + // value might be a bool. If the value is the bool 'true' we want to write the attribute name + // instead of the string 'true'. If the value is the bool 'false' we don't want to write anything. + // Otherwise the value is another object (perhaps an HtmlString) and we'll ask it to format itself. + string stringValue; + if (value.Value is bool) + { + if ((bool)value.Value) + { + stringValue = name; + } + else + { + continue; + } + } + else + { + stringValue = value.Value as string; + } + + // Call the WriteTo(string) overload when possible + if (value.Literal && stringValue != null) + { + WriteLiteral(stringValue); + } + else if (value.Literal) + { + WriteLiteral(value.Value); + } + else if (stringValue != null) + { + Write(stringValue); + } + else + { + Write(value.Value); + } + } + WriteLiteral(trailer); + } + + /// + /// is invoked + /// + /// The to invoke + protected void Write(HelperResult result) + { + Write(result); + } + + /// + /// Writes the specified to . + /// + /// The to write. + /// + /// is invoked for types. + /// For all other types, the encoded result of is written to + /// . + /// + protected void Write(object value) + { + if (value is HelperResult helperResult) + { + helperResult.WriteTo(Output); + } + else + { + Write(Convert.ToString(value, CultureInfo.InvariantCulture)); + } + } + + /// + /// Writes the specified with HTML encoding to . + /// + /// The to write. + protected void Write(string value) + { + WriteLiteral(HtmlEncoder.Encode(value)); + } + + protected string HtmlEncodeAndReplaceLineBreaks(string input) + { + if (string.IsNullOrEmpty(input)) + { + return string.Empty; + } + + // Split on line breaks before passing it through the encoder. + return string.Join("
" + Environment.NewLine, + input.Split(new[] { "\r\n" }, StringSplitOptions.None) + .SelectMany(s => s.Split(new[] { '\r', '\n' }, StringSplitOptions.None)) + .Select(HtmlEncoder.Encode)); + } + } +} \ No newline at end of file diff --git a/src/Shared/RazorViews/HelperResult.cs b/src/Shared/RazorViews/HelperResult.cs new file mode 100644 index 0000000000..c79944aae6 --- /dev/null +++ b/src/Shared/RazorViews/HelperResult.cs @@ -0,0 +1,34 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; + +namespace Microsoft.Extensions.RazorViews +{ + /// + /// Represents a deferred write operation in a . + /// + internal class HelperResult + { + /// + /// Creates a new instance of . + /// + /// The delegate to invoke when is called. + public HelperResult(Action action) + { + WriteAction = action; + } + + public Action WriteAction { get; } + + /// + /// Method invoked to produce content from the . + /// + /// The instance to write to. + public void WriteTo(TextWriter writer) + { + WriteAction(writer); + } + } +} \ No newline at end of file diff --git a/src/Shared/SecurityHelper/SecurityHelper.cs b/src/Shared/SecurityHelper/SecurityHelper.cs new file mode 100644 index 0000000000..408ef6b224 --- /dev/null +++ b/src/Shared/SecurityHelper/SecurityHelper.cs @@ -0,0 +1,40 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using System.Security.Claims; + +namespace Microsoft.Extensions.Internal +{ + /// + /// Helper code used when implementing authentication middleware + /// + internal static class SecurityHelper + { + /// + /// Add all ClaimsIdentities from an additional ClaimPrincipal to the ClaimsPrincipal + /// Merges a new claims principal, placing all new identities first, and eliminating + /// any empty unauthenticated identities from context.User + /// + /// The containing existing . + /// The containing to be added. + public static ClaimsPrincipal MergeUserPrincipal(ClaimsPrincipal existingPrincipal, ClaimsPrincipal additionalPrincipal) + { + var newPrincipal = new ClaimsPrincipal(); + + // New principal identities go first + if (additionalPrincipal != null) + { + newPrincipal.AddIdentities(additionalPrincipal.Identities); + } + + // Then add any existing non empty or authenticated identities + if (existingPrincipal != null) + { + newPrincipal.AddIdentities(existingPrincipal.Identities.Where(i => i.IsAuthenticated || i.Claims.Any())); + } + return newPrincipal; + } + } +} diff --git a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs new file mode 100644 index 0000000000..8862611136 --- /dev/null +++ b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetails.cs @@ -0,0 +1,29 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + /// + /// Contains details for individual exception messages. + /// + internal class ExceptionDetails + { + /// + /// An individual exception + /// + public Exception Error { get; set; } + + /// + /// The generated stack frames + /// + public IEnumerable StackFrames { get; set; } + + /// + /// Gets or sets the summary message. + /// + public string ErrorMessage { get; set; } + } +} diff --git a/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs new file mode 100644 index 0000000000..2d1dd20710 --- /dev/null +++ b/src/Shared/StackTrace/ExceptionDetails/ExceptionDetailsProvider.cs @@ -0,0 +1,170 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.IO; +using System.Linq; +using System.Reflection; +using Microsoft.Extensions.FileProviders; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class ExceptionDetailsProvider + { + private readonly IFileProvider _fileProvider; + private readonly int _sourceCodeLineCount; + + public ExceptionDetailsProvider(IFileProvider fileProvider, int sourceCodeLineCount) + { + _fileProvider = fileProvider; + _sourceCodeLineCount = sourceCodeLineCount; + } + + public IEnumerable GetDetails(Exception exception) + { + var exceptions = FlattenAndReverseExceptionTree(exception); + + foreach (var ex in exceptions) + { + yield return new ExceptionDetails + { + Error = ex, + StackFrames = StackTraceHelper.GetFrames(ex) + .Select(frame => GetStackFrameSourceCodeInfo( + frame.MethodDisplayInfo.ToString(), + frame.FilePath, + frame.LineNumber)) + }; + } + } + + private static IEnumerable FlattenAndReverseExceptionTree(Exception ex) + { + // ReflectionTypeLoadException is special because the details are in + // the LoaderExceptions property + var typeLoadException = ex as ReflectionTypeLoadException; + if (typeLoadException != null) + { + var typeLoadExceptions = new List(); + foreach (var loadException in typeLoadException.LoaderExceptions) + { + typeLoadExceptions.AddRange(FlattenAndReverseExceptionTree(loadException)); + } + + typeLoadExceptions.Add(ex); + return typeLoadExceptions; + } + + var list = new List(); + if (ex is AggregateException aggregateException) + { + list.Add(ex); + foreach (var innerException in aggregateException.Flatten().InnerExceptions) + { + list.Add(innerException); + } + } + + else + { + while (ex != null) + { + list.Add(ex); + ex = ex.InnerException; + } + list.Reverse(); + } + + return list; + } + + // make it internal to enable unit testing + internal StackFrameSourceCodeInfo GetStackFrameSourceCodeInfo(string method, string filePath, int lineNumber) + { + var stackFrame = new StackFrameSourceCodeInfo + { + Function = method, + File = filePath, + Line = lineNumber + }; + + if (string.IsNullOrEmpty(stackFrame.File)) + { + return stackFrame; + } + + IEnumerable lines = null; + if (File.Exists(stackFrame.File)) + { + lines = File.ReadLines(stackFrame.File); + } + else + { + // Handle relative paths and embedded files + var fileInfo = _fileProvider.GetFileInfo(stackFrame.File); + if (fileInfo.Exists) + { + // ReadLines doesn't accept a stream. Use ReadLines as its more efficient + // relative to reading lines via stream reader + if (!string.IsNullOrEmpty(fileInfo.PhysicalPath)) + { + lines = File.ReadLines(fileInfo.PhysicalPath); + } + else + { + lines = ReadLines(fileInfo); + } + } + } + + if (lines != null) + { + ReadFrameContent(stackFrame, lines, stackFrame.Line, stackFrame.Line); + } + + return stackFrame; + } + + // make it internal to enable unit testing + internal void ReadFrameContent( + StackFrameSourceCodeInfo frame, + IEnumerable allLines, + int errorStartLineNumberInFile, + int errorEndLineNumberInFile) + { + // Get the line boundaries in the file to be read and read all these lines at once into an array. + var preErrorLineNumberInFile = Math.Max(errorStartLineNumberInFile - _sourceCodeLineCount, 1); + var postErrorLineNumberInFile = errorEndLineNumberInFile + _sourceCodeLineCount; + var codeBlock = allLines + .Skip(preErrorLineNumberInFile - 1) + .Take(postErrorLineNumberInFile - preErrorLineNumberInFile + 1) + .ToArray(); + + var numOfErrorLines = (errorEndLineNumberInFile - errorStartLineNumberInFile) + 1; + var errorStartLineNumberInArray = errorStartLineNumberInFile - preErrorLineNumberInFile; + + frame.PreContextLine = preErrorLineNumberInFile; + frame.PreContextCode = codeBlock.Take(errorStartLineNumberInArray).ToArray(); + frame.ContextCode = codeBlock + .Skip(errorStartLineNumberInArray) + .Take(numOfErrorLines) + .ToArray(); + frame.PostContextCode = codeBlock + .Skip(errorStartLineNumberInArray + numOfErrorLines) + .ToArray(); + } + + private static IEnumerable ReadLines(IFileInfo fileInfo) + { + using (var reader = new StreamReader(fileInfo.CreateReadStream())) + { + string line; + while ((line = reader.ReadLine()) != null) + { + yield return line; + } + } + } + } +} diff --git a/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs b/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs new file mode 100644 index 0000000000..b1c0ccc188 --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/MethodDisplayInfo.cs @@ -0,0 +1,49 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; +using System.Text; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class MethodDisplayInfo + { + public string DeclaringTypeName { get; set; } + + public string Name { get; set; } + + public string GenericArguments { get; set; } + + public string SubMethod { get; set; } + + public IEnumerable Parameters { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + if (!string.IsNullOrEmpty(DeclaringTypeName)) + { + builder + .Append(DeclaringTypeName) + .Append("."); + } + + builder.Append(Name); + builder.Append(GenericArguments); + + builder.Append("("); + builder.Append(string.Join(", ", Parameters.Select(p => p.ToString()))); + builder.Append(")"); + + if (!string.IsNullOrEmpty(SubMethod)) + { + builder.Append("+"); + builder.Append(SubMethod); + builder.Append("()"); + } + + return builder.ToString(); + } + } +} diff --git a/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs b/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs new file mode 100644 index 0000000000..1199a8386d --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/ParameterDisplayInfo.cs @@ -0,0 +1,33 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Text; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class ParameterDisplayInfo + { + public string Name { get; set; } + + public string Type { get; set; } + + public string Prefix { get; set; } + + public override string ToString() + { + var builder = new StringBuilder(); + if (!string.IsNullOrEmpty(Prefix)) + { + builder + .Append(Prefix) + .Append(" "); + } + + builder.Append(Type); + builder.Append(" "); + builder.Append(Name); + + return builder.ToString(); + } + } +} diff --git a/src/Shared/StackTrace/StackFrame/PortablePdbReader.cs b/src/Shared/StackTrace/StackFrame/PortablePdbReader.cs new file mode 100644 index 0000000000..ff6a4947f8 --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/PortablePdbReader.cs @@ -0,0 +1,135 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Diagnostics; +using System.IO; +using System.Reflection; +using System.Reflection.Metadata; +using System.Reflection.Metadata.Ecma335; +using System.Reflection.PortableExecutable; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class PortablePdbReader : IDisposable + { + private readonly Dictionary _cache = + new Dictionary(StringComparer.Ordinal); + + public void PopulateStackFrame(StackFrameInfo frameInfo, MethodBase method, int IlOffset) + { + if (method.Module.Assembly.IsDynamic) + { + return; + } + + var metadataReader = GetMetadataReader(method.Module.Assembly.Location); + + if (metadataReader == null) + { + return; + } + + var methodToken = MetadataTokens.Handle(method.MetadataToken); + + Debug.Assert(methodToken.Kind == HandleKind.MethodDefinition); + + var handle = ((MethodDefinitionHandle)methodToken).ToDebugInformationHandle(); + + if (!handle.IsNil) + { + var methodDebugInfo = metadataReader.GetMethodDebugInformation(handle); + var sequencePoints = methodDebugInfo.GetSequencePoints(); + SequencePoint? bestPointSoFar = null; + + foreach (var point in sequencePoints) + { + if (point.Offset > IlOffset) + { + break; + } + + if (point.StartLine != SequencePoint.HiddenLine) + { + bestPointSoFar = point; + } + } + + if (bestPointSoFar.HasValue) + { + frameInfo.LineNumber = bestPointSoFar.Value.StartLine; + frameInfo.FilePath = metadataReader.GetString(metadataReader.GetDocument(bestPointSoFar.Value.Document).Name); + } + } + } + + private MetadataReader GetMetadataReader(string assemblyPath) + { + MetadataReaderProvider provider = null; + if (!_cache.TryGetValue(assemblyPath, out provider)) + { + var pdbPath = GetPdbPath(assemblyPath); + + if (!string.IsNullOrEmpty(pdbPath) && File.Exists(pdbPath) && IsPortable(pdbPath)) + { + var pdbStream = File.OpenRead(pdbPath); + provider = MetadataReaderProvider.FromPortablePdbStream(pdbStream); + } + + _cache[assemblyPath] = provider; + } + + return provider?.GetMetadataReader(); + } + + private static string GetPdbPath(string assemblyPath) + { + if (string.IsNullOrEmpty(assemblyPath)) + { + return null; + } + + if (File.Exists(assemblyPath)) + { + var peStream = File.OpenRead(assemblyPath); + + using (var peReader = new PEReader(peStream)) + { + foreach (var entry in peReader.ReadDebugDirectory()) + { + if (entry.Type == DebugDirectoryEntryType.CodeView) + { + var codeViewData = peReader.ReadCodeViewDebugDirectoryData(entry); + var peDirectory = Path.GetDirectoryName(assemblyPath); + return Path.Combine(peDirectory, Path.GetFileName(codeViewData.Path)); + } + } + } + } + + return null; + } + + private static bool IsPortable(string pdbPath) + { + using (var pdbStream = File.OpenRead(pdbPath)) + { + return pdbStream.ReadByte() == 'B' && + pdbStream.ReadByte() == 'S' && + pdbStream.ReadByte() == 'J' && + pdbStream.ReadByte() == 'B'; + } + } + + public void Dispose() + { + foreach (var entry in _cache) + { + entry.Value?.Dispose(); + } + + _cache.Clear(); + } + } +} diff --git a/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs b/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs new file mode 100644 index 0000000000..ffd91f213c --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/StackFrameInfo.cs @@ -0,0 +1,18 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Diagnostics; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class StackFrameInfo + { + public int LineNumber { get; set; } + + public string FilePath { get; set; } + + public StackFrame StackFrame { get; set; } + + public MethodDisplayInfo MethodDisplayInfo { get; set; } + } +} diff --git a/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs b/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs new file mode 100644 index 0000000000..2932e083b1 --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/StackFrameSourceCodeInfo.cs @@ -0,0 +1,54 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Collections.Generic; +using System.Linq; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + /// + /// Contains the source code where the exception occurred. + /// + internal class StackFrameSourceCodeInfo + { + /// + /// Function containing instruction + /// + public string Function { get; set; } + + /// + /// File containing the instruction + /// + public string File { get; set; } + + /// + /// The line number of the instruction + /// + public int Line { get; set; } + + /// + /// The line preceding the frame line + /// + public int PreContextLine { get; set; } + + /// + /// Lines of code before the actual error line(s). + /// + public IEnumerable PreContextCode { get; set; } = Enumerable.Empty(); + + /// + /// Line(s) of code responsible for the error. + /// + public IEnumerable ContextCode { get; set; } = Enumerable.Empty(); + + /// + /// Lines of code after the actual error line(s). + /// + public IEnumerable PostContextCode { get; set; } = Enumerable.Empty(); + + /// + /// Specific error details for this stack frame. + /// + public string ErrorDetails { get; set; } + } +} diff --git a/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs b/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs new file mode 100644 index 0000000000..5ce9a40903 --- /dev/null +++ b/src/Shared/StackTrace/StackFrame/StackTraceHelper.cs @@ -0,0 +1,261 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Diagnostics; +using System.Linq; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.ExceptionServices; +using Microsoft.Extensions.Internal; + +namespace Microsoft.Extensions.StackTrace.Sources +{ + internal class StackTraceHelper + { + public static IList GetFrames(Exception exception) + { + var frames = new List(); + + if (exception == null) + { + return frames; + } + + using (var portablePdbReader = new PortablePdbReader()) + { + var needFileInfo = true; + var stackTrace = new System.Diagnostics.StackTrace(exception, needFileInfo); + var stackFrames = stackTrace.GetFrames(); + + if (stackFrames == null) + { + return frames; + } + + for (var i = 0; i < stackFrames.Length; i++) + { + var frame = stackFrames[i]; + var method = frame.GetMethod(); + + // Always show last stackFrame + if (!ShowInStackTrace(method) && i < stackFrames.Length - 1) + { + continue; + } + + var stackFrame = new StackFrameInfo + { + StackFrame = frame, + FilePath = frame.GetFileName(), + LineNumber = frame.GetFileLineNumber(), + MethodDisplayInfo = GetMethodDisplayString(frame.GetMethod()), + }; + + if (string.IsNullOrEmpty(stackFrame.FilePath)) + { + // .NET Framework and older versions of mono don't support portable PDBs + // so we read it manually to get file name and line information + portablePdbReader.PopulateStackFrame(stackFrame, method, frame.GetILOffset()); + } + + frames.Add(stackFrame); + } + + return frames; + } + } + + internal static MethodDisplayInfo GetMethodDisplayString(MethodBase method) + { + // Special case: no method available + if (method == null) + { + return null; + } + + var methodDisplayInfo = new MethodDisplayInfo(); + + // Type name + var type = method.DeclaringType; + + var methodName = method.Name; + + if (type != null && type.IsDefined(typeof(CompilerGeneratedAttribute)) && + (typeof(IAsyncStateMachine).IsAssignableFrom(type) || typeof(IEnumerator).IsAssignableFrom(type))) + { + // Convert StateMachine methods to correct overload +MoveNext() + if (TryResolveStateMachineMethod(ref method, out type)) + { + methodDisplayInfo.SubMethod = methodName; + } + } + // ResolveStateMachineMethod may have set declaringType to null + if (type != null) + { + methodDisplayInfo.DeclaringTypeName = TypeNameHelper.GetTypeDisplayName(type, includeGenericParameterNames: true); + } + + // Method name + methodDisplayInfo.Name = method.Name; + if (method.IsGenericMethod) + { + var genericArguments = string.Join(", ", method.GetGenericArguments() + .Select(arg => TypeNameHelper.GetTypeDisplayName(arg, fullName: false, includeGenericParameterNames: true))); + methodDisplayInfo.GenericArguments += "<" + genericArguments + ">"; + } + + // Method parameters + methodDisplayInfo.Parameters = method.GetParameters().Select(parameter => + { + var parameterType = parameter.ParameterType; + + var prefix = string.Empty; + if (parameter.IsOut) + { + prefix = "out"; + } + else if (parameterType != null && parameterType.IsByRef) + { + prefix = "ref"; + } + + var parameterTypeString = "?"; + if (parameterType != null) + { + if (parameterType.IsByRef) + { + parameterType = parameterType.GetElementType(); + } + + parameterTypeString = TypeNameHelper.GetTypeDisplayName(parameterType, fullName: false, includeGenericParameterNames: true); + } + + return new ParameterDisplayInfo + { + Prefix = prefix, + Name = parameter.Name, + Type = parameterTypeString, + }; + }); + + return methodDisplayInfo; + } + + private static bool ShowInStackTrace(MethodBase method) + { + Debug.Assert(method != null); + + // Don't show any methods marked with the StackTraceHiddenAttribute + // https://github.com/dotnet/coreclr/pull/14652 + if (HasStackTraceHiddenAttribute(method)) + { + return false; + } + + + var type = method.DeclaringType; + if (type == null) + { + return true; + } + + if (HasStackTraceHiddenAttribute(type)) + { + return false; + } + + // Fallbacks for runtime pre-StackTraceHiddenAttribute + if (type == typeof(ExceptionDispatchInfo) && method.Name == "Throw") + { + return false; + } + else if (type == typeof(TaskAwaiter) || + type == typeof(TaskAwaiter<>) || + type == typeof(ConfiguredTaskAwaitable.ConfiguredTaskAwaiter) || + type == typeof(ConfiguredTaskAwaitable<>.ConfiguredTaskAwaiter)) + { + switch (method.Name) + { + case "HandleNonSuccessAndDebuggerNotification": + case "ThrowForNonSuccess": + case "ValidateEnd": + case "GetResult": + return false; + } + } + + return true; + } + + private static bool TryResolveStateMachineMethod(ref MethodBase method, out Type declaringType) + { + Debug.Assert(method != null); + Debug.Assert(method.DeclaringType != null); + + declaringType = method.DeclaringType; + + var parentType = declaringType.DeclaringType; + if (parentType == null) + { + return false; + } + + var methods = parentType.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Static | BindingFlags.Instance | BindingFlags.DeclaredOnly); + if (methods == null) + { + return false; + } + + foreach (var candidateMethod in methods) + { + var attributes = candidateMethod.GetCustomAttributes(); + if (attributes == null) + { + continue; + } + + foreach (var asma in attributes) + { + if (asma.StateMachineType == declaringType) + { + method = candidateMethod; + declaringType = candidateMethod.DeclaringType; + // Mark the iterator as changed; so it gets the + annotation of the original method + // async statemachines resolve directly to their builder methods so aren't marked as changed + return asma is IteratorStateMachineAttribute; + } + } + } + + return false; + } + + private static bool HasStackTraceHiddenAttribute(MemberInfo memberInfo) + { + IList attributes; + try + { + // Accessing MembmerInfo.GetCustomAttributesData throws for some types (such as types in dynamically generated assemblies). + // We'll skip looking up StackTraceHiddenAttributes on such types. + attributes = memberInfo.GetCustomAttributesData(); + } + catch + { + return false; + } + + for (var i = 0; i < attributes.Count; i++) + { + if (attributes[i].AttributeType.Name == "StackTraceHiddenAttribute") + { + return true; + } + } + + return false; + } + } +} diff --git a/src/Shared/WebEncoders/Properties/EncoderResources.cs b/src/Shared/WebEncoders/Properties/EncoderResources.cs new file mode 100644 index 0000000000..3474ae82c5 --- /dev/null +++ b/src/Shared/WebEncoders/Properties/EncoderResources.cs @@ -0,0 +1,38 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Globalization; + +namespace Microsoft.Extensions.WebEncoders.Sources +{ + // TODO using a resx file. project.json, unfortunately, fails to embed resx files when there are also compile items + // in the contentFiles section. Revisit once we convert repos to MSBuild + internal static class EncoderResources + { + /// + /// Invalid {0}, {1} or {2} length. + /// + internal static readonly string WebEncoders_InvalidCountOffsetOrLength = "Invalid {0}, {1} or {2} length."; + + /// + /// Malformed input: {0} is an invalid input length. + /// + internal static readonly string WebEncoders_MalformedInput = "Malformed input: {0} is an invalid input length."; + + /// + /// Invalid {0}, {1} or {2} length. + /// + internal static string FormatWebEncoders_InvalidCountOffsetOrLength(object p0, object p1, object p2) + { + return string.Format(CultureInfo.CurrentCulture, WebEncoders_InvalidCountOffsetOrLength, p0, p1, p2); + } + + /// + /// Malformed input: {0} is an invalid input length. + /// + internal static string FormatWebEncoders_MalformedInput(object p0) + { + return string.Format(CultureInfo.CurrentCulture, WebEncoders_MalformedInput, p0); + } + } +} diff --git a/src/Shared/WebEncoders/WebEncoders.cs b/src/Shared/WebEncoders/WebEncoders.cs new file mode 100644 index 0000000000..17068ae67a --- /dev/null +++ b/src/Shared/WebEncoders/WebEncoders.cs @@ -0,0 +1,388 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Diagnostics; +using System.Globalization; +using Microsoft.Extensions.WebEncoders.Sources; + +#if WebEncoders_In_WebUtilities +namespace Microsoft.AspNetCore.WebUtilities +#else +namespace Microsoft.Extensions.Internal +#endif +{ + /// + /// Contains utility APIs to assist with common encoding and decoding operations. + /// +#if WebEncoders_In_WebUtilities + public +#else + internal +#endif + static class WebEncoders + { + private static readonly byte[] EmptyBytes = new byte[0]; + + /// + /// Decodes a base64url-encoded string. + /// + /// The base64url-encoded input to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws if the input is malformed. + /// + public static byte[] Base64UrlDecode(string input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + return Base64UrlDecode(input, offset: 0, count: input.Length); + } + + /// + /// Decodes a base64url-encoded substring of a given string. + /// + /// A string containing the base64url-encoded input to decode. + /// The position in at which decoding should begin. + /// The number of characters in to decode. + /// The base64url-decoded form of the input. + /// + /// The input must not contain any whitespace or padding characters. + /// Throws if the input is malformed. + /// + public static byte[] Base64UrlDecode(string input, int offset, int count) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + + // Special-case empty input + if (count == 0) + { + return EmptyBytes; + } + + // Create array large enough for the Base64 characters, not just shorter Base64-URL-encoded form. + var buffer = new char[GetArraySizeRequiredToDecode(count)]; + + return Base64UrlDecode(input, offset, buffer, bufferOffset: 0, count: count); + } + + /// + /// Decodes a base64url-encoded into a byte[]. + /// + /// A string containing the base64url-encoded input to decode. + /// The position in at which decoding should begin. + /// + /// Scratch buffer to hold the s to decode. Array must be large enough to hold + /// and characters as well as Base64 padding + /// characters. Content is not preserved. + /// + /// + /// The offset into at which to begin writing the s to decode. + /// + /// The number of characters in to decode. + /// The base64url-decoded form of the . + /// + /// The input must not contain any whitespace or padding characters. + /// Throws if the input is malformed. + /// + public static byte[] Base64UrlDecode(string input, int offset, char[] buffer, int bufferOffset, int count) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + if (buffer == null) + { + throw new ArgumentNullException(nameof(buffer)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + if (bufferOffset < 0) + { + throw new ArgumentOutOfRangeException(nameof(bufferOffset)); + } + + if (count == 0) + { + return EmptyBytes; + } + + // Assumption: input is base64url encoded without padding and contains no whitespace. + + var paddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + var arraySizeRequired = checked(count + paddingCharsToAdd); + Debug.Assert(arraySizeRequired % 4 == 0, "Invariant: Array length must be a multiple of 4."); + + if (buffer.Length - bufferOffset < arraySizeRequired) + { + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + EncoderResources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(bufferOffset), + nameof(input)), + nameof(count)); + } + + // Copy input into buffer, fixing up '-' -> '+' and '_' -> '/'. + var i = bufferOffset; + for (var j = offset; i - bufferOffset < count; i++, j++) + { + var ch = input[j]; + if (ch == '-') + { + buffer[i] = '+'; + } + else if (ch == '_') + { + buffer[i] = '/'; + } + else + { + buffer[i] = ch; + } + } + + // Add the padding characters back. + for (; paddingCharsToAdd > 0; i++, paddingCharsToAdd--) + { + buffer[i] = '='; + } + + // Decode. + // If the caller provided invalid base64 chars, they'll be caught here. + return Convert.FromBase64CharArray(buffer, bufferOffset, arraySizeRequired); + } + + /// + /// Gets the minimum char[] size required for decoding of characters + /// with the method. + /// + /// The number of characters to decode. + /// + /// The minimum char[] size required for decoding of characters. + /// + public static int GetArraySizeRequiredToDecode(int count) + { + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + + if (count == 0) + { + return 0; + } + + var numPaddingCharsToAdd = GetNumBase64PaddingCharsToAddForDecode(count); + + return checked(count + numPaddingCharsToAdd); + } + + /// + /// Encodes using base64url encoding. + /// + /// The binary input to encode. + /// The base64url-encoded form of . + public static string Base64UrlEncode(byte[] input) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + return Base64UrlEncode(input, offset: 0, count: input.Length); + } + + /// + /// Encodes using base64url encoding. + /// + /// The binary input to encode. + /// The offset into at which to begin encoding. + /// The number of bytes from to encode. + /// The base64url-encoded form of . + public static string Base64UrlEncode(byte[] input, int offset, int count) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + + // Special-case empty input + if (count == 0) + { + return string.Empty; + } + + var buffer = new char[GetArraySizeRequiredToEncode(count)]; + var numBase64Chars = Base64UrlEncode(input, offset, buffer, outputOffset: 0, count: count); + + return new String(buffer, startIndex: 0, length: numBase64Chars); + } + + /// + /// Encodes using base64url encoding. + /// + /// The binary input to encode. + /// The offset into at which to begin encoding. + /// + /// Buffer to receive the base64url-encoded form of . Array must be large enough to + /// hold characters and the full base64-encoded form of + /// , including padding characters. + /// + /// + /// The offset into at which to begin writing the base64url-encoded form of + /// . + /// + /// The number of bytes from to encode. + /// + /// The number of characters written to , less any padding characters. + /// + public static int Base64UrlEncode(byte[] input, int offset, char[] output, int outputOffset, int count) + { + if (input == null) + { + throw new ArgumentNullException(nameof(input)); + } + if (output == null) + { + throw new ArgumentNullException(nameof(output)); + } + + ValidateParameters(input.Length, nameof(input), offset, count); + if (outputOffset < 0) + { + throw new ArgumentOutOfRangeException(nameof(outputOffset)); + } + + var arraySizeRequired = GetArraySizeRequiredToEncode(count); + if (output.Length - outputOffset < arraySizeRequired) + { + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + EncoderResources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(outputOffset), + nameof(output)), + nameof(count)); + } + + // Special-case empty input. + if (count == 0) + { + return 0; + } + + // Use base64url encoding with no padding characters. See RFC 4648, Sec. 5. + + // Start with default Base64 encoding. + var numBase64Chars = Convert.ToBase64CharArray(input, offset, count, output, outputOffset); + + // Fix up '+' -> '-' and '/' -> '_'. Drop padding characters. + for (var i = outputOffset; i - outputOffset < numBase64Chars; i++) + { + var ch = output[i]; + if (ch == '+') + { + output[i] = '-'; + } + else if (ch == '/') + { + output[i] = '_'; + } + else if (ch == '=') + { + // We've reached a padding character; truncate the remainder. + return i - outputOffset; + } + } + + return numBase64Chars; + } + + /// + /// Get the minimum output char[] size required for encoding + /// s with the method. + /// + /// The number of characters to encode. + /// + /// The minimum output char[] size required for encoding s. + /// + public static int GetArraySizeRequiredToEncode(int count) + { + var numWholeOrPartialInputBlocks = checked(count + 2) / 3; + return checked(numWholeOrPartialInputBlocks * 4); + } + + private static int GetNumBase64PaddingCharsInString(string str) + { + // Assumption: input contains a well-formed base64 string with no whitespace. + + // base64 guaranteed have 0 - 2 padding characters. + if (str[str.Length - 1] == '=') + { + if (str[str.Length - 2] == '=') + { + return 2; + } + return 1; + } + return 0; + } + + private static int GetNumBase64PaddingCharsToAddForDecode(int inputLength) + { + switch (inputLength % 4) + { + case 0: + return 0; + case 2: + return 2; + case 3: + return 1; + default: + throw new FormatException( + string.Format( + CultureInfo.CurrentCulture, + EncoderResources.WebEncoders_MalformedInput, + inputLength)); + } + } + + private static void ValidateParameters(int bufferLength, string inputName, int offset, int count) + { + if (offset < 0) + { + throw new ArgumentOutOfRangeException(nameof(offset)); + } + if (count < 0) + { + throw new ArgumentOutOfRangeException(nameof(count)); + } + if (bufferLength - offset < count) + { + throw new ArgumentException( + string.Format( + CultureInfo.CurrentCulture, + EncoderResources.WebEncoders_InvalidCountOffsetOrLength, + nameof(count), + nameof(offset), + inputName), + nameof(count)); + } + } + } +} diff --git a/src/Shared/test/Shared.Tests/ClosedGenericMatcherTest.cs b/src/Shared/test/Shared.Tests/ClosedGenericMatcherTest.cs new file mode 100644 index 0000000000..e71a792692 --- /dev/null +++ b/src/Shared/test/Shared.Tests/ClosedGenericMatcherTest.cs @@ -0,0 +1,360 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections; +using System.Collections.Generic; +using System.Collections.ObjectModel; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class ClosedGenericMatcherTest + { + // queryType, interfaceType, expectedResult + public static TheoryData ExtractGenericInterfaceDataSet + { + get + { + return new TheoryData + { + // Closed generic types that match given open generic type. + { + typeof(IEnumerable), + typeof(IEnumerable<>), + typeof(IEnumerable) + }, + { + typeof(IReadOnlyList), + typeof(IReadOnlyList<>), + typeof(IReadOnlyList) + }, + { + typeof(KeyValuePair), + typeof(KeyValuePair<,>), + typeof(KeyValuePair) + }, + // Closed generic interfaces that implement sub-interface of given open generic type. + { + typeof(ICollection), + typeof(IEnumerable<>), + typeof(IEnumerable) + }, + { + typeof(IReadOnlyList), + typeof(IEnumerable<>), + typeof(IEnumerable) + }, + { + typeof(IDictionary), + typeof(IEnumerable<>), + typeof(IEnumerable>) + }, + // Class that implements closed generic based on given open generic interface. + { + typeof(BaseClass), + typeof(IDictionary<,>), + typeof(IDictionary) + }, + { + typeof(BaseClass), + typeof(IEquatable<>), + typeof(IEquatable) + }, + { + typeof(BaseClass), + typeof(ICollection<>), + typeof(ICollection>) + }, + // Derived class that implements closed generic based on given open generic interface. + { + typeof(DerivedClass), + typeof(IDictionary<,>), + typeof(IDictionary) + }, + { + typeof(DerivedClass), + typeof(IEquatable<>), + typeof(IEquatable) + }, + { + typeof(DerivedClass), + typeof(ICollection<>), + typeof(ICollection>) + }, + // Derived class that also implements another interface. + { + typeof(DerivedClassWithComparable), + typeof(IDictionary<,>), + typeof(IDictionary) + }, + { + typeof(DerivedClassWithComparable), + typeof(IEquatable<>), + typeof(IEquatable) + }, + { + typeof(DerivedClassWithComparable), + typeof(ICollection<>), + typeof(ICollection>) + }, + { + typeof(DerivedClassWithComparable), + typeof(IComparable<>), + typeof(IComparable) + }, + // Derived class using system implementation. + { + typeof(DerivedClassFromSystemImplementation), + typeof(ICollection<>), + typeof(ICollection) + }, + { + typeof(DerivedClassFromSystemImplementation), + typeof(IReadOnlyList<>), + typeof(IReadOnlyList) + }, + { + typeof(DerivedClassFromSystemImplementation), + typeof(IEnumerable<>), + typeof(IEnumerable) + }, + // Not given an open generic type. + { + typeof(IEnumerable), + typeof(IEnumerable), + null + }, + { + typeof(IEnumerable), + typeof(IEnumerable), + null + }, + { + typeof(IReadOnlyList), + typeof(BaseClass), + null + }, + { + typeof(KeyValuePair<,>), + typeof(KeyValuePair), + null + }, + // Not a match. + { + typeof(IEnumerable), + typeof(IReadOnlyList<>), + null + }, + { + typeof(IList), + typeof(IReadOnlyList<>), + null + }, + { + typeof(IDictionary), + typeof(KeyValuePair<,>), + null + }, + }; + } + } + + [Theory] + [MemberData(nameof(ExtractGenericInterfaceDataSet))] + public void ExtractGenericInterface_ReturnsExpectedType( + Type queryType, + Type interfaceType, + Type expectedResult) + { + // Arrange & Act + var result = ClosedGenericMatcher.ExtractGenericInterface(queryType, interfaceType); + + // Assert + Assert.Equal(expectedResult, result); + } + + // IEnumerable is preferred because it is defined on the more-derived type. + [Fact] + public void ExtractGenericInterface_MultipleDefinitionsInherited() + { + // Arrange + var type = typeof(TwoIEnumerableImplementationsInherited); + + // Act + var result = ClosedGenericMatcher.ExtractGenericInterface(type, typeof(IEnumerable<>)); + + // Sort + Assert.Equal(typeof(IEnumerable), result); + } + + // IEnumerable is preferred because we sort by Ordinal on the full name. + [Fact] + public void ExtractGenericInterface_MultipleDefinitionsOnSameType() + { + // Arrange + var type = typeof(TwoIEnumerableImplementationsOnSameClass); + + // Act + var result = ClosedGenericMatcher.ExtractGenericInterface(type, typeof(IEnumerable<>)); + + // Sort + Assert.Equal(typeof(IEnumerable), result); + } + + private class TwoIEnumerableImplementationsOnSameClass : IEnumerable, IEnumerable + { + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + } + + private class TwoIEnumerableImplementationsInherited : List, IEnumerable + { + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + } + + private class BaseClass : IDictionary, IEquatable + { + object IDictionary.this[string key] + { + get + { + throw new NotImplementedException(); + } + + set + { + throw new NotImplementedException(); + } + } + + int ICollection>.Count + { + get + { + throw new NotImplementedException(); + } + } + + bool ICollection>.IsReadOnly + { + get + { + throw new NotImplementedException(); + } + } + + ICollection IDictionary.Keys + { + get + { + throw new NotImplementedException(); + } + } + + ICollection IDictionary.Values + { + get + { + throw new NotImplementedException(); + } + } + + public bool Equals(BaseClass other) + { + throw new NotImplementedException(); + } + + void ICollection>.Add(KeyValuePair item) + { + throw new NotImplementedException(); + } + + void IDictionary.Add(string key, object value) + { + throw new NotImplementedException(); + } + + void ICollection>.Clear() + { + throw new NotImplementedException(); + } + + bool ICollection>.Contains(KeyValuePair item) + { + throw new NotImplementedException(); + } + + bool IDictionary.ContainsKey(string key) + { + throw new NotImplementedException(); + } + + void ICollection>.CopyTo(KeyValuePair[] array, int arrayIndex) + { + throw new NotImplementedException(); + } + + IEnumerator IEnumerable.GetEnumerator() + { + throw new NotImplementedException(); + } + + IEnumerator> IEnumerable>.GetEnumerator() + { + throw new NotImplementedException(); + } + + bool ICollection>.Remove(KeyValuePair item) + { + throw new NotImplementedException(); + } + + bool IDictionary.Remove(string key) + { + throw new NotImplementedException(); + } + + bool IDictionary.TryGetValue(string key, out object value) + { + throw new NotImplementedException(); + } + } + + private class DerivedClass : BaseClass + { + } + + private class DerivedClassWithComparable : DerivedClass, IComparable + { + public int CompareTo(DerivedClassWithComparable other) + { + throw new NotImplementedException(); + } + } + + private class DerivedClassFromSystemImplementation : Collection + { + } + } +} \ No newline at end of file diff --git a/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryHolderTest.cs b/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryHolderTest.cs new file mode 100644 index 0000000000..9a0951eb27 --- /dev/null +++ b/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryHolderTest.cs @@ -0,0 +1,91 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class CopyOnWriteDictionaryHolderTest + { + [Fact] + public void ReadOperation_DelegatesToSourceDictionary_IfNoMutationsArePerformed() + { + // Arrange + var source = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "test-key", "test-value" }, + { "key2", "key2-value" } + }; + + var holder = new CopyOnWriteDictionaryHolder(source); + + // Act and Assert + Assert.Equal("key2-value", holder["key2"]); + Assert.Equal(2, holder.Count); + Assert.Equal(new string[] { "test-key", "key2" }, holder.Keys.ToArray()); + Assert.Equal(new object[] { "test-value", "key2-value" }, holder.Values.ToArray()); + Assert.True(holder.ContainsKey("test-key")); + + object value; + Assert.False(holder.TryGetValue("different-key", out value)); + + Assert.False(holder.HasBeenCopied); + Assert.Same(source, holder.ReadDictionary); + } + + [Fact] + public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceAValueIsChanged() + { + // Arrange + var source = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "key1", "value1" }, + { "key2", "value2" } + }; + + var holder = new CopyOnWriteDictionaryHolder(source); + + // Act + holder["key2"] = "value3"; + + // Assert + Assert.Equal("value2", source["key2"]); + Assert.Equal(2, holder.Count); + Assert.Equal("value1", holder["key1"]); + Assert.Equal("value3", holder["key2"]); + + Assert.True(holder.HasBeenCopied); + Assert.NotSame(source, holder.ReadDictionary); + } + + [Fact] + public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceValueIsAdded() + { + // Arrange + var source = new Dictionary(StringComparer.OrdinalIgnoreCase) + { + { "key1", "value1" }, + { "key2", "value2" } + }; + + var holder = new CopyOnWriteDictionaryHolder(source); + + // Act + holder.Add("key3", "value3"); + holder.Remove("key1"); + + // Assert + Assert.Equal(2, source.Count); + Assert.Equal("value1", source["key1"]); + Assert.Equal(2, holder.Count); + Assert.Equal("value2", holder["KeY2"]); + Assert.Equal("value3", holder["key3"]); + + Assert.True(holder.HasBeenCopied); + Assert.NotSame(source, holder.ReadDictionary); + } + } +} diff --git a/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryTest.cs b/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryTest.cs new file mode 100644 index 0000000000..c1b54036d4 --- /dev/null +++ b/src/Shared/test/Shared.Tests/CopyOnWriteDictionaryTest.cs @@ -0,0 +1,109 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using Moq; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class CopyOnWriteDictionaryTest + { + [Fact] + public void ReadOperation_DelegatesToSourceDictionary_IfNoMutationsArePerformed() + { + // Arrange + var values = new List(); + var enumerator = Mock.Of>>(); + var sourceDictionary = new Mock>(MockBehavior.Strict); + sourceDictionary + .SetupGet(d => d.Count) + .Returns(100) + .Verifiable(); + sourceDictionary + .SetupGet(d => d.Values) + .Returns(values) + .Verifiable(); + sourceDictionary + .Setup(d => d.ContainsKey("test-key")) + .Returns(value: true) + .Verifiable(); + sourceDictionary + .Setup(d => d.GetEnumerator()) + .Returns(enumerator) + .Verifiable(); + sourceDictionary + .Setup(d => d["key2"]) + .Returns("key2-value") + .Verifiable(); + object value; + sourceDictionary.Setup(d => d.TryGetValue("different-key", out value)) + .Returns(false) + .Verifiable(); + + var copyOnWriteDictionary = new CopyOnWriteDictionary(sourceDictionary.Object, + StringComparer.OrdinalIgnoreCase); + + // Act and Assert + Assert.Equal("key2-value", copyOnWriteDictionary["key2"]); + Assert.Equal(100, copyOnWriteDictionary.Count); + Assert.Same(values, copyOnWriteDictionary.Values); + Assert.True(copyOnWriteDictionary.ContainsKey("test-key")); + Assert.Same(enumerator, copyOnWriteDictionary.GetEnumerator()); + Assert.False(copyOnWriteDictionary.TryGetValue("different-key", out value)); + sourceDictionary.Verify(); + } + + [Fact] + public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceAValueIsChanged() + { + // Arrange + var values = new List(); + var sourceDictionary = new Dictionary + { + { "key1", "value1" }, + { "key2", "value2" } + }; + var copyOnWriteDictionary = new CopyOnWriteDictionary( + sourceDictionary, + StringComparer.OrdinalIgnoreCase); + + // Act + copyOnWriteDictionary["key2"] = "value3"; + + // Assert + Assert.Equal("value2", sourceDictionary["key2"]); + Assert.Equal(2, copyOnWriteDictionary.Count); + Assert.Equal("value1", copyOnWriteDictionary["key1"]); + Assert.Equal("value3", copyOnWriteDictionary["key2"]); + } + + [Fact] + public void ReadOperation_DoesNotDelegateToSourceDictionary_OnceDictionaryIsModified() + { + // Arrange + var values = new List(); + var sourceDictionary = new Dictionary + { + { "key1", "value1" }, + { "key2", "value2" } + }; + var copyOnWriteDictionary = new CopyOnWriteDictionary( + sourceDictionary, + StringComparer.OrdinalIgnoreCase); + + // Act + copyOnWriteDictionary.Add("key3", "value3"); + copyOnWriteDictionary.Remove("key1"); + + + // Assert + Assert.Equal(2, sourceDictionary.Count); + Assert.Equal("value1", sourceDictionary["key1"]); + Assert.Equal(2, copyOnWriteDictionary.Count); + Assert.Equal("value2", copyOnWriteDictionary["KeY2"]); + Assert.Equal("value3", copyOnWriteDictionary["key3"]); + } + } +} diff --git a/src/Shared/test/Shared.Tests/Microsoft.AspNetCore.Shared.Tests.csproj b/src/Shared/test/Shared.Tests/Microsoft.AspNetCore.Shared.Tests.csproj new file mode 100644 index 0000000000..48b2099db7 --- /dev/null +++ b/src/Shared/test/Shared.Tests/Microsoft.AspNetCore.Shared.Tests.csproj @@ -0,0 +1,29 @@ + + + + netcoreapp2.1;net461 + portable + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Shared/test/Shared.Tests/ObjectMethodExecutorTest.cs b/src/Shared/test/Shared.Tests/ObjectMethodExecutorTest.cs new file mode 100644 index 0000000000..1c26ef1de1 --- /dev/null +++ b/src/Shared/test/Shared.Tests/ObjectMethodExecutorTest.cs @@ -0,0 +1,634 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using Microsoft.FSharp.Control; +using Microsoft.FSharp.Core; +using System; +using System.Collections.Generic; +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Threading; +using System.Threading.Tasks; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class ObjectMethodExecutorTest + { + private TestObject _targetObject = new TestObject(); + private TypeInfo targetTypeInfo = typeof(TestObject).GetTypeInfo(); + + [Fact] + public void ExecuteValueMethod() + { + var executor = GetExecutorForMethod("ValueMethod"); + var result = executor.Execute( + _targetObject, + new object[] { 10, 20 }); + Assert.False(executor.IsMethodAsync); + Assert.Equal(30, (int)result); + } + + [Fact] + public void ExecuteVoidValueMethod() + { + var executor = GetExecutorForMethod("VoidValueMethod"); + var result = executor.Execute( + _targetObject, + new object[] { 10 }); + Assert.False(executor.IsMethodAsync); + Assert.Null(result); + } + + [Fact] + public void ExecuteValueMethodWithReturnType() + { + var executor = GetExecutorForMethod("ValueMethodWithReturnType"); + var result = executor.Execute( + _targetObject, + new object[] { 10 }); + var resultObject = Assert.IsType(result); + Assert.False(executor.IsMethodAsync); + Assert.Equal("Hello", resultObject.value); + } + + [Fact] + public void ExecuteValueMethodUpdateValue() + { + var executor = GetExecutorForMethod("ValueMethodUpdateValue"); + var parameter = new TestObject(); + var result = executor.Execute( + _targetObject, + new object[] { parameter }); + var resultObject = Assert.IsType(result); + Assert.False(executor.IsMethodAsync); + Assert.Equal("HelloWorld", resultObject.value); + } + + [Fact] + public void ExecuteValueMethodWithReturnTypeThrowsException() + { + var executor = GetExecutorForMethod("ValueMethodWithReturnTypeThrowsException"); + var parameter = new TestObject(); + Assert.False(executor.IsMethodAsync); + Assert.Throws( + () => executor.Execute( + _targetObject, + new object[] { parameter })); + } + + [Fact] + public async Task ExecuteValueMethodAsync() + { + var executor = GetExecutorForMethod("ValueMethodAsync"); + var result = await executor.ExecuteAsync( + _targetObject, + new object[] { 10, 20 }); + Assert.True(executor.IsMethodAsync); + Assert.Equal(30, (int)result); + } + + [Fact] + public async Task ExecuteValueMethodWithReturnTypeAsync() + { + var executor = GetExecutorForMethod("ValueMethodWithReturnTypeAsync"); + var result = await executor.ExecuteAsync( + _targetObject, + new object[] { 10 }); + var resultObject = Assert.IsType(result); + Assert.True(executor.IsMethodAsync); + Assert.Equal("Hello", resultObject.value); + } + + [Fact] + public async Task ExecuteValueMethodUpdateValueAsync() + { + var executor = GetExecutorForMethod("ValueMethodUpdateValueAsync"); + var parameter = new TestObject(); + var result = await executor.ExecuteAsync( + _targetObject, + new object[] { parameter }); + var resultObject = Assert.IsType(result); + Assert.True(executor.IsMethodAsync); + Assert.Equal("HelloWorld", resultObject.value); + } + + [Fact] + public async Task ExecuteValueMethodWithReturnTypeThrowsExceptionAsync() + { + var executor = GetExecutorForMethod("ValueMethodWithReturnTypeThrowsExceptionAsync"); + var parameter = new TestObject(); + Assert.True(executor.IsMethodAsync); + await Assert.ThrowsAsync( + async () => await executor.ExecuteAsync( + _targetObject, + new object[] { parameter })); + } + + [Fact] + public async Task ExecuteValueMethodWithReturnVoidThrowsExceptionAsync() + { + var executor = GetExecutorForMethod("ValueMethodWithReturnVoidThrowsExceptionAsync"); + var parameter = new TestObject(); + Assert.True(executor.IsMethodAsync); + await Assert.ThrowsAsync( + async () => await executor.ExecuteAsync( + _targetObject, + new object[] { parameter })); + } + + [Fact] + public void GetDefaultValueForParameters_ReturnsSuppliedValues() + { + var suppliedDefaultValues = new object[] { 123, "test value" }; + var executor = GetExecutorForMethod("MethodWithMultipleParameters", suppliedDefaultValues); + Assert.Equal(suppliedDefaultValues[0], executor.GetDefaultValueForParameter(0)); + Assert.Equal(suppliedDefaultValues[1], executor.GetDefaultValueForParameter(1)); + Assert.Throws(() => executor.GetDefaultValueForParameter(2)); + } + + [Fact] + public void GetDefaultValueForParameters_ThrowsIfNoneWereSupplied() + { + var executor = GetExecutorForMethod("MethodWithMultipleParameters"); + Assert.Throws(() => executor.GetDefaultValueForParameter(0)); + } + + [Fact] + public async void TargetMethodReturningCustomAwaitableOfReferenceType_CanInvokeViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableOfReferenceTypeAsync"); + + // Act + var result = await (TestAwaitable)executor.Execute(_targetObject, new object[] { "Hello", 123 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(TestObject), executor.AsyncResultType); + Assert.NotNull(result); + Assert.Equal("Hello 123", result.value); + } + + [Fact] + public async void TargetMethodReturningCustomAwaitableOfValueType_CanInvokeViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableOfValueTypeAsync"); + + // Act + var result = await (TestAwaitable)executor.Execute(_targetObject, new object[] { 123, 456 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(int), executor.AsyncResultType); + Assert.Equal(579, result); + } + + [Fact] + public async void TargetMethodReturningCustomAwaitableOfReferenceType_CanInvokeViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableOfReferenceTypeAsync"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { "Hello", 123 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(TestObject), executor.AsyncResultType); + Assert.NotNull(result); + Assert.IsType(result); + Assert.Equal("Hello 123", ((TestObject)result).value); + } + + [Fact] + public async void TargetMethodReturningCustomAwaitableOfValueType_CanInvokeViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableOfValueTypeAsync"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { 123, 456 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(int), executor.AsyncResultType); + Assert.NotNull(result); + Assert.IsType(result); + Assert.Equal(579, (int)result); + } + + [Fact] + public async void TargetMethodReturningAwaitableOfVoidType_CanInvokeViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("VoidValueMethodAsync"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { 123 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(void), executor.AsyncResultType); + Assert.Null(result); + } + + [Fact] + public async void TargetMethodReturningAwaitableWithICriticalNotifyCompletion_UsesUnsafeOnCompleted() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableWithICriticalNotifyCompletion"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[0]); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("Used UnsafeOnCompleted", (string)result); + } + + [Fact] + public async void TargetMethodReturningAwaitableWithoutICriticalNotifyCompletion_UsesOnCompleted() + { + // Arrange + var executor = GetExecutorForMethod("CustomAwaitableWithoutICriticalNotifyCompletion"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[0]); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("Used OnCompleted", (string)result); + } + + [Fact] + public async void TargetMethodReturningValueTaskOfValueType_CanBeInvokedViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("ValueTaskOfValueType"); + + // Act + var result = await (ValueTask)executor.Execute(_targetObject, new object[] { 123 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(int), executor.AsyncResultType); + Assert.Equal(123, result); + } + + [Fact] + public async void TargetMethodReturningValueTaskOfReferenceType_CanBeInvokedViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("ValueTaskOfReferenceType"); + + // Act + var result = await (ValueTask)executor.Execute(_targetObject, new object[] { "test result" }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("test result", result); + } + + [Fact] + public async void TargetMethodReturningValueTaskOfValueType_CanBeInvokedViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("ValueTaskOfValueType"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { 123 }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(int), executor.AsyncResultType); + Assert.NotNull(result); + Assert.Equal(123, (int)result); + } + + [Fact] + public async void TargetMethodReturningValueTaskOfReferenceType_CanBeInvokedViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("ValueTaskOfReferenceType"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { "test result" }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("test result", result); + } + + [Fact] + public async void TargetMethodReturningFSharpAsync_CanBeInvokedViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("FSharpAsyncMethod"); + + // Act + var fsharpAsync = (FSharpAsync)executor.Execute(_targetObject, new object[] { "test result" }); + var result = await FSharpAsync.StartAsTask(fsharpAsync, + FSharpOption.None, + FSharpOption.None); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("test result", result); + } + + [Fact] + public async void TargetMethodReturningFailingFSharpAsync_CanBeInvokedViaExecute() + { + // Arrange + var executor = GetExecutorForMethod("FSharpAsyncFailureMethod"); + + // Act + var fsharpAsync = (FSharpAsync)executor.Execute(_targetObject, new object[] { "test result" }); + var resultTask = FSharpAsync.StartAsTask(fsharpAsync, + FSharpOption.None, + FSharpOption.None); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + + var exception = await Assert.ThrowsAsync(async () => await resultTask); + Assert.IsType(exception.InnerException); + Assert.Equal("Test exception", exception.InnerException.Message); + } + + [Fact] + public async void TargetMethodReturningFSharpAsync_CanBeInvokedViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("FSharpAsyncMethod"); + + // Act + var result = await executor.ExecuteAsync(_targetObject, new object[] { "test result" }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + Assert.Equal("test result", result); + } + + [Fact] + public async void TargetMethodReturningFailingFSharpAsync_CanBeInvokedViaExecuteAsync() + { + // Arrange + var executor = GetExecutorForMethod("FSharpAsyncFailureMethod"); + + // Act + var resultTask = executor.ExecuteAsync(_targetObject, new object[] { "test result" }); + + // Assert + Assert.True(executor.IsMethodAsync); + Assert.Same(typeof(string), executor.AsyncResultType); + + var exception = await Assert.ThrowsAsync(async () => await resultTask); + Assert.IsType(exception.InnerException); + Assert.Equal("Test exception", exception.InnerException.Message); + } + + private ObjectMethodExecutor GetExecutorForMethod(string methodName) + { + var method = typeof(TestObject).GetMethod(methodName); + return ObjectMethodExecutor.Create(method, targetTypeInfo); + } + + private ObjectMethodExecutor GetExecutorForMethod(string methodName, object[] parameterDefaultValues) + { + var method = typeof(TestObject).GetMethod(methodName); + return ObjectMethodExecutor.Create(method, targetTypeInfo, parameterDefaultValues); + } + + public class TestObject + { + public string value; + public int ValueMethod(int i, int j) + { + return i + j; + } + + public void VoidValueMethod(int i) + { + + } + + public TestObject ValueMethodWithReturnType(int i) + { + return new TestObject() { value = "Hello" }; ; + } + + public TestObject ValueMethodWithReturnTypeThrowsException(TestObject i) + { + throw new NotImplementedException("Not Implemented Exception"); + } + + public TestObject ValueMethodUpdateValue(TestObject parameter) + { + parameter.value = "HelloWorld"; + return parameter; + } + + public Task ValueMethodAsync(int i, int j) + { + return Task.FromResult(i + j); + } + + public async Task VoidValueMethodAsync(int i) + { + await ValueMethodAsync(3, 4); + } + public Task ValueMethodWithReturnTypeAsync(int i) + { + return Task.FromResult(new TestObject() { value = "Hello" }); + } + + public async Task ValueMethodWithReturnVoidThrowsExceptionAsync(TestObject i) + { + await Task.CompletedTask; + throw new NotImplementedException("Not Implemented Exception"); + } + + public async Task ValueMethodWithReturnTypeThrowsExceptionAsync(TestObject i) + { + await Task.CompletedTask; + throw new NotImplementedException("Not Implemented Exception"); + } + + public Task ValueMethodUpdateValueAsync(TestObject parameter) + { + parameter.value = "HelloWorld"; + return Task.FromResult(parameter); + } + + public TestAwaitable CustomAwaitableOfReferenceTypeAsync( + string input1, + int input2) + { + return new TestAwaitable(new TestObject + { + value = $"{input1} {input2}" + }); + } + + public TestAwaitable CustomAwaitableOfValueTypeAsync( + int input1, + int input2) + { + return new TestAwaitable(input1 + input2); + } + + public TestAwaitableWithICriticalNotifyCompletion CustomAwaitableWithICriticalNotifyCompletion() + { + return new TestAwaitableWithICriticalNotifyCompletion(); + } + + public TestAwaitableWithoutICriticalNotifyCompletion CustomAwaitableWithoutICriticalNotifyCompletion() + { + return new TestAwaitableWithoutICriticalNotifyCompletion(); + } + + public ValueTask ValueTaskOfValueType(int result) + { + return new ValueTask(result); + } + + public ValueTask ValueTaskOfReferenceType(string result) + { + return new ValueTask(result); + } + + public void MethodWithMultipleParameters(int valueTypeParam, string referenceTypeParam) + { + } + + public FSharpAsync FSharpAsyncMethod(string parameter) + { + return FSharpAsync.AwaitTask(Task.FromResult(parameter)); + } + + public FSharpAsync FSharpAsyncFailureMethod(string parameter) + { + return FSharpAsync.AwaitTask( + Task.FromException(new InvalidOperationException("Test exception"))); + } + } + + public class TestAwaitable + { + private T _result; + private bool _isCompleted; + private List _onCompletedCallbacks = new List(); + + public TestAwaitable(T result) + { + _result = result; + + // Simulate a brief delay before completion + ThreadPool.QueueUserWorkItem(_ => + { + Thread.Sleep(100); + SetCompleted(); + }); + } + + private void SetCompleted() + { + _isCompleted = true; + + foreach (var callback in _onCompletedCallbacks) + { + callback(); + } + } + + public TestAwaiter GetAwaiter() + { + return new TestAwaiter(this); + } + + public struct TestAwaiter : INotifyCompletion + { + private TestAwaitable _owner; + + public TestAwaiter(TestAwaitable owner) : this() + { + _owner = owner; + } + + public bool IsCompleted => _owner._isCompleted; + + public void OnCompleted(Action continuation) + { + if (_owner._isCompleted) + { + continuation(); + } + else + { + _owner._onCompletedCallbacks.Add(continuation); + } + } + + public T GetResult() + { + return _owner._result; + } + } + } + + public class TestAwaitableWithICriticalNotifyCompletion + { + public TestAwaiterWithICriticalNotifyCompletion GetAwaiter() + => new TestAwaiterWithICriticalNotifyCompletion(); + } + + public class TestAwaitableWithoutICriticalNotifyCompletion + { + public TestAwaiterWithoutICriticalNotifyCompletion GetAwaiter() + => new TestAwaiterWithoutICriticalNotifyCompletion(); + } + + public class TestAwaiterWithICriticalNotifyCompletion + : CompletionTrackingAwaiterBase, ICriticalNotifyCompletion + { + } + + public class TestAwaiterWithoutICriticalNotifyCompletion + : CompletionTrackingAwaiterBase, INotifyCompletion + { + } + + public class CompletionTrackingAwaiterBase + { + private string _result; + + public bool IsCompleted { get; private set; } + + public string GetResult() => _result; + + public void OnCompleted(Action continuation) + { + _result = "Used OnCompleted"; + IsCompleted = true; + continuation(); + } + + public void UnsafeOnCompleted(Action continuation) + { + _result = "Used UnsafeOnCompleted"; + IsCompleted = true; + continuation(); + } + } + } +} diff --git a/src/Shared/test/Shared.Tests/PropertyActivatorTest.cs b/src/Shared/test/Shared.Tests/PropertyActivatorTest.cs new file mode 100644 index 0000000000..a5cb1605b3 --- /dev/null +++ b/src/Shared/test/Shared.Tests/PropertyActivatorTest.cs @@ -0,0 +1,187 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Reflection; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class PropertyActivatorTest + { + [Fact] + public void Activate_InvokesValueAccessorWithExpectedValue() + { + // Arrange + var instance = new TestClass(); + var typeInfo = instance.GetType().GetTypeInfo(); + var property = typeInfo.GetDeclaredProperty("IntProperty"); + var invokedWith = -1; + var activator = new PropertyActivator( + property, + valueAccessor: (val) => + { + invokedWith = val; + return val; + }); + + // Act + activator.Activate(instance, 123); + + // Assert + Assert.Equal(123, invokedWith); + } + + [Fact] + public void Activate_SetsPropertyValue() + { + // Arrange + var instance = new TestClass(); + var typeInfo = instance.GetType().GetTypeInfo(); + var property = typeInfo.GetDeclaredProperty("IntProperty"); + var activator = new PropertyActivator(property, valueAccessor: (val) => val + 1); + + // Act + activator.Activate(instance, 123); + + // Assert + Assert.Equal(124, instance.IntProperty); + } + + [Fact] + public void GetPropertiesToActivate_RestrictsActivatableProperties() + { + // Arrange + var instance = new TestClass(); + var typeInfo = instance.GetType().GetTypeInfo(); + var expectedPropertyInfo = typeInfo.GetDeclaredProperty("ActivatableProperty"); + + // Act + var propertiesToActivate = PropertyActivator.GetPropertiesToActivate( + type: typeof(TestClass), + activateAttributeType: typeof(TestActivateAttribute), + createActivateInfo: + (propertyInfo) => new PropertyActivator(propertyInfo, valueAccessor: (val) => val + 1)); + + // Assert + Assert.Collection( + propertiesToActivate, + (activator) => + { + Assert.Equal(expectedPropertyInfo, activator.PropertyInfo); + }); + } + + [Fact] + public void GetPropertiesToActivate_CanCreateCustomPropertyActivators() + { + // Arrange + var instance = new TestClass(); + var typeInfo = instance.GetType().GetTypeInfo(); + var expectedPropertyInfo = typeInfo.GetDeclaredProperty("IntProperty"); + + // Act + var propertiesToActivate = PropertyActivator.GetPropertiesToActivate( + type: typeof(TestClass), + activateAttributeType: typeof(TestActivateAttribute), + createActivateInfo: + (propertyInfo) => new PropertyActivator(expectedPropertyInfo, valueAccessor: (val) => val + 1)); + + // Assert + Assert.Collection( + propertiesToActivate, + (activator) => + { + Assert.Equal(expectedPropertyInfo, activator.PropertyInfo); + }); + } + + [Fact] + public void GetPropertiesToActivate_ExcludesNonPublic() + { + // Arrange + var instance = new TestClassWithPropertyVisiblity(); + var typeInfo = instance.GetType().GetTypeInfo(); + var expectedPropertyInfo = typeInfo.GetDeclaredProperty("Public"); + + // Act + var propertiesToActivate = PropertyActivator.GetPropertiesToActivate( + typeof(TestClassWithPropertyVisiblity), + typeof(TestActivateAttribute), + (propertyInfo) => new PropertyActivator(propertyInfo, valueAccessor: (val) => val)); + + // Assert + Assert.Single(propertiesToActivate); + Assert.Single(propertiesToActivate, p => p.PropertyInfo == expectedPropertyInfo); + } + + [Fact] + public void GetPropertiesToActivate_IncludesNonPublic() + { + // Arrange + var instance = new TestClassWithPropertyVisiblity(); + var typeInfo = instance.GetType().GetTypeInfo(); + + // Act + var propertiesToActivate = PropertyActivator.GetPropertiesToActivate( + typeof(TestClassWithPropertyVisiblity), + typeof(TestActivateAttribute), + (propertyInfo) => new PropertyActivator(propertyInfo, valueAccessor: (val) => val), + includeNonPublic: true); + + // Assert + Assert.Equal(5, propertiesToActivate.Length); + } + + private class TestClass + { + public int IntProperty { get; set; } + + [TestActivate] + public int ActivatableProperty { get; set; } + + [TestActivate] + public int NoSetterActivatableProperty { get; } + + [TestActivate] + public int this[int something] // Not activatable + { + get + { + return 0; + } + } + + [TestActivate] + public static int StaticActivatablProperty { get; set; } + } + + private class TestClassWithPropertyVisiblity + { + [TestActivate] + public int Public { get; set; } + + [TestActivate] + protected int Protected { get; set; } + + [TestActivate] + internal int Internal { get; set; } + + [TestActivate] + protected internal int ProtectedInternal {get; set; } + + [TestActivate] + private int Private { get; set; } + } + + [AttributeUsage(AttributeTargets.Property)] + private class TestActivateAttribute : Attribute + { + } + + private class ActivationInfo + { + public string Name { get; set; } + } + } +} diff --git a/src/Shared/test/Shared.Tests/PropertyHelperTest.cs b/src/Shared/test/Shared.Tests/PropertyHelperTest.cs new file mode 100644 index 0000000000..19cf08b370 --- /dev/null +++ b/src/Shared/test/Shared.Tests/PropertyHelperTest.cs @@ -0,0 +1,831 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Reflection; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class PropertyHelperTest + { + [Fact] + public void PropertyHelper_ReturnsNameCorrectly() + { + // Arrange + var anonymous = new { foo = "bar" }; + var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property; + + // Act + var helper = new PropertyHelper(property); + + // Assert + Assert.Equal("foo", property.Name); + Assert.Equal("foo", helper.Name); + } + + [Fact] + public void PropertyHelper_ReturnsValueCorrectly() + { + // Arrange + var anonymous = new { bar = "baz" }; + var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property; + + // Act + var helper = new PropertyHelper(property); + + // Assert + Assert.Equal("bar", helper.Name); + Assert.Equal("baz", helper.GetValue(anonymous)); + } + + [Fact] + public void PropertyHelper_ReturnsGetterDelegate() + { + // Arrange + var anonymous = new { bar = "baz" }; + var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property; + + // Act + var helper = new PropertyHelper(property); + + // Assert + Assert.NotNull(helper.ValueGetter); + Assert.Equal("baz", helper.ValueGetter(anonymous)); + } + + [Fact] + public void SetValue_SetsPropertyValue() + { + // Arrange + var expected = "new value"; + var instance = new BaseClass { PropA = "old value" }; + var helper = PropertyHelper.GetProperties( + instance.GetType()).First(prop => prop.Name == "PropA"); + + // Act + helper.SetValue(instance, expected); + + // Assert + Assert.Equal(expected, instance.PropA); + } + + [Fact] + public void PropertyHelper_ReturnsSetterDelegate() + { + // Arrange + var expected = "new value"; + var instance = new BaseClass { PropA = "old value" }; + var helper = PropertyHelper.GetProperties( + instance.GetType()).First(prop => prop.Name == "PropA"); + + // Act and Assert + Assert.NotNull(helper.ValueSetter); + helper.ValueSetter(instance, expected); + + // Assert + Assert.Equal(expected, instance.PropA); + } + + [Fact] + public void PropertyHelper_ReturnsValueCorrectly_ForValueTypes() + { + // Arrange + var anonymous = new { foo = 32 }; + var property = PropertyHelper.GetProperties(anonymous.GetType()).First().Property; + + // Act + var helper = new PropertyHelper(property); + + // Assert + Assert.Equal("foo", helper.Name); + Assert.Equal(32, helper.GetValue(anonymous)); + } + + [Fact] + public void PropertyHelper_ReturnsCachedPropertyHelper() + { + // Arrange + var anonymous = new { foo = "bar" }; + + // Act + var helpers1 = PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo()); + var helpers2 = PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo()); + + // Assert + Assert.Single(helpers1); + Assert.Same(helpers1, helpers2); + Assert.Same(helpers1[0], helpers2[0]); + } + + [Fact] + public void PropertyHelper_DoesNotChangeUnderscores() + { + // Arrange + var anonymous = new { bar_baz2 = "foo" }; + + // Act + Assert + var helper = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo())); + Assert.Equal("bar_baz2", helper.Name); + } + + [Fact] + public void PropertyHelper_DoesNotFindPrivateProperties() + { + // Arrange + var anonymous = new PrivateProperties(); + + // Act + Assert + var helper = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo())); + Assert.Equal("Prop1", helper.Name); + } + + [Fact] + public void PropertyHelper_DoesNotFindStaticProperties() + { + // Arrange + var anonymous = new Static(); + + // Act + Assert + var helper = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo())); + Assert.Equal("Prop5", helper.Name); + } + + [Fact] + public void PropertyHelper_DoesNotFindSetOnlyProperties() + { + // Arrange + var anonymous = new SetOnly(); + + // Act + Assert + var helper = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo())); + Assert.Equal("Prop6", helper.Name); + } + + [Theory] + [InlineData(typeof(int?))] + [InlineData(typeof(DayOfWeek?))] + public void PropertyHelper_WorksForNullablePrimitiveAndEnumTypes(Type nullableType) + { + // Act + var properties = PropertyHelper.GetProperties(nullableType); + + // Assert + Assert.Empty(properties); + } + + [Fact] + public void PropertyHelper_UnwrapsNullableTypes() + { + // Arrange + var myType = typeof(MyStruct?); + + // Act + var properties = PropertyHelper.GetProperties(myType); + + // Assert + var property = Assert.Single(properties); + Assert.Equal("Foo", property.Name); + } + + [Fact] + public void PropertyHelper_WorksForStruct() + { + // Arrange + var anonymous = new MyProperties(); + + anonymous.IntProp = 3; + anonymous.StringProp = "Five"; + + // Act + Assert + var helper1 = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo()).Where(prop => prop.Name == "IntProp")); + var helper2 = Assert.Single(PropertyHelper.GetProperties(anonymous.GetType().GetTypeInfo()).Where(prop => prop.Name == "StringProp")); + Assert.Equal(3, helper1.GetValue(anonymous)); + Assert.Equal("Five", helper2.GetValue(anonymous)); + } + + [Fact] + public void PropertyHelper_ForDerivedClass() + { + // Arrange + var derived = new DerivedClass { PropA = "propAValue", PropB = "propBValue" }; + + // Act + var helpers = PropertyHelper.GetProperties(derived.GetType().GetTypeInfo()).ToArray(); + + // Assert + Assert.NotNull(helpers); + Assert.Equal(2, helpers.Length); + + var propAHelper = Assert.Single(helpers.Where(h => h.Name == "PropA")); + var propBHelper = Assert.Single(helpers.Where(h => h.Name == "PropB")); + + Assert.Equal("propAValue", propAHelper.GetValue(derived)); + Assert.Equal("propBValue", propBHelper.GetValue(derived)); + } + + [Fact] + public void PropertyHelper_ForDerivedClass_WithNew() + { + // Arrange + var derived = new DerivedClassWithNew { PropA = "propAValue" }; + + // Act + var helpers = PropertyHelper.GetProperties(derived.GetType().GetTypeInfo()).ToArray(); + + // Assert + Assert.NotNull(helpers); + Assert.Equal(2, helpers.Length); + + var propAHelper = Assert.Single(helpers.Where(h => h.Name == "PropA")); + var propBHelper = Assert.Single(helpers.Where(h => h.Name == "PropB")); + + Assert.Equal("propAValue", propAHelper.GetValue(derived)); + Assert.Equal("Newed", propBHelper.GetValue(derived)); + } + + [Fact] + public void PropertyHelper_ForDerived_WithVirtual() + { + // Arrange + var derived = new DerivedClassWithOverride { PropA = "propAValue", PropB = "propBValue" }; + + // Act + var helpers = PropertyHelper.GetProperties(derived.GetType().GetTypeInfo()).ToArray(); + + // Assert + Assert.NotNull(helpers); + Assert.Equal(2, helpers.Length); + + var propAHelper = Assert.Single(helpers.Where(h => h.Name == "PropA")); + var propBHelper = Assert.Single(helpers.Where(h => h.Name == "PropB")); + + Assert.Equal("OverridenpropAValue", propAHelper.GetValue(derived)); + Assert.Equal("propBValue", propBHelper.GetValue(derived)); + } + + [Fact] + public void PropertyHelper_ForInterface_ReturnsExpectedProperties() + { + // Arrange + var expectedNames = new[] { "Count", "IsReadOnly" }; + + // Act + var helpers = PropertyHelper.GetProperties(typeof(ICollection)); + + // Assert + Assert.Collection( + helpers.OrderBy(helper => helper.Name, StringComparer.Ordinal), + helper => { Assert.Equal(expectedNames[0], helper.Name, StringComparer.Ordinal); }, + helper => { Assert.Equal(expectedNames[1], helper.Name, StringComparer.Ordinal); }); + } + + [Fact] + public void PropertyHelper_ForDerivedInterface_ReturnsAllProperties() + { + // Arrange + var expectedNames = new[] { "Count", "IsReadOnly", "Keys", "Values" }; + + // Act + var helpers = PropertyHelper.GetProperties(typeof(IDictionary)); + + // Assert + Assert.Collection( + helpers.OrderBy(helper => helper.Name, StringComparer.Ordinal), + helper => { Assert.Equal(expectedNames[0], helper.Name, StringComparer.Ordinal); }, + helper => { Assert.Equal(expectedNames[1], helper.Name, StringComparer.Ordinal); }, + helper => { Assert.Equal(expectedNames[2], helper.Name, StringComparer.Ordinal); }, + helper => { Assert.Equal(expectedNames[3], helper.Name, StringComparer.Ordinal); }); + } + + [Fact] + public void GetProperties_ExcludesIndexersAndPropertiesWithoutPublicGetters() + { + // Arrange + var type = typeof(DerivedClassWithNonReadableProperties); + + // Act + var result = PropertyHelper.GetProperties(type).ToArray(); + + // Assert + Assert.Equal(3, result.Length); + Assert.Equal("Visible", result[0].Name); + Assert.Equal("PropA", result[1].Name); + Assert.Equal("PropB", result[2].Name); + } + + [Fact] + public void GetVisibleProperties_NoHiddenProperty() + { + // Arrange + var type = typeof(string); + + // Act + var result = PropertyHelper.GetVisibleProperties(type).ToArray(); + + // Assert + var property = Assert.Single(result); + Assert.Equal("Length", property.Name); + Assert.Equal(typeof(int), property.Property.PropertyType); + } + + [Fact] + public void GetVisibleProperties_HiddenProperty() + { + // Arrange + var type = typeof(DerivedHiddenProperty); + + // Act + var result = PropertyHelper.GetVisibleProperties(type).ToArray(); + + // Assert + Assert.Equal(2, result.Length); + Assert.Equal("Id", result[0].Name); + Assert.Equal(typeof(string), result[0].Property.PropertyType); + Assert.Equal("Name", result[1].Name); + Assert.Equal(typeof(string), result[1].Property.PropertyType); + } + + [Fact] + public void GetVisibleProperties_HiddenProperty_TwoLevels() + { + // Arrange + var type = typeof(DerivedHiddenProperty2); + + // Act + var result = PropertyHelper.GetVisibleProperties(type).ToArray(); + + // Assert + Assert.Equal(2, result.Length); + Assert.Equal("Id", result[0].Name); + Assert.Equal(typeof(Guid), result[0].Property.PropertyType); + Assert.Equal("Name", result[1].Name); + Assert.Equal(typeof(string), result[1].Property.PropertyType); + } + + [Fact] + public void GetVisibleProperties_NoHiddenPropertyWithTypeInfoInput() + { + // Arrange + var type = typeof(string); + + // Act + var result = PropertyHelper.GetVisibleProperties(type.GetTypeInfo()).ToArray(); + + // Assert + var property = Assert.Single(result); + Assert.Equal("Length", property.Name); + Assert.Equal(typeof(int), property.Property.PropertyType); + } + + [Fact] + public void GetVisibleProperties_HiddenPropertyWithTypeInfoInput() + { + // Arrange + var type = typeof(DerivedHiddenProperty); + + // Act + var result = PropertyHelper.GetVisibleProperties(type.GetTypeInfo()).ToArray(); + + // Assert + Assert.Equal(2, result.Length); + Assert.Equal("Id", result[0].Name); + Assert.Equal(typeof(string), result[0].Property.PropertyType); + Assert.Equal("Name", result[1].Name); + Assert.Equal(typeof(string), result[1].Property.PropertyType); + } + + [Fact] + public void GetVisibleProperties_HiddenProperty_TwoLevelsWithTypeInfoInput() + { + // Arrange + var type = typeof(DerivedHiddenProperty2); + + // Act + var result = PropertyHelper.GetVisibleProperties(type.GetTypeInfo()).ToArray(); + + // Assert + Assert.Equal(2, result.Length); + Assert.Equal("Id", result[0].Name); + Assert.Equal(typeof(Guid), result[0].Property.PropertyType); + Assert.Equal("Name", result[1].Name); + Assert.Equal(typeof(string), result[1].Property.PropertyType); + } + + [Fact] + public void MakeFastPropertySetter_SetsPropertyValues_ForPublicAndNobPublicProperties() + { + // Arrange + var instance = new BaseClass(); + var typeInfo = instance.GetType().GetTypeInfo(); + var publicProperty = typeInfo.GetDeclaredProperty("PropA"); + var protectedProperty = typeInfo.GetDeclaredProperty("PropProtected"); + var publicPropertySetter = PropertyHelper.MakeFastPropertySetter(publicProperty); + var protectedPropertySetter = PropertyHelper.MakeFastPropertySetter(protectedProperty); + + // Act + publicPropertySetter(instance, "TestPublic"); + protectedPropertySetter(instance, "TestProtected"); + + // Assert + Assert.Equal("TestPublic", instance.PropA); + Assert.Equal("TestProtected", instance.GetPropProtected()); + } + + [Fact] + public void MakeFastPropertySetter_SetsPropertyValues_ForOverridenProperties() + { + // Arrange + var instance = new DerivedClassWithOverride(); + var typeInfo = instance.GetType().GetTypeInfo(); + var property = typeInfo.GetDeclaredProperty("PropA"); + var propertySetter = PropertyHelper.MakeFastPropertySetter(property); + + // Act + propertySetter(instance, "Test value"); + + // Assert + Assert.Equal("OverridenTest value", instance.PropA); + } + + [Fact] + public void MakeFastPropertySetter_SetsPropertyValues_ForNewedProperties() + { + // Arrange + var instance = new DerivedClassWithNew(); + var typeInfo = instance.GetType().GetTypeInfo(); + var property = typeInfo.GetDeclaredProperty("PropB"); + var propertySetter = PropertyHelper.MakeFastPropertySetter(property); + + // Act + propertySetter(instance, "Test value"); + + // Assert + Assert.Equal("NewedTest value", instance.PropB); + } + + [Fact] + public void MakeFastPropertyGetter_ReferenceType_ForNullObject_Throws() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(BaseClass)) + .Single(p => p.Name == nameof(BaseClass.PropA)); + + var accessor = PropertyHelper.MakeFastPropertyGetter(property.Property); + + // Act & Assert + Assert.Throws(() => accessor(null)); + } + + [Fact] + public void MakeFastPropertyGetter_ValueType_ForNullObject_Throws() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(MyProperties)) + .Single(p => p.Name == nameof(MyProperties.StringProp)); + + var accessor = PropertyHelper.MakeFastPropertyGetter(property.Property); + + // Act & Assert + Assert.Throws(() => accessor(null)); + } + + [Fact] + public void MakeNullSafeFastPropertyGetter_ReferenceType_Success() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(BaseClass)) + .Single(p => p.Name == nameof(BaseClass.PropA)); + + var accessor = PropertyHelper.MakeNullSafeFastPropertyGetter(property.Property); + + // Act + var value = accessor(new BaseClass() { PropA = "Hi" }); + + // Assert + Assert.Equal("Hi", value); + } + + [Fact] + public void MakeNullSafeFastPropertyGetter_ValueType_Success() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(MyProperties)) + .Single(p => p.Name == nameof(MyProperties.StringProp)); + + var accessor = PropertyHelper.MakeNullSafeFastPropertyGetter(property.Property); + + // Act + var value = accessor(new MyProperties() { StringProp = "Hi" }); + + // Assert + Assert.Equal("Hi", value); + } + + [Fact] + public void MakeNullSafeFastPropertyGetter_ReferenceType_ForNullObject_ReturnsNull() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(BaseClass)) + .Single(p => p.Name == nameof(BaseClass.PropA)); + + var accessor = PropertyHelper.MakeNullSafeFastPropertyGetter(property.Property); + + // Act + var value = accessor(null); + + // Assert + Assert.Null(value); + } + + [Fact] + public void MakeNullSafeFastPropertyGetter_ValueType_ForNullObject_ReturnsNull() + { + // Arrange + var property = PropertyHelper + .GetProperties(typeof(MyProperties)) + .Single(p => p.Name == nameof(MyProperties.StringProp)); + + var accessor = PropertyHelper.MakeNullSafeFastPropertyGetter(property.Property); + + // Act + var value = accessor(null); + + // Assert + Assert.Null(value); + } + + public static TheoryData> IgnoreCaseTestData + { + get + { + return new TheoryData> + { + { + new + { + selected = true, + SeLeCtEd = false + }, + new KeyValuePair("selected", false) + }, + { + new + { + SeLeCtEd = false, + selected = true + }, + new KeyValuePair("SeLeCtEd", true) + }, + { + new + { + SelECTeD = false, + SeLECTED = true + }, + new KeyValuePair("SelECTeD", true) + } + }; + } + } + + [Theory] + [MemberData(nameof(IgnoreCaseTestData))] + public void ObjectToDictionary_IgnoresPropertyCase(object testObject, + KeyValuePair expectedEntry) + { + // Act + var result = PropertyHelper.ObjectToDictionary(testObject); + + // Assert + var entry = Assert.Single(result); + Assert.Equal(expectedEntry, entry); + } + + [Fact] + public void ObjectToDictionary_WithNullObject_ReturnsEmptyDictionary() + { + // Arrange + object value = null; + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(0, dictValues.Count); + } + + [Fact] + public void ObjectToDictionary_WithPlainObjectType_ReturnsEmptyDictionary() + { + // Arrange + var value = new object(); + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(0, dictValues.Count); + } + + [Fact] + public void ObjectToDictionary_WithPrimitiveType_LooksUpPublicProperties() + { + // Arrange + var value = "test"; + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(1, dictValues.Count); + Assert.Equal(4, dictValues["Length"]); + } + + [Fact] + public void ObjectToDictionary_WithAnonymousType_LooksUpProperties() + { + // Arrange + var value = new { test = "value", other = 1 }; + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(2, dictValues.Count); + Assert.Equal("value", dictValues["test"]); + Assert.Equal(1, dictValues["other"]); + } + + [Fact] + public void ObjectToDictionary_ReturnsCaseInsensitiveDictionary() + { + // Arrange + var value = new { TEST = "value", oThEr = 1 }; + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(2, dictValues.Count); + Assert.Equal("value", dictValues["test"]); + Assert.Equal(1, dictValues["other"]); + } + + [Fact] + public void ObjectToDictionary_ReturnsInheritedProperties() + { + // Arrange + var value = new ThreeDPoint() { X = 5, Y = 10, Z = 17 }; + + // Act + var dictValues = PropertyHelper.ObjectToDictionary(value); + + // Assert + Assert.NotNull(dictValues); + Assert.Equal(3, dictValues.Count); + Assert.Equal(5, dictValues["X"]); + Assert.Equal(10, dictValues["Y"]); + Assert.Equal(17, dictValues["Z"]); + } + + private class Point + { + public int X { get; set; } + public int Y { get; set; } + } + + private class ThreeDPoint : Point + { + public int Z { get; set; } + } + + private class Static + { + public static int Prop2 { get; set; } + public int Prop5 { get; set; } + } + + private struct MyProperties + { + public int IntProp { get; set; } + public string StringProp { get; set; } + } + + private class SetOnly + { + public int Prop2 { set { } } + public int Prop6 { get; set; } + } + + private class PrivateProperties + { + public int Prop1 { get; set; } + protected int Prop2 { get; set; } + private int Prop3 { get; set; } + } + + public class BaseClass + { + public string PropA { get; set; } + + protected string PropProtected { get; set; } + + public string GetPropProtected() + { + return PropProtected; + } + } + + public class DerivedClass : BaseClass + { + public string PropB { get; set; } + } + + public class BaseClassWithVirtual + { + public virtual string PropA { get; set; } + public string PropB { get; set; } + } + + public class DerivedClassWithNew : BaseClassWithVirtual + { + private string _value = "Newed"; + + public new string PropB + { + get { return _value; } + set { _value = "Newed" + value; } + } + } + + public class DerivedClassWithOverride : BaseClassWithVirtual + { + private string _value = "Overriden"; + + public override string PropA + { + get { return _value; } + set { _value = "Overriden" + value; } + } + } + + private class DerivedClassWithNonReadableProperties : BaseClassWithVirtual + { + public string this[int index] + { + get { return string.Empty; } + set { } + } + + public int Visible { get; set; } + + private string NotVisible { get; set; } + + public string NotVisible2 { private get; set; } + + public string NotVisible3 + { + set { } + } + + public static string NotVisible4 { get; set; } + } + + private struct MyStruct + { + public string Foo { get; set; } + } + + private class BaseHiddenProperty + { + public int Id { get; set; } + } + + private class DerivedHiddenProperty : BaseHiddenProperty + { + public new string Id { get; set; } + + public string Name { get; set; } + } + + private class DerivedHiddenProperty2 : DerivedHiddenProperty + { + public new Guid Id { get; set; } + + public new string Name { get; private set; } + } + } +} diff --git a/src/Shared/test/Shared.Tests/SecurityHelperTests.cs b/src/Shared/test/Shared.Tests/SecurityHelperTests.cs new file mode 100644 index 0000000000..8e7515ad36 --- /dev/null +++ b/src/Shared/test/Shared.Tests/SecurityHelperTests.cs @@ -0,0 +1,93 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Linq; +using System.Security.Claims; +using System.Security.Principal; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class SecurityHelperTests + { + [Fact] + public void AddingToAnonymousIdentityDoesNotKeepAnonymousIdentity() + { + var user = SecurityHelper.MergeUserPrincipal(new ClaimsPrincipal(), new GenericPrincipal(new GenericIdentity("Test1", "Alpha"), new string[0])); + + Assert.NotNull(user); + Assert.Equal("Alpha", user.Identity.AuthenticationType); + Assert.Equal("Test1", user.Identity.Name); + Assert.IsAssignableFrom(user); + Assert.IsAssignableFrom(user.Identity); + Assert.Single(user.Identities); + } + + [Fact] + public void AddingExistingIdentityChangesDefaultButPreservesPrior() + { + ClaimsPrincipal user = new GenericPrincipal(new GenericIdentity("Test1", "Alpha"), null); + + Assert.Equal("Alpha", user.Identity.AuthenticationType); + Assert.Equal("Test1", user.Identity.Name); + + user = SecurityHelper.MergeUserPrincipal(user, new GenericPrincipal(new GenericIdentity("Test2", "Beta"), new string[0])); + + Assert.Equal("Beta", user.Identity.AuthenticationType); + Assert.Equal("Test2", user.Identity.Name); + + user = SecurityHelper.MergeUserPrincipal(user, new GenericPrincipal(new GenericIdentity("Test3", "Gamma"), new string[0])); + + Assert.Equal("Gamma", user.Identity.AuthenticationType); + Assert.Equal("Test3", user.Identity.Name); + + Assert.Equal(3, user.Identities.Count()); + Assert.Equal("Test3", user.Identities.Skip(0).First().Name); + Assert.Equal("Test2", user.Identities.Skip(1).First().Name); + Assert.Equal("Test1", user.Identities.Skip(2).First().Name); + } + + [Fact] + public void AddingPreservesNewIdentitiesAndDropsEmpty() + { + var existingPrincipal = new ClaimsPrincipal(new ClaimsIdentity()); + var identityNoAuthTypeWithClaim = new ClaimsIdentity(); + identityNoAuthTypeWithClaim.AddClaim(new Claim("identityNoAuthTypeWithClaim", "yes")); + existingPrincipal.AddIdentity(identityNoAuthTypeWithClaim); + var identityEmptyWithAuthType = new ClaimsIdentity("empty"); + existingPrincipal.AddIdentity(identityEmptyWithAuthType); + + Assert.False(existingPrincipal.Identity.IsAuthenticated); + + var newPrincipal = new ClaimsPrincipal(); + var newEmptyIdentity = new ClaimsIdentity(); + var identityTwo = new ClaimsIdentity("yep"); + newPrincipal.AddIdentity(newEmptyIdentity); + newPrincipal.AddIdentity(identityTwo); + + var user = SecurityHelper.MergeUserPrincipal(existingPrincipal, newPrincipal); + + // Preserve newPrincipal order + Assert.False(user.Identity.IsAuthenticated); + Assert.Null(user.Identity.Name); + + Assert.Equal(4, user.Identities.Count()); + Assert.Equal(newEmptyIdentity, user.Identities.Skip(0).First()); + Assert.Equal(identityTwo, user.Identities.Skip(1).First()); + Assert.Equal(identityNoAuthTypeWithClaim, user.Identities.Skip(2).First()); + Assert.Equal(identityEmptyWithAuthType, user.Identities.Skip(3).First()); + + // This merge should drop newEmptyIdentity since its empty + user = SecurityHelper.MergeUserPrincipal(user, new GenericPrincipal(new GenericIdentity("Test3", "Gamma"), new string[0])); + + Assert.Equal("Gamma", user.Identity.AuthenticationType); + Assert.Equal("Test3", user.Identity.Name); + + Assert.Equal(4, user.Identities.Count()); + Assert.Equal("Test3", user.Identities.Skip(0).First().Name); + Assert.Equal(identityTwo, user.Identities.Skip(1).First()); + Assert.Equal(identityNoAuthTypeWithClaim, user.Identities.Skip(2).First()); + Assert.Equal(identityEmptyWithAuthType, user.Identities.Skip(3).First()); + } + } +} diff --git a/src/Shared/test/Shared.Tests/StackTraceHelperTest.cs b/src/Shared/test/Shared.Tests/StackTraceHelperTest.cs new file mode 100644 index 0000000000..657a310b6e --- /dev/null +++ b/src/Shared/test/Shared.Tests/StackTraceHelperTest.cs @@ -0,0 +1,345 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using Microsoft.Extensions.StackTrace.Sources; +using ThrowingLibrary; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class StackTraceHelperTest + { + [Fact] + public void StackTraceHelper_IncludesLineNumbersForFiles() + { + // Arrange + Exception exception = null; + try + { + // Throwing an exception in the current assembly always seems to populate the full stack + // trace regardless of symbol type. Crossing assembly boundaries ensures PortablePdbReader gets used + // on desktop. + Thrower.Throw(); + } + catch (Exception ex) + { + exception = ex; + } + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + Assert.Collection(stackFrames, + frame => + { + Assert.Contains("Thrower.cs", frame.FilePath); + Assert.Equal(17, frame.LineNumber); + }, + frame => + { + Assert.Contains("StackTraceHelperTest.cs", frame.FilePath); + }); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForGenericMethods() + { + // Arrange + var exception = Record.Exception(() => GenericMethod(null)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.GenericMethod(T val)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsWithOutParameters() + { + // Arrange + var exception = Record.Exception(() => MethodWithOutParameter(out var value)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.MethodWithOutParameter(out int value)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsWithGenericOutParameters() + { + // Arrange + var exception = Record.Exception(() => MethodWithGenericOutParameter("Test", out int value)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.MethodWithGenericOutParameter(string a, out TVal value)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsWithRefParameters() + { + // Arrange + var value = 0; + var exception = Record.Exception(() => MethodWithRefParameter(ref value)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.MethodWithRefParameter(ref int value)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsWithGenericRefParameters() + { + // Arrange + var value = 0; + var exception = Record.Exception(() => MethodWithGenericRefParameter(ref value)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.MethodWithGenericRefParameter(ref TVal value)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsWithNullableParameters() + { + // Arrange + var value = 0; + var exception = Record.Exception(() => MethodWithNullableParameter(value)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.MethodWithNullableParameter(Nullable value)", methods[0]); + } + + [Fact] + public void StackTraceHelper_PrettyPrintsStackTraceForMethodsOnGenericTypes() + { + // Arrange + var exception = Record.Exception(() => new GenericClass().Throw(0)); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest+GenericClass.Throw(T parameter)", methods[0]); + } + + [Fact] + public void StackTraceHelper_ProducesReadableOutput() + { + // Arrange + var expectedCallStack = new List() + { + "Microsoft.Extensions.Internal.StackTraceHelperTest.Iterator()+MoveNext()", + "string.Join(string separator, IEnumerable values)", + "Microsoft.Extensions.Internal.StackTraceHelperTest+GenericClass.GenericMethod(ref V value)", + "Microsoft.Extensions.Internal.StackTraceHelperTest.MethodAsync(int value)", + "Microsoft.Extensions.Internal.StackTraceHelperTest.MethodAsync(TValue value)", + "Microsoft.Extensions.Internal.StackTraceHelperTest.Method(string value)", + "Microsoft.Extensions.Internal.StackTraceHelperTest.StackTraceHelper_ProducesReadableOutput()", + }; + + Exception exception = null; + try + { + Method("test"); + } + catch (Exception ex) + { + exception = ex; + } + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + var methodNames = stackFrames.Select(stackFrame => stackFrame.MethodDisplayInfo.ToString()).ToArray(); + + // Assert + Assert.Equal(expectedCallStack, methodNames); + } + + [Fact] + public void StackTraceHelper_DoesNotIncludeInstanceMethodsOnTypesWithStackTraceHiddenAttribute() + { + // Arrange + var exception = Record.Exception(() => InvokeMethodOnTypeWithStackTraceHiddenAttribute()); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.ThrowCore()", methods[0]); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.InvokeMethodOnTypeWithStackTraceHiddenAttribute()", methods[1]); + } + + [Fact] + public void StackTraceHelper_DoesNotIncludeStaticMethodsOnTypesWithStackTraceHiddenAttribute() + { + // Arrange + var exception = Record.Exception(() => InvokeStaticMethodOnTypeWithStackTraceHiddenAttribute()); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.ThrowCore()", methods[0]); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.InvokeStaticMethodOnTypeWithStackTraceHiddenAttribute()", methods[1]); + } + + [Fact] + public void StackTraceHelper_DoesNotIncludeMethodsWithStackTraceHiddenAttribute() + { + // Arrange + var exception = Record.Exception(() => new TypeWithMethodWithStackTraceHiddenAttribute().Throw()); + + // Act + var stackFrames = StackTraceHelper.GetFrames(exception); + + // Assert + var methods = stackFrames.Select(frame => frame.MethodDisplayInfo.ToString()).ToArray(); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest.ThrowCore()", methods[0]); + Assert.Equal("Microsoft.Extensions.Internal.StackTraceHelperTest+TypeWithMethodWithStackTraceHiddenAttribute.Throw()", methods[1]); + } + + [Fact] + public void GetFrames_DoesNotFailForDynamicallyGeneratedAssemblies() + { + // Arrange + var action = (Action)Expression.Lambda( + Expression.Throw( + Expression.New(typeof(Exception)))).Compile(); + var exception = Record.Exception(action); + + // Act + var frames = StackTraceHelper.GetFrames(exception).ToArray(); + + // Assert + var frame = frames[0]; + Assert.Null(frame.FilePath); + Assert.Equal($"lambda_method(Closure )", frame.MethodDisplayInfo.ToString()); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + async Task MethodAsync(int value) + { + await Task.Delay(0); + return GenericClass.GenericMethod(ref value); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + async Task MethodAsync(TValue value) + { + return await MethodAsync(1); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + string Method(string value) + { + return MethodAsync(value).GetAwaiter().GetResult(); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + static IEnumerable Iterator() + { + yield return "Success"; + throw new Exception(); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void MethodWithOutParameter(out int value) => throw new Exception(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void MethodWithGenericOutParameter(string a, out TVal value) => throw new Exception(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void MethodWithRefParameter(ref int value) => throw new Exception(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void MethodWithGenericRefParameter(ref TVal value) => throw new Exception(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void MethodWithNullableParameter(int? value) => throw new Exception(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void InvokeMethodOnTypeWithStackTraceHiddenAttribute() => new TypeWithStackTraceHiddenAttribute().Throw(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + void InvokeStaticMethodOnTypeWithStackTraceHiddenAttribute() => TypeWithStackTraceHiddenAttribute.ThrowStatic(); + + class GenericClass + { + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static string GenericMethod(ref V value) + { + var returnVal = ""; + for (var i = 0; i < 10; i++) + { + returnVal += string.Join(", ", Iterator()); + } + return returnVal; + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public void Throw(T parameter) => throw new Exception(); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + private void GenericMethod(T val) where T : class => throw new Exception(); + + private class StackTraceHiddenAttribute : Attribute + { + } + + [StackTraceHidden] + private class TypeWithStackTraceHiddenAttribute + { + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public void Throw() => ThrowCore(); + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public static void ThrowStatic() => ThrowCore(); + } + + private class TypeWithMethodWithStackTraceHiddenAttribute + { + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + [StackTraceHidden] + public void MethodWithStackTraceHiddenAttribute() + { + ThrowCore(); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + public void Throw() => MethodWithStackTraceHiddenAttribute(); + } + + [MethodImpl(MethodImplOptions.NoOptimization | MethodImplOptions.NoInlining)] + private static void ThrowCore() => throw new Exception(); + } +} diff --git a/src/Shared/test/Shared.Tests/WebEncodersTests.cs b/src/Shared/test/Shared.Tests/WebEncodersTests.cs new file mode 100644 index 0000000000..5c71403fd6 --- /dev/null +++ b/src/Shared/test/Shared.Tests/WebEncodersTests.cs @@ -0,0 +1,113 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Linq; +using Xunit; + +namespace Microsoft.Extensions.Internal +{ + public class WebEncodersTests + { + [Theory] + [InlineData("", 1, 0)] + [InlineData("", 0, 1)] + [InlineData("0123456789", 9, 2)] + [InlineData("0123456789", Int32.MaxValue, 2)] + [InlineData("0123456789", 9, -1)] + public void Base64UrlDecode_BadOffsets(string input, int offset, int count) + { + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlDecode(input, offset, count); + }); + } + + [Theory] + [InlineData("x")] + [InlineData("(x)")] + public void Base64UrlDecode_MalformedInput(string input) + { + // Act & assert + Assert.Throws(() => + { + var retVal = WebEncoders.Base64UrlDecode(input); + }); + } + + [Theory] + [InlineData("", "")] + [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] + [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] + [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] + public void Base64UrlEncode_And_Decode(string base64Input, string expectedBase64Url) + { + // Arrange + byte[] input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); + + // Act & assert - 1 + string actualBase64Url = WebEncoders.Base64UrlEncode(input, 3, input.Length - 5); // also helps test offsets + Assert.Equal(expectedBase64Url, actualBase64Url); + + // Act & assert - 2 + // Verify that values round-trip + byte[] roundTripped = WebEncoders.Base64UrlDecode("xx" + actualBase64Url + "yyy", 2, actualBase64Url.Length); // also helps test offsets + string roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); + Assert.Equal(roundTrippedAsBase64, base64Input); + } + + [Theory] + [InlineData("", "")] + [InlineData("123456qwerty++//X+/x", "123456qwerty--__X-_x")] + [InlineData("123456qwerty++//X+/xxw==", "123456qwerty--__X-_xxw")] + [InlineData("123456qwerty++//X+/xxw0=", "123456qwerty--__X-_xxw0")] + public void Base64UrlEncode_And_Decode_WithBufferOffsets(string base64Input, string expectedBase64Url) + { + // Arrange + var input = new byte[3].Concat(Convert.FromBase64String(base64Input)).Concat(new byte[2]).ToArray(); + var buffer = new char[30]; + var output = new char[30]; + for (var i = 0; i < buffer.Length; i++) + { + buffer[i] = '^'; + output[i] = '^'; + } + + // Act 1 + var numEncodedChars = + WebEncoders.Base64UrlEncode(input, offset: 3, output: output, outputOffset: 4, count: input.Length - 5); + + // Assert 1 + var encodedString = new string(output, startIndex: 4, length: numEncodedChars); + Assert.Equal(expectedBase64Url, encodedString); + + // Act 2 + var roundTripInput = new string(output); + var roundTripped = + WebEncoders.Base64UrlDecode(roundTripInput, offset: 4, buffer: buffer, bufferOffset: 5, count: numEncodedChars); + + // Assert 2, verify that values round-trip + var roundTrippedAsBase64 = Convert.ToBase64String(roundTripped); + Assert.Equal(roundTrippedAsBase64, base64Input); + } + + [Theory] + [InlineData(0, 1, 0)] + [InlineData(0, 0, 1)] + [InlineData(10, 9, 2)] + [InlineData(10, Int32.MaxValue, 2)] + [InlineData(10, 9, -1)] + public void Base64UrlEncode_BadOffsets(int inputLength, int offset, int count) + { + // Arrange + byte[] input = new byte[inputLength]; + + // Act & assert + Assert.ThrowsAny(() => + { + var retVal = WebEncoders.Base64UrlEncode(input, offset, count); + }); + } + } +} diff --git a/src/Shared/test/testassets/ThrowingLibrary/Thrower.cs b/src/Shared/test/testassets/ThrowingLibrary/Thrower.cs new file mode 100644 index 0000000000..babe2387c6 --- /dev/null +++ b/src/Shared/test/testassets/ThrowingLibrary/Thrower.cs @@ -0,0 +1,20 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.Runtime.CompilerServices; + +namespace ThrowingLibrary +{ + // Throwing an exception in the current assembly always seems to populate the full stack + // trace regardless of symbol type. This type exists to simulate an exception thrown + // across assemblies which is the typical use case for StackTraceHelper. + public static class Thrower + { + [MethodImpl(MethodImplOptions.NoInlining)] + public static void Throw() + { + throw new DivideByZeroException(); + } + } +} diff --git a/src/Shared/test/testassets/ThrowingLibrary/ThrowingLibrary.csproj b/src/Shared/test/testassets/ThrowingLibrary/ThrowingLibrary.csproj new file mode 100644 index 0000000000..d77d392873 --- /dev/null +++ b/src/Shared/test/testassets/ThrowingLibrary/ThrowingLibrary.csproj @@ -0,0 +1,8 @@ + + + + netstandard2.0 + portable + + + diff --git a/src/SignalR/Directory.Build.props b/src/SignalR/Directory.Build.props index 3a47101b91..19cc48835f 100644 --- a/src/SignalR/Directory.Build.props +++ b/src/SignalR/Directory.Build.props @@ -17,5 +17,6 @@ true true latest + $(MSBuildThisFileDirectory)..\Shared\ diff --git a/src/SignalR/build/dependencies.props b/src/SignalR/build/dependencies.props index a68a5f5ec1..c3d36120d3 100644 --- a/src/SignalR/build/dependencies.props +++ b/src/SignalR/build/dependencies.props @@ -65,7 +65,6 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 2.1.1 2.1.1 @@ -78,10 +77,7 @@ 2.1.1 2.1.1 2.1.1 - 2.1.1 2.1.1 - 2.1.1 2.1.1 - 2.1.1 - \ No newline at end of file + diff --git a/src/SignalR/src/Microsoft.AspNetCore.Http.Connections/Microsoft.AspNetCore.Http.Connections.csproj b/src/SignalR/src/Microsoft.AspNetCore.Http.Connections/Microsoft.AspNetCore.Http.Connections.csproj index 0b0a149c3a..4c572c8aba 100644 --- a/src/SignalR/src/Microsoft.AspNetCore.Http.Connections/Microsoft.AspNetCore.Http.Connections.csproj +++ b/src/SignalR/src/Microsoft.AspNetCore.Http.Connections/Microsoft.AspNetCore.Http.Connections.csproj @@ -14,6 +14,11 @@ + + + + + @@ -24,8 +29,6 @@ - - diff --git a/src/SignalR/src/Microsoft.AspNetCore.SignalR.Core/Microsoft.AspNetCore.SignalR.Core.csproj b/src/SignalR/src/Microsoft.AspNetCore.SignalR.Core/Microsoft.AspNetCore.SignalR.Core.csproj index d63b5aed42..728a93a055 100644 --- a/src/SignalR/src/Microsoft.AspNetCore.SignalR.Core/Microsoft.AspNetCore.SignalR.Core.csproj +++ b/src/SignalR/src/Microsoft.AspNetCore.SignalR.Core/Microsoft.AspNetCore.SignalR.Core.csproj @@ -6,6 +6,11 @@ Microsoft.AspNetCore.SignalR + + + + + @@ -15,8 +20,6 @@ - - diff --git a/src/Templating/Directory.Build.props b/src/Templating/Directory.Build.props index d7eb964138..356908672a 100644 --- a/src/Templating/Directory.Build.props +++ b/src/Templating/Directory.Build.props @@ -13,5 +13,6 @@ https://github.com/aspnet/AspNetCore git true + $(MSBuildThisFileDirectory)..\Shared\ diff --git a/src/Templating/build/dependencies.props b/src/Templating/build/dependencies.props index 3110c18d64..835fdd0843 100644 --- a/src/Templating/build/dependencies.props +++ b/src/Templating/build/dependencies.props @@ -15,7 +15,6 @@ 2.1.2-rtm-30913 2.1.2-rtm-30913 2.1.2-rtm-30913 - 2.1.1 2.1.2-rtm-30913 2.1.1 2.1.1 @@ -35,7 +34,6 @@ 2.1.2-rtm-30913 2.1.2-rtm-30913 2.1.1 - 2.1.1 2.1.5 2.1.2-rtm-30913 15.6.1 diff --git a/src/Templating/test/Templates.Test/Templates.Test.csproj b/src/Templating/test/Templates.Test/Templates.Test.csproj index 19230e2958..3aa44382f8 100644 --- a/src/Templating/test/Templates.Test/Templates.Test.csproj +++ b/src/Templating/test/Templates.Test/Templates.Test.csproj @@ -6,15 +6,15 @@ + + - - diff --git a/src/Tools/Directory.Build.props b/src/Tools/Directory.Build.props index 6b35802689..0cbe48018a 100644 --- a/src/Tools/Directory.Build.props +++ b/src/Tools/Directory.Build.props @@ -4,6 +4,7 @@ $(RepositoryRoot)obj\$(MSBuildProjectName)\ $(RepositoryRoot)bin\$(MSBuildProjectName)\ + $(MSBuildThisFileDirectory)Shared\ diff --git a/src/Tools/FirstRunCertGenerator/src/Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj b/src/Tools/FirstRunCertGenerator/src/Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj index ce61b3ab62..8a5011b7ef 100644 --- a/src/Tools/FirstRunCertGenerator/src/Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj +++ b/src/Tools/FirstRunCertGenerator/src/Microsoft.AspNetCore.DeveloperCertificates.XPlat.csproj @@ -8,7 +8,7 @@ - + diff --git a/src/Tools/FirstRunCertGenerator/src/Properties/AssemblyInfo.cs b/src/Tools/FirstRunCertGenerator/src/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000..0f02f95e4a --- /dev/null +++ b/src/Tools/FirstRunCertGenerator/src/Properties/AssemblyInfo.cs @@ -0,0 +1,6 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System.Runtime.CompilerServices; + +[assembly: InternalsVisibleTo("Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests, PublicKey=0024000004800000940000000602000000240000525341310004000001000100f33a29044fa9d740c9b3213a93e57c84b472c84e0b8a0e1ae48e67a9f8f6de9d5f7f3d52ac23e48ac51801f1dc950abe901da34d2a9e3baadb141a17c77ef3c565dd5ee5054b91cf63bb3c6ab83f72ab3aafe93d0fc3c2348b764fafb0b1c0733de51459aeab46580384bf9d74c4e28164b7cde247f891ba07891c9d872ad2bb")] diff --git a/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs b/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs new file mode 100644 index 0000000000..f6503673e5 --- /dev/null +++ b/src/Tools/FirstRunCertGenerator/test/CertificateManagerTests.cs @@ -0,0 +1,300 @@ +// Copyright (c) .NET Foundation. All rights reserved. +// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. + +using System; +using System.IO; +using System.Linq; +using System.Runtime.InteropServices; +using System.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using System.Text; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Certificates.Generation.Tests +{ + public class CertificateManagerTests + { + public CertificateManagerTests(ITestOutputHelper output) + { + Output = output; + } + + public const string TestCertificateSubject = "CN=aspnet.test"; + + public ITestOutputHelper Output { get; } + + [Fact] + public void EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates() + { + try + { + // Arrange + const string CertificateName = nameof(EnsureCreateHttpsCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates) + ".cer"; + var manager = new CertificateManager(); + + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); + } + + // Act + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject); + + // Assert + Assert.Equal(EnsureCertificateResult.Succeeded, result); + Assert.True(File.Exists(CertificateName)); + + var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName)); + Assert.NotNull(exportedCertificate); + Assert.False(exportedCertificate.HasPrivateKey); + + var httpsCertificates = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false); + var httpsCertificate = Assert.Single(httpsCertificates, c => c.Subject == TestCertificateSubject); + Assert.True(httpsCertificate.HasPrivateKey); + Assert.Equal(TestCertificateSubject, httpsCertificate.Subject); + Assert.Equal(TestCertificateSubject, httpsCertificate.Issuer); + Assert.Equal("sha256RSA", httpsCertificate.SignatureAlgorithm.FriendlyName); + Assert.Equal("1.2.840.113549.1.1.11", httpsCertificate.SignatureAlgorithm.Value); + + Assert.Equal(now.LocalDateTime, httpsCertificate.NotBefore); + Assert.Equal(now.AddYears(1).LocalDateTime, httpsCertificate.NotAfter); + Assert.Contains( + httpsCertificate.Extensions.OfType(), + e => e is X509BasicConstraintsExtension basicConstraints && + basicConstraints.Critical == true && + basicConstraints.CertificateAuthority == false && + basicConstraints.HasPathLengthConstraint == false && + basicConstraints.PathLengthConstraint == 0); + + Assert.Contains( + httpsCertificate.Extensions.OfType(), + e => e is X509KeyUsageExtension keyUsage && + keyUsage.Critical == true && + keyUsage.KeyUsages == X509KeyUsageFlags.KeyEncipherment); + + Assert.Contains( + httpsCertificate.Extensions.OfType(), + e => e is X509EnhancedKeyUsageExtension enhancedKeyUsage && + enhancedKeyUsage.Critical == true && + enhancedKeyUsage.EnhancedKeyUsages.OfType().Single() is Oid keyUsage && + keyUsage.Value == "1.3.6.1.5.5.7.3.1"); + + // Subject alternative name + Assert.Contains( + httpsCertificate.Extensions.OfType(), + e => e.Critical == true && + e.Oid.Value == "2.5.29.17"); + + // ASP.NET HTTPS Development certificate extension + Assert.Contains( + httpsCertificate.Extensions.OfType(), + e => e.Critical == false && + e.Oid.Value == "1.3.6.1.4.1.311.84.1.1" && + Encoding.ASCII.GetString(e.RawData) == "ASP.NET Core HTTPS development certificate"); + + Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString()); + + } + catch (Exception e) + { + Output.WriteLine(e.Message); + ListCertificates(Output); + throw; + } + } + + private void ListCertificates(ITestOutputHelper output) + { + using (var store = new X509Store(StoreName.My, StoreLocation.CurrentUser)) + { + store.Open(OpenFlags.ReadOnly); + var certificates = store.Certificates; + foreach (var certificate in certificates) + { + Output.WriteLine($"Certificate: '{Convert.ToBase64String(certificate.Export(X509ContentType.Cert))}'."); + certificate.Dispose(); + } + + store.Close(); + } + } + + [Fact] + public void EnsureCreateHttpsCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates() + { + // Arrange + const string CertificateName = nameof(EnsureCreateHttpsCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates) + ".pfx"; + var certificatePassword = Guid.NewGuid().ToString(); + + var manager = new CertificateManager(); + + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); + } + + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject); + + var httpsCertificate = manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Single(c => c.Subject == TestCertificateSubject); + + // Act + var result = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, includePrivateKey: true, password: certificatePassword, subject: TestCertificateSubject); + + // Assert + Assert.Equal(EnsureCertificateResult.ValidCertificatePresent, result); + Assert.True(File.Exists(CertificateName)); + + var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName), certificatePassword); + Assert.NotNull(exportedCertificate); + Assert.True(exportedCertificate.HasPrivateKey); + + + Assert.Equal(httpsCertificate.GetCertHashString(), exportedCertificate.GetCertHashString()); + } + + [Fact(Skip = "Requires user interaction")] + public void EnsureAspNetCoreHttpsDevelopmentCertificate_ReturnsCorrectResult_WhenUserCancelsTrustStepOnWindows() + { + var manager = new CertificateManager(); + + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + manager.RemoveAllCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); + } + + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + var trustFailed = manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject); + + Assert.Equal(EnsureCertificateResult.UserCancelledTrustStep, trustFailed); + } + + [Fact(Skip = "Requires user interaction")] + public void EnsureAspNetCoreHttpsDevelopmentCertificate_CanRemoveCertificates() + { + var manager = new CertificateManager(); + + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + manager.EnsureAspNetCoreHttpsDevelopmentCertificate(now, now.AddYears(1), path: null, trust: true, subject: TestCertificateSubject); + + manager.CleanupHttpsCertificates(TestCertificateSubject); + + Assert.Empty(manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.My, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject)); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + Assert.Empty(manager.ListCertificates(CertificatePurpose.HTTPS, StoreName.Root, StoreLocation.CurrentUser, isValid: false).Where(c => c.Subject == TestCertificateSubject)); + } + } + + [Fact] + public void EnsureCreateIdentityTokenSigningCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates() + { + // Arrange + const string CertificateName = nameof(EnsureCreateIdentityTokenSigningCertificate_CreatesACertificate_WhenThereAreNoHttpsCertificates) + ".cer"; + var manager = new CertificateManager(); + + manager.RemoveAllCertificates(CertificatePurpose.Signing, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + manager.RemoveAllCertificates(CertificatePurpose.Signing, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); + } + + // Act + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + var result = manager.EnsureAspNetCoreApplicationTokensDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, subject: TestCertificateSubject); + + // Assert + Assert.Equal(EnsureCertificateResult.Succeeded, result); + Assert.True(File.Exists(CertificateName)); + + var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName)); + Assert.NotNull(exportedCertificate); + Assert.False(exportedCertificate.HasPrivateKey); + + var identityCertificates = manager.ListCertificates(CertificatePurpose.Signing, StoreName.My, StoreLocation.CurrentUser, isValid: false); + var identityCertificate = Assert.Single(identityCertificates, i => i.Subject == TestCertificateSubject); + Assert.True(identityCertificate.HasPrivateKey); + Assert.Equal(TestCertificateSubject, identityCertificate.Subject); + Assert.Equal(TestCertificateSubject, identityCertificate.Issuer); + Assert.Equal("sha256RSA", identityCertificate.SignatureAlgorithm.FriendlyName); + Assert.Equal("1.2.840.113549.1.1.11", identityCertificate.SignatureAlgorithm.Value); + + Assert.Equal(now.LocalDateTime, identityCertificate.NotBefore); + Assert.Equal(now.AddYears(1).LocalDateTime, identityCertificate.NotAfter); + Assert.Contains( + identityCertificate.Extensions.OfType(), + e => e is X509BasicConstraintsExtension basicConstraints && + basicConstraints.Critical == true && + basicConstraints.CertificateAuthority == false && + basicConstraints.HasPathLengthConstraint == false && + basicConstraints.PathLengthConstraint == 0); + + Assert.Contains( + identityCertificate.Extensions.OfType(), + e => e is X509KeyUsageExtension keyUsage && + keyUsage.Critical == true && + keyUsage.KeyUsages == X509KeyUsageFlags.DigitalSignature); + + Assert.Contains( + identityCertificate.Extensions.OfType(), + e => e is X509EnhancedKeyUsageExtension enhancedKeyUsage && + enhancedKeyUsage.Critical == true && + enhancedKeyUsage.EnhancedKeyUsages.OfType().Single() is Oid keyUsage && + keyUsage.Value == "1.3.6.1.5.5.7.3.1"); + + // ASP.NET Core Identity Json Web Token signing development certificate + Assert.Contains( + identityCertificate.Extensions.OfType(), + e => e.Critical == false && + e.Oid.Value == "1.3.6.1.4.1.311.84.1.2" && + Encoding.ASCII.GetString(e.RawData) == "ASP.NET Core Identity Json Web Token signing development certificate"); + + Assert.Equal(identityCertificate.GetCertHashString(), exportedCertificate.GetCertHashString()); + } + + [Fact] + public void EnsureCreateIdentityTokenSigningCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates() + { + // Arrange + const string CertificateName = nameof(EnsureCreateIdentityTokenSigningCertificate_DoesNotCreateACertificate_WhenThereIsAnExistingHttpsCertificates) + ".pfx"; + var certificatePassword = Guid.NewGuid().ToString(); + + var manager = new CertificateManager(); + + manager.RemoveAllCertificates(CertificatePurpose.Signing, StoreName.My, StoreLocation.CurrentUser, TestCertificateSubject); + if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + manager.RemoveAllCertificates(CertificatePurpose.Signing, StoreName.Root, StoreLocation.CurrentUser, TestCertificateSubject); + } + + DateTimeOffset now = DateTimeOffset.UtcNow; + now = new DateTimeOffset(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, 0, now.Offset); + manager.EnsureAspNetCoreApplicationTokensDevelopmentCertificate(now, now.AddYears(1), path: null, trust: false, subject: TestCertificateSubject); + + var identityTokenSigningCertificates = manager.ListCertificates(CertificatePurpose.Signing, StoreName.My, StoreLocation.CurrentUser, isValid: false).Single(c => c.Subject == TestCertificateSubject); + + // Act + var result = manager.EnsureAspNetCoreApplicationTokensDevelopmentCertificate(now, now.AddYears(1), CertificateName, trust: false, includePrivateKey: true, password: certificatePassword, subject: TestCertificateSubject); + + // Assert + Assert.Equal(EnsureCertificateResult.ValidCertificatePresent, result); + Assert.True(File.Exists(CertificateName)); + + var exportedCertificate = new X509Certificate2(File.ReadAllBytes(CertificateName), certificatePassword); + Assert.NotNull(exportedCertificate); + Assert.True(exportedCertificate.HasPrivateKey); + + Assert.Equal(identityTokenSigningCertificates.GetCertHashString(), exportedCertificate.GetCertHashString()); + } + } +} diff --git a/src/Tools/FirstRunCertGenerator/test/Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj b/src/Tools/FirstRunCertGenerator/test/Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj new file mode 100644 index 0000000000..4bf1174f62 --- /dev/null +++ b/src/Tools/FirstRunCertGenerator/test/Microsoft.AspNetCore.DeveloperCertificates.XPlat.Tests.csproj @@ -0,0 +1,11 @@ + + + + netcoreapp2.1 + + + + + + + diff --git a/src/Tools/shared/src/CliContext.cs b/src/Tools/Shared/CommandLine/CliContext.cs similarity index 100% rename from src/Tools/shared/src/CliContext.cs rename to src/Tools/Shared/CommandLine/CliContext.cs diff --git a/src/Tools/shared/src/CommandLineApplicationExtensions.cs b/src/Tools/Shared/CommandLine/CommandLineApplicationExtensions.cs similarity index 100% rename from src/Tools/shared/src/CommandLineApplicationExtensions.cs rename to src/Tools/Shared/CommandLine/CommandLineApplicationExtensions.cs diff --git a/src/Tools/shared/src/ConsoleReporter.cs b/src/Tools/Shared/CommandLine/ConsoleReporter.cs similarity index 100% rename from src/Tools/shared/src/ConsoleReporter.cs rename to src/Tools/Shared/CommandLine/ConsoleReporter.cs diff --git a/src/Tools/shared/src/DebugHelper.cs b/src/Tools/Shared/CommandLine/DebugHelper.cs similarity index 100% rename from src/Tools/shared/src/DebugHelper.cs rename to src/Tools/Shared/CommandLine/DebugHelper.cs diff --git a/src/Tools/shared/src/Ensure.cs b/src/Tools/Shared/CommandLine/Ensure.cs similarity index 100% rename from src/Tools/shared/src/Ensure.cs rename to src/Tools/Shared/CommandLine/Ensure.cs diff --git a/src/Tools/shared/src/IConsole.cs b/src/Tools/Shared/CommandLine/IConsole.cs similarity index 100% rename from src/Tools/shared/src/IConsole.cs rename to src/Tools/Shared/CommandLine/IConsole.cs diff --git a/src/Tools/shared/src/IReporter.cs b/src/Tools/Shared/CommandLine/IReporter.cs similarity index 100% rename from src/Tools/shared/src/IReporter.cs rename to src/Tools/Shared/CommandLine/IReporter.cs diff --git a/src/Tools/shared/src/NullReporter.cs b/src/Tools/Shared/CommandLine/NullReporter.cs similarity index 100% rename from src/Tools/shared/src/NullReporter.cs rename to src/Tools/Shared/CommandLine/NullReporter.cs diff --git a/src/Tools/shared/src/PhysicalConsole.cs b/src/Tools/Shared/CommandLine/PhysicalConsole.cs similarity index 100% rename from src/Tools/shared/src/PhysicalConsole.cs rename to src/Tools/Shared/CommandLine/PhysicalConsole.cs diff --git a/src/Tools/shared/test/TestConsole.cs b/src/Tools/Shared/TestHelpers/TestConsole.cs similarity index 100% rename from src/Tools/shared/test/TestConsole.cs rename to src/Tools/Shared/TestHelpers/TestConsole.cs diff --git a/src/Tools/shared/test/TestReporter.cs b/src/Tools/Shared/TestHelpers/TestReporter.cs similarity index 100% rename from src/Tools/shared/test/TestReporter.cs rename to src/Tools/Shared/TestHelpers/TestReporter.cs diff --git a/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj b/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj index 1f0f906e50..77193cb477 100644 --- a/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj +++ b/src/Tools/dotnet-dev-certs/src/dotnet-dev-certs.csproj @@ -12,19 +12,11 @@ - - - - - - - - - + + - diff --git a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj index 3856c4877c..63b64800b5 100644 --- a/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj +++ b/src/Tools/dotnet-sql-cache/src/dotnet-sql-cache.csproj @@ -11,7 +11,7 @@ - + diff --git a/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj b/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj index a66a31dd7e..5e7e80d02e 100644 --- a/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj +++ b/src/Tools/dotnet-user-secrets/src/dotnet-user-secrets.csproj @@ -13,7 +13,7 @@ - + diff --git a/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj b/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj index 0254a866e8..ea4686125b 100644 --- a/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj +++ b/src/Tools/dotnet-user-secrets/test/dotnet-user-secrets.Tests.csproj @@ -6,7 +6,7 @@ - + diff --git a/src/Tools/dotnet-watch/src/dotnet-watch.csproj b/src/Tools/dotnet-watch/src/dotnet-watch.csproj index 4aff804186..14f3253cdb 100644 --- a/src/Tools/dotnet-watch/src/dotnet-watch.csproj +++ b/src/Tools/dotnet-watch/src/dotnet-watch.csproj @@ -12,13 +12,13 @@ - + + - diff --git a/src/Tools/dotnet-watch/test/dotnet-watch.Tests.csproj b/src/Tools/dotnet-watch/test/dotnet-watch.Tests.csproj index 2bad8c40c4..ada6cec74c 100644 --- a/src/Tools/dotnet-watch/test/dotnet-watch.Tests.csproj +++ b/src/Tools/dotnet-watch/test/dotnet-watch.Tests.csproj @@ -7,7 +7,7 @@ - + From 6402a6a971e1987b80939a355d06bf1530b95a9e Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 14 Dec 2018 11:41:56 -0800 Subject: [PATCH 09/10] Fix aspnet/AspNetCore-Internal#1503 - ensure ANCM packages are code signed --- .../Directory.Build.targets | 3 +++ .../Directory.Build.targets | 3 +++ 2 files changed, 6 insertions(+) diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets index 9837fe8fd4..9b37939d97 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModule/Directory.Build.targets @@ -28,6 +28,9 @@ NuGetPackage $(PackageId) $(PackageVersion) + $(PackageSigningCertName) + true + true diff --git a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets index 7163fff522..3ccb87cc94 100644 --- a/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets +++ b/src/Servers/IIS/src/Microsoft.AspNetCore.AspNetCoreModuleV2/Directory.Build.targets @@ -27,6 +27,9 @@ NuGetPackage $(PackageId) $(PackageVersion) + $(PackageSigningCertName) + true + true From cb5458e87062eddb224c1695b7081c41985fec10 Mon Sep 17 00:00:00 2001 From: Nate McMaster Date: Fri, 14 Dec 2018 12:05:30 -0800 Subject: [PATCH 10/10] Exclude ancm.mof from code signing This file is not signable. The sign tool treats .mof as a potential signing candidate by default, even though most .mof files are not signable. --- build/CodeSign.props | 3 +++ 1 file changed, 3 insertions(+) diff --git a/build/CodeSign.props b/build/CodeSign.props index 5b48abcb11..c5e12409da 100644 --- a/build/CodeSign.props +++ b/build/CodeSign.props @@ -71,6 +71,9 @@ + + +