diff --git a/.appveyor.yml b/.appveyor.yml deleted file mode 100644 index bb08c436468d43df5200dfe05f5201936972df0d..0000000000000000000000000000000000000000 --- a/.appveyor.yml +++ /dev/null @@ -1,27 +0,0 @@ -init: - # Reset dynamic port range from AppVeyor setting (1025-65535) to Windows default (49152-65535), - # to prevent conflicts with ANCM random ports (1025-48000). - - netsh int ipv4 show dynamicport tcp - - netsh int ipv4 set dynamic tcp start=49152 num=16384 - - netsh int ipv4 show dynamicport tcp - - - git config --global core.autocrlf true -branches: - only: - - dev - - /^release\/.*$/ - - /^(.*\/)?ci-.*$/ -install: - - ps: .\tools\update_schema.ps1 - - git submodule update --init --recursive - - net start w3svc -build_script: - - ps: .\run.ps1 default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true -clone_depth: 1 -environment: - global: - DOTNET_SKIP_FIRST_TIME_EXPERIENCE: true - DOTNET_CLI_TELEMETRY_OPTOUT: 1 -test: off -deploy: off -os: Visual Studio 2017 diff --git a/.editorconfig b/.editorconfig deleted file mode 100644 index 17d90aec31e287a0c20bb1ba5dc872c95022c619..0000000000000000000000000000000000000000 --- a/.editorconfig +++ /dev/null @@ -1,24 +0,0 @@ -# EditorConfig is awesome:http://EditorConfig.org - -# top-most EditorConfig file -root = true - -[*] -indent_style = space -charset = utf-8 -trim_trailing_whitespace = true -insert_final_newline = true - -[*.cs] -indent_size = 4 -dotnet_sort_system_directives_first = true:warning - -# Xml files -[*.{csproj,config,props,targets,ruleset,config,resx,xml}] -indent_size = 2 - -[*.{json, yml}] -indent_size = 2 - -[*.{ps1,sh}] -indent_size = 4 diff --git a/.gitattributes b/.gitattributes deleted file mode 100644 index 204c7323a3702f97690e533d9754f4141b349e3c..0000000000000000000000000000000000000000 --- a/.gitattributes +++ /dev/null @@ -1,53 +0,0 @@ -*.doc diff=astextplain -*.DOC diff=astextplain -*.docx diff=astextplain -*.DOCX diff=astextplain -*.dot diff=astextplain -*.DOT diff=astextplain -*.pdf diff=astextplain -*.PDF diff=astextplain -*.rtf diff=astextplain -*.RTF diff=astextplain - -*.jpg binary -*.png binary -*.gif binary - -*.cs text=auto diff=csharp -*.vb text=auto -*.resx text=auto -*.c text=auto -*.cpp text=auto -*.cxx text=auto -*.h text=auto -*.hxx text=auto -*.py text=auto -*.rb text=auto -*.java text=auto -*.html text=auto -*.htm text=auto -*.css text=auto -*.scss text=auto -*.sass text=auto -*.less text=auto -*.js text=auto -*.lisp text=auto -*.clj text=auto -*.sql text=auto -*.php text=auto -*.lua text=auto -*.m text=auto -*.asm text=auto -*.erl text=auto -*.fs text=auto -*.fsx text=auto -*.hs text=auto -*.rc text=auto - -*.vcxproj text=auto -*.csproj text=auto -*.vbproj text=auto -*.fsproj text=auto -*.dbproj text=auto -*.sln text=auto eol=crlf -*.sh eol=lf diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 42ecc5d6c7461ea4762b34344997cee3ee6101cd..0000000000000000000000000000000000000000 --- a/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "test/gtest/googletest"] - path = test/gtest/googletest - url = https://github.com/google/googletest diff --git a/.vsts-pipelines/builds/ci-internal-21.yml b/.vsts-pipelines/builds/ci-internal-21.yml deleted file mode 100644 index afb252eae867641ac28c2916eef08d5764bbde53..0000000000000000000000000000000000000000 --- a/.vsts-pipelines/builds/ci-internal-21.yml +++ /dev/null @@ -1,30 +0,0 @@ -trigger: -- release/2.2 - -resources: - repositories: - - repository: buildtools - type: git - name: aspnet-BuildTools - ref: refs/heads/release/2.2 - -phases: -- template: .azure\templates\jobs\default-build.yml@buildtools - parameters: - agentOs: Windows - codeSign: false - buildArgs: /p:BuildServerIIS21=true /p:SkipIISExpressTests=true /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true - beforeBuild: - - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 SetupDumps" - displayName: Prepare repo - afterBuild: - - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown" - displayName: Stop AppVerifier - condition: always() - - task: PublishBuildArtifacts@1 - displayName: Upload logs - condition: eq(variables['system.pullrequest.isfork'], false) - inputs: - artifactName: logs - artifactType: Container - pathtoPublish: artifacts/logs \ No newline at end of file diff --git a/.vsts-pipelines/builds/ci-internal.yml b/.vsts-pipelines/builds/ci-internal.yml deleted file mode 100644 index 260baf4536f61f496484cf78b475d93b9a486ef6..0000000000000000000000000000000000000000 --- a/.vsts-pipelines/builds/ci-internal.yml +++ /dev/null @@ -1,13 +0,0 @@ -trigger: -- master -- release/* - -resources: - repositories: - - repository: buildtools - type: git - name: aspnet-BuildTools - ref: refs/heads/release/2.2 - -phases: -- template: ../templates/build-steps.yml diff --git a/.vsts-pipelines/builds/ci-public.yml b/.vsts-pipelines/builds/ci-public.yml deleted file mode 100644 index 0ed1a241abfc0620bd52ce623e4f5b676199ec74..0000000000000000000000000000000000000000 --- a/.vsts-pipelines/builds/ci-public.yml +++ /dev/null @@ -1,15 +0,0 @@ -trigger: -- master -- release/* - -# See https://github.com/aspnet/BuildTools -resources: - repositories: - - repository: buildtools - type: github - endpoint: DotNet-Bot GitHub Connection - name: aspnet/BuildTools - ref: refs/heads/release/2.2 - -phases: -- template: ../templates/build-steps.yml diff --git a/.vsts-pipelines/templates/build-steps.yml b/.vsts-pipelines/templates/build-steps.yml deleted file mode 100644 index 4db5633ddc768b0141981e843f822653d543451c..0000000000000000000000000000000000000000 --- a/.vsts-pipelines/templates/build-steps.yml +++ /dev/null @@ -1,88 +0,0 @@ -phases: -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: Windows - phaseName: IIS_Express_Tests - buildArgs: /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISTests=true /p:SkipIISForwardsCompatibilityTests=true - beforeBuild: - - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup" - displayName: Prepare repo - afterBuild: - - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown" - displayName: Stop AppVerifier - condition: always() - - task: PublishBuildArtifacts@1 - displayName: Upload logs - condition: eq(variables['system.pullrequest.isfork'], false) - inputs: - artifactName: logs - artifactType: Container - pathtoPublish: artifacts/logs - -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: Windows - phaseName: IIS_Tests - buildArgs: /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true - beforeBuild: - - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup" - displayName: Prepare repo - afterBuild: - - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown" - displayName: Stop AppVerifier - condition: always() - - task: PublishBuildArtifacts@1 - displayName: Upload logs - condition: eq(variables['system.pullrequest.isfork'], false) - inputs: - artifactName: logs - artifactType: Container - pathtoPublish: artifacts/logs - -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: Windows - phaseName: IIS_BackCompat_Tests - buildArgs: /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISForwardsCompatibilityTests=true - beforeBuild: - - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup" - displayName: Prepare repo - afterBuild: - - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown" - displayName: Stop AppVerifier - condition: always() - - task: PublishBuildArtifacts@1 - displayName: Upload logs - condition: eq(variables['system.pullrequest.isfork'], false) - inputs: - artifactName: logs - artifactType: Container - pathtoPublish: artifacts/logs - -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: Windows - phaseName: IIS_ForwardsCompat_Tests - buildArgs: /p:SkipIISTests=true /p:SkipIISExpressTests=true /p:SkipIISBackwardsCompatibilityTests=true - beforeBuild: - - powershell: "& ./tools/UpdateIISExpressCertificate.ps1; & ./tools/update_schema.ps1; & ./tools/SetupTestEnvironment.ps1 Setup" - displayName: Prepare repo - afterBuild: - - powershell: "& ./tools/SetupTestEnvironment.ps1 Shutdown" - displayName: Stop AppVerifier - condition: always() - - task: PublishBuildArtifacts@1 - displayName: Upload logs - condition: eq(variables['system.pullrequest.isfork'], false) - inputs: - artifactName: logs - artifactType: Container - pathtoPublish: artifacts/logs - -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: macOS - -- template: .vsts-pipelines/templates/phases/default-build.yml@buildtools - parameters: - agentOs: Linux diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md deleted file mode 100644 index eac4268e4c97dc979c89a79ed8705c9998506413..0000000000000000000000000000000000000000 --- a/CONTRIBUTING.md +++ /dev/null @@ -1,4 +0,0 @@ -Contributing -====== - -Information on contributing to this repo is in the [Contributing Guide](https://github.com/aspnet/Home/blob/master/CONTRIBUTING.md) in the Home repo. diff --git a/LICENSE.txt b/LICENSE.txt deleted file mode 100644 index 1508c66d70ba654cd380745ebb2288fe7a62f8d1..0000000000000000000000000000000000000000 --- a/LICENSE.txt +++ /dev/null @@ -1,228 +0,0 @@ - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright (c) .NET Foundation and Contributors - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -========================= - -ASP.NET Core Module - -Copyright (c) .NET Foundation -All rights reserved. - -MIT License - -Permission is hereby granted, free of charge, to any person obtaining a copy of -this software and associated documentation files (the ""Software""), to deal in -the Software without restriction, including without limitation the rights to -use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of -the Software, and to permit persons to whom the Software is furnished to do so, -subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS -FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR -COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER -IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN -CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. diff --git a/NuGet.config b/NuGet.config deleted file mode 100644 index e32bddfd514287b0b63cece097f11ecb1410ec64..0000000000000000000000000000000000000000 --- a/NuGet.config +++ /dev/null @@ -1,7 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<configuration> - <packageSources> - <clear /> - <!-- Restore sources should be defined in build/sources.props. --> - </packageSources> -</configuration> diff --git a/README.md b/README.md deleted file mode 100644 index 217e6fe345f81b408d98ebcdeb8dc8be3e6161b4..0000000000000000000000000000000000000000 --- a/README.md +++ /dev/null @@ -1,18 +0,0 @@ -ASP.NET Core IISIntegration -======== -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. - -## Building from source -1. Install prerequisites - 1. Visual Studio 2017 - 1. Workload: `Desktop development with C++` - 1. Run `run.ps1 install vs` or install the following components - 1. Additional Component: `Windows 8.1 SDK and UCRT SDK` - 2. Additional Component: `Windows 10 SDK (10.0.15063.0) for Desktop C++ [x86 and x64]` - 2. Workload: `ASP.NET and web development` -2. Clone with submodules - 1. `git clone --recurse-submodules IISIntegration` - 2. OR run `git submodule update --init --recursive` after initial clone -3. `build.cmd` diff --git a/THIRD_PARTY_NOTICES b/THIRD_PARTY_NOTICES deleted file mode 100644 index 12e1c32746014154bcdba79f93c78f584be14b05..0000000000000000000000000000000000000000 --- a/THIRD_PARTY_NOTICES +++ /dev/null @@ -1,42 +0,0 @@ -.NET Core uses third-party libraries or other resources that may be -distributed under licenses different than the .NET Core software. - -In the event that we accidentally failed to list a required notice, please -bring it to our attention. Post an issue or email us: - - dotnet@microsoft.com - -The attached notices are provided for information only. - - -License notice for googletest ------------------------------------- - -"Copyright 2008, Google Inc. -All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are -met: - - * Redistributions of source code must retain the above copyright -notice, this list of conditions and the following disclaimer. - * Redistributions in binary form must reproduce the above -copyright notice, this list of conditions and the following disclaimer -in the documentation and/or other materials provided with the -distribution. - * Neither the name of Google Inc. nor the names of its -contributors may be used to endorse or promote products derived from -this software without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE." diff --git a/build.cmd b/build.cmd deleted file mode 100644 index c0050bda125e73f3745de70a4021262eaa048c7b..0000000000000000000000000000000000000000 --- a/build.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' default-build %*; exit $LASTEXITCODE" diff --git a/build.sh b/build.sh deleted file mode 100755 index 98a4b227658413eca2adb0d1d2d68178a80155cf..0000000000000000000000000000000000000000 --- a/build.sh +++ /dev/null @@ -1,8 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" - -# Call "sync" between "chmod" and execution to prevent "text file busy" error in Docker (aufs) -chmod +x "$DIR/run.sh"; sync -"$DIR/run.sh" default-build "$@" diff --git a/korebuild-lock.txt b/korebuild-lock.txt deleted file mode 100644 index 0055dcb41f6a5d733733e548b6a9d293940e4371..0000000000000000000000000000000000000000 --- a/korebuild-lock.txt +++ /dev/null @@ -1,2 +0,0 @@ -version:2.2.0-preview2-20181019.5 -commithash:84a1c04b13bd7127728fee91989db8f2f58c8781 diff --git a/mv_to_src.sh b/mv_to_src.sh new file mode 100644 index 0000000000000000000000000000000000000000..2360a52087821c43aa6ce418d685121652232798 --- /dev/null +++ b/mv_to_src.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +dir="$(pwd)" +name="IISIntegration" + +if [ "$skip_src" != false ]; then + echo "Moving $dir into src/$name/" + if [ -d "src/" ]; then + git mv src/ src_tmp/ + fi + mkdir -p "src/$name" + if [ -d "src_tmp/" ]; then + git mv src_tmp/ "src/$name/src/" + fi +fi + +files_to_mv=(NuGetPackageVerifier.json .gitignore README.md version.props Directory.Build.props Directory.Build.targets *.sln shared test tools samples build NuGet benchmarks korebuild.json nuget) +for f in "${files_to_mv[@]}"; do + if [ -e $f ]; then + echo "Moving $f" + git mv $f "src/$name/$f" + fi +done + +files_to_rm=(build.sh build.cmd run.cmd run.sh run.ps1 NuGet.config korebuild-lock.txt .github .vsts-pipelines .vscode .appveyor.yml .travis.yml CONTRIBUTING.md) +for f in "${files_to_rm[@]}"; do + if [ -e $f ]; then + echo "Removing $f" + git rm -r $f + fi +done + +echo "Reorganize source code from aspnet/$name into a subfolder" > .git/COMMIT_EDITMSG +echo "" >> .git/COMMIT_EDITMSG +echo "Prior to reorg, this source existed at https://github.com/aspnet/$name/tree/$(git rev-parse HEAD)" >> .git/COMMIT_EDITMSG \ No newline at end of file diff --git a/run.cmd b/run.cmd deleted file mode 100644 index d52d5c7e689e8108ed0f0b83a22b61375fde8fef..0000000000000000000000000000000000000000 --- a/run.cmd +++ /dev/null @@ -1,2 +0,0 @@ -@ECHO OFF -PowerShell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command "[System.Threading.Thread]::CurrentThread.CurrentCulture = ''; [System.Threading.Thread]::CurrentThread.CurrentUICulture = '';& '%~dp0run.ps1' %*; exit $LASTEXITCODE" diff --git a/run.ps1 b/run.ps1 deleted file mode 100644 index 34604c7175877351351d0a60c3f60c90673c8cdf..0000000000000000000000000000000000000000 --- a/run.ps1 +++ /dev/null @@ -1,209 +0,0 @@ -#!/usr/bin/env powershell -#requires -version 4 - -<# -.SYNOPSIS -Executes KoreBuild commands. - -.DESCRIPTION -Downloads korebuild if required. Then executes the KoreBuild command. To see available commands, execute with `-Command help`. - -.PARAMETER Command -The KoreBuild command to run. - -.PARAMETER Path -The folder to build. Defaults to the folder containing this script. - -.PARAMETER Channel -The channel of KoreBuild to download. Overrides the value from the config file. - -.PARAMETER DotNetHome -The directory where .NET Core tools will be stored. - -.PARAMETER ToolsSource -The base url where build tools can be downloaded. Overrides the value from the config file. - -.PARAMETER Update -Updates KoreBuild to the latest version even if a lock file is present. - -.PARAMETER Reinstall -Re-installs KoreBuild - -.PARAMETER ConfigFile -The path to the configuration file that stores values. Defaults to korebuild.json. - -.PARAMETER ToolsSourceSuffix -The Suffix to append to the end of the ToolsSource. Useful for query strings in blob stores. - -.PARAMETER CI -Sets up CI specific settings and variables. - -.PARAMETER Arguments -Arguments to be passed to the command - -.NOTES -This function will create a file $PSScriptRoot/korebuild-lock.txt. This lock file can be committed to source, but does not have to be. -When the lockfile is not present, KoreBuild will create one using latest available version from $Channel. - -The $ConfigFile is expected to be an JSON file. It is optional, and the configuration values in it are optional as well. Any options set -in the file are overridden by command line parameters. - -.EXAMPLE -Example config file: -```json -{ - "$schema": "https://raw.githubusercontent.com/aspnet/BuildTools/master/tools/korebuild.schema.json", - "channel": "master", - "toolsSource": "https://aspnetcore.blob.core.windows.net/buildtools" -} -``` -#> -[CmdletBinding(PositionalBinding = $false)] -param( - [Parameter(Mandatory = $true, Position = 0)] - [string]$Command, - [string]$Path = $PSScriptRoot, - [Alias('c')] - [string]$Channel, - [Alias('d')] - [string]$DotNetHome, - [Alias('s')] - [string]$ToolsSource, - [Alias('u')] - [switch]$Update, - [switch]$Reinstall, - [string]$ToolsSourceSuffix, - [string]$ConfigFile = $null, - [switch]$CI, - [Parameter(ValueFromRemainingArguments = $true)] - [string[]]$Arguments -) - -Set-StrictMode -Version 2 -$ErrorActionPreference = 'Stop' - -# -# Functions -# - -function Get-KoreBuild { - - $lockFile = Join-Path $Path 'korebuild-lock.txt' - - if (!(Test-Path $lockFile) -or $Update) { - Get-RemoteFile "$ToolsSource/korebuild/channels/$Channel/latest.txt" $lockFile $ToolsSourceSuffix - } - - $version = Get-Content $lockFile | Where-Object { $_ -like 'version:*' } | Select-Object -first 1 - if (!$version) { - Write-Error "Failed to parse version from $lockFile. Expected a line that begins with 'version:'" - } - $version = $version.TrimStart('version:').Trim() - $korebuildPath = Join-Paths $DotNetHome ('buildtools', 'korebuild', $version) - - if ($Reinstall -and (Test-Path $korebuildPath)) { - Remove-Item -Force -Recurse $korebuildPath - } - - if (!(Test-Path $korebuildPath)) { - Write-Host -ForegroundColor Magenta "Downloading KoreBuild $version" - New-Item -ItemType Directory -Path $korebuildPath | Out-Null - $remotePath = "$ToolsSource/korebuild/artifacts/$version/korebuild.$version.zip" - - try { - $tmpfile = Join-Path ([IO.Path]::GetTempPath()) "KoreBuild-$([guid]::NewGuid()).zip" - Get-RemoteFile $remotePath $tmpfile $ToolsSourceSuffix - if (Get-Command -Name 'Microsoft.PowerShell.Archive\Expand-Archive' -ErrorAction Ignore) { - # Use built-in commands where possible as they are cross-plat compatible - Microsoft.PowerShell.Archive\Expand-Archive -Path $tmpfile -DestinationPath $korebuildPath - } - else { - # Fallback to old approach for old installations of PowerShell - Add-Type -AssemblyName System.IO.Compression.FileSystem - [System.IO.Compression.ZipFile]::ExtractToDirectory($tmpfile, $korebuildPath) - } - } - catch { - Remove-Item -Recurse -Force $korebuildPath -ErrorAction Ignore - throw - } - finally { - Remove-Item $tmpfile -ErrorAction Ignore - } - } - - return $korebuildPath -} - -function Join-Paths([string]$path, [string[]]$childPaths) { - $childPaths | ForEach-Object { $path = Join-Path $path $_ } - return $path -} - -function Get-RemoteFile([string]$RemotePath, [string]$LocalPath, [string]$RemoteSuffix) { - if ($RemotePath -notlike 'http*') { - Copy-Item $RemotePath $LocalPath - return - } - - $retries = 10 - while ($retries -gt 0) { - $retries -= 1 - try { - Invoke-WebRequest -UseBasicParsing -Uri $($RemotePath + $RemoteSuffix) -OutFile $LocalPath - return - } - catch { - Write-Verbose "Request failed. $retries retries remaining" - } - } - - Write-Error "Download failed: '$RemotePath'." -} - -# -# Main -# - -# Load configuration or set defaults - -$Path = Resolve-Path $Path -if (!$ConfigFile) { $ConfigFile = Join-Path $Path 'korebuild.json' } - -if (Test-Path $ConfigFile) { - try { - $config = Get-Content -Raw -Encoding UTF8 -Path $ConfigFile | ConvertFrom-Json - if ($config) { - if (!($Channel) -and (Get-Member -Name 'channel' -InputObject $config)) { [string] $Channel = $config.channel } - if (!($ToolsSource) -and (Get-Member -Name 'toolsSource' -InputObject $config)) { [string] $ToolsSource = $config.toolsSource} - } - } - catch { - Write-Host -ForegroundColor Red $Error[0] - Write-Error "$ConfigFile contains invalid JSON." - exit 1 - } -} - -if (!$DotNetHome) { - $DotNetHome = if ($env:DOTNET_HOME) { $env:DOTNET_HOME } ` - elseif ($env:USERPROFILE) { Join-Path $env:USERPROFILE '.dotnet'} ` - elseif ($env:HOME) {Join-Path $env:HOME '.dotnet'}` - else { Join-Path $PSScriptRoot '.dotnet'} -} - -if (!$Channel) { $Channel = 'master' } -if (!$ToolsSource) { $ToolsSource = 'https://aspnetcore.blob.core.windows.net/buildtools' } - -# Execute - -$korebuildPath = Get-KoreBuild -Import-Module -Force -Scope Local (Join-Path $korebuildPath 'KoreBuild.psd1') - -try { - Set-KoreBuildSettings -ToolsSource $ToolsSource -DotNetHome $DotNetHome -RepoPath $Path -ConfigFile $ConfigFile -CI:$CI - Invoke-KoreBuildCommand $Command @Arguments -} -finally { - Remove-Module 'KoreBuild' -ErrorAction Ignore -} diff --git a/run.sh b/run.sh deleted file mode 100755 index 4c1fed5646ca811ed28e7bd5f47ec62da9a1fe9f..0000000000000000000000000000000000000000 --- a/run.sh +++ /dev/null @@ -1,256 +0,0 @@ -#!/usr/bin/env bash - -set -euo pipefail - -# -# variables -# - -RESET="\033[0m" -RED="\033[0;31m" -YELLOW="\033[0;33m" -MAGENTA="\033[0;95m" -DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" -[ -z "${DOTNET_HOME:-}" ] && DOTNET_HOME="$HOME/.dotnet" -verbose=false -update=false -reinstall=false -repo_path="$DIR" -channel='' -tools_source='' -tools_source_suffix='' -ci=false - -# -# Functions -# -__usage() { - echo "Usage: $(basename "${BASH_SOURCE[0]}") command [options] [[--] <Arguments>...]" - echo "" - echo "Arguments:" - echo " command The command to be run." - echo " <Arguments>... Arguments passed to the command. Variable number of arguments allowed." - echo "" - echo "Options:" - echo " --verbose Show verbose output." - echo " -c|--channel <CHANNEL> The channel of KoreBuild to download. Overrides the value from the config file.." - echo " --config-file <FILE> The path to the configuration file that stores values. Defaults to korebuild.json." - echo " -d|--dotnet-home <DIR> The directory where .NET Core tools will be stored. Defaults to '\$DOTNET_HOME' or '\$HOME/.dotnet." - echo " --path <PATH> The directory to build. Defaults to the directory containing the script." - echo " -s|--tools-source|-ToolsSource <URL> The base url where build tools can be downloaded. Overrides the value from the config file." - echo " --tools-source-suffix|-ToolsSourceSuffix <SUFFIX> The suffix to append to tools-source. Useful for query strings." - echo " -u|--update Update to the latest KoreBuild even if the lock file is present." - echo " --reinstall Reinstall KoreBuild." - echo " --ci Apply CI specific settings and environment variables." - echo "" - echo "Description:" - echo " This function will create a file \$DIR/korebuild-lock.txt. This lock file can be committed to source, but does not have to be." - echo " When the lockfile is not present, KoreBuild will create one using latest available version from \$channel." - - if [[ "${1:-}" != '--no-exit' ]]; then - exit 2 - fi -} - -get_korebuild() { - local version - local lock_file="$repo_path/korebuild-lock.txt" - if [ ! -f "$lock_file" ] || [ "$update" = true ]; then - __get_remote_file "$tools_source/korebuild/channels/$channel/latest.txt" "$lock_file" "$tools_source_suffix" - fi - version="$(grep 'version:*' -m 1 "$lock_file")" - if [[ "$version" == '' ]]; then - __error "Failed to parse version from $lock_file. Expected a line that begins with 'version:'" - return 1 - fi - version="$(echo "${version#version:}" | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//')" - local korebuild_path="$DOTNET_HOME/buildtools/korebuild/$version" - - if [ "$reinstall" = true ] && [ -d "$korebuild_path" ]; then - rm -rf "$korebuild_path" - fi - - { - if [ ! -d "$korebuild_path" ]; then - mkdir -p "$korebuild_path" - local remote_path="$tools_source/korebuild/artifacts/$version/korebuild.$version.zip" - tmpfile="$(mktemp)" - echo -e "${MAGENTA}Downloading KoreBuild ${version}${RESET}" - if __get_remote_file "$remote_path" "$tmpfile" "$tools_source_suffix"; then - unzip -q -d "$korebuild_path" "$tmpfile" - fi - rm "$tmpfile" || true - fi - - source "$korebuild_path/KoreBuild.sh" - } || { - if [ -d "$korebuild_path" ]; then - echo "Cleaning up after failed installation" - rm -rf "$korebuild_path" || true - fi - return 1 - } -} - -__error() { - echo -e "${RED}error: $*${RESET}" 1>&2 -} - -__warn() { - echo -e "${YELLOW}warning: $*${RESET}" -} - -__machine_has() { - hash "$1" > /dev/null 2>&1 - return $? -} - -__get_remote_file() { - local remote_path=$1 - local local_path=$2 - local remote_path_suffix=$3 - - if [[ "$remote_path" != 'http'* ]]; then - cp "$remote_path" "$local_path" - return 0 - fi - - local failed=false - if __machine_has wget; then - wget --tries 10 --quiet -O "$local_path" "${remote_path}${remote_path_suffix}" || failed=true - else - failed=true - fi - - if [ "$failed" = true ] && __machine_has curl; then - failed=false - curl --retry 10 -sSL -f --create-dirs -o "$local_path" "${remote_path}${remote_path_suffix}" || failed=true - fi - - if [ "$failed" = true ]; then - __error "Download failed: $remote_path" 1>&2 - return 1 - fi -} - -# -# main -# - -command="${1:-}" -shift - -while [[ $# -gt 0 ]]; do - case $1 in - -\?|-h|--help) - __usage --no-exit - exit 0 - ;; - -c|--channel|-Channel) - shift - channel="${1:-}" - [ -z "$channel" ] && __usage - ;; - --config-file|-ConfigFile) - shift - config_file="${1:-}" - [ -z "$config_file" ] && __usage - if [ ! -f "$config_file" ]; then - __error "Invalid value for --config-file. $config_file does not exist." - exit 1 - fi - ;; - -d|--dotnet-home|-DotNetHome) - shift - DOTNET_HOME="${1:-}" - [ -z "$DOTNET_HOME" ] && __usage - ;; - --path|-Path) - shift - repo_path="${1:-}" - [ -z "$repo_path" ] && __usage - ;; - -s|--tools-source|-ToolsSource) - shift - tools_source="${1:-}" - [ -z "$tools_source" ] && __usage - ;; - --tools-source-suffix|-ToolsSourceSuffix) - shift - tools_source_suffix="${1:-}" - [ -z "$tools_source_suffix" ] && __usage - ;; - -u|--update|-Update) - update=true - ;; - --reinstall|-[Rr]einstall) - reinstall=true - ;; - --ci|-[Cc][Ii]) - ci=true - ;; - --verbose|-Verbose) - verbose=true - ;; - --) - shift - break - ;; - *) - break - ;; - esac - shift -done - -if ! __machine_has unzip; then - __error 'Missing required command: unzip' - exit 1 -fi - -if ! __machine_has curl && ! __machine_has wget; then - __error 'Missing required command. Either wget or curl is required.' - exit 1 -fi - -[ -z "${config_file:-}" ] && config_file="$repo_path/korebuild.json" -if [ -f "$config_file" ]; then - if __machine_has jq ; then - if jq '.' "$config_file" >/dev/null ; then - config_channel="$(jq -r 'select(.channel!=null) | .channel' "$config_file")" - config_tools_source="$(jq -r 'select(.toolsSource!=null) | .toolsSource' "$config_file")" - else - __error "$config_file contains invalid JSON." - exit 1 - fi - elif __machine_has python ; then - if python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then - config_channel="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" - config_tools_source="$(python -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" - else - __error "$config_file contains invalid JSON." - exit 1 - fi - elif __machine_has python3 ; then - if python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'))" >/dev/null ; then - config_channel="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['channel'] if 'channel' in obj else '')")" - config_tools_source="$(python3 -c "import json,codecs;obj=json.load(codecs.open('$config_file', 'r', 'utf-8-sig'));print(obj['toolsSource'] if 'toolsSource' in obj else '')")" - else - __error "$config_file contains invalid JSON." - exit 1 - fi - else - __error 'Missing required command: jq or python. Could not parse the JSON file.' - exit 1 - fi - - [ ! -z "${config_channel:-}" ] && channel="$config_channel" - [ ! -z "${config_tools_source:-}" ] && tools_source="$config_tools_source" -fi - -[ -z "$channel" ] && channel='master' -[ -z "$tools_source" ] && tools_source='https://aspnetcore.blob.core.windows.net/buildtools' - -get_korebuild -set_korebuildsettings "$tools_source" "$DOTNET_HOME" "$repo_path" "$config_file" "$ci" -invoke_korebuild_command "$command" "$@" diff --git a/.gitignore b/src/IISIntegration/.gitignore similarity index 100% rename from .gitignore rename to src/IISIntegration/.gitignore diff --git a/Directory.Build.props b/src/IISIntegration/Directory.Build.props similarity index 100% rename from Directory.Build.props rename to src/IISIntegration/Directory.Build.props diff --git a/Directory.Build.targets b/src/IISIntegration/Directory.Build.targets similarity index 100% rename from Directory.Build.targets rename to src/IISIntegration/Directory.Build.targets diff --git a/IISIntegration.NoV1.sln b/src/IISIntegration/IISIntegration.NoV1.sln similarity index 100% rename from IISIntegration.NoV1.sln rename to src/IISIntegration/IISIntegration.NoV1.sln diff --git a/IISIntegration.sln b/src/IISIntegration/IISIntegration.sln similarity index 100% rename from IISIntegration.sln rename to src/IISIntegration/IISIntegration.sln diff --git a/NuGetPackageVerifier.json b/src/IISIntegration/NuGetPackageVerifier.json similarity index 100% rename from NuGetPackageVerifier.json rename to src/IISIntegration/NuGetPackageVerifier.json diff --git a/NuGetPackageVerifier.xplat.json b/src/IISIntegration/NuGetPackageVerifier.xplat.json similarity index 100% rename from NuGetPackageVerifier.xplat.json rename to src/IISIntegration/NuGetPackageVerifier.xplat.json diff --git a/benchmarks/IIS.Performance/FirstRequestConfig.cs b/src/IISIntegration/benchmarks/IIS.Performance/FirstRequestConfig.cs similarity index 100% rename from benchmarks/IIS.Performance/FirstRequestConfig.cs rename to src/IISIntegration/benchmarks/IIS.Performance/FirstRequestConfig.cs diff --git a/benchmarks/IIS.Performance/IIS.Performance.csproj b/src/IISIntegration/benchmarks/IIS.Performance/IIS.Performance.csproj similarity index 100% rename from benchmarks/IIS.Performance/IIS.Performance.csproj rename to src/IISIntegration/benchmarks/IIS.Performance/IIS.Performance.csproj diff --git a/benchmarks/IIS.Performance/PlaintextBenchmark.cs b/src/IISIntegration/benchmarks/IIS.Performance/PlaintextBenchmark.cs similarity index 100% rename from benchmarks/IIS.Performance/PlaintextBenchmark.cs rename to src/IISIntegration/benchmarks/IIS.Performance/PlaintextBenchmark.cs diff --git a/benchmarks/IIS.Performance/StartupTimeBenchmark.cs b/src/IISIntegration/benchmarks/IIS.Performance/StartupTimeBenchmark.cs similarity index 100% rename from benchmarks/IIS.Performance/StartupTimeBenchmark.cs rename to src/IISIntegration/benchmarks/IIS.Performance/StartupTimeBenchmark.cs diff --git a/build/Build.Settings b/src/IISIntegration/build/Build.Settings similarity index 100% rename from build/Build.Settings rename to src/IISIntegration/build/Build.Settings diff --git a/build/Config.Definitions.Props b/src/IISIntegration/build/Config.Definitions.Props similarity index 100% rename from build/Config.Definitions.Props rename to src/IISIntegration/build/Config.Definitions.Props diff --git a/build/Key.snk b/src/IISIntegration/build/Key.snk similarity index 100% rename from build/Key.snk rename to src/IISIntegration/build/Key.snk diff --git a/build/applicationhost.config b/src/IISIntegration/build/applicationhost.config similarity index 100% rename from build/applicationhost.config rename to src/IISIntegration/build/applicationhost.config diff --git a/build/applicationhost.iis.config b/src/IISIntegration/build/applicationhost.iis.config similarity index 100% rename from build/applicationhost.iis.config rename to src/IISIntegration/build/applicationhost.iis.config diff --git a/build/assets.props b/src/IISIntegration/build/assets.props similarity index 100% rename from build/assets.props rename to src/IISIntegration/build/assets.props diff --git a/build/buildpipeline/pipeline.groovy b/src/IISIntegration/build/buildpipeline/pipeline.groovy similarity index 96% rename from build/buildpipeline/pipeline.groovy rename to src/IISIntegration/build/buildpipeline/pipeline.groovy index 7ccbca0b2ade900af798ce3555c10b6f21fccb87..13fd8d9addc2688e00ef259a27824adafe2a6eab 100644 --- a/build/buildpipeline/pipeline.groovy +++ b/src/IISIntegration/build/buildpipeline/pipeline.groovy @@ -1,18 +1,18 @@ -import org.dotnet.ci.pipelines.Pipeline - -def windowsPipeline = Pipeline.createPipeline(this, 'build/buildpipeline/windows.groovy') - -def configurations = [ - 'Debug', - 'Release' -] - -configurations.each { configuration -> - - def params = [ - 'Configuration': configuration - ] - - windowsPipeline.triggerPipelineOnEveryGithubPR("Windows ${configuration} x64 Build", params) - windowsPipeline.triggerPipelineOnGithubPush(params) -} +import org.dotnet.ci.pipelines.Pipeline + +def windowsPipeline = Pipeline.createPipeline(this, 'build/buildpipeline/windows.groovy') + +def configurations = [ + 'Debug', + 'Release' +] + +configurations.each { configuration -> + + def params = [ + 'Configuration': configuration + ] + + windowsPipeline.triggerPipelineOnEveryGithubPR("Windows ${configuration} x64 Build", params) + windowsPipeline.triggerPipelineOnGithubPush(params) +} diff --git a/build/buildpipeline/windows-appverif.groovy b/src/IISIntegration/build/buildpipeline/windows-appverif.groovy similarity index 100% rename from build/buildpipeline/windows-appverif.groovy rename to src/IISIntegration/build/buildpipeline/windows-appverif.groovy diff --git a/build/buildpipeline/windows.groovy b/src/IISIntegration/build/buildpipeline/windows.groovy similarity index 98% rename from build/buildpipeline/windows.groovy rename to src/IISIntegration/build/buildpipeline/windows.groovy index e3efa6193fb3d5fd9d984f77bfef0a48f349f43e..c482e84079093d0457e92f025dfba0f121f4d875 100644 --- a/build/buildpipeline/windows.groovy +++ b/src/IISIntegration/build/buildpipeline/windows.groovy @@ -1,15 +1,15 @@ -@Library('dotnet-ci') _ - -// 'node' indicates to Jenkins that the enclosed block runs on a node that matches -// the label 'windows-with-vs' -simpleNode('Windows.10.Amd64.EnterpriseRS3.ASPNET.Open') { - stage ('Checking out source') { - checkout scm - bat 'git submodule update --init --recursive' - } - stage ('Build') { - def logFolder = getLogFolder() - def environment = "\$env:ASPNETCORE_TEST_LOG_DIR='${WORKSPACE}\\${logFolder}'" - bat "powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command \"${environment};&.\\tools\\SetupTestEnvironment.ps1 SetupDumps;&.\\tools\\update_schema.ps1;&.\\tools\\UpdateIISExpressCertificate.ps1;&.\\run.cmd -CI default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true /p:Configuration=${params.Configuration}\";" - } -} +@Library('dotnet-ci') _ + +// 'node' indicates to Jenkins that the enclosed block runs on a node that matches +// the label 'windows-with-vs' +simpleNode('Windows.10.Amd64.EnterpriseRS3.ASPNET.Open') { + stage ('Checking out source') { + checkout scm + bat 'git submodule update --init --recursive' + } + stage ('Build') { + def logFolder = getLogFolder() + def environment = "\$env:ASPNETCORE_TEST_LOG_DIR='${WORKSPACE}\\${logFolder}'" + bat "powershell -NoProfile -NoLogo -ExecutionPolicy unrestricted -Command \"${environment};&.\\tools\\SetupTestEnvironment.ps1 SetupDumps;&.\\tools\\update_schema.ps1;&.\\tools\\UpdateIISExpressCertificate.ps1;&.\\run.cmd -CI default-build /p:SkipIISBackwardsCompatibilityTests=true /p:SkipIISForwardsCompatibilityTests=true /p:Configuration=${params.Configuration}\";" + } +} diff --git a/build/dependencies.props b/src/IISIntegration/build/dependencies.props similarity index 100% rename from build/dependencies.props rename to src/IISIntegration/build/dependencies.props diff --git a/build/functional-test-assets.targets b/src/IISIntegration/build/functional-test-assets.targets similarity index 100% rename from build/functional-test-assets.targets rename to src/IISIntegration/build/functional-test-assets.targets diff --git a/build/launchSettings.json b/src/IISIntegration/build/launchSettings.json similarity index 100% rename from build/launchSettings.json rename to src/IISIntegration/build/launchSettings.json diff --git a/build/native.targets b/src/IISIntegration/build/native.targets similarity index 100% rename from build/native.targets rename to src/IISIntegration/build/native.targets diff --git a/build/repo.props b/src/IISIntegration/build/repo.props similarity index 100% rename from build/repo.props rename to src/IISIntegration/build/repo.props diff --git a/build/repo.targets b/src/IISIntegration/build/repo.targets similarity index 100% rename from build/repo.targets rename to src/IISIntegration/build/repo.targets diff --git a/build/sources.props b/src/IISIntegration/build/sources.props similarity index 100% rename from build/sources.props rename to src/IISIntegration/build/sources.props diff --git a/build/testsite.props b/src/IISIntegration/build/testsite.props similarity index 100% rename from build/testsite.props rename to src/IISIntegration/build/testsite.props diff --git a/korebuild.json b/src/IISIntegration/korebuild.json similarity index 100% rename from korebuild.json rename to src/IISIntegration/korebuild.json diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec similarity index 100% rename from nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.nuspec diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModule.props b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props similarity index 100% rename from nuget/Microsoft.AspNetCore.AspNetCoreModule.props rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModule.props diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec similarity index 100% rename from nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.nuspec diff --git a/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in b/src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in similarity index 100% rename from nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in rename to src/IISIntegration/nuget/Microsoft.AspNetCore.AspNetCoreModuleV2.props.in diff --git a/samples/IISSample/IISSample.csproj b/src/IISIntegration/samples/IISSample/IISSample.csproj similarity index 100% rename from samples/IISSample/IISSample.csproj rename to src/IISIntegration/samples/IISSample/IISSample.csproj diff --git a/samples/IISSample/Properties/launchSettings.json b/src/IISIntegration/samples/IISSample/Properties/launchSettings.json similarity index 100% rename from samples/IISSample/Properties/launchSettings.json rename to src/IISIntegration/samples/IISSample/Properties/launchSettings.json diff --git a/samples/IISSample/Startup.cs b/src/IISIntegration/samples/IISSample/Startup.cs similarity index 100% rename from samples/IISSample/Startup.cs rename to src/IISIntegration/samples/IISSample/Startup.cs diff --git a/samples/IISSample/web.config b/src/IISIntegration/samples/IISSample/web.config similarity index 100% rename from samples/IISSample/web.config rename to src/IISIntegration/samples/IISSample/web.config diff --git a/samples/NativeIISSample/NativeIISSample.csproj b/src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj similarity index 100% rename from samples/NativeIISSample/NativeIISSample.csproj rename to src/IISIntegration/samples/NativeIISSample/NativeIISSample.csproj diff --git a/samples/NativeIISSample/Properties/launchSettings.json b/src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json similarity index 100% rename from samples/NativeIISSample/Properties/launchSettings.json rename to src/IISIntegration/samples/NativeIISSample/Properties/launchSettings.json diff --git a/samples/NativeIISSample/Startup.cs b/src/IISIntegration/samples/NativeIISSample/Startup.cs similarity index 100% rename from samples/NativeIISSample/Startup.cs rename to src/IISIntegration/samples/NativeIISSample/Startup.cs diff --git a/samples/NativeIISSample/web.config b/src/IISIntegration/samples/NativeIISSample/web.config similarity index 100% rename from samples/NativeIISSample/web.config rename to src/IISIntegration/samples/NativeIISSample/web.config diff --git a/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/AspNetCore.vcxproj diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/application.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/application.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/applicationmanager.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/aspnetcoreconfig.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/debugutil.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/environmentvariablehash.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/filewatcher.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwarderconnection.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/forwardinghandler.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/path.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/path.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/processmanager.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/protocolconfig.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/proxymodule.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/resource.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/responseheaderhash.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/serverprocess.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/sttimer.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/websockethandler.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Inc/winhttphelper.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/Source.def b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/Source.def rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/Source.def diff --git a/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcore_msg.mc diff --git a/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/aspnetcoremodule.rc diff --git a/src/AspNetCoreModuleV1/AspNetCore/resource.h b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/resource.h rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/resource.h diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/application.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/application.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/applicationmanager.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/aspnetcoreconfig.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/filewatcher.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwarderconnection.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/forwardinghandler.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/main.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/main.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/path.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/path.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/precomp.hxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/processmanager.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/protocolconfig.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/proxymodule.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/responseheaderhash.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/serverprocess.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/websockethandler.cxx diff --git a/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx similarity index 100% rename from src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/AspNetCore/src/winhttphelper.cxx diff --git a/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/IISLib.vcxproj diff --git a/src/AspNetCoreModuleV1/IISLib/acache.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/acache.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.cxx diff --git a/src/AspNetCoreModuleV1/IISLib/acache.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/acache.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/acache.h diff --git a/src/AspNetCoreModuleV1/IISLib/ahutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/ahutil.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/ahutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/ahutil.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ahutil.h diff --git a/src/AspNetCoreModuleV1/IISLib/base64.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/base64.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/base64.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/base64.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/base64.h diff --git a/src/AspNetCoreModuleV1/IISLib/buffer.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/buffer.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/buffer.h diff --git a/src/AspNetCoreModuleV1/IISLib/datetime.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/datetime.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/datetime.h diff --git a/src/AspNetCoreModuleV1/IISLib/dbgutil.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/dbgutil.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/dbgutil.h diff --git a/src/AspNetCoreModuleV1/IISLib/hashfn.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/hashfn.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashfn.h diff --git a/src/AspNetCoreModuleV1/IISLib/hashtable.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/hashtable.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/hashtable.h diff --git a/src/AspNetCoreModuleV1/IISLib/listentry.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/listentry.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/listentry.h diff --git a/src/AspNetCoreModuleV1/IISLib/macros.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/macros.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/macros.h diff --git a/src/AspNetCoreModuleV1/IISLib/multisz.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/multisz.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/multisz.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/multisz.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisz.h diff --git a/src/AspNetCoreModuleV1/IISLib/multisza.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/multisza.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/multisza.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/multisza.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/multisza.h diff --git a/src/AspNetCoreModuleV1/IISLib/ntassert.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/ntassert.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/ntassert.h diff --git a/src/AspNetCoreModuleV1/IISLib/percpu.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/percpu.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/percpu.h diff --git a/src/AspNetCoreModuleV1/IISLib/precomp.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/precomp.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/precomp.h diff --git a/src/AspNetCoreModuleV1/IISLib/prime.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/prime.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/prime.h diff --git a/src/AspNetCoreModuleV1/IISLib/pudebug.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/pudebug.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/pudebug.h diff --git a/src/AspNetCoreModuleV1/IISLib/reftrace.c b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/reftrace.c rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.c diff --git a/src/AspNetCoreModuleV1/IISLib/reftrace.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/reftrace.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/reftrace.h diff --git a/src/AspNetCoreModuleV1/IISLib/rwlock.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/rwlock.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/rwlock.h diff --git a/src/AspNetCoreModuleV1/IISLib/stringa.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/stringa.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/stringa.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/stringa.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringa.h diff --git a/src/AspNetCoreModuleV1/IISLib/stringu.cpp b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/stringu.cpp rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.cpp diff --git a/src/AspNetCoreModuleV1/IISLib/stringu.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/stringu.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/stringu.h diff --git a/src/AspNetCoreModuleV1/IISLib/tracelog.c b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/tracelog.c rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.c diff --git a/src/AspNetCoreModuleV1/IISLib/tracelog.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/tracelog.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/tracelog.h diff --git a/src/AspNetCoreModuleV1/IISLib/treehash.h b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/treehash.h rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/treehash.h diff --git a/src/AspNetCoreModuleV1/IISLib/util.cxx b/src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx similarity index 100% rename from src/AspNetCoreModuleV1/IISLib/util.cxx rename to src/IISIntegration/src/AspNetCoreModuleV1/IISLib/util.cxx diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineApplication.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AppOfflineHandler.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ApplicationFactory.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj similarity index 98% rename from src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj index 4b2c6129e8a8551051507d9effa52aa2936724b5..98c5920ed466a14bb02dfc45c0788e1f03dacefd 100644 --- a/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj +++ b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/AspNetCore.vcxproj @@ -1,305 +1,305 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>AspNetCoreModule</RootNamespace> - <ProjectName>AspNetCore</ProjectName> - <TargetName>aspnetcorev2</TargetName> - <LinkIncremental>false</LinkIncremental> - <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <Import Project="..\..\..\Build\Build.Settings" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - <ResourceCompile> - <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> - </ResourceCompile> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <IntrinsicFunctions>true</IntrinsicFunctions> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - <ResourceCompile> - <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> - </ResourceCompile> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>NotUsing</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - <ResourceCompile> - <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> - </ResourceCompile> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>NotUsing</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - <ResourceCompile> - <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> - </ResourceCompile> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="ApplicationFactory.h" /> - <ClInclude Include="applicationinfo.h" /> - <ClInclude Include="AppOfflineApplication.h" /> - <ClInclude Include="AppOfflineHandler.h" /> - <ClInclude Include="DisconnectHandler.h" /> - <ClInclude Include="PollingAppOfflineApplication.h" /> - <ClInclude Include="ServerErrorApplication.h" /> - <ClInclude Include="ShimOptions.h" /> - <ClInclude Include="globalmodule.h" /> - <ClInclude Include="resource.h" /> - <ClInclude Include="applicationmanager.h" /> - <ClInclude Include="HandlerResolver.h" /> - <ClInclude Include="proxymodule.h" /> - <ClInclude Include="stdafx.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="applicationinfo.cpp" /> - <ClCompile Include="applicationmanager.cpp" /> - <ClCompile Include="AppOfflineApplication.cpp" /> - <ClCompile Include="AppOfflineHandler.cpp" /> - <ClCompile Include="DisconnectHandler.cpp" /> - <ClCompile Include="PollingAppOfflineApplication.cpp" /> - <ClCompile Include="ShimOptions.cpp" /> - <ClCompile Include="dllmain.cpp" /> - <ClCompile Include="globalmodule.cpp" /> - <ClCompile Include="HandlerResolver.cpp" /> - <ClCompile Include="stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> - </ClCompile> - <ClCompile Include="proxymodule.cpp" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> - <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> - </ProjectReference> - <ProjectReference Include="..\IISLib\IISLib.vcxproj"> - <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <None Include="ancm.mof" /> - <None Include="Source.def" /> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="aspnetcoremodule.rc" /> - </ItemGroup> - <ItemGroup> - <Content Include="aspnetcore_schema_v2.xml"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> - <Content Include="ancm.mof"> - <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> - </Content> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="HtmlResponses.rc" /> - </ItemGroup> - <ItemGroup> - <None Include="InProcessShimStaticHtml.htm"> - <DeploymentContent>true</DeploymentContent> - </None> - <None Include="OutOfProcessShimStaticHtml.htm"> - <DeploymentContent>true</DeploymentContent> - </None> - </ItemGroup> - <ItemGroup> - <Xml Include="aspnetcore_schema_v2.xml" /> - </ItemGroup> - <Import Project="..\..\..\build\native.targets" /> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{EC82302F-D2F0-4727-99D1-EABC0DD9DC3B}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>AspNetCoreModule</RootNamespace> + <ProjectName>AspNetCore</ProjectName> + <TargetName>aspnetcorev2</TargetName> + <LinkIncremental>false</LinkIncremental> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <Import Project="..\..\..\Build\Build.Settings" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <ResourceCompile> + <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <IntrinsicFunctions>true</IntrinsicFunctions> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <ResourceCompile> + <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <ResourceCompile> + <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;ASPNETCOREMODULE_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <AdditionalIncludeDirectories>..\IISLib;.\Inc;..\CommonLib</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <ResourceCompile> + <AdditionalIncludeDirectories>..\Commonlib</AdditionalIncludeDirectories> + </ResourceCompile> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="ApplicationFactory.h" /> + <ClInclude Include="applicationinfo.h" /> + <ClInclude Include="AppOfflineApplication.h" /> + <ClInclude Include="AppOfflineHandler.h" /> + <ClInclude Include="DisconnectHandler.h" /> + <ClInclude Include="PollingAppOfflineApplication.h" /> + <ClInclude Include="ServerErrorApplication.h" /> + <ClInclude Include="ShimOptions.h" /> + <ClInclude Include="globalmodule.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="applicationmanager.h" /> + <ClInclude Include="HandlerResolver.h" /> + <ClInclude Include="proxymodule.h" /> + <ClInclude Include="stdafx.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="applicationinfo.cpp" /> + <ClCompile Include="applicationmanager.cpp" /> + <ClCompile Include="AppOfflineApplication.cpp" /> + <ClCompile Include="AppOfflineHandler.cpp" /> + <ClCompile Include="DisconnectHandler.cpp" /> + <ClCompile Include="PollingAppOfflineApplication.cpp" /> + <ClCompile Include="ShimOptions.cpp" /> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="globalmodule.cpp" /> + <ClCompile Include="HandlerResolver.cpp" /> + <ClCompile Include="stdafx.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> + </ClCompile> + <ClCompile Include="proxymodule.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> + <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> + </ProjectReference> + <ProjectReference Include="..\IISLib\IISLib.vcxproj"> + <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <None Include="ancm.mof" /> + <None Include="Source.def" /> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="aspnetcoremodule.rc" /> + </ItemGroup> + <ItemGroup> + <Content Include="aspnetcore_schema_v2.xml"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + <Content Include="ancm.mof"> + <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory> + </Content> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="HtmlResponses.rc" /> + </ItemGroup> + <ItemGroup> + <None Include="InProcessShimStaticHtml.htm"> + <DeploymentContent>true</DeploymentContent> + </None> + <None Include="OutOfProcessShimStaticHtml.htm"> + <DeploymentContent>true</DeploymentContent> + </None> + </ItemGroup> + <ItemGroup> + <Xml Include="aspnetcore_schema_v2.xml" /> + </ItemGroup> + <Import Project="..\..\..\build\native.targets" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project> \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/DisconnectHandler.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HandlerResolver.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/HtmlResponses.rc diff --git a/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/InProcessShimStaticHtml.htm diff --git a/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/OutOfProcessShimStaticHtml.htm diff --git a/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/PollingAppOfflineApplication.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ServerErrorApplication.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ShimOptions.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/Source.def rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/Source.def diff --git a/src/AspNetCoreModuleV2/AspNetCore/ancm.mof b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/ancm.mof rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/ancm.mof diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationinfo.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/applicationmanager.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcore_schema_v2.xml diff --git a/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/aspnetcoremodule.rc diff --git a/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/dllmain.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/globalmodule.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/globalmodule.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/proxymodule.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/proxymodule.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/resource.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/resource.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/resource.h diff --git a/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.cpp diff --git a/src/AspNetCoreModuleV2/AspNetCore/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.h similarity index 100% rename from src/AspNetCoreModuleV2/AspNetCore/stdafx.h rename to src/IISIntegration/src/AspNetCoreModuleV2/AspNetCore/stdafx.h diff --git a/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/BaseOutputManager.h diff --git a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj similarity index 98% rename from src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj index 0ddec2fcb1f333b893d8deea30e0b0a394cf8d3e..2386dfc6ee6aa93b56aeccb1b96519fe41ea22d4 100644 --- a/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj +++ b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/CommonLib.vcxproj @@ -1,293 +1,293 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <VCProjectVersion>15.0</VCProjectVersion> - <ProjectGuid>{55494E58-E061-4C4C-A0A8-837008E72F85}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>NewCommon</RootNamespace> - <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>false</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="Shared"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>true</LinkIncremental> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <LinkIncremental>true</LinkIncremental> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <LinkIncremental>false</LinkIncremental> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <LinkIncremental>false</LinkIncremental> - <IncludePath>C:\AspNetCoreModule\src\IISLib;$(IncludePath)</IncludePath> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <TreatWarningAsError>true</TreatWarningAsError> - <Optimization>Disabled</Optimization> - <SDLCheck>false</SDLCheck> - <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <ConformanceMode>true</ConformanceMode> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <TreatWarningAsError>true</TreatWarningAsError> - <Optimization>Disabled</Optimization> - <SDLCheck>false</SDLCheck> - <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <ConformanceMode>true</ConformanceMode> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <MinimalRebuild>false</MinimalRebuild> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <TreatWarningAsError>true</TreatWarningAsError> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <SDLCheck>false</SDLCheck> - <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <ConformanceMode>true</ConformanceMode> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <TreatWarningAsError>true</TreatWarningAsError> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <SDLCheck>false</SDLCheck> - <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <ConformanceMode>true</ConformanceMode> - <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <AdditionalUsingDirectories> - </AdditionalUsingDirectories> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - <Lib> - <AdditionalLibraryDirectories>..\iislib</AdditionalLibraryDirectories> - </Lib> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="application.h" /> - <ClInclude Include="baseoutputmanager.h" /> - <ClInclude Include="ConfigurationSection.h" /> - <ClInclude Include="ConfigurationSource.h" /> - <ClInclude Include="config_utility.h" /> - <ClInclude Include="Environment.h" /> - <ClInclude Include="EventLog.h" /> - <ClInclude Include="EventTracing.h" /> - <ClInclude Include="exceptions.h" /> - <ClInclude Include="file_utility.h" /> - <ClInclude Include="FileOutputManager.h" /> - <ClInclude Include="GlobalVersionUtility.h" /> - <ClInclude Include="fx_ver.h" /> - <ClInclude Include="HandleWrapper.h" /> - <ClInclude Include="hostfxroptions.h" /> - <ClInclude Include="hostfxr_utility.h" /> - <ClInclude Include="iapplication.h" /> - <ClInclude Include="debugutil.h" /> - <ClInclude Include="InvalidOperationException.h" /> - <ClInclude Include="IOutputManager.h" /> - <ClInclude Include="irequesthandler.h" /> - <ClInclude Include="LoggingHelpers.h" /> - <ClInclude Include="ModuleHelpers.h" /> - <ClInclude Include="NonCopyable.h" /> - <ClInclude Include="NullOutputManager.h" /> - <ClInclude Include="PipeOutputManager.h" /> - <ClInclude Include="requesthandler.h" /> - <ClInclude Include="resources.h" /> - <ClInclude Include="ServerErrorApplication.h" /> - <ClInclude Include="ServerErrorHandler.h" /> - <ClInclude Include="SRWExclusiveLock.h" /> - <ClInclude Include="SRWSharedLock.h" /> - <ClInclude Include="stdafx.h" /> - <ClInclude Include="StdWrapper.h" /> - <ClInclude Include="StringHelpers.h" /> - <ClInclude Include="sttimer.h" /> - <ClInclude Include="WebConfigConfigurationSection.h" /> - <ClInclude Include="WebConfigConfigurationSource.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="ConfigurationSection.cpp" /> - <ClCompile Include="ConfigurationSource.cpp" /> - <ClCompile Include="debugutil.cpp" /> - <ClCompile Include="Environment.cpp" /> - <ClCompile Include="EventLog.cpp" /> - <ClCompile Include="file_utility.cpp" /> - <ClCompile Include="FileOutputManager.cpp" /> - <ClCompile Include="fx_ver.cpp" /> - <ClCompile Include="GlobalVersionUtility.cpp" /> - <ClCompile Include="HandleWrapper.cpp" /> - <ClCompile Include="hostfxr_utility.cpp" /> - <ClCompile Include="hostfxroptions.cpp" /> - <ClCompile Include="LoggingHelpers.cpp" /> - <ClCompile Include="PipeOutputManager.cpp" /> - <ClCompile Include="StdWrapper.cpp" /> - <ClCompile Include="SRWExclusiveLock.cpp" /> - <ClCompile Include="SRWSharedLock.cpp" /> - <ClCompile Include="stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> - </ClCompile> - <ClCompile Include="StringHelpers.cpp" /> - <ClCompile Include="WebConfigConfigurationSection.cpp" /> - <ClCompile Include="WebConfigConfigurationSource.cpp" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\IISLib\IISLib.vcxproj"> - <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <CustomBuild Include="aspnetcore_msg.mc"> - <FileType>Document</FileType> - <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc %(FullPath)</Command> - <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling Event Messages ...</Message> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> - <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">mc %(FullPath)</Command> - <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Event Messages ...</Message> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> - <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc %(FullPath)</Command> - <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling Event Messages ...</Message> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> - <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">mc %(FullPath)</Command> - <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Event Messages ...</Message> - <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> - </CustomBuild> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{55494E58-E061-4C4C-A0A8-837008E72F85}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>NewCommon</RootNamespace> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>false</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IncludePath>C:\AspNetCoreModule\src\IISLib;$(IncludePath)</IncludePath> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <Optimization>Disabled</Optimization> + <SDLCheck>false</SDLCheck> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <Optimization>Disabled</Optimization> + <SDLCheck>false</SDLCheck> + <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <ConformanceMode>true</ConformanceMode> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <MinimalRebuild>false</MinimalRebuild> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>false</SDLCheck> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <ConformanceMode>true</ConformanceMode> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <TreatWarningAsError>true</TreatWarningAsError> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>false</SDLCheck> + <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>..\iislib;</AdditionalIncludeDirectories> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <AdditionalUsingDirectories> + </AdditionalUsingDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + <Lib> + <AdditionalLibraryDirectories>..\iislib</AdditionalLibraryDirectories> + </Lib> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="application.h" /> + <ClInclude Include="baseoutputmanager.h" /> + <ClInclude Include="ConfigurationSection.h" /> + <ClInclude Include="ConfigurationSource.h" /> + <ClInclude Include="config_utility.h" /> + <ClInclude Include="Environment.h" /> + <ClInclude Include="EventLog.h" /> + <ClInclude Include="EventTracing.h" /> + <ClInclude Include="exceptions.h" /> + <ClInclude Include="file_utility.h" /> + <ClInclude Include="FileOutputManager.h" /> + <ClInclude Include="GlobalVersionUtility.h" /> + <ClInclude Include="fx_ver.h" /> + <ClInclude Include="HandleWrapper.h" /> + <ClInclude Include="hostfxroptions.h" /> + <ClInclude Include="hostfxr_utility.h" /> + <ClInclude Include="iapplication.h" /> + <ClInclude Include="debugutil.h" /> + <ClInclude Include="InvalidOperationException.h" /> + <ClInclude Include="IOutputManager.h" /> + <ClInclude Include="irequesthandler.h" /> + <ClInclude Include="LoggingHelpers.h" /> + <ClInclude Include="ModuleHelpers.h" /> + <ClInclude Include="NonCopyable.h" /> + <ClInclude Include="NullOutputManager.h" /> + <ClInclude Include="PipeOutputManager.h" /> + <ClInclude Include="requesthandler.h" /> + <ClInclude Include="resources.h" /> + <ClInclude Include="ServerErrorApplication.h" /> + <ClInclude Include="ServerErrorHandler.h" /> + <ClInclude Include="SRWExclusiveLock.h" /> + <ClInclude Include="SRWSharedLock.h" /> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="StdWrapper.h" /> + <ClInclude Include="StringHelpers.h" /> + <ClInclude Include="sttimer.h" /> + <ClInclude Include="WebConfigConfigurationSection.h" /> + <ClInclude Include="WebConfigConfigurationSource.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ConfigurationSection.cpp" /> + <ClCompile Include="ConfigurationSource.cpp" /> + <ClCompile Include="debugutil.cpp" /> + <ClCompile Include="Environment.cpp" /> + <ClCompile Include="EventLog.cpp" /> + <ClCompile Include="file_utility.cpp" /> + <ClCompile Include="FileOutputManager.cpp" /> + <ClCompile Include="fx_ver.cpp" /> + <ClCompile Include="GlobalVersionUtility.cpp" /> + <ClCompile Include="HandleWrapper.cpp" /> + <ClCompile Include="hostfxr_utility.cpp" /> + <ClCompile Include="hostfxroptions.cpp" /> + <ClCompile Include="LoggingHelpers.cpp" /> + <ClCompile Include="PipeOutputManager.cpp" /> + <ClCompile Include="StdWrapper.cpp" /> + <ClCompile Include="SRWExclusiveLock.cpp" /> + <ClCompile Include="SRWSharedLock.cpp" /> + <ClCompile Include="stdafx.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> + </ClCompile> + <ClCompile Include="StringHelpers.cpp" /> + <ClCompile Include="WebConfigConfigurationSection.cpp" /> + <ClCompile Include="WebConfigConfigurationSource.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\IISLib\IISLib.vcxproj"> + <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <CustomBuild Include="aspnetcore_msg.mc"> + <FileType>Document</FileType> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">mc %(FullPath)</Command> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Compiling Event Messages ...</Message> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">mc %(FullPath)</Command> + <Message Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Compiling Event Messages ...</Message> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">mc %(FullPath)</Command> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Compiling Event Messages ...</Message> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> + <Command Condition="'$(Configuration)|$(Platform)'=='Release|x64'">mc %(FullPath)</Command> + <Message Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Compiling Event Messages ...</Message> + <Outputs Condition="'$(Configuration)|$(Platform)'=='Release|x64'">%(Filename).rc;%(Filename).h;MSG0409.bin</Outputs> + </CustomBuild> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project> \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationLoadException.h diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSection.h diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ConfigurationSource.h diff --git a/src/AspNetCoreModuleV2/CommonLib/Environment.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/Environment.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/Environment.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/Environment.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/Environment.h diff --git a/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/EventLog.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/EventLog.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/EventLog.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventLog.h diff --git a/src/AspNetCoreModuleV2/CommonLib/EventTracing.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventTracing.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/EventTracing.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/EventTracing.h diff --git a/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/FileOutputManager.h diff --git a/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/GlobalVersionUtility.h diff --git a/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/HandleWrapper.h diff --git a/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/IOutputManager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/IOutputManager.h diff --git a/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/InvalidOperationException.h diff --git a/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/LoggingHelpers.h diff --git a/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ModuleHelpers.h diff --git a/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/NonCopyable.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NonCopyable.h diff --git a/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/NullOutputManager.h diff --git a/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/PipeOutputManager.h diff --git a/src/AspNetCoreModuleV2/CommonLib/ResultException.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ResultException.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ResultException.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ResultException.h diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWExclusiveLock.h diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/SRWSharedLock.h diff --git a/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/ServerErrorHandler.h diff --git a/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/StdWrapper.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StdWrapper.h diff --git a/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/StringHelpers.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/StringHelpers.h diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSection.h diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/WebConfigConfigurationSource.h diff --git a/src/AspNetCoreModuleV2/CommonLib/application.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/application.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/application.h diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_event.h diff --git a/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/aspnetcore_msg.mc diff --git a/src/AspNetCoreModuleV2/CommonLib/config_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/config_utility.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/config_utility.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/config_utility.h diff --git a/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/debugutil.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/debugutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/debugutil.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/debugutil.h diff --git a/src/AspNetCoreModuleV2/CommonLib/exceptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/exceptions.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/exceptions.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/exceptions.h diff --git a/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/file_utility.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/file_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/file_utility.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/file_utility.h diff --git a/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/fx_ver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/fx_ver.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/fx_ver.h diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxr_utility.h diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/hostfxroptions.h diff --git a/src/AspNetCoreModuleV2/CommonLib/iapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/iapplication.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/iapplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/iapplication.h diff --git a/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/irequesthandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/irequesthandler.h diff --git a/src/AspNetCoreModuleV2/CommonLib/requesthandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/requesthandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/requesthandler.h diff --git a/src/AspNetCoreModuleV2/CommonLib/resources.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/resources.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/resources.h diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/stdafx.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.cpp diff --git a/src/AspNetCoreModuleV2/CommonLib/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/stdafx.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/stdafx.h diff --git a/src/AspNetCoreModuleV2/CommonLib/sttimer.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/sttimer.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/sttimer.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/sttimer.h diff --git a/src/AspNetCoreModuleV2/CommonLib/targetver.h b/src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h similarity index 100% rename from src/AspNetCoreModuleV2/CommonLib/targetver.h rename to src/IISIntegration/src/AspNetCoreModuleV2/CommonLib/targetver.h diff --git a/src/AspNetCoreModuleV2/DefaultRules.ruleset b/src/IISIntegration/src/AspNetCoreModuleV2/DefaultRules.ruleset similarity index 100% rename from src/AspNetCoreModuleV2/DefaultRules.ruleset rename to src/IISIntegration/src/AspNetCoreModuleV2/DefaultRules.ruleset diff --git a/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj similarity index 97% rename from src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj index 8a78b1966494981d469e4730b5073b4144b39226..15d4ef1317bffac92613ae5d8f1f4dd371cb13e3 100644 --- a/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj +++ b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/IISLib.vcxproj @@ -1,206 +1,206 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <ProjectGuid>{09D9D1D6-2951-4E14-BC35-76A23CF9391A}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>IISLib</RootNamespace> - <ProjectName>IISLib</ProjectName> - <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>StaticLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <WarningLevel>Level3</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <SDLCheck>true</SDLCheck> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <TreatWarningAsError>true</TreatWarningAsError> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader> - </PrecompiledHeader> - <WarningLevel>Level3</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <SDLCheck>true</SDLCheck> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <TreatWarningAsError>true</TreatWarningAsError> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader> - </PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <SDLCheck>true</SDLCheck> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <TreatWarningAsError>true</TreatWarningAsError> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level3</WarningLevel> - <PrecompiledHeader> - </PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <SDLCheck>true</SDLCheck> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <ShowIncludes>false</ShowIncludes> - <TreatWarningAsError>true</TreatWarningAsError> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="acache.h" /> - <ClInclude Include="ahutil.h" /> - <ClInclude Include="base64.h" /> - <ClInclude Include="buffer.h" /> - <ClInclude Include="datetime.h" /> - <ClInclude Include="dbgutil.h" /> - <ClInclude Include="hashfn.h" /> - <ClInclude Include="hashtable.h" /> - <ClInclude Include="listentry.h" /> - <ClInclude Include="macros.h" /> - <ClInclude Include="multisz.h" /> - <ClInclude Include="multisza.h" /> - <ClInclude Include="ntassert.h" /> - <ClInclude Include="percpu.h" /> - <ClInclude Include="precomp.h" /> - <ClInclude Include="prime.h" /> - <ClInclude Include="reftrace.h" /> - <ClInclude Include="rwlock.h" /> - <ClInclude Include="stringa.h" /> - <ClInclude Include="stringu.h" /> - <ClInclude Include="tracelog.h" /> - <ClInclude Include="treehash.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="acache.cpp" /> - <ClCompile Include="ahutil.cpp" /> - <ClCompile Include="base64.cpp" /> - <ClCompile Include="multisz.cpp" /> - <ClCompile Include="multisza.cpp" /> - <ClCompile Include="reftrace.c" /> - <ClCompile Include="stringa.cpp" /> - <ClCompile Include="stringu.cpp" /> - <ClCompile Include="tracelog.c" /> - <ClCompile Include="util.cpp" /> - </ItemGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{09D9D1D6-2951-4E14-BC35-76A23CF9391A}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>IISLib</RootNamespace> + <ProjectName>IISLib</ProjectName> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <TreatWarningAsError>true</TreatWarningAsError> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader> + </PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <TreatWarningAsError>true</TreatWarningAsError> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <TreatWarningAsError>true</TreatWarningAsError> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level3</WarningLevel> + <PrecompiledHeader> + </PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <SDLCheck>true</SDLCheck> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <ShowIncludes>false</ShowIncludes> + <TreatWarningAsError>true</TreatWarningAsError> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="acache.h" /> + <ClInclude Include="ahutil.h" /> + <ClInclude Include="base64.h" /> + <ClInclude Include="buffer.h" /> + <ClInclude Include="datetime.h" /> + <ClInclude Include="dbgutil.h" /> + <ClInclude Include="hashfn.h" /> + <ClInclude Include="hashtable.h" /> + <ClInclude Include="listentry.h" /> + <ClInclude Include="macros.h" /> + <ClInclude Include="multisz.h" /> + <ClInclude Include="multisza.h" /> + <ClInclude Include="ntassert.h" /> + <ClInclude Include="percpu.h" /> + <ClInclude Include="precomp.h" /> + <ClInclude Include="prime.h" /> + <ClInclude Include="reftrace.h" /> + <ClInclude Include="rwlock.h" /> + <ClInclude Include="stringa.h" /> + <ClInclude Include="stringu.h" /> + <ClInclude Include="tracelog.h" /> + <ClInclude Include="treehash.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="acache.cpp" /> + <ClCompile Include="ahutil.cpp" /> + <ClCompile Include="base64.cpp" /> + <ClCompile Include="multisz.cpp" /> + <ClCompile Include="multisza.cpp" /> + <ClCompile Include="reftrace.c" /> + <ClCompile Include="stringa.cpp" /> + <ClCompile Include="stringu.cpp" /> + <ClCompile Include="tracelog.c" /> + <ClCompile Include="util.cpp" /> + </ItemGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project> \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/IISLib/acache.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/acache.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/acache.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/acache.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/acache.h diff --git a/src/AspNetCoreModuleV2/IISLib/ahutil.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/ahutil.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/ahutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/ahutil.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ahutil.h diff --git a/src/AspNetCoreModuleV2/IISLib/base64.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/base64.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/base64.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/base64.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/base64.h diff --git a/src/AspNetCoreModuleV2/IISLib/buffer.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/buffer.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/buffer.h diff --git a/src/AspNetCoreModuleV2/IISLib/datetime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/datetime.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/datetime.h diff --git a/src/AspNetCoreModuleV2/IISLib/dbgutil.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/dbgutil.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/dbgutil.h diff --git a/src/AspNetCoreModuleV2/IISLib/hashfn.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/hashfn.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashfn.h diff --git a/src/AspNetCoreModuleV2/IISLib/hashtable.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/hashtable.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/hashtable.h diff --git a/src/AspNetCoreModuleV2/IISLib/listentry.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/listentry.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/listentry.h diff --git a/src/AspNetCoreModuleV2/IISLib/macros.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/macros.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/macros.h diff --git a/src/AspNetCoreModuleV2/IISLib/multisz.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/multisz.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/multisz.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/multisz.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisz.h diff --git a/src/AspNetCoreModuleV2/IISLib/multisza.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/multisza.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/multisza.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/multisza.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/multisza.h diff --git a/src/AspNetCoreModuleV2/IISLib/ntassert.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/ntassert.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/ntassert.h diff --git a/src/AspNetCoreModuleV2/IISLib/percpu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/percpu.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/percpu.h diff --git a/src/AspNetCoreModuleV2/IISLib/precomp.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/precomp.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/precomp.h diff --git a/src/AspNetCoreModuleV2/IISLib/prime.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/prime.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/prime.h diff --git a/src/AspNetCoreModuleV2/IISLib/reftrace.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/reftrace.c rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.c diff --git a/src/AspNetCoreModuleV2/IISLib/reftrace.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/reftrace.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/reftrace.h diff --git a/src/AspNetCoreModuleV2/IISLib/rwlock.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/rwlock.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/rwlock.h diff --git a/src/AspNetCoreModuleV2/IISLib/stringa.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/stringa.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/stringa.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/stringa.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringa.h diff --git a/src/AspNetCoreModuleV2/IISLib/stringu.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/stringu.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.cpp diff --git a/src/AspNetCoreModuleV2/IISLib/stringu.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/stringu.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/stringu.h diff --git a/src/AspNetCoreModuleV2/IISLib/tracelog.c b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/tracelog.c rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.c diff --git a/src/AspNetCoreModuleV2/IISLib/tracelog.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/tracelog.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/tracelog.h diff --git a/src/AspNetCoreModuleV2/IISLib/treehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/treehash.h rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/treehash.h diff --git a/src/AspNetCoreModuleV2/IISLib/util.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cpp similarity index 100% rename from src/AspNetCoreModuleV2/IISLib/util.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/IISLib/util.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/HtmlResponses.rc diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessApplicationBase.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessOptions.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj similarity index 98% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj index 5e3fe5c6c1df66cad22891cb90249d4c64db9437..69435f32d61986025dddc246b1e354ac16f2dc16 100644 --- a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj +++ b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRequestHandler.vcxproj @@ -1,276 +1,276 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="..\..\..\Build\Build.Settings" /> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <VCProjectVersion>15.0</VCProjectVersion> - <ProjectGuid>{D57EA297-6DC2-4BC0-8C91-334863327863}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>InProcessRequestHandler</RootNamespace> - <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> - <ProjectName>InProcessRequestHandler</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="Shared"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup> - <TargetName>aspnetcorev2_inprocess</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <LinkIncremental>false</LinkIncremental> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="aspnetcore_event.h" /> - <ClInclude Include="inprocessapplication.h" /> - <ClInclude Include="InProcessApplicationBase.h" /> - <ClInclude Include="inprocesshandler.h" /> - <ClInclude Include="InProcessOptions.h" /> - <ClInclude Include="resource.h" /> - <ClInclude Include="ShuttingDownApplication.h" /> - <ClInclude Include="stdafx.h" /> - <ClInclude Include="StartupExceptionApplication.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dllmain.cpp" /> - <ClCompile Include="inprocessapplication.cpp" /> - <ClCompile Include="InProcessApplicationBase.cpp" /> - <ClCompile Include="inprocesshandler.cpp" /> - <ClCompile Include="InProcessOptions.cpp" /> - <ClCompile Include="managedexports.cpp" /> - <ClCompile Include="stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> - </ClCompile> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> - <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> - </ProjectReference> - <ProjectReference Include="..\IISLib\IISLib.vcxproj"> - <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project> - </ProjectReference> - <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj"> - <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="HtmlResponses.rc" /> - <ResourceCompile Include="inprocessrequesthandler.rc" /> - </ItemGroup> - <ItemGroup> - <None Include="InProcessRhStaticHtml.htm"> - <DeploymentContent>true</DeploymentContent> - </None> - <None Include="Source.def" /> - </ItemGroup> - <Import Project="..\..\..\build\native.targets" /> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="..\..\..\Build\Build.Settings" /> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{D57EA297-6DC2-4BC0-8C91-334863327863}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>InProcessRequestHandler</RootNamespace> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + <ProjectName>InProcessRequestHandler</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <TargetName>aspnetcorev2_inprocess</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>Use</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>Use</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="aspnetcore_event.h" /> + <ClInclude Include="inprocessapplication.h" /> + <ClInclude Include="InProcessApplicationBase.h" /> + <ClInclude Include="inprocesshandler.h" /> + <ClInclude Include="InProcessOptions.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="ShuttingDownApplication.h" /> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="StartupExceptionApplication.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="inprocessapplication.cpp" /> + <ClCompile Include="InProcessApplicationBase.cpp" /> + <ClCompile Include="inprocesshandler.cpp" /> + <ClCompile Include="InProcessOptions.cpp" /> + <ClCompile Include="managedexports.cpp" /> + <ClCompile Include="stdafx.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> + </ClCompile> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> + <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> + </ProjectReference> + <ProjectReference Include="..\IISLib\IISLib.vcxproj"> + <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project> + </ProjectReference> + <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj"> + <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="HtmlResponses.rc" /> + <ResourceCompile Include="inprocessrequesthandler.rc" /> + </ItemGroup> + <ItemGroup> + <None Include="InProcessRhStaticHtml.htm"> + <DeploymentContent>true</DeploymentContent> + </None> + <None Include="Source.def" /> + </ItemGroup> + <Import Project="..\..\..\build\native.targets" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project> \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/InProcessRhStaticHtml.htm diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/ShuttingDownApplication.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/Source.def diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionApplication.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/StartupExceptionHandler.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/dllmain.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessapplication.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocesshandler.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/inprocessrequesthandler.rc diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/managedexports.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/resource.h diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.cpp diff --git a/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h similarity index 100% rename from src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h rename to src/IISIntegration/src/AspNetCoreModuleV2/InProcessRequestHandler/stdafx.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/HtmlResponses.rc diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj similarity index 98% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj index 7d29672fa0347e8174d8f0102e78a5ee1490ae5a..ca2bc0f4aa220ea20d009f3a925e787143376213 100644 --- a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj +++ b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRequestHandler.vcxproj @@ -1,285 +1,285 @@ -<?xml version="1.0" encoding="utf-8"?> -<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> - <Import Project="..\..\..\Build\Build.Settings" /> - <ItemGroup Label="ProjectConfigurations"> - <ProjectConfiguration Include="Debug|Win32"> - <Configuration>Debug</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|Win32"> - <Configuration>Release</Configuration> - <Platform>Win32</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Debug|x64"> - <Configuration>Debug</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - <ProjectConfiguration Include="Release|x64"> - <Configuration>Release</Configuration> - <Platform>x64</Platform> - </ProjectConfiguration> - </ItemGroup> - <PropertyGroup Label="Globals"> - <VCProjectVersion>15.0</VCProjectVersion> - <ProjectGuid>{7F87406C-A3C8-4139-A68D-E4C344294A67}</ProjectGuid> - <Keyword>Win32Proj</Keyword> - <RootNamespace>OutOfProcessRequestHandler</RootNamespace> - <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> - <ProjectName>OutOfProcessRequestHandler</ProjectName> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>true</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> - <ConfigurationType>DynamicLibrary</ConfigurationType> - <UseDebugLibraries>false</UseDebugLibraries> - <PlatformToolset>v141</PlatformToolset> - <WholeProgramOptimization>true</WholeProgramOptimization> - <CharacterSet>Unicode</CharacterSet> - </PropertyGroup> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> - <ImportGroup Label="ExtensionSettings"> - </ImportGroup> - <ImportGroup Label="Shared"> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> - </ImportGroup> - <PropertyGroup Label="UserMacros" /> - <PropertyGroup> - <TargetName>aspnetcorev2_outofprocess</TargetName> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <LinkIncremental>false</LinkIncremental> - </PropertyGroup> - <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <LinkIncremental>false</LinkIncremental> - </PropertyGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> - <ClCompile> - <PrecompiledHeader>Use</PrecompiledHeader> - <WarningLevel>Level4</WarningLevel> - <Optimization>Disabled</Optimization> - <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> - <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> - <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>true</GenerateDebugInformation> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> - <ClCompile> - <WarningLevel>Level4</WarningLevel> - <PrecompiledHeader>Use</PrecompiledHeader> - <Optimization>MaxSpeed</Optimization> - <FunctionLevelLinking>true</FunctionLevelLinking> - <IntrinsicFunctions>true</IntrinsicFunctions> - <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> - <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> - <RuntimeLibrary>MultiThreaded</RuntimeLibrary> - <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> - <TreatWarningAsError>true</TreatWarningAsError> - <SDLCheck>true</SDLCheck> - <WholeProgramOptimization>true</WholeProgramOptimization> - <PreprocessKeepComments>false</PreprocessKeepComments> - <ExceptionHandling>SyncCThrow</ExceptionHandling> - <StructMemberAlignment>8Bytes</StructMemberAlignment> - <FunctionLevelLinking>true</FunctionLevelLinking> - <RuntimeTypeInfo>false</RuntimeTypeInfo> - <OmitDefaultLibName>true</OmitDefaultLibName> - <CompileAs>CompileAsCpp</CompileAs> - <IntrinsicFunctions>true</IntrinsicFunctions> - <MultiProcessorCompilation>true</MultiProcessorCompilation> - <LanguageStandard>stdcpp17</LanguageStandard> - <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> - </ClCompile> - <Link> - <SubSystem>Windows</SubSystem> - <GenerateDebugInformation>false</GenerateDebugInformation> - <EnableCOMDATFolding>true</EnableCOMDATFolding> - <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> - <OptimizeReferences>true</OptimizeReferences> - <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> - <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> - <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> - </Link> - </ItemDefinitionGroup> - <ItemGroup> - <ClInclude Include="environmentvariablehelpers.h" /> - <ClInclude Include="forwarderconnection.h" /> - <ClInclude Include="processmanager.h" /> - <ClInclude Include="protocolconfig.h" /> - <ClInclude Include="resource.h" /> - <ClInclude Include="responseheaderhash.h" /> - <ClInclude Include="serverprocess.h" /> - <ClInclude Include="stdafx.h" /> - <ClInclude Include="url_utility.h" /> - <ClInclude Include="websockethandler.h" /> - <ClInclude Include="winhttphelper.h" /> - <ClInclude Include="forwardinghandler.h" /> - <ClInclude Include="outprocessapplication.h" /> - </ItemGroup> - <ItemGroup> - <ClCompile Include="dllmain.cpp" /> - <ClCompile Include="forwardinghandler.cpp" /> - <ClCompile Include="outprocessapplication.cpp" /> - <ClCompile Include="forwarderconnection.cpp" /> - <ClCompile Include="processmanager.cpp" /> - <ClCompile Include="protocolconfig.cpp" /> - <ClCompile Include="responseheaderhash.cpp" /> - <ClCompile Include="serverprocess.cpp" /> - <ClCompile Include="stdafx.cpp"> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> - <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> - </ClCompile> - <ClCompile Include="url_utility.cpp" /> - <ClCompile Include="websockethandler.cpp" /> - <ClCompile Include="winhttphelper.cpp" /> - </ItemGroup> - <ItemGroup> - <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> - <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> - </ProjectReference> - <ProjectReference Include="..\IISLib\IISLib.vcxproj"> - <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project> - </ProjectReference> - <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj"> - <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project> - </ProjectReference> - </ItemGroup> - <ItemGroup> - <ResourceCompile Include="HtmlResponses.rc" /> - <ResourceCompile Include="outofprocessrequesthandler.rc" /> - </ItemGroup> - <ItemGroup> - <None Include="OutOfProcessRhStaticHtml.htm"> - <DeploymentContent>true</DeploymentContent> - </None> - <None Include="Source.def" /> - </ItemGroup> - <Import Project="..\..\..\build\native.targets" /> - <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> - <ImportGroup Label="ExtensionTargets"> - </ImportGroup> +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <Import Project="..\..\..\Build\Build.Settings" /> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{7F87406C-A3C8-4139-A68D-E4C344294A67}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>OutOfProcessRequestHandler</RootNamespace> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + <ProjectName>OutOfProcessRequestHandler</ProjectName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>DynamicLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup> + <TargetName>aspnetcorev2_outofprocess</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>false</LinkIncremental> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>Use</PrecompiledHeader> + <WarningLevel>Level4</WarningLevel> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>Use</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>WIN32;NDEBUG;_WINDOWS;_USRDLL;REQUESTHANDLER_EXPORTS;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <WarningLevel>Level4</WarningLevel> + <PrecompiledHeader>Use</PrecompiledHeader> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <PreprocessorDefinitions>NDEBUG;REQUESTHANDLER_EXPORTS;_WINDOWS;_USRDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <AdditionalIncludeDirectories>..\IISLib;..\CommonLib;.\Inc;..\RequestHandlerLib</AdditionalIncludeDirectories> + <TreatWarningAsError>true</TreatWarningAsError> + <SDLCheck>true</SDLCheck> + <WholeProgramOptimization>true</WholeProgramOptimization> + <PreprocessKeepComments>false</PreprocessKeepComments> + <ExceptionHandling>SyncCThrow</ExceptionHandling> + <StructMemberAlignment>8Bytes</StructMemberAlignment> + <FunctionLevelLinking>true</FunctionLevelLinking> + <RuntimeTypeInfo>false</RuntimeTypeInfo> + <OmitDefaultLibName>true</OmitDefaultLibName> + <CompileAs>CompileAsCpp</CompileAs> + <IntrinsicFunctions>true</IntrinsicFunctions> + <MultiProcessorCompilation>true</MultiProcessorCompilation> + <LanguageStandard>stdcpp17</LanguageStandard> + <ForcedIncludeFiles>stdafx.h</ForcedIncludeFiles> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>false</GenerateDebugInformation> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <ModuleDefinitionFile>Source.def</ModuleDefinitionFile> + <AdditionalDependencies>kernel32.lib;user32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;ahadmin.lib;ws2_32.lib;iphlpapi.lib;version.lib;Rpcrt4.lib;winhttp.lib</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + </ItemDefinitionGroup> + <ItemGroup> + <ClInclude Include="environmentvariablehelpers.h" /> + <ClInclude Include="forwarderconnection.h" /> + <ClInclude Include="processmanager.h" /> + <ClInclude Include="protocolconfig.h" /> + <ClInclude Include="resource.h" /> + <ClInclude Include="responseheaderhash.h" /> + <ClInclude Include="serverprocess.h" /> + <ClInclude Include="stdafx.h" /> + <ClInclude Include="url_utility.h" /> + <ClInclude Include="websockethandler.h" /> + <ClInclude Include="winhttphelper.h" /> + <ClInclude Include="forwardinghandler.h" /> + <ClInclude Include="outprocessapplication.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="dllmain.cpp" /> + <ClCompile Include="forwardinghandler.cpp" /> + <ClCompile Include="outprocessapplication.cpp" /> + <ClCompile Include="forwarderconnection.cpp" /> + <ClCompile Include="processmanager.cpp" /> + <ClCompile Include="protocolconfig.cpp" /> + <ClCompile Include="responseheaderhash.cpp" /> + <ClCompile Include="serverprocess.cpp" /> + <ClCompile Include="stdafx.cpp"> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">Create</PrecompiledHeader> + <PrecompiledHeader Condition="'$(Configuration)|$(Platform)'=='Release|x64'">Create</PrecompiledHeader> + </ClCompile> + <ClCompile Include="url_utility.cpp" /> + <ClCompile Include="websockethandler.cpp" /> + <ClCompile Include="winhttphelper.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\CommonLib\CommonLib.vcxproj"> + <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> + </ProjectReference> + <ProjectReference Include="..\IISLib\IISLib.vcxproj"> + <Project>{4787a64f-9a3e-4867-a55a-70cb4b2b2ffe}</Project> + </ProjectReference> + <ProjectReference Include="..\RequestHandlerLib\RequestHandlerLib.vcxproj"> + <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project> + </ProjectReference> + </ItemGroup> + <ItemGroup> + <ResourceCompile Include="HtmlResponses.rc" /> + <ResourceCompile Include="outofprocessrequesthandler.rc" /> + </ItemGroup> + <ItemGroup> + <None Include="OutOfProcessRhStaticHtml.htm"> + <DeploymentContent>true</DeploymentContent> + </None> + <None Include="Source.def" /> + </ItemGroup> + <Import Project="..\..\..\build\native.targets" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> </Project> \ No newline at end of file diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/OutOfProcessRhStaticHtml.htm diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/Source.def diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/dllmain.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwarderconnection.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/forwardinghandler.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outofprocessrequesthandler.rc diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/outprocessapplication.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/processmanager.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/protocolconfig.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/resource.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/responseheaderhash.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/serverprocess.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/stdafx.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/url_utility.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/websockethandler.h diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.cpp diff --git a/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h b/src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h similarity index 100% rename from src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h rename to src/IISIntegration/src/AspNetCoreModuleV2/OutOfProcessRequestHandler/winhttphelper.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.cpp diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/AppOfflineTrackingApplication.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/RequestHandlerLib.vcxproj diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehash.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/environmentvariablehelpers.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.cpp diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/filewatcher.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.cpp diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/requesthandler_config.h diff --git a/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h b/src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h similarity index 100% rename from src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h rename to src/IISIntegration/src/AspNetCoreModuleV2/RequestHandlerLib/stdafx.h diff --git a/src/Directory.Build.props b/src/IISIntegration/src/Directory.Build.props similarity index 100% rename from src/Directory.Build.props rename to src/IISIntegration/src/Directory.Build.props diff --git a/test/Common.FunctionalTests/AppHostConfig/IIS.config b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config similarity index 100% rename from test/Common.FunctionalTests/AppHostConfig/IIS.config rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config diff --git a/test/Common.FunctionalTests/AppOfflineTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs similarity index 100% rename from test/Common.FunctionalTests/AppOfflineTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs diff --git a/test/Common.FunctionalTests/BasicAuthTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs similarity index 100% rename from test/Common.FunctionalTests/BasicAuthTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs diff --git a/test/Common.FunctionalTests/ClientCertificateFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs similarity index 100% rename from test/Common.FunctionalTests/ClientCertificateFixture.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs diff --git a/test/Common.FunctionalTests/ClientCertificateTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs similarity index 100% rename from test/Common.FunctionalTests/ClientCertificateTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs diff --git a/test/Common.FunctionalTests/ClientDisconnectStress.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs similarity index 100% rename from test/Common.FunctionalTests/ClientDisconnectStress.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs diff --git a/test/Common.FunctionalTests/CommonStartupTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs similarity index 100% rename from test/Common.FunctionalTests/CommonStartupTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs diff --git a/test/Common.FunctionalTests/CompressionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs similarity index 100% rename from test/Common.FunctionalTests/CompressionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs diff --git a/test/Common.FunctionalTests/ConfigurationChangeTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs similarity index 100% rename from test/Common.FunctionalTests/ConfigurationChangeTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/CompressionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/CompressionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/EventLogTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/EventLogTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs diff --git a/test/Common.FunctionalTests/Inprocess/FrebTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/FrebTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/LogPipeTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs diff --git a/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/StartupTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/StartupTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs diff --git a/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs similarity index 100% rename from test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs diff --git a/test/Common.FunctionalTests/LogFileTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs similarity index 100% rename from test/Common.FunctionalTests/LogFileTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs diff --git a/test/Common.FunctionalTests/MultiApplicationTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs similarity index 100% rename from test/Common.FunctionalTests/MultiApplicationTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs diff --git a/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs similarity index 100% rename from test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs diff --git a/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs similarity index 100% rename from test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs diff --git a/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs similarity index 100% rename from test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs diff --git a/test/Common.FunctionalTests/PublishedSitesFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs similarity index 100% rename from test/Common.FunctionalTests/PublishedSitesFixture.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs diff --git a/test/Common.FunctionalTests/RequiresNewHandler.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs similarity index 100% rename from test/Common.FunctionalTests/RequiresNewHandler.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs diff --git a/test/Common.FunctionalTests/RequiresNewShim.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs similarity index 100% rename from test/Common.FunctionalTests/RequiresNewShim.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs diff --git a/test/Common.FunctionalTests/ServerAbortTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs similarity index 100% rename from test/Common.FunctionalTests/ServerAbortTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs diff --git a/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs similarity index 100% rename from test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs diff --git a/test/Common.FunctionalTests/SkipVSTSAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs similarity index 100% rename from test/Common.FunctionalTests/SkipVSTSAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs diff --git a/test/Common.FunctionalTests/Utilities/AppVerifier.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/AppVerifier.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs diff --git a/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/EventLogHelpers.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs diff --git a/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs diff --git a/test/Common.FunctionalTests/Utilities/Helpers.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/Helpers.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs diff --git a/test/Common.FunctionalTests/Utilities/IISCapability.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISCapability.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs diff --git a/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs diff --git a/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs diff --git a/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs diff --git a/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs diff --git a/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs diff --git a/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/LogFileTestBase.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs diff --git a/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs diff --git a/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs similarity index 100% rename from test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs diff --git a/test/Common.FunctionalTests/WindowsAuthTests.cs b/src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs similarity index 100% rename from test/Common.FunctionalTests/WindowsAuthTests.cs rename to src/IISIntegration/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs diff --git a/test/Common.Tests/Common.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Common.Tests.csproj similarity index 100% rename from test/Common.Tests/Common.Tests.csproj rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Common.Tests.csproj diff --git a/test/Common.Tests/Utilities/DisposableList.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs similarity index 100% rename from test/Common.Tests/Utilities/DisposableList.cs rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs diff --git a/test/Common.Tests/Utilities/TestConnections.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs similarity index 100% rename from test/Common.Tests/Utilities/TestConnections.cs rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs diff --git a/test/Common.Tests/Utilities/TimeoutExtensions.cs b/src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs similarity index 100% rename from test/Common.Tests/Utilities/TimeoutExtensions.cs rename to src/IISIntegration/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs diff --git a/test/CommonLibTests/CommonLibTests.vcxproj b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj similarity index 100% rename from test/CommonLibTests/CommonLibTests.vcxproj rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj diff --git a/test/CommonLibTests/ConfigUtilityTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp similarity index 100% rename from test/CommonLibTests/ConfigUtilityTests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp diff --git a/test/CommonLibTests/FileOutputManagerTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp similarity index 100% rename from test/CommonLibTests/FileOutputManagerTests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp diff --git a/test/CommonLibTests/GlobalVersionTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp similarity index 100% rename from test/CommonLibTests/GlobalVersionTests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp diff --git a/test/CommonLibTests/Helpers.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.cpp similarity index 100% rename from test/CommonLibTests/Helpers.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.cpp diff --git a/test/CommonLibTests/Helpers.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.h similarity index 100% rename from test/CommonLibTests/Helpers.h rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/Helpers.h diff --git a/test/CommonLibTests/NativeTests.targets b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/NativeTests.targets similarity index 100% rename from test/CommonLibTests/NativeTests.targets rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/NativeTests.targets diff --git a/test/CommonLibTests/PipeOutputManagerTests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp similarity index 100% rename from test/CommonLibTests/PipeOutputManagerTests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp diff --git a/test/CommonLibTests/exception_handler_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp similarity index 100% rename from test/CommonLibTests/exception_handler_tests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp diff --git a/test/CommonLibTests/fakeclasses.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/fakeclasses.h similarity index 100% rename from test/CommonLibTests/fakeclasses.h rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/fakeclasses.h diff --git a/test/CommonLibTests/hostfxr_utility_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp similarity index 100% rename from test/CommonLibTests/hostfxr_utility_tests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp diff --git a/test/CommonLibTests/inprocess_application_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp similarity index 100% rename from test/CommonLibTests/inprocess_application_tests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp diff --git a/test/CommonLibTests/main.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/main.cpp similarity index 100% rename from test/CommonLibTests/main.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/main.cpp diff --git a/test/CommonLibTests/stdafx.h b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/stdafx.h similarity index 100% rename from test/CommonLibTests/stdafx.h rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/stdafx.h diff --git a/test/CommonLibTests/utility_tests.cpp b/src/IISIntegration/src/IISIntegration/test/CommonLibTests/utility_tests.cpp similarity index 100% rename from test/CommonLibTests/utility_tests.cpp rename to src/IISIntegration/src/IISIntegration/test/CommonLibTests/utility_tests.cpp diff --git a/test/Directory.Build.props b/src/IISIntegration/src/IISIntegration/test/Directory.Build.props similarity index 100% rename from test/Directory.Build.props rename to src/IISIntegration/src/IISIntegration/test/Directory.Build.props diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs similarity index 100% rename from test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs similarity index 100% rename from test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs diff --git a/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj similarity index 100% rename from test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj rename to src/IISIntegration/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs similarity index 100% rename from test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs similarity index 100% rename from test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs diff --git a/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj similarity index 100% rename from test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj rename to src/IISIntegration/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj diff --git a/test/IIS.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs similarity index 100% rename from test/IIS.FunctionalTests/DeployerSelector.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs diff --git a/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj similarity index 100% rename from test/IIS.FunctionalTests/IIS.FunctionalTests.csproj rename to src/IISIntegration/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj diff --git a/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs similarity index 100% rename from test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs diff --git a/test/IIS.Shared.FunctionalTests/MofFileTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs similarity index 100% rename from test/IIS.Shared.FunctionalTests/MofFileTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs diff --git a/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs similarity index 100% rename from test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs diff --git a/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs similarity index 100% rename from test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs diff --git a/test/IIS.Shared.FunctionalTests/ServicesTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs similarity index 100% rename from test/IIS.Shared.FunctionalTests/ServicesTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs diff --git a/test/IIS.Tests/AppHostConfig/HostableWebCore.config b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config similarity index 100% rename from test/IIS.Tests/AppHostConfig/HostableWebCore.config rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config diff --git a/test/IIS.Tests/ClientDisconnectTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs similarity index 100% rename from test/IIS.Tests/ClientDisconnectTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs diff --git a/test/IIS.Tests/ConnectionIdFeatureTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs similarity index 100% rename from test/IIS.Tests/ConnectionIdFeatureTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs diff --git a/test/IIS.Tests/HttpBodyControlFeatureTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs similarity index 100% rename from test/IIS.Tests/HttpBodyControlFeatureTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs diff --git a/test/IIS.Tests/IIS.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj similarity index 100% rename from test/IIS.Tests/IIS.Tests.csproj rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj diff --git a/test/IIS.Tests/ResponseAbortTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs similarity index 100% rename from test/IIS.Tests/ResponseAbortTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs diff --git a/test/IIS.Tests/StrictTestServerTests.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs similarity index 100% rename from test/IIS.Tests/StrictTestServerTests.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs diff --git a/test/IIS.Tests/TestServerTest.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/TestServerTest.cs similarity index 100% rename from test/IIS.Tests/TestServerTest.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/TestServerTest.cs diff --git a/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs similarity index 100% rename from test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs diff --git a/test/IIS.Tests/Utilities/TestServer.cs b/src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs similarity index 100% rename from test/IIS.Tests/Utilities/TestServer.cs rename to src/IISIntegration/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs diff --git a/test/IISExpress.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs similarity index 100% rename from test/IISExpress.FunctionalTests/DeployerSelector.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs diff --git a/test/IISExpress.FunctionalTests/HttpsTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/HttpsTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs diff --git a/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj similarity index 100% rename from test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj diff --git a/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs diff --git a/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs diff --git a/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs diff --git a/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs diff --git a/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs similarity index 100% rename from test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs diff --git a/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs similarity index 100% rename from test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs diff --git a/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs similarity index 100% rename from test/IISExpress.FunctionalTests/RequiresIISAttribute.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs diff --git a/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs b/src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs similarity index 100% rename from test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs rename to src/IISIntegration/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs similarity index 100% rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs diff --git a/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj b/src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj similarity index 100% rename from test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj rename to src/IISIntegration/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj diff --git a/test/TestTasks/InjectRequestHandler.cs b/src/IISIntegration/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs similarity index 100% rename from test/TestTasks/InjectRequestHandler.cs rename to src/IISIntegration/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs diff --git a/test/TestTasks/TestTasks.csproj b/src/IISIntegration/src/IISIntegration/test/TestTasks/TestTasks.csproj similarity index 100% rename from test/TestTasks/TestTasks.csproj rename to src/IISIntegration/src/IISIntegration/test/TestTasks/TestTasks.csproj diff --git a/test/WebSites/Directory.Build.props b/src/IISIntegration/src/IISIntegration/test/WebSites/Directory.Build.props similarity index 100% rename from test/WebSites/Directory.Build.props rename to src/IISIntegration/src/IISIntegration/test/WebSites/Directory.Build.props diff --git a/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj similarity index 100% rename from test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj diff --git a/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json similarity index 100% rename from test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json diff --git a/test/WebSites/InProcessWebSite/DummyServer.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs similarity index 100% rename from test/WebSites/InProcessWebSite/DummyServer.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs diff --git a/test/WebSites/InProcessWebSite/InProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj similarity index 100% rename from test/WebSites/InProcessWebSite/InProcessWebSite.csproj rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj diff --git a/test/WebSites/InProcessWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs similarity index 100% rename from test/WebSites/InProcessWebSite/Program.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs diff --git a/test/WebSites/InProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json similarity index 100% rename from test/WebSites/InProcessWebSite/Properties/launchSettings.json rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json diff --git a/test/WebSites/InProcessWebSite/Startup.WebSockets.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs similarity index 100% rename from test/WebSites/InProcessWebSite/Startup.WebSockets.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs diff --git a/test/WebSites/InProcessWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs similarity index 100% rename from test/WebSites/InProcessWebSite/Startup.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs diff --git a/test/WebSites/InProcessWebSite/web.config b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/web.config similarity index 100% rename from test/WebSites/InProcessWebSite/web.config rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/web.config diff --git a/test/WebSites/InProcessWebSite/wwwroot/static.txt b/src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt similarity index 100% rename from test/WebSites/InProcessWebSite/wwwroot/static.txt rename to src/IISIntegration/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt diff --git a/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj similarity index 100% rename from test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj diff --git a/test/WebSites/OutOfProcessWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs similarity index 100% rename from test/WebSites/OutOfProcessWebSite/Program.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs diff --git a/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json similarity index 100% rename from test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json diff --git a/test/WebSites/OutOfProcessWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs similarity index 100% rename from test/WebSites/OutOfProcessWebSite/Startup.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs diff --git a/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt b/src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt similarity index 100% rename from test/WebSites/OutOfProcessWebSite/wwwroot/static.txt rename to src/IISIntegration/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt diff --git a/test/WebSites/StressTestWebSite/Program.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs similarity index 100% rename from test/WebSites/StressTestWebSite/Program.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs diff --git a/test/WebSites/StressTestWebSite/Properties/launchSettings.json b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json similarity index 100% rename from test/WebSites/StressTestWebSite/Properties/launchSettings.json rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json diff --git a/test/WebSites/StressTestWebSite/Startup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs similarity index 100% rename from test/WebSites/StressTestWebSite/Startup.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs diff --git a/test/WebSites/StressTestWebSite/StressTestWebSite.csproj b/src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj similarity index 100% rename from test/WebSites/StressTestWebSite/StressTestWebSite.csproj rename to src/IISIntegration/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj diff --git a/test/WebSites/shared/SharedStartup/Startup.shared.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs similarity index 100% rename from test/WebSites/shared/SharedStartup/Startup.shared.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs diff --git a/test/WebSites/shared/WebSockets/Constants.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs similarity index 100% rename from test/WebSites/shared/WebSockets/Constants.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs diff --git a/test/WebSites/shared/WebSockets/HandshakeHelpers.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs similarity index 100% rename from test/WebSites/shared/WebSockets/HandshakeHelpers.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs diff --git a/test/WebSites/shared/WebSockets/TestStartup.cs b/src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs similarity index 100% rename from test/WebSites/shared/WebSockets/TestStartup.cs rename to src/IISIntegration/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs diff --git a/test/gtest/gtest.vcxproj b/src/IISIntegration/src/IISIntegration/test/gtest/gtest.vcxproj similarity index 100% rename from test/gtest/gtest.vcxproj rename to src/IISIntegration/src/IISIntegration/test/gtest/gtest.vcxproj diff --git a/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/AssemblyInfo.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/DuplexStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/EmptyStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpRequestStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpResponseStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpStreamState.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/HttpUpgradeStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISConfigurationData.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.FeatureCollection.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Features.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestIdentifierFeature.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IHttpRequestLifetimeFeature.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.IO.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.Log.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContext.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpContextOfT.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISHttpServer.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISNativeApplication.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerAuthenticationHandler.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IISServerSetupFilter.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Flush.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Read.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.Write.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOEngine.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncIOOperation.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/AsyncWriteOperationBase.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/IAsyncIOEngine.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Initialize.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Read.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.Write.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/IO/WebSocketsAsyncIOEngine.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/OutputProducer.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ReadOnlyStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/Streams.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/ThrowingWasUpgradedWriteOnlyStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WrappingStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Core/WriteOnlyStream.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/CoreStrings.resx diff --git a/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/HttpContextExtensions.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerDefaults.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IISServerOptions.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/IServerVariableFeature.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.csproj diff --git a/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Microsoft.AspNetCore.Server.IIS.targets diff --git a/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/NativeMethods.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/Properties/CoreStrings.Designer.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/WebHostBuilderIISExtensions.cs diff --git a/src/Microsoft.AspNetCore.Server.IIS/_._ b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/_._ similarity index 100% rename from src/Microsoft.AspNetCore.Server.IIS/_._ rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IIS/_._ diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/AuthenticationHandler.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/ForwardedTlsConnectionFeature.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISDefaults.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISHostingStartup.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISMiddleware.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISOptions.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/IISSetupFilter.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.csproj diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Microsoft.AspNetCore.Server.IISIntegration.targets diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/NativeMethods.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/Properties/AssemblyInfo.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/WebHostBuilderIISExtensions.cs diff --git a/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json similarity index 100% rename from src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IISIntegration/baseline.netcore.json diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ApplicationDeployerFactory.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Http.config diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployer.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeployerBase.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameterExtensions.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentParameters.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISDeploymentResult.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/IISExpressDeployer.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/LoggingHandler.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/ProcessTracker.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/RetryHandler.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/WebConfigHelpers.cs diff --git a/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs b/src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs similarity index 100% rename from src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs rename to src/IISIntegration/src/Microsoft.AspNetCore.Server.IntegrationTesting.IIS/XElementExtensions.cs diff --git a/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config b/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config new file mode 100644 index 0000000000000000000000000000000000000000..bc24ef96390914736b57886e6949cdd67eb5ac68 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/AppHostConfig/IIS.config @@ -0,0 +1,740 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + IIS configuration sections. + + For schema documentation, see + %windir%\system32\inetsrv\config\schema\IIS_schema.xml. + + Please make a backup of this file before making any changes to it. + +--> + +<configuration> + + <!-- + + The <configSections> section controls the registration of sections. + Section is the basic unit of deployment, locking, searching and + containment for configuration settings. + + Every section belongs to one section group. + A section group is a container of logically-related sections. + + Sections cannot be nested. + Section groups may be nested. + + <section + name="" [Required, Collection Key] [XML name of the section] + allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set] + overrideModeDefault="Allow" [Allow|Deny] [Default delegation mode] + allowLocation="true" [true|false] [Allowed in location tags] + /> + + The recommended way to unlock sections is by using a location tag: + <location path="Default Web Site" overrideMode="Allow"> + <system.webServer> + <asp /> + </system.webServer> + </location> + + --> + <configSections> + <sectionGroup name="system.applicationHost"> + <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="sites" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + </sectionGroup> + + <sectionGroup name="system.webServer"> + <section name="asp" overrideModeDefault="Deny" /> + <section name="caching" overrideModeDefault="Allow" /> + <section name="cgi" overrideModeDefault="Deny" /> + <section name="defaultDocument" overrideModeDefault="Allow" /> + <section name="directoryBrowse" overrideModeDefault="Allow" /> + <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="globalModules" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="handlers" overrideModeDefault="Deny" /> + <section name="httpCompression" overrideModeDefault="Allow" /> + <section name="httpErrors" overrideModeDefault="Allow" /> + <section name="httpLogging" overrideModeDefault="Deny" /> + <section name="httpProtocol" overrideModeDefault="Allow" /> + <section name="httpRedirect" overrideModeDefault="Allow" /> + <section name="httpTracing" overrideModeDefault="Deny" /> + <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" /> + <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" /> + <section name="odbcLogging" overrideModeDefault="Deny" /> + <sectionGroup name="security"> + <section name="access" overrideModeDefault="Deny" /> + <section name="applicationDependencies" overrideModeDefault="Deny" /> + <sectionGroup name="authentication"> + <section name="anonymousAuthentication" overrideModeDefault="Deny" /> + <section name="basicAuthentication" overrideModeDefault="Deny" /> + <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" /> + <section name="digestAuthentication" overrideModeDefault="Deny" /> + <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" /> + <section name="windowsAuthentication" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="authorization" overrideModeDefault="Allow" /> + <section name="ipSecurity" overrideModeDefault="Deny" /> + <section name="dynamicIpSecurity" overrideModeDefault="Deny" /> + <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="requestFiltering" overrideModeDefault="Allow" /> + </sectionGroup> + <section name="serverRuntime" overrideModeDefault="Deny" /> + <section name="serverSideInclude" overrideModeDefault="Deny" /> + <section name="staticContent" overrideModeDefault="Allow" /> + <sectionGroup name="tracing"> + <section name="traceFailedRequests" overrideModeDefault="Allow" /> + <section name="traceProviderDefinitions" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="urlCompression" overrideModeDefault="Allow" /> + <section name="validation" overrideModeDefault="Allow" /> + <sectionGroup name="webdav"> + <section name="globalSettings" overrideModeDefault="Deny" /> + <section name="authoring" overrideModeDefault="Deny" /> + <section name="authoringRules" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="webSocket" overrideModeDefault="Deny" /> + <section name="aspNetCore" overrideModeDefault="Allow" /> + </sectionGroup> + <sectionGroup name="system.ftpServer"> + <section name="log" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="firewallSupport" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="caching" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="providerDefinitions" overrideModeDefault="Deny" /> + <sectionGroup name="security"> + <section name="ipSecurity" overrideModeDefault="Deny" /> + <section name="requestFiltering" overrideModeDefault="Deny" /> + <section name="authorization" overrideModeDefault="Deny" /> + <section name="authentication" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="serverRuntime" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + </sectionGroup> + </configSections> + + <configProtectedData> + <providers> + <add name="IISWASOnlyRsaProvider" type="" description="Uses RsaCryptoServiceProvider to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useMachineContainer="true" useOAEP="false" /> + <add name="IISCngProvider" type="Microsoft.ApplicationHost.CngProtectedConfigurationProvider" description="Uses Win32 Crypto CNG to encrypt and decrypt" keyContainerName="iisCngConfigurationKey" useMachineContainer="true" /> + <add name="IISWASOnlyCngProvider" type="Microsoft.ApplicationHost.CngProtectedConfigurationProvider" description="(WAS Only) Uses Win32 Crypto CNG to encrypt and decrypt" keyContainerName="iisCngWasKey" useMachineContainer="true" /> + <add name="AesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisConfigurationKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAAX3F7JKrgomyurjp+EzqF/rH26sw4/Bl57PAr0ZDqQJWRVT5LLg2T+nvdVUl0mbFYl2D9zwOqBWPEU29RgmvWDvGqNu6q/qDnRJ/pP/sDbArVJTnK/JQCJ9FuImmu6pz/Xbvq+aGG7FGxlZWOwMGYlnJBkDAseyOWTL8dYsGZ4xXo18NWaIJoimCKPqxUQCKf/arDeIopmx4QSLu9scbgYNHLdv8+pegkLVt5BdhR/xNTU6gb/eIemjy2SCYXASu/6M5Jki0plXyIvHf8Q+kwGSIkPvnCiUnE66koKA4dQ45rG4Ftb4wZ0gSa4bQVp6D6Svhu7fV7rOzBNdNreGF8qA==" /> + <add name="IISWASOnlyAesProvider" type="Microsoft.ApplicationHost.AesProtectedConfigurationProvider" description="Uses an AES session key to encrypt and decrypt" keyContainerName="iisWasKey" cspProviderName="" useOAEP="false" useMachineContainer="true" sessionKey="AQIAAA5mAAAApAAAbu3YiDQwroP3yTqKR0m1fxXM6E9EBOZ5ZOg7LO1TJwYXCgQTB0hrm1TRAOxFhlPKtok3YVAyYMfazt7GXJ0O447FFg0abNIy4U/PZV/10evK5XvcoUy2qgddsa1EwOI7dqIrhe9T0A9+QtnHpYOqEFUhLj3ZGmhWsvyVBaenBGLWRuZ65Qwtd75/Hc2FcRaYpuDChjrz0OR/x8LKnGGkNMDwe3Ew9MIyImp8AjCGfGBTkevXqlmTOXfBHtWRsbQYlipz1jINc9EXGiPmIRPmLo4MnmQ/48jssL8QI91BRbL62kuQTxPwCZ+v0WzC3C+poF29V3CwjgydcrV5nZq/kw==" /> + </providers> + </configProtectedData> + + <system.applicationHost> + + <applicationPools> + <add name="DefaultAppPool" autoStart="true" startMode="AlwaysRunning"> + <processModel identityType="LocalSystem" /> + </add> + <applicationPoolDefaults managedRuntimeVersion="v4.0"> + <processModel identityType="ApplicationPoolIdentity" loadUserProfile="true" setProfileEnvironment="false" /> + </applicationPoolDefaults> + </applicationPools> + + <!-- + + The <customMetadata> section is used internally by the Admin Base Objects + (ABO) Compatibility component. Please do not modify its content. + + --> + <customMetadata /> + + <!-- + + The <listenerAdapters> section defines the protocols with which the + Windows Process Activation Service (WAS) binds. + + --> + <listenerAdapters> + <add name="http" /> + </listenerAdapters> + + <log> + <centralBinaryLogFile enabled="true" directory="%SystemDrive%\inetpub\logs\LogFiles" /> + <centralW3CLogFile enabled="true" directory="%SystemDrive%\inetpub\logs\LogFiles" /> + </log> + + <sites> + <site name="Default Web Site" id="1"> + <application path="/"> + <virtualDirectory path="/" physicalPath="%SystemDrive%\inetpub\wwwroot" /> + </application> + <bindings> + <binding protocol="http" bindingInformation="*:80:" /> + </bindings> + </site> + <siteDefaults> + <logFile logFormat="W3C" directory="%SystemDrive%\inetpub\logs\LogFiles" /> + <traceFailedRequestsLogging directory="%SystemDrive%\inetpub\logs\FailedReqLogFiles" /> + </siteDefaults> + <applicationDefaults applicationPool="DefaultAppPool" /> + <virtualDirectoryDefaults allowSubDirConfig="true" /> + </sites> + + <webLimits /> + + </system.applicationHost> + + <system.webServer> + + <asp /> + + <caching enabled="true" enableKernelCache="true"> + </caching> + + <cgi /> + + <defaultDocument enabled="true"> + <files> + <add value="Default.htm" /> + <add value="Default.asp" /> + <add value="index.htm" /> + <add value="index.html" /> + <add value="iisstart.htm" /> + </files> + </defaultDocument> + + <directoryBrowse enabled="false" /> + + <fastCgi /> + + <!-- + + The <globalModules> section defines all native-code modules. + To enable a module, specify it in the <modules> section. + + --> + <globalModules> + <add name="HttpLoggingModule" image="%windir%\System32\inetsrv\loghttp.dll" /> + <add name="UriCacheModule" image="%windir%\System32\inetsrv\cachuri.dll" /> + <add name="FileCacheModule" image="%windir%\System32\inetsrv\cachfile.dll" /> + <add name="TokenCacheModule" image="%windir%\System32\inetsrv\cachtokn.dll" /> + <add name="HttpCacheModule" image="%windir%\System32\inetsrv\cachhttp.dll" /> + <add name="StaticCompressionModule" image="%windir%\System32\inetsrv\compstat.dll" /> + <add name="DefaultDocumentModule" image="%windir%\System32\inetsrv\defdoc.dll" /> + <add name="DirectoryListingModule" image="%windir%\System32\inetsrv\dirlist.dll" /> + <add name="ProtocolSupportModule" image="%windir%\System32\inetsrv\protsup.dll" /> + <add name="StaticFileModule" image="%windir%\System32\inetsrv\static.dll" /> + <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" /> + <add name="RequestFilteringModule" image="%windir%\System32\inetsrv\modrqflt.dll" /> + <add name="CustomErrorModule" image="%windir%\System32\inetsrv\custerr.dll" /> + <!--<add name="WebSocketModule" image="%windir%\System32\inetsrv\iiswsock.dll" />--> + </globalModules> + + <httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> + <scheme name="gzip" dll="%Windir%\system32\inetsrv\gzip.dll" /> + <staticTypes> + <add mimeType="text/*" enabled="true" /> + <add mimeType="message/*" enabled="true" /> + <add mimeType="application/javascript" enabled="true" /> + <add mimeType="application/atom+xml" enabled="true" /> + <add mimeType="application/xaml+xml" enabled="true" /> + <add mimeType="image/svg+xml" enabled="true" /> + <add mimeType="*/*" enabled="false" /> + </staticTypes> + </httpCompression> + + <httpErrors lockAttributes="allowAbsolutePathsWhenDelegated,defaultPath"> + <error statusCode="401" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="401.htm" /> + <error statusCode="403" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="403.htm" /> + <error statusCode="404" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="404.htm" /> + <error statusCode="405" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="405.htm" /> + <error statusCode="406" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="406.htm" /> + <error statusCode="412" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="412.htm" /> + <error statusCode="500" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="500.htm" /> + <error statusCode="501" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="501.htm" /> + <error statusCode="502" prefixLanguageFilePath="%SystemDrive%\inetpub\custerr" path="502.htm" /> + </httpErrors> + + <httpLogging dontLog="false" /> + + <httpProtocol> + <customHeaders> + <clear /> + </customHeaders> + <redirectHeaders> + <clear /> + </redirectHeaders> + </httpProtocol> + + <httpRedirect /> + + <httpTracing /> + + <isapiFilters /> + + <modules> + <add name="HttpLoggingModule" lockItem="true" /> + <add name="HttpCacheModule" lockItem="true" /> + <add name="StaticCompressionModule" lockItem="true" /> + <add name="DefaultDocumentModule" lockItem="true" /> + <add name="DirectoryListingModule" lockItem="true" /> + <add name="ProtocolSupportModule" lockItem="true" /> + <add name="StaticFileModule" lockItem="true" /> + <add name="AnonymousAuthenticationModule" lockItem="true" /> + <add name="RequestFilteringModule" lockItem="true" /> + <add name="CustomErrorModule" lockItem="true" /> + <!--<add name="WebSocketModule" lockItem="true" />--> + </modules> + + <odbcLogging /> + + <security> + + <access sslFlags="None" /> + + <applicationDependencies /> + + <authentication> + + <anonymousAuthentication enabled="true" userName="IUSR" /> + + <basicAuthentication /> + + <clientCertificateMappingAuthentication /> + + <digestAuthentication /> + + <iisClientCertificateMappingAuthentication /> + + </authentication> + + <authorization /> + + <ipSecurity /> + + <isapiCgiRestriction /> + + <requestFiltering> + <fileExtensions allowUnlisted="true" applyToWebDAV="true" /> + <verbs allowUnlisted="true" applyToWebDAV="true" /> + <hiddenSegments applyToWebDAV="true"> + <add segment="web.config" /> + </hiddenSegments> + </requestFiltering> + + </security> + + <serverRuntime /> + + <serverSideInclude /> + + <staticContent lockAttributes="isDocFooterFileName"> + <mimeMap fileExtension=".323" mimeType="text/h323" /> + <mimeMap fileExtension=".3g2" mimeType="video/3gpp2" /> + <mimeMap fileExtension=".3gp2" mimeType="video/3gpp2" /> + <mimeMap fileExtension=".3gp" mimeType="video/3gpp" /> + <mimeMap fileExtension=".3gpp" mimeType="video/3gpp" /> + <mimeMap fileExtension=".aaf" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".aac" mimeType="audio/aac" /> + <mimeMap fileExtension=".aca" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".accdb" mimeType="application/msaccess" /> + <mimeMap fileExtension=".accde" mimeType="application/msaccess" /> + <mimeMap fileExtension=".accdt" mimeType="application/msaccess" /> + <mimeMap fileExtension=".acx" mimeType="application/internet-property-stream" /> + <mimeMap fileExtension=".adt" mimeType="audio/vnd.dlna.adts" /> + <mimeMap fileExtension=".adts" mimeType="audio/vnd.dlna.adts" /> + <mimeMap fileExtension=".afm" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".ai" mimeType="application/postscript" /> + <mimeMap fileExtension=".aif" mimeType="audio/x-aiff" /> + <mimeMap fileExtension=".aifc" mimeType="audio/aiff" /> + <mimeMap fileExtension=".aiff" mimeType="audio/aiff" /> + <mimeMap fileExtension=".appcache" mimeType="text/cache-manifest" /> + <mimeMap fileExtension=".application" mimeType="application/x-ms-application" /> + <mimeMap fileExtension=".art" mimeType="image/x-jg" /> + <mimeMap fileExtension=".asd" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".asf" mimeType="video/x-ms-asf" /> + <mimeMap fileExtension=".asi" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".asm" mimeType="text/plain" /> + <mimeMap fileExtension=".asr" mimeType="video/x-ms-asf" /> + <mimeMap fileExtension=".asx" mimeType="video/x-ms-asf" /> + <mimeMap fileExtension=".atom" mimeType="application/atom+xml" /> + <mimeMap fileExtension=".au" mimeType="audio/basic" /> + <mimeMap fileExtension=".avi" mimeType="video/avi" /> + <mimeMap fileExtension=".axs" mimeType="application/olescript" /> + <mimeMap fileExtension=".bas" mimeType="text/plain" /> + <mimeMap fileExtension=".bcpio" mimeType="application/x-bcpio" /> + <mimeMap fileExtension=".bin" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".bmp" mimeType="image/bmp" /> + <mimeMap fileExtension=".c" mimeType="text/plain" /> + <mimeMap fileExtension=".cab" mimeType="application/vnd.ms-cab-compressed" /> + <mimeMap fileExtension=".calx" mimeType="application/vnd.ms-office.calx" /> + <mimeMap fileExtension=".cat" mimeType="application/vnd.ms-pki.seccat" /> + <mimeMap fileExtension=".cdf" mimeType="application/x-cdf" /> + <mimeMap fileExtension=".chm" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".class" mimeType="application/x-java-applet" /> + <mimeMap fileExtension=".clp" mimeType="application/x-msclip" /> + <mimeMap fileExtension=".cmx" mimeType="image/x-cmx" /> + <mimeMap fileExtension=".cnf" mimeType="text/plain" /> + <mimeMap fileExtension=".cod" mimeType="image/cis-cod" /> + <mimeMap fileExtension=".cpio" mimeType="application/x-cpio" /> + <mimeMap fileExtension=".cpp" mimeType="text/plain" /> + <mimeMap fileExtension=".crd" mimeType="application/x-mscardfile" /> + <mimeMap fileExtension=".crl" mimeType="application/pkix-crl" /> + <mimeMap fileExtension=".crt" mimeType="application/x-x509-ca-cert" /> + <mimeMap fileExtension=".csh" mimeType="application/x-csh" /> + <mimeMap fileExtension=".css" mimeType="text/css" /> + <mimeMap fileExtension=".csv" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".cur" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".dcr" mimeType="application/x-director" /> + <mimeMap fileExtension=".deploy" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".der" mimeType="application/x-x509-ca-cert" /> + <mimeMap fileExtension=".dib" mimeType="image/bmp" /> + <mimeMap fileExtension=".dir" mimeType="application/x-director" /> + <mimeMap fileExtension=".disco" mimeType="text/xml" /> + <mimeMap fileExtension=".dll" mimeType="application/x-msdownload" /> + <mimeMap fileExtension=".dll.config" mimeType="text/xml" /> + <mimeMap fileExtension=".dlm" mimeType="text/dlm" /> + <mimeMap fileExtension=".doc" mimeType="application/msword" /> + <mimeMap fileExtension=".docm" mimeType="application/vnd.ms-word.document.macroEnabled.12" /> + <mimeMap fileExtension=".docx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.document" /> + <mimeMap fileExtension=".dot" mimeType="application/msword" /> + <mimeMap fileExtension=".dotm" mimeType="application/vnd.ms-word.template.macroEnabled.12" /> + <mimeMap fileExtension=".dotx" mimeType="application/vnd.openxmlformats-officedocument.wordprocessingml.template" /> + <mimeMap fileExtension=".dsp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".dtd" mimeType="text/xml" /> + <mimeMap fileExtension=".dvi" mimeType="application/x-dvi" /> + <mimeMap fileExtension=".dvr-ms" mimeType="video/x-ms-dvr" /> + <mimeMap fileExtension=".dwf" mimeType="drawing/x-dwf" /> + <mimeMap fileExtension=".dwp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".dxr" mimeType="application/x-director" /> + <mimeMap fileExtension=".eml" mimeType="message/rfc822" /> + <mimeMap fileExtension=".emz" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".eot" mimeType="application/vnd.ms-fontobject" /> + <mimeMap fileExtension=".eps" mimeType="application/postscript" /> + <mimeMap fileExtension=".esd" mimeType="application/vnd.ms-cab-compressed" /> + <mimeMap fileExtension=".etx" mimeType="text/x-setext" /> + <mimeMap fileExtension=".evy" mimeType="application/envoy" /> + <mimeMap fileExtension=".exe" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".exe.config" mimeType="text/xml" /> + <mimeMap fileExtension=".fdf" mimeType="application/vnd.fdf" /> + <mimeMap fileExtension=".fif" mimeType="application/fractals" /> + <mimeMap fileExtension=".fla" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".flr" mimeType="x-world/x-vrml" /> + <mimeMap fileExtension=".flv" mimeType="video/x-flv" /> + <mimeMap fileExtension=".gif" mimeType="image/gif" /> + <mimeMap fileExtension=".gtar" mimeType="application/x-gtar" /> + <mimeMap fileExtension=".gz" mimeType="application/x-gzip" /> + <mimeMap fileExtension=".h" mimeType="text/plain" /> + <mimeMap fileExtension=".hdf" mimeType="application/x-hdf" /> + <mimeMap fileExtension=".hdml" mimeType="text/x-hdml" /> + <mimeMap fileExtension=".hhc" mimeType="application/x-oleobject" /> + <mimeMap fileExtension=".hhk" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".hhp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".hlp" mimeType="application/winhlp" /> + <mimeMap fileExtension=".hqx" mimeType="application/mac-binhex40" /> + <mimeMap fileExtension=".hta" mimeType="application/hta" /> + <mimeMap fileExtension=".htc" mimeType="text/x-component" /> + <mimeMap fileExtension=".htm" mimeType="text/html" /> + <mimeMap fileExtension=".html" mimeType="text/html" /> + <mimeMap fileExtension=".htt" mimeType="text/webviewhtml" /> + <mimeMap fileExtension=".hxt" mimeType="text/html" /> + <mimeMap fileExtension=".ico" mimeType="image/x-icon" /> + <mimeMap fileExtension=".ics" mimeType="text/calendar" /> + <mimeMap fileExtension=".ief" mimeType="image/ief" /> + <mimeMap fileExtension=".iii" mimeType="application/x-iphone" /> + <mimeMap fileExtension=".inf" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".ins" mimeType="application/x-internet-signup" /> + <mimeMap fileExtension=".isp" mimeType="application/x-internet-signup" /> + <mimeMap fileExtension=".IVF" mimeType="video/x-ivf" /> + <mimeMap fileExtension=".jar" mimeType="application/java-archive" /> + <mimeMap fileExtension=".java" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".jck" mimeType="application/liquidmotion" /> + <mimeMap fileExtension=".jcz" mimeType="application/liquidmotion" /> + <mimeMap fileExtension=".jfif" mimeType="image/pjpeg" /> + <mimeMap fileExtension=".jpb" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".jpe" mimeType="image/jpeg" /> + <mimeMap fileExtension=".jpeg" mimeType="image/jpeg" /> + <mimeMap fileExtension=".jpg" mimeType="image/jpeg" /> + <mimeMap fileExtension=".js" mimeType="application/javascript" /> + <mimeMap fileExtension=".json" mimeType="application/json" /> + <mimeMap fileExtension=".jsonld" mimeType="application/ld+json" /> + <mimeMap fileExtension=".jsx" mimeType="text/jscript" /> + <mimeMap fileExtension=".latex" mimeType="application/x-latex" /> + <mimeMap fileExtension=".less" mimeType="text/css" /> + <mimeMap fileExtension=".lit" mimeType="application/x-ms-reader" /> + <mimeMap fileExtension=".lpk" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".lsf" mimeType="video/x-la-asf" /> + <mimeMap fileExtension=".lsx" mimeType="video/x-la-asf" /> + <mimeMap fileExtension=".lzh" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".m13" mimeType="application/x-msmediaview" /> + <mimeMap fileExtension=".m14" mimeType="application/x-msmediaview" /> + <mimeMap fileExtension=".m1v" mimeType="video/mpeg" /> + <mimeMap fileExtension=".m2ts" mimeType="video/vnd.dlna.mpeg-tts" /> + <mimeMap fileExtension=".m3u" mimeType="audio/x-mpegurl" /> + <mimeMap fileExtension=".m4a" mimeType="audio/mp4" /> + <mimeMap fileExtension=".m4v" mimeType="video/mp4" /> + <mimeMap fileExtension=".man" mimeType="application/x-troff-man" /> + <mimeMap fileExtension=".manifest" mimeType="application/x-ms-manifest" /> + <mimeMap fileExtension=".map" mimeType="text/plain" /> + <mimeMap fileExtension=".mdb" mimeType="application/x-msaccess" /> + <mimeMap fileExtension=".mdp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".me" mimeType="application/x-troff-me" /> + <mimeMap fileExtension=".mht" mimeType="message/rfc822" /> + <mimeMap fileExtension=".mhtml" mimeType="message/rfc822" /> + <mimeMap fileExtension=".mid" mimeType="audio/mid" /> + <mimeMap fileExtension=".midi" mimeType="audio/mid" /> + <mimeMap fileExtension=".mix" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".mmf" mimeType="application/x-smaf" /> + <mimeMap fileExtension=".mno" mimeType="text/xml" /> + <mimeMap fileExtension=".mny" mimeType="application/x-msmoney" /> + <mimeMap fileExtension=".mov" mimeType="video/quicktime" /> + <mimeMap fileExtension=".movie" mimeType="video/x-sgi-movie" /> + <mimeMap fileExtension=".mp2" mimeType="video/mpeg" /> + <mimeMap fileExtension=".mp3" mimeType="audio/mpeg" /> + <mimeMap fileExtension=".mp4" mimeType="video/mp4" /> + <mimeMap fileExtension=".mp4v" mimeType="video/mp4" /> + <mimeMap fileExtension=".mpa" mimeType="video/mpeg" /> + <mimeMap fileExtension=".mpe" mimeType="video/mpeg" /> + <mimeMap fileExtension=".mpeg" mimeType="video/mpeg" /> + <mimeMap fileExtension=".mpg" mimeType="video/mpeg" /> + <mimeMap fileExtension=".mpp" mimeType="application/vnd.ms-project" /> + <mimeMap fileExtension=".mpv2" mimeType="video/mpeg" /> + <mimeMap fileExtension=".ms" mimeType="application/x-troff-ms" /> + <mimeMap fileExtension=".msi" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".mso" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".mvb" mimeType="application/x-msmediaview" /> + <mimeMap fileExtension=".mvc" mimeType="application/x-miva-compiled" /> + <mimeMap fileExtension=".nc" mimeType="application/x-netcdf" /> + <mimeMap fileExtension=".nsc" mimeType="video/x-ms-asf" /> + <mimeMap fileExtension=".nws" mimeType="message/rfc822" /> + <mimeMap fileExtension=".ocx" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".oda" mimeType="application/oda" /> + <mimeMap fileExtension=".odc" mimeType="text/x-ms-odc" /> + <mimeMap fileExtension=".ods" mimeType="application/oleobject" /> + <mimeMap fileExtension=".oga" mimeType="audio/ogg" /> + <mimeMap fileExtension=".ogg" mimeType="video/ogg" /> + <mimeMap fileExtension=".ogv" mimeType="video/ogg" /> + <mimeMap fileExtension=".one" mimeType="application/onenote" /> + <mimeMap fileExtension=".onea" mimeType="application/onenote" /> + <mimeMap fileExtension=".onetoc" mimeType="application/onenote" /> + <mimeMap fileExtension=".onetoc2" mimeType="application/onenote" /> + <mimeMap fileExtension=".onetmp" mimeType="application/onenote" /> + <mimeMap fileExtension=".onepkg" mimeType="application/onenote" /> + <mimeMap fileExtension=".osdx" mimeType="application/opensearchdescription+xml" /> + <mimeMap fileExtension=".otf" mimeType="font/otf" /> + <mimeMap fileExtension=".p10" mimeType="application/pkcs10" /> + <mimeMap fileExtension=".p12" mimeType="application/x-pkcs12" /> + <mimeMap fileExtension=".p7b" mimeType="application/x-pkcs7-certificates" /> + <mimeMap fileExtension=".p7c" mimeType="application/pkcs7-mime" /> + <mimeMap fileExtension=".p7m" mimeType="application/pkcs7-mime" /> + <mimeMap fileExtension=".p7r" mimeType="application/x-pkcs7-certreqresp" /> + <mimeMap fileExtension=".p7s" mimeType="application/pkcs7-signature" /> + <mimeMap fileExtension=".pbm" mimeType="image/x-portable-bitmap" /> + <mimeMap fileExtension=".pcx" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".pcz" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".pdf" mimeType="application/pdf" /> + <mimeMap fileExtension=".pfb" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".pfm" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".pfx" mimeType="application/x-pkcs12" /> + <mimeMap fileExtension=".pgm" mimeType="image/x-portable-graymap" /> + <mimeMap fileExtension=".pko" mimeType="application/vnd.ms-pki.pko" /> + <mimeMap fileExtension=".pma" mimeType="application/x-perfmon" /> + <mimeMap fileExtension=".pmc" mimeType="application/x-perfmon" /> + <mimeMap fileExtension=".pml" mimeType="application/x-perfmon" /> + <mimeMap fileExtension=".pmr" mimeType="application/x-perfmon" /> + <mimeMap fileExtension=".pmw" mimeType="application/x-perfmon" /> + <mimeMap fileExtension=".png" mimeType="image/png" /> + <mimeMap fileExtension=".pnm" mimeType="image/x-portable-anymap" /> + <mimeMap fileExtension=".pnz" mimeType="image/png" /> + <mimeMap fileExtension=".pot" mimeType="application/vnd.ms-powerpoint" /> + <mimeMap fileExtension=".potm" mimeType="application/vnd.ms-powerpoint.template.macroEnabled.12" /> + <mimeMap fileExtension=".potx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.template" /> + <mimeMap fileExtension=".ppam" mimeType="application/vnd.ms-powerpoint.addin.macroEnabled.12" /> + <mimeMap fileExtension=".ppm" mimeType="image/x-portable-pixmap" /> + <mimeMap fileExtension=".pps" mimeType="application/vnd.ms-powerpoint" /> + <mimeMap fileExtension=".ppsm" mimeType="application/vnd.ms-powerpoint.slideshow.macroEnabled.12" /> + <mimeMap fileExtension=".ppsx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slideshow" /> + <mimeMap fileExtension=".ppt" mimeType="application/vnd.ms-powerpoint" /> + <mimeMap fileExtension=".pptm" mimeType="application/vnd.ms-powerpoint.presentation.macroEnabled.12" /> + <mimeMap fileExtension=".pptx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.presentation" /> + <mimeMap fileExtension=".prf" mimeType="application/pics-rules" /> + <mimeMap fileExtension=".prm" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".prx" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".ps" mimeType="application/postscript" /> + <mimeMap fileExtension=".psd" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".psm" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".psp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".pub" mimeType="application/x-mspublisher" /> + <mimeMap fileExtension=".qt" mimeType="video/quicktime" /> + <mimeMap fileExtension=".qtl" mimeType="application/x-quicktimeplayer" /> + <mimeMap fileExtension=".qxd" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".ra" mimeType="audio/x-pn-realaudio" /> + <mimeMap fileExtension=".ram" mimeType="audio/x-pn-realaudio" /> + <mimeMap fileExtension=".rar" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".ras" mimeType="image/x-cmu-raster" /> + <mimeMap fileExtension=".rf" mimeType="image/vnd.rn-realflash" /> + <mimeMap fileExtension=".rgb" mimeType="image/x-rgb" /> + <mimeMap fileExtension=".rm" mimeType="application/vnd.rn-realmedia" /> + <mimeMap fileExtension=".rmi" mimeType="audio/mid" /> + <mimeMap fileExtension=".roff" mimeType="application/x-troff" /> + <mimeMap fileExtension=".rpm" mimeType="audio/x-pn-realaudio-plugin" /> + <mimeMap fileExtension=".rtf" mimeType="application/rtf" /> + <mimeMap fileExtension=".rtx" mimeType="text/richtext" /> + <mimeMap fileExtension=".scd" mimeType="application/x-msschedule" /> + <mimeMap fileExtension=".sct" mimeType="text/scriptlet" /> + <mimeMap fileExtension=".sea" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".setpay" mimeType="application/set-payment-initiation" /> + <mimeMap fileExtension=".setreg" mimeType="application/set-registration-initiation" /> + <mimeMap fileExtension=".sgml" mimeType="text/sgml" /> + <mimeMap fileExtension=".sh" mimeType="application/x-sh" /> + <mimeMap fileExtension=".shar" mimeType="application/x-shar" /> + <mimeMap fileExtension=".sit" mimeType="application/x-stuffit" /> + <mimeMap fileExtension=".sldm" mimeType="application/vnd.ms-powerpoint.slide.macroEnabled.12" /> + <mimeMap fileExtension=".sldx" mimeType="application/vnd.openxmlformats-officedocument.presentationml.slide" /> + <mimeMap fileExtension=".smd" mimeType="audio/x-smd" /> + <mimeMap fileExtension=".smi" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".smx" mimeType="audio/x-smd" /> + <mimeMap fileExtension=".smz" mimeType="audio/x-smd" /> + <mimeMap fileExtension=".snd" mimeType="audio/basic" /> + <mimeMap fileExtension=".snp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".spc" mimeType="application/x-pkcs7-certificates" /> + <mimeMap fileExtension=".spl" mimeType="application/futuresplash" /> + <mimeMap fileExtension=".spx" mimeType="audio/ogg" /> + <mimeMap fileExtension=".src" mimeType="application/x-wais-source" /> + <mimeMap fileExtension=".ssm" mimeType="application/streamingmedia" /> + <mimeMap fileExtension=".sst" mimeType="application/vnd.ms-pki.certstore" /> + <mimeMap fileExtension=".stl" mimeType="application/vnd.ms-pki.stl" /> + <mimeMap fileExtension=".sv4cpio" mimeType="application/x-sv4cpio" /> + <mimeMap fileExtension=".sv4crc" mimeType="application/x-sv4crc" /> + <mimeMap fileExtension=".svg" mimeType="image/svg+xml" /> + <mimeMap fileExtension=".svgz" mimeType="image/svg+xml" /> + <mimeMap fileExtension=".swf" mimeType="application/x-shockwave-flash" /> + <mimeMap fileExtension=".t" mimeType="application/x-troff" /> + <mimeMap fileExtension=".tar" mimeType="application/x-tar" /> + <mimeMap fileExtension=".tcl" mimeType="application/x-tcl" /> + <mimeMap fileExtension=".tex" mimeType="application/x-tex" /> + <mimeMap fileExtension=".texi" mimeType="application/x-texinfo" /> + <mimeMap fileExtension=".texinfo" mimeType="application/x-texinfo" /> + <mimeMap fileExtension=".tgz" mimeType="application/x-compressed" /> + <mimeMap fileExtension=".thmx" mimeType="application/vnd.ms-officetheme" /> + <mimeMap fileExtension=".thn" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".tif" mimeType="image/tiff" /> + <mimeMap fileExtension=".tiff" mimeType="image/tiff" /> + <mimeMap fileExtension=".toc" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".tr" mimeType="application/x-troff" /> + <mimeMap fileExtension=".trm" mimeType="application/x-msterminal" /> + <mimeMap fileExtension=".ts" mimeType="video/vnd.dlna.mpeg-tts" /> + <mimeMap fileExtension=".tsv" mimeType="text/tab-separated-values" /> + <mimeMap fileExtension=".ttf" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".tts" mimeType="video/vnd.dlna.mpeg-tts" /> + <mimeMap fileExtension=".txt" mimeType="text/plain" /> + <mimeMap fileExtension=".u32" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".uls" mimeType="text/iuls" /> + <mimeMap fileExtension=".ustar" mimeType="application/x-ustar" /> + <mimeMap fileExtension=".vbs" mimeType="text/vbscript" /> + <mimeMap fileExtension=".vcf" mimeType="text/x-vcard" /> + <mimeMap fileExtension=".vcs" mimeType="text/plain" /> + <mimeMap fileExtension=".vdx" mimeType="application/vnd.ms-visio.viewer" /> + <mimeMap fileExtension=".vml" mimeType="text/xml" /> + <mimeMap fileExtension=".vsd" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".vss" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".vst" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".vsto" mimeType="application/x-ms-vsto" /> + <mimeMap fileExtension=".vsw" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".vsx" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".vtx" mimeType="application/vnd.visio" /> + <mimeMap fileExtension=".wav" mimeType="audio/wav" /> + <mimeMap fileExtension=".wax" mimeType="audio/x-ms-wax" /> + <mimeMap fileExtension=".wbmp" mimeType="image/vnd.wap.wbmp" /> + <mimeMap fileExtension=".wcm" mimeType="application/vnd.ms-works" /> + <mimeMap fileExtension=".wdb" mimeType="application/vnd.ms-works" /> + <mimeMap fileExtension=".webm" mimeType="video/webm" /> + <mimeMap fileExtension=".wks" mimeType="application/vnd.ms-works" /> + <mimeMap fileExtension=".wm" mimeType="video/x-ms-wm" /> + <mimeMap fileExtension=".wma" mimeType="audio/x-ms-wma" /> + <mimeMap fileExtension=".wmd" mimeType="application/x-ms-wmd" /> + <mimeMap fileExtension=".wmf" mimeType="application/x-msmetafile" /> + <mimeMap fileExtension=".wml" mimeType="text/vnd.wap.wml" /> + <mimeMap fileExtension=".wmlc" mimeType="application/vnd.wap.wmlc" /> + <mimeMap fileExtension=".wmls" mimeType="text/vnd.wap.wmlscript" /> + <mimeMap fileExtension=".wmlsc" mimeType="application/vnd.wap.wmlscriptc" /> + <mimeMap fileExtension=".wmp" mimeType="video/x-ms-wmp" /> + <mimeMap fileExtension=".wmv" mimeType="video/x-ms-wmv" /> + <mimeMap fileExtension=".wmx" mimeType="video/x-ms-wmx" /> + <mimeMap fileExtension=".wmz" mimeType="application/x-ms-wmz" /> + <mimeMap fileExtension=".woff" mimeType="font/x-woff" /> + <mimeMap fileExtension=".woff2" mimeType="application/font-woff2" /> + <mimeMap fileExtension=".wps" mimeType="application/vnd.ms-works" /> + <mimeMap fileExtension=".wri" mimeType="application/x-mswrite" /> + <mimeMap fileExtension=".wrl" mimeType="x-world/x-vrml" /> + <mimeMap fileExtension=".wrz" mimeType="x-world/x-vrml" /> + <mimeMap fileExtension=".wsdl" mimeType="text/xml" /> + <mimeMap fileExtension=".wtv" mimeType="video/x-ms-wtv" /> + <mimeMap fileExtension=".wvx" mimeType="video/x-ms-wvx" /> + <mimeMap fileExtension=".x" mimeType="application/directx" /> + <mimeMap fileExtension=".xaf" mimeType="x-world/x-vrml" /> + <mimeMap fileExtension=".xaml" mimeType="application/xaml+xml" /> + <mimeMap fileExtension=".xap" mimeType="application/x-silverlight-app" /> + <mimeMap fileExtension=".xbap" mimeType="application/x-ms-xbap" /> + <mimeMap fileExtension=".xbm" mimeType="image/x-xbitmap" /> + <mimeMap fileExtension=".xdr" mimeType="text/plain" /> + <mimeMap fileExtension=".xht" mimeType="application/xhtml+xml" /> + <mimeMap fileExtension=".xhtml" mimeType="application/xhtml+xml" /> + <mimeMap fileExtension=".xla" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xlam" mimeType="application/vnd.ms-excel.addin.macroEnabled.12" /> + <mimeMap fileExtension=".xlc" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xlm" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xls" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xlsb" mimeType="application/vnd.ms-excel.sheet.binary.macroEnabled.12" /> + <mimeMap fileExtension=".xlsm" mimeType="application/vnd.ms-excel.sheet.macroEnabled.12" /> + <mimeMap fileExtension=".xlsx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" /> + <mimeMap fileExtension=".xlt" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xltm" mimeType="application/vnd.ms-excel.template.macroEnabled.12" /> + <mimeMap fileExtension=".xltx" mimeType="application/vnd.openxmlformats-officedocument.spreadsheetml.template" /> + <mimeMap fileExtension=".xlw" mimeType="application/vnd.ms-excel" /> + <mimeMap fileExtension=".xml" mimeType="text/xml" /> + <mimeMap fileExtension=".xof" mimeType="x-world/x-vrml" /> + <mimeMap fileExtension=".xpm" mimeType="image/x-xpixmap" /> + <mimeMap fileExtension=".xps" mimeType="application/vnd.ms-xpsdocument" /> + <mimeMap fileExtension=".xsd" mimeType="text/xml" /> + <mimeMap fileExtension=".xsf" mimeType="text/xml" /> + <mimeMap fileExtension=".xsl" mimeType="text/xml" /> + <mimeMap fileExtension=".xslt" mimeType="text/xml" /> + <mimeMap fileExtension=".xsn" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".xtp" mimeType="application/octet-stream" /> + <mimeMap fileExtension=".xwd" mimeType="image/x-xwindowdump" /> + <mimeMap fileExtension=".z" mimeType="application/x-compress" /> + <mimeMap fileExtension=".zip" mimeType="application/x-zip-compressed" /> + </staticContent> + + <tracing> + + <traceFailedRequests /> + + <traceProviderDefinitions> + <add name="WWW Server" guid="{3a2a4e84-4c21-4981-ae10-3fda0d9b0f83}"> + <areas> + <add name="ANCM" value="65536" /> + </areas> + </add> + </traceProviderDefinitions> + + </tracing> + + <urlCompression /> + + <validation /> + <!--<webSocket />--> + + </system.webServer> + <location path="" overrideMode="Allow"> + <system.webServer> + + <handlers accessPolicy="Read, Script"> + <add name="TRACEVerbHandler" path="*" verb="TRACE" modules="ProtocolSupportModule" requireAccess="None" /> + <add name="OPTIONSVerbHandler" path="*" verb="OPTIONS" modules="ProtocolSupportModule" requireAccess="None" /> + <add name="StaticFile" path="*" verb="*" modules="StaticFileModule,DefaultDocumentModule,DirectoryListingModule" resourceType="Either" requireAccess="Read" /> + </handlers> + </system.webServer> + </location> + +</configuration> diff --git a/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs b/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..7d8d661ef043dc0adf5c3a5c119133c190d1e3a8 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/AppOfflineTests.cs @@ -0,0 +1,287 @@ +// 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; +using System.Net.Http; +using System.Net.Sockets; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; + +namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class AppOfflineTests : IISFunctionalTestBase + { + private static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(100); + + private readonly PublishedSitesFixture _fixture; + + public AppOfflineTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task AppOfflineDroppedWhileSiteIsDown_SiteReturns503(HostingModel hostingModel) + { + var deploymentResult = await DeployApp(hostingModel); + + AddAppOffline(deploymentResult.ContentRoot); + + await AssertAppOffline(deploymentResult); + DeletePublishOutput(deploymentResult); + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task LockedAppOfflineDroppedWhileSiteIsDown_SiteReturns503(HostingModel hostingModel) + { + var deploymentResult = await DeployApp(hostingModel); + + // Add app_offline without shared access + using (var stream = File.Open(Path.Combine(deploymentResult.ContentRoot, "app_offline.htm"), FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None)) + using (var writer = new StreamWriter(stream)) + { + await writer.WriteLineAsync("App if offline but you wouldn't see this message"); + await writer.FlushAsync(); + await AssertAppOffline(deploymentResult, ""); + } + + DeletePublishOutput(deploymentResult); + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess, 500, "500.0")] + [InlineData(HostingModel.OutOfProcess, 502, "502.5")] + public async Task AppOfflineDroppedWhileSiteFailedToStartInShim_AppOfflineServed(HostingModel hostingModel, int statusCode, string content) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "nonexistent")); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var result = await deploymentResult.HttpClient.GetAsync("/"); + Assert.Equal(statusCode, (int)result.StatusCode); + Assert.Contains(content, await result.Content.ReadAsStringAsync()); + + AddAppOffline(deploymentResult.ContentRoot); + + await AssertAppOffline(deploymentResult); + DeletePublishOutput(deploymentResult); + } + + [ConditionalFact(Skip = "https://github.com/aspnet/IISIntegration/issues/933")] + public async Task AppOfflineDroppedWhileSiteFailedToStartInRequestHandler_SiteStops_InProcess() + { + var deploymentResult = await DeployApp(HostingModel.InProcess); + + // Set file content to empty so it fails at runtime + File.WriteAllText(Path.Combine(deploymentResult.ContentRoot, "Microsoft.AspNetCore.Server.IIS.dll"), ""); + + var result = await deploymentResult.HttpClient.GetAsync("/"); + Assert.Equal(500, (int)result.StatusCode); + Assert.Contains("500.30", await result.Content.ReadAsStringAsync()); + + AddAppOffline(deploymentResult.ContentRoot); + + await deploymentResult.AssertRecycledAsync(() => AssertAppOffline(deploymentResult)); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.ShutdownToken)] + public async Task AppOfflineDroppedWhileSiteStarting_SiteShutsDown_InProcess() + { + // This test often hits a race between debug logging and stdout redirection closing the handle + // we are fine having this race + using (AppVerifier.Disable(DeployerSelector.ServerType, 0x300)) + { + var deploymentResult = await DeployApp(HostingModel.InProcess); + + for (int i = 0; i < 10; i++) + { + // send first request and add app_offline while app is starting + var runningTask = AssertAppOffline(deploymentResult); + + // This test tries to hit a race where we drop app_offline file while + // in process application is starting, application start takes at least 400ms + // so we back off for 100ms to allow request to reach request handler + // Test itself is racy and can result in two scenarios + // 1. ANCM detects app_offline before it starts the request - if AssertAppOffline succeeds we've hit it + // 2. Intended scenario where app starts and then shuts down + // In first case we remove app_offline and try again + await Task.Delay(RetryDelay); + + AddAppOffline(deploymentResult.ContentRoot); + + try + { + await runningTask.DefaultTimeout(); + + // if AssertAppOffline succeeded ANCM have picked up app_offline before starting the app + // try again + RemoveAppOffline(deploymentResult.ContentRoot); + } + catch + { + deploymentResult.AssertWorkerProcessStop(); + return; + } + } + + Assert.True(false); + + } + } + + [ConditionalFact] + public async Task AppOfflineDroppedWhileSiteRunning_SiteShutsDown_InProcess() + { + var deploymentResult = await AssertStarts(HostingModel.InProcess); + + AddAppOffline(deploymentResult.ContentRoot); + + await deploymentResult.AssertRecycledAsync(() => AssertAppOffline(deploymentResult)); + } + + [ConditionalFact] + public async Task AppOfflineDroppedWhileSiteRunning_SiteShutsDown_OutOfProcess() + { + var deploymentResult = await AssertStarts(HostingModel.OutOfProcess); + + // Repeat dropping file and restarting multiple times + for (int i = 0; i < 5; i++) + { + AddAppOffline(deploymentResult.ContentRoot); + await AssertAppOffline(deploymentResult); + RemoveAppOffline(deploymentResult.ContentRoot); + await AssertRunning(deploymentResult); + } + + AddAppOffline(deploymentResult.ContentRoot); + await AssertAppOffline(deploymentResult); + DeletePublishOutput(deploymentResult); + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task AppOfflineDropped_CanRemoveAppOfflineAfterAddingAndSiteWorks(HostingModel hostingModel) + { + var deploymentResult = await DeployApp(hostingModel); + + AddAppOffline(deploymentResult.ContentRoot); + + await AssertAppOffline(deploymentResult); + + RemoveAppOffline(deploymentResult.ContentRoot); + + await AssertRunning(deploymentResult); + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task AppOfflineAddedAndRemovedStress(HostingModel hostingModel) + { + var deploymentResult = await AssertStarts(hostingModel); + + var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => { + var statusCode = (int)response.StatusCode; + Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode); + }); + + for (int i = 0; i < 100; i++) + { + // AddAppOffline might fail if app_offline is being read by ANCM and deleted at the same time + RetryHelper.RetryOperation( + () => AddAppOffline(deploymentResult.ContentRoot), + e => Logger.LogError($"Failed to create app_offline : {e.Message}"), + retryCount: 3, + retryDelayMilliseconds: RetryDelay.Milliseconds); + RemoveAppOffline(deploymentResult.ContentRoot); + } + + try + { + await load; + } + catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException) + { + // IOException in InProcess is fine, just means process stopped + if (hostingModel != HostingModel.InProcess) + { + throw; + } + } + } + + private async Task<IISDeploymentResult> DeployApp(HostingModel hostingModel = HostingModel.InProcess) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: hostingModel, publish: true); + + return await DeployAsync(deploymentParameters); + } + + private void AddAppOffline(string appPath, string content = "The app is offline.") + { + File.WriteAllText(Path.Combine(appPath, "app_offline.htm"), content); + } + + private void RemoveAppOffline(string appPath) + { + RetryHelper.RetryOperation( + () => File.Delete(Path.Combine(appPath, "app_offline.htm")), + e => Logger.LogError($"Failed to remove app_offline : {e.Message}"), + retryCount: 3, + retryDelayMilliseconds: RetryDelay.Milliseconds); + } + + private async Task AssertAppOffline(IISDeploymentResult deploymentResult, string expectedResponse = "The app is offline.") + { + var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.StatusCode == HttpStatusCode.ServiceUnavailable); + Assert.Equal(expectedResponse, await response.Content.ReadAsStringAsync()); + } + + private async Task<IISDeploymentResult> AssertStarts(HostingModel hostingModel) + { + var deploymentResult = await DeployApp(hostingModel); + + await AssertRunning(deploymentResult); + + return deploymentResult; + } + + private static async Task AssertRunning(IISDeploymentResult deploymentResult) + { + var response = await deploymentResult.HttpClient.RetryRequestAsync("HelloWorld", r => r.IsSuccessStatusCode); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("Hello World", responseText); + } + + private void DeletePublishOutput(IISDeploymentResult deploymentResult) + { + foreach (var file in Directory.GetFiles(deploymentResult.ContentRoot, "*", SearchOption.AllDirectories)) + { + // Out of process module dll is allowed to be locked + var name = Path.GetFileName(file); + if (name == "aspnetcore.dll" || name == "aspnetcorev2.dll" || name == "aspnetcorev2_outofprocess.dll") + { + continue; + } + File.Delete(file); + } + } + + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs b/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..d8607db21ed27da1ba8ac0919dbab15efb7ff0ff --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/BasicAuthTests.cs @@ -0,0 +1,70 @@ +// 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.Net.Http; +using System.Net.Http.Headers; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class BasicAuthTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public BasicAuthTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22) + .WithApplicationTypes(ApplicationType.Portable) + .WithAllAncmVersions() + .WithAllHostingModels(); + + [ConditionalTheory] + [RequiresEnvironmentVariable("ASPNETCORE_MODULE_TEST_USER")] + [RequiresIIS(IISCapability.BasicAuthentication)] + [MemberData(nameof(TestVariants))] + public async Task BasicAuthTest(TestVariant variant) + { + var username = Environment.GetEnvironmentVariable("ASPNETCORE_MODULE_TEST_USER"); + var password = Environment.GetEnvironmentVariable("ASPNETCORE_MODULE_TEST_PASSWORD"); + + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.SetAnonymousAuth(enabled: false); + deploymentParameters.SetWindowsAuth(enabled: false); + deploymentParameters.SetBasicAuth(enabled: true); + + // The default in hosting sets windows auth to true. + var deploymentResult = await DeployAsync(deploymentParameters); + var request = new HttpRequestMessage(HttpMethod.Get, "/Auth"); + var byteArray = new UTF8Encoding().GetBytes(username + ":" + password); + request.Headers.Authorization = new AuthenticationHeaderValue("Basic", Convert.ToBase64String(byteArray)); + + var response = await deploymentResult.HttpClient.SendAsync(request); + + var responseText = await response.Content.ReadAsStringAsync(); + + if (variant.HostingModel == HostingModel.InProcess) + { + Assert.StartsWith("Windows", responseText); + Assert.Contains(username, responseText); + } + else + { + // We expect out-of-proc not allowing basic auth + Assert.Equal("Windows", responseText); + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs new file mode 100644 index 0000000000000000000000000000000000000000..40b6f2265e5bc6307d854ad050eaa734b078fb5b --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateFixture.cs @@ -0,0 +1,104 @@ +// 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.Security.Cryptography; +using System.Security.Cryptography.X509Certificates; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class ClientCertificateFixture : IDisposable + { + private X509Certificate2 _certificate; + private const string _certIssuerPrefix = "CN=IISIntegrationTest_Root"; + + public X509Certificate2 GetOrCreateCertificate() + { + if (_certificate != null) + { + return _certificate; + } + + using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadWrite); + var parentKey = CreateKeyMaterial(2048); + + // Create a cert name with a random guid to avoid name conflicts + var parentRequest = new CertificateRequest( + _certIssuerPrefix + Guid.NewGuid().ToString(), + parentKey, HashAlgorithmName.SHA256, + RSASignaturePadding.Pkcs1); + + parentRequest.CertificateExtensions.Add( + new X509BasicConstraintsExtension( + certificateAuthority: true, + hasPathLengthConstraint: false, + pathLengthConstraint: 0, + critical: true)); + + parentRequest.CertificateExtensions.Add( + new X509KeyUsageExtension(X509KeyUsageFlags.DigitalSignature | X509KeyUsageFlags.NonRepudiation, critical: true)); + + parentRequest.CertificateExtensions.Add( + new X509SubjectKeyIdentifierExtension(parentRequest.PublicKey, false)); + + var notBefore = DateTimeOffset.Now.AddDays(-1); + var notAfter = DateTimeOffset.Now.AddYears(5); + + var parentCert = parentRequest.CreateSelfSigned(notBefore, notAfter); + + // Need to export/import the certificate to associate the private key with the cert. + var imported = parentCert; + + var export = parentCert.Export(X509ContentType.Pkcs12, ""); + imported = new X509Certificate2(export, "", X509KeyStorageFlags.PersistKeySet | X509KeyStorageFlags.Exportable); + Array.Clear(export, 0, export.Length); + + // Add the cert to the cert store + _certificate = imported; + + store.Add(certificate: imported); + store.Close(); + return imported; + } + } + + public void Dispose() + { + if (_certificate == null) + { + return; + } + + using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine)) + { + store.Open(OpenFlags.ReadWrite); + store.Remove(_certificate); + + // Remove any extra certs that were left by previous tests. + for (var i = store.Certificates.Count - 1; i >= 0; i--) + { + var cert = store.Certificates[i]; + if (cert.Issuer.StartsWith(_certIssuerPrefix)) + { + store.Remove(cert); + } + } + store.Close(); + } + } + + private 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; + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..43ccc83eff04414603bec4d9385e602ec2e8e428 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/ClientCertificateTests.cs @@ -0,0 +1,108 @@ +// 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.Net.Http; +using System.Security.Cryptography.X509Certificates; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.Common; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + [SkipIfNotAdmin] + public class ClientCertificateTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + private readonly ClientCertificateFixture _certFixture; + + public ClientCertificateTests(PublishedSitesFixture fixture, ClientCertificateFixture certFixture) + { + _fixture = fixture; + _certFixture = certFixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22, Tfm.Net461) + .WithAllApplicationTypes() + .WithAllAncmVersions() + .WithAllHostingModels(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public Task HttpsNoClientCert_NoClientCert(TestVariant variant) + { + return ClientCertTest(variant, sendClientCert: false); + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public Task HttpsClientCert_GetCertInformation(TestVariant variant) + { + return ClientCertTest(variant, sendClientCert: true); + } + + private async Task ClientCertTest(TestVariant variant, bool sendClientCert) + { + var port = TestPortHelper.GetNextSSLPort(); + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant); + deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/"; + deploymentParameters.AddHttpsToServerConfig(); + + var handler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (a, b, c, d) => true, + ClientCertificateOptions = ClientCertificateOption.Manual, + }; + + X509Certificate2 cert = null; + if (sendClientCert) + { + cert = _certFixture.GetOrCreateCertificate(); + handler.ClientCertificates.Add(cert); + } + + var deploymentResult = await DeployAsync(deploymentParameters); + + var client = deploymentResult.CreateClient(handler); + var response = await client.GetAsync("GetClientCert"); + + var responseText = await response.Content.ReadAsStringAsync(); + + try + { + if (sendClientCert) + { + Assert.Equal($"Enabled;{cert.GetCertHashString()}", responseText); + } + else + { + Assert.Equal("Disabled", responseText); + } + } + catch (Exception ex) + { + Logger.LogError($"Certificate is invalid. Issuer name: {cert.Issuer}"); + using (var store = new X509Store(StoreName.Root, StoreLocation.LocalMachine)) + { + Logger.LogError($"List of current certificates in root store:"); + store.Open(OpenFlags.ReadWrite); + foreach (var otherCert in store.Certificates) + { + Logger.LogError(otherCert.Issuer); + } + store.Close(); + } + throw ex; + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs b/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs new file mode 100644 index 0000000000000000000000000000000000000000..9deeae3f927e68bd81f02ce4990c5f1a647c1208 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/ClientDisconnectStress.cs @@ -0,0 +1,65 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class ClientDisconnectStressTests: FunctionalTestsBase + { + private readonly PublishedSitesFixture _fixture; + + public ClientDisconnectStressTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task ClientDisconnectStress(HostingModel hostingModel) + { + var site = await StartAsync(_fixture.GetBaseDeploymentParameters(hostingModel)); + var maxRequestSize = 1000; + var blockSize = 40; + var random = new Random(); + async Task RunRequests() + { + using (var connection = new TestConnection(site.HttpClient.BaseAddress.Port)) + { + await connection.Send( + "POST /ReadAndFlushEcho HTTP/1.1", + $"Content-Length: {maxRequestSize}", + "Host: localhost", + "Connection: close", + "", + ""); + + var disconnectAfter = random.Next(maxRequestSize); + var data = new byte[blockSize]; + for (int i = 0; i < disconnectAfter / blockSize; i++) + { + await connection.Stream.WriteAsync(data); + } + } + } + + List<Task> tasks = new List<Task>(); + for (int i = 0; i < 100; i++) + { + tasks.Add(Task.Run(RunRequests)); + } + + await Task.WhenAll(tasks); + + StopServer(); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs b/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..e2bcf2a8f95220b41e1f9fb50f199d302f2cadf2 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/CommonStartupTests.cs @@ -0,0 +1,44 @@ +// 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.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class CommonStartupTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public CommonStartupTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22) + .WithAllApplicationTypes() + .WithAllAncmVersions() + .WithAllHostingModels(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task StartupStress(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => { + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Hello World", response.Content.ReadAsStringAsync().GetAwaiter().GetResult()); + }); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..c2d0277c4c677facff3fd5d1c5eeacde3b1dbfea --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/CompressionTests.cs @@ -0,0 +1,58 @@ +// 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.Net.Http; +using System.Net.Http.Headers; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISCompressionSiteCollection.Name)] + public abstract class CompressionTests : FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + [Collection(IISTestSiteCollection.Name)] + public class InProc: CompressionTests + { + public InProc(IISTestSiteFixture fixture) : base(fixture) { } + } + + [Collection(OutOfProcessTestSiteCollection.Name)] + public class OutOfProcess: CompressionTests + { + public OutOfProcess(OutOfProcessTestSiteFixture fixture) : base(fixture) { } + } + + [Collection(OutOfProcessV1TestSiteCollection.Name)] + public class OutOfProcessV1: CompressionTests + { + public OutOfProcessV1(OutOfProcessV1TestSiteFixture fixture) : base(fixture) { } + } + + protected CompressionTests(IISTestSiteFixture fixture) : base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task PassesThroughCompression() + { + var request = new HttpRequestMessage(HttpMethod.Get, "/CompressedData"); + + request.Headers.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); + + var response = await _fixture.Client.SendAsync(request); + Assert.Equal("gzip", response.Content.Headers.ContentEncoding.Single()); + Assert.Equal( + new byte[] { + 0x1F, 0x8B, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x04, 0x0B, 0x63, 0x60, 0xA0, 0x3D, 0x00, 0x00, + 0xCA, 0xC6, 0x88, 0x99, 0x64, 0x00, 0x00, 0x00 }, + await response.Content.ReadAsByteArrayAsync()); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..099cefb97a94f431f413bf4d4016331f33035f1e --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/ConfigurationChangeTests.cs @@ -0,0 +1,126 @@ +// 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.Net; +using System.Net.Http; +using System.Net.Sockets; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class ConfigurationChangeTests : IISFunctionalTestBase + { + private static readonly TimeSpan RetryDelay = TimeSpan.FromMilliseconds(100); + private readonly PublishedSitesFixture _fixture; + + public ConfigurationChangeTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ConfigurationChangeStopsInProcess() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.InProcess, publish: true); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await deploymentResult.AssertStarts(); + + // Just "touching" web.config should be enough + deploymentResult.ModifyWebConfig(element => {}); + + await deploymentResult.AssertRecycledAsync(); + } + + [ConditionalTheory] + [InlineData(AncmVersion.AspNetCoreModule)] + [InlineData(AncmVersion.AspNetCoreModuleV2)] + public async Task ConfigurationChangeForcesChildProcessRestart(AncmVersion version) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + deploymentParameters.AncmVersion = version; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var processBefore = await deploymentResult.HttpClient.GetStringAsync("/ProcessId"); + + // Just "touching" web.config should be enough + deploymentResult.ModifyWebConfig(element => {}); + + // Have to retry here to allow ANCM to receive notification and react to it + // Verify that worker process gets restarted with new process id + await deploymentResult.HttpClient.RetryRequestAsync("/ProcessId", async r => await r.Content.ReadAsStringAsync() != processBefore); + } + + [ConditionalFact] + public async Task OutOfProcessToInProcessHostingModelSwitchWorks() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await deploymentResult.AssertStarts(); + + deploymentResult.ModifyWebConfig(element => element + .Descendants("system.webServer") + .Single() + .GetOrAdd("aspNetCore") + .SetAttributeValue("hostingModel", "inprocess")); + + // Have to retry here to allow ANCM to receive notification and react to it + // Verify that inprocess application was created and tried to start + await deploymentResult.HttpClient.RetryRequestAsync("/HelloWorld", r => r.StatusCode == HttpStatusCode.InternalServerError); + + StopServer(); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not find the assembly 'aspnetcorev2_inprocess.dll'", Logger); + } + + [ConditionalTheory] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task ConfigurationTouchedStress(HostingModel hostingModel) + { + var deploymentResult = await DeployAsync(_fixture.GetBaseDeploymentParameters(hostingModel, publish: true)); + + await deploymentResult.AssertStarts(); + var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => { + var statusCode = (int)response.StatusCode; + Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode); + }); + + for (int i = 0; i < 100; i++) + { + // ModifyWebConfig might fail if web.config is being read by IIS + RetryHelper.RetryOperation( + () => deploymentResult.ModifyWebConfig(element => {}), + e => Logger.LogError($"Failed to touch web.config : {e.Message}"), + retryCount: 3, + retryDelayMilliseconds: RetryDelay.Milliseconds); + } + + try + { + await load; + } + catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException) + { + // IOException in InProcess is fine, just means process stopped + if (hostingModel != HostingModel.InProcess) + { + throw; + } + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..6e2d1bc7521c298da8e398ba16d920dbf5849fbc --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ClientDisconnectTests.cs @@ -0,0 +1,108 @@ +// 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.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class ClientDisconnectTests: FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public ClientDisconnectTests(IISTestSiteFixture fixture): base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ServerWorksAfterClientDisconnect() + { + using (var connection = _fixture.CreateTestConnection()) + { + var message = "Hello"; + await connection.Send( + "POST /ReadAndWriteSynchronously HTTP/1.1", + $"Content-Length: {100000}", + "Host: localhost", + "Connection: close", + "", + ""); + + await connection.Send(message); + + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + } + + var response = await _fixture.Client.GetAsync("HelloWorld"); + + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("Hello World", responseText); + } + + [ConditionalFact] + public async Task RequestAbortedTokenFires() + { + using (var connection = _fixture.CreateTestConnection()) + { + await connection.Send( + "GET /WaitForAbort HTTP/1.1", + "Host: localhost", + "Connection: close", + "", + ""); + + await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "1"); + } + + await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "0"); + } + + [ConditionalFact] + public async Task ClientDisconnectCallbackStress() + { + // Fixture initialization fails if inside of the Task.Run, so send an + // initial request to initialize the fixture. + var response = await _fixture.Client.GetAsync("HelloWorld"); + var numTotalRequests = 0; + for (var j = 0; j < 20; j++) + { + // Windows has a max connection limit of 10 for the IIS server, + // so setting limit fairly low. + const int numRequests = 5; + async Task RunRequests() + { + using (var connection = _fixture.CreateTestConnection()) + { + await connection.Send( + "GET /WaitForAbort HTTP/1.1", + "Host: localhost", + "Connection: close", + "", + ""); + await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() != "0"); + Interlocked.Increment(ref numTotalRequests); + } + } + + List<Task> tasks = new List<Task>(); + for (int i = 0; i < numRequests; i++) + { + tasks.Add(Task.Run(RunRequests)); + } + + await Task.WhenAll(tasks); + + await _fixture.Client.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "0"); + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..ce1c84e6099aa7d603488e08496c9ecee4a2e8d8 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/CompressionTests.cs @@ -0,0 +1,96 @@ +// 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.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISCompressionSiteCollection.Name)] + public class CompressionModuleTests : FixtureLoggedTest + { + private readonly IISCompressionSiteFixture _fixture; + + public CompressionModuleTests(IISCompressionSiteFixture fixture): base(fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.DynamicCompression)] + [InlineData(true)] + [InlineData(false)] + public async Task BufferingDisabled(bool compression) + { + using (var connection = _fixture.CreateTestConnection()) + { + var requestLength = 0; + var messages = new List<string>(); + for (var i = 1; i < 100; i++) + { + var message = i + Environment.NewLine; + requestLength += message.Length; + messages.Add(message); + } + + await connection.Send( + "POST /ReadAndWriteEchoLinesNoBuffering HTTP/1.1", + $"Content-Length: {requestLength}", + "Accept-Encoding: " + (compression ? "gzip": "identity"), + "Response-Content-Type: text/event-stream", + "Host: localhost", + "Connection: close", + "", + ""); + + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + await connection.ReceiveHeaders(); + + foreach (var message in messages) + { + await connection.Send(message); + await connection.ReceiveChunk(message); + } + + await connection.Send("\r\n"); + await connection.ReceiveChunk(""); + await connection.WaitForConnectionClose(); + } + } + + [ConditionalFact] + [RequiresIIS(IISCapability.DynamicCompression)] + public async Task DynamicResponsesAreCompressed() + { + var handler = new HttpClientHandler + { + AutomaticDecompression = DecompressionMethods.GZip + }; + var client = new HttpClient(handler) + { + BaseAddress = _fixture.Client.BaseAddress, + }; + client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("gzip")); + client.DefaultRequestHeaders.AcceptEncoding.Add(new StringWithQualityHeaderValue("identity", 0)); + client.DefaultRequestHeaders.Add("Response-Content-Type", "text/event-stream"); + var messages = "Message1\r\nMessage2\r\n"; + + // Send messages with terminator + var response = await client.PostAsync("ReadAndWriteEchoLines", new StringContent(messages + "\r\n")); + Assert.Equal(messages, await response.Content.ReadAsStringAsync()); + Assert.True(response.Content.Headers.TryGetValues("Content-Type", out var contentTypes)); + Assert.Single(contentTypes, "text/event-stream"); + // Not the cleanest check but I wasn't able to figure out other way to check + // that response was compressed + Assert.Contains("gzip", response.Content.GetType().FullName, StringComparison.OrdinalIgnoreCase); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..ae8fde39edad5088b6f8aeb177666de192c75662 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EnvironmentVariableTests.cs @@ -0,0 +1,51 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class EnvironmentVariableTests: FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public EnvironmentVariableTests(IISTestSiteFixture fixture): base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task GetUniqueEnvironmentVariable() + { + Assert.Equal("foobar", await _fixture.Client.GetStringAsync("/CheckEnvironmentVariable")); + } + + [ConditionalFact] + public async Task GetLongEnvironmentVariable() + { + Assert.Equal( + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" + + "AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative", + await _fixture.Client.GetStringAsync("/CheckEnvironmentLongValueVariable")); + } + + [ConditionalFact] + public async Task GetExistingEnvironmentVariable() + { + Assert.Contains(";foobarbaz", await _fixture.Client.GetStringAsync("/CheckAppendedEnvironmentVariable")); + } + + [ConditionalFact] + public async Task AuthHeaderEnvironmentVariableRemoved() + { + Assert.DoesNotContain("shouldberemoved", await _fixture.Client.GetStringAsync("/CheckRemoveAuthEnvironmentVariable")); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..bf45949491a3b7ff85a9cf8bcdbfa9d75486a657 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ErrorPagesTests.cs @@ -0,0 +1,131 @@ +// 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.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class ErrorPagesTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public ErrorPagesTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task IncludesAdditionalErrorPageTextInProcessHandlerLoadFailure_CorrectString() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + var response = await DeployAppWithStartupFailure(deploymentParameters); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + var responseString = await response.Content.ReadAsStringAsync(); + Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", responseString); + VerifyNoExtraTrailingBytes(responseString); + + await AssertLink(response); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task IncludesAdditionalErrorPageTextOutOfProcessStartupFailure_CorrectString() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + var response = await DeployAppWithStartupFailure(deploymentParameters); + + Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode); + + StopServer(); + + var responseString = await response.Content.ReadAsStringAsync(); + Assert.Contains("HTTP Error 502.5 - ANCM Out-Of-Process Startup Failure", responseString); + VerifyNoExtraTrailingBytes(responseString); + + await AssertLink(response); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task IncludesAdditionalErrorPageTextOutOfProcessHandlerLoadFailure_CorrectString() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + deploymentParameters.HandlerSettings["handlerVersion"] = "88.93"; + deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example"; + + var deploymentResult = await DeployAsync(deploymentParameters); + var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + var responseString = await response.Content.ReadAsStringAsync(); + Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", responseString); + VerifyNoExtraTrailingBytes(responseString); + + await AssertLink(response); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [RequiresNewHandler] + public async Task IncludesAdditionalErrorPageTextInProcessStartupFailure_CorrectString() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn"); + deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example"; + + var deploymentResult = await DeployAsync(deploymentParameters); + var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + var responseString = await response.Content.ReadAsStringAsync(); + Assert.Contains("HTTP Error 500.30 - ANCM In-Process Start Failure", responseString); + VerifyNoExtraTrailingBytes(responseString); + + await AssertLink(response); + } + + private static void VerifyNoExtraTrailingBytes(string responseString) + { + if (!DeployerSelector.IsBackwardsCompatiblityTest) + { + Assert.EndsWith("</html>\r\n", responseString); + } + } + + private static async Task AssertLink(HttpResponseMessage response) + { + Assert.Contains("<a href=\"http://example\"> <cite> http://example </cite></a> and ", await response.Content.ReadAsStringAsync()); + } + + private async Task<HttpResponseMessage> DeployAppWithStartupFailure(IISDeploymentParameters deploymentParameters) + { + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "doesnot")); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", "start")); + + deploymentParameters.EnvironmentVariables["ANCM_ADDITIONAL_ERROR_PAGE_LINK"] = "http://example"; + + var deploymentResult = await DeployAsync(deploymentParameters); + + return await deploymentResult.HttpClient.GetAsync("HelloWorld"); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..1df7f3c077fd1fe95659446b75adf23abaf6f016 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/EventLogTests.cs @@ -0,0 +1,46 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class EventLogTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public EventLogTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task CheckStartupEventLogMessage() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + + var deploymentResult = await DeployAsync(deploymentParameters); + await deploymentResult.AssertStarts(); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Application '.+' started the coreclr in-process successfully."); + } + + [ConditionalFact] + public async Task CheckShutdownEventLogMessage() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + var deploymentResult = await DeployAsync(deploymentParameters); + await deploymentResult.AssertStarts(); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Application '.+' has shutdown."); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..e31dc3dbaa08e88f520f67471746e049f9c1e22d --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FeatureCollectionTests.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.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class FeatureCollectionTest + { + private readonly IISTestSiteFixture _fixture; + + public FeatureCollectionTest(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData("FeatureCollectionSetRequestFeatures")] + [InlineData("FeatureCollectionSetResponseFeatures")] + [InlineData("FeatureCollectionSetConnectionFeatures")] + public async Task FeatureCollectionTest_SetHttpContextFeatures(string path) + { + Assert.Equal("Success", await _fixture.Client.GetStringAsync(path + "/path" + "?query")); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..705af2b213c820e268966fd1a09b609f8eadd3a4 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FixtureLoggedTest.cs @@ -0,0 +1,31 @@ +// 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.Reflection; +using Microsoft.Extensions.Logging.Testing; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class FixtureLoggedTest: LoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public FixtureLoggedTest(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + public override void Initialize(MethodInfo methodInfo, object[] testMethodArguments, ITestOutputHelper testOutputHelper) + { + base.Initialize(methodInfo, testMethodArguments, testOutputHelper); + _fixture.Attach(this); + } + + public override void Dispose() + { + _fixture.Detach(this); + base.Dispose(); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..12e2f6ae53ca7e08c0d0ece27959d7c06641f552 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/FrebTests.cs @@ -0,0 +1,181 @@ +// 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.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class FrebTests : LogFileTestBase + { + private readonly PublishedSitesFixture _fixture; + public FrebTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static IList<FrebLogItem> FrebChecks() + { + var list = new List<FrebLogItem>(); + list.Add(new FrebLogItem("ANCM_INPROC_EXECUTE_REQUEST_START")); + list.Add(new FrebLogItem("ANCM_INPROC_EXECUTE_REQUEST_COMPLETION", "1")); + list.Add(new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_START")); + list.Add(new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_COMPLETION", "0")); + list.Add(new FrebLogItem("ANCM_INPROC_MANAGED_REQUEST_COMPLETION")); + return list; + } + + [ConditionalFact] + [RequiresIIS(IISCapability.FailedRequestTracingModule)] + public async Task CheckCommonFrebEvents() + { + var result = await SetupFrebApp(); + + await result.HttpClient.GetAsync("HelloWorld"); + + StopServer(); + + AssertFrebLogs(result, FrebChecks()); + } + + [ConditionalFact] + [RequiresNewShim] + [RequiresIIS(IISCapability.FailedRequestTracingModule)] + public async Task FrebIncludesHResultFailures() + { + var parameters = _fixture.GetBaseDeploymentParameters(publish: true); + parameters.TransformArguments((args, _) => string.Empty); + var result = await SetupFrebApp(parameters); + + await result.HttpClient.GetAsync("HelloWorld"); + + StopServer(); + + AssertFrebLogs(result, new FrebLogItem("ANCM_HRESULT_FAILED"), new FrebLogItem("ANCM_EXCEPTION_CAUGHT")); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.FailedRequestTracingModule)] + public async Task CheckFailedRequestEvents() + { + var result = await SetupFrebApp(); + + await result.HttpClient.GetAsync("Throw"); + + StopServer(); + + AssertFrebLogs(result, new FrebLogItem("ANCM_INPROC_ASYNC_COMPLETION_COMPLETION", "2")); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.FailedRequestTracingModule)] + public async Task CheckFrebDisconnect() + { + var result = await SetupFrebApp(); + + using (var connection = new TestConnection(result.HttpClient.BaseAddress.Port)) + { + await connection.Send( + "GET /WaitForAbort HTTP/1.1", + "Host: localhost", + "Connection: close", + "", + ""); + await result.HttpClient.RetryRequestAsync("/WaitingRequestCount", async message => await message.Content.ReadAsStringAsync() == "1"); + } + + StopServer(); + + // The order of freb logs is based on when the requests are complete. + // This is non-deterministic here, so we need to check both freb files for a request that was disconnected. + AssertFrebLogs(result, new FrebLogItem("ANCM_INPROC_REQUEST_DISCONNECT"), new FrebLogItem("ANCM_INPROC_MANAGED_REQUEST_COMPLETION")); + } + + private async Task<IISDeploymentResult> SetupFrebApp(IISDeploymentParameters parameters = null) + { + parameters = parameters ?? _fixture.GetBaseDeploymentParameters(publish: true); + parameters.EnableFreb("Verbose", _logFolderPath); + + Directory.CreateDirectory(_logFolderPath); + var result = await DeployAsync(parameters); + return result; + } + + private void AssertFrebLogs(IISDeploymentResult result, params FrebLogItem[] expectedFrebEvents) + { + AssertFrebLogs(result, (IEnumerable<FrebLogItem>)expectedFrebEvents); + } + + private void AssertFrebLogs(IISDeploymentResult result, IEnumerable<FrebLogItem> expectedFrebEvents) + { + var frebEvent = GetFrebLogItems(result); + foreach (var expectedEvent in expectedFrebEvents) + { + Assert.Contains(expectedEvent, frebEvent); + } + } + + private IEnumerable<FrebLogItem> GetFrebLogItems(IISDeploymentResult result) + { + var folderPath = Helpers.GetFrebFolder(_logFolderPath, result); + var xmlFiles = Directory.GetFiles(folderPath).Where(f => f.EndsWith("xml")); + var frebEvents = new List<FrebLogItem>(); + + foreach (var xmlFile in xmlFiles) + { + var xDocument = XDocument.Load(xmlFile).Root; + var nameSpace = (XNamespace)"http://schemas.microsoft.com/win/2004/08/events/event"; + var eventElements = xDocument.Descendants(nameSpace + "Event"); + foreach (var eventElement in eventElements) + { + var eventElementWithOpCode = eventElement.Descendants(nameSpace + "RenderingInfo").Single().Descendants(nameSpace + "Opcode").Single(); + var requestStatus = eventElement.Element(nameSpace + "EventData").Descendants().Where(el => el.Attribute("Name").Value == "requestStatus").SingleOrDefault(); + frebEvents.Add(new FrebLogItem(eventElementWithOpCode.Value, requestStatus?.Value)); + } + } + + return frebEvents; + } + + public class FrebLogItem + { + private string _opCode; + private string _requestStatus; + + public FrebLogItem(string opCode) + { + _opCode = opCode; + } + + public FrebLogItem(string opCode, string requestStatus) + { + _opCode = opCode; + _requestStatus = requestStatus; + } + + public override bool Equals(object obj) + { + var item = obj as FrebLogItem; + return item != null && + _opCode == item._opCode && + _requestStatus == item._requestStatus; + } + + public override int GetHashCode() + { + return HashCode.Combine(_opCode, _requestStatus); + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..1b2ad70600114759f74e0e189987e3c5348cc0c9 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HelloWorldTests.cs @@ -0,0 +1,30 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class HelloWorldInProcessTests + { + private readonly IISTestSiteFixture _fixture; + + public HelloWorldInProcessTests(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task HelloWorld_InProcess() + { + Assert.Equal("Hello World", await _fixture.Client.GetStringAsync("/HelloWorld")); + + Assert.Equal("/Path??", await _fixture.Client.GetStringAsync("/HelloWorld/Path%3F%3F?query")); + + Assert.Equal("?query", await _fixture.Client.GetStringAsync("/HelloWorld/Query%3F%3F?query")); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..061b828a6cc1324f54917c275eb83832eee0d066 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/HostingEnvironmentTests.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; +using System.IO; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class HostingEnvironmentTests: FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public HostingEnvironmentTests(IISTestSiteFixture fixture): base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + [RequiresIIS(IISCapability.ShutdownToken)] + public async Task HostingEnvironmentIsCorrect() + { + Assert.Equal( + $"ContentRootPath {_fixture.DeploymentResult.ContentRoot}" + Environment.NewLine + + $"WebRootPath {_fixture.DeploymentResult.ContentRoot}\\wwwroot" + Environment.NewLine + + $"CurrentDirectory {Path.GetDirectoryName(_fixture.DeploymentResult.HostProcess.MainModule.FileName)}", + await _fixture.Client.GetStringAsync("/HostingEnvironment")); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..95c05308bd122610c2e9c0c6a7ce29ee42235703 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/InvalidReadWriteOperationTests.cs @@ -0,0 +1,84 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class InvalidReadWriteOperationTests + { + private readonly IISTestSiteFixture _fixture; + + public InvalidReadWriteOperationTests(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task TestReadOffsetWorks() + { + var result = await _fixture.Client.PostAsync($"/TestReadOffsetWorks", new StringContent("Hello World")); + Assert.Equal("Hello World", await result.Content.ReadAsStringAsync()); + } + + [ConditionalTheory] + [InlineData("/InvalidOffsetSmall")] + [InlineData("/InvalidOffsetLarge")] + [InlineData("/InvalidCountSmall")] + [InlineData("/InvalidCountLarge")] + [InlineData("/InvalidCountWithOffset")] + public async Task TestInvalidReadOperations(string operation) + { + var result = await _fixture.Client.GetStringAsync($"/TestInvalidReadOperations{operation}"); + Assert.Equal("Success", result); + } + + [ConditionalTheory] + [InlineData("/NullBuffer")] + [InlineData("/InvalidCountZeroRead")] + public async Task TestValidReadOperations(string operation) + { + var result = await _fixture.Client.GetStringAsync($"/TestValidReadOperations{operation}"); + Assert.Equal("Success", result); + } + + [ConditionalTheory] + [InlineData("/NullBufferPost")] + [InlineData("/InvalidCountZeroReadPost")] + public async Task TestValidReadOperationsPost(string operation) + { + var result = await _fixture.Client.PostAsync($"/TestValidReadOperations{operation}", new StringContent("hello")); + Assert.Equal("Success", await result.Content.ReadAsStringAsync()); + } + + [ConditionalTheory] + [InlineData("/InvalidOffsetSmall")] + [InlineData("/InvalidOffsetLarge")] + [InlineData("/InvalidCountSmall")] + [InlineData("/InvalidCountLarge")] + [InlineData("/InvalidCountWithOffset")] + public async Task TestInvalidWriteOperations(string operation) + { + var result = await _fixture.Client.GetStringAsync($"/TestInvalidWriteOperations{operation}"); + Assert.Equal("Success", result); + } + + [ConditionalFact] + public async Task TestValidWriteOperations() + { + var result = await _fixture.Client.GetStringAsync($"/TestValidWriteOperations/NullBuffer"); + Assert.Equal("Success", result); + } + + [ConditionalFact] + public async Task TestValidWriteOperationsPost() + { + var result = await _fixture.Client.PostAsync($"/TestValidWriteOperations/NullBufferPost", new StringContent("hello")); + Assert.Equal("Success", await result.Content.ReadAsStringAsync()); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..40db2cfdb851eaa5c04810f7af91d20d157b833f --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LargeResponseBodyTests.cs @@ -0,0 +1,36 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class LargeResponseBodyTests + { + private readonly IISTestSiteFixture _fixture; + + public LargeResponseBodyTests(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData(65000)] + [InlineData(1000000)] + [InlineData(10000000)] + [InlineData(100000000)] + public async Task LargeResponseBodyTest_CheckAllResponseBodyBytesWritten(int query) + { + Assert.Equal(new string('a', query), await _fixture.Client.GetStringAsync($"/LargeResponseBody?length={query}")); + } + + [ConditionalFact] + public async Task LargeResponseBodyFromFile_CheckAllResponseBodyBytesWritten() + { + Assert.Equal(200000000, (await _fixture.Client.GetStringAsync($"/LargeResponseFile")).Length); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..4d34c3154f7bab1418b9553c86bd5c68677dcb02 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/LogPipeTests.cs @@ -0,0 +1,83 @@ +// 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.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class LogPipeTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public LogPipeTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData("ConsoleErrorWrite")] + [InlineData("ConsoleWrite")] + public async Task CheckStdoutLoggingToPipe_DoesNotCrashProcess(string path) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + var deploymentResult = await DeployAsync(deploymentParameters); + + await Helpers.AssertStarts(deploymentResult, path); + + StopServer(); + + if (deploymentParameters.ServerType == ServerType.IISExpress) + { + Assert.Contains(TestSink.Writes, context => context.Message.Contains("TEST MESSAGE")); + } + } + + [ConditionalTheory] + [InlineData("ConsoleErrorWriteStartServer")] + [InlineData("ConsoleWriteStartServer")] + public async Task CheckStdoutLoggingToPipeWithFirstWrite(string path) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + + var firstWriteString = "TEST MESSAGE"; + + deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await Helpers.AssertStarts(deploymentResult); + + StopServer(); + + if (deploymentParameters.ServerType == ServerType.IISExpress) + { + // We can't read stdout logs from IIS as they aren't redirected. + Assert.Contains(TestSink.Writes, context => context.Message.Contains(firstWriteString)); + } + } + + [ConditionalFact] + public async Task CheckUnicodePipe() + { + var path = "CheckConsoleFunctions"; + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync(path); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", "(.*)彡⾔(.*)")); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..fec5c227ecf9da4443d3bcefd8d0f5f68119dc1f --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseHeaderTests.cs @@ -0,0 +1,85 @@ +// 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.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Net.Http.Headers; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class ResponseHeaders + { + private readonly IISTestSiteFixture _fixture; + + public ResponseHeaders(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task AddResponseHeaders_HeaderValuesAreSetCorrectly() + { + var response = await _fixture.Client.GetAsync("ResponseHeaders"); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Request Complete", responseText); + + Assert.True(response.Headers.TryGetValues("UnknownHeader", out var headerValues)); + Assert.Equal("test123=foo", headerValues.First()); + + Assert.True(response.Content.Headers.TryGetValues(HeaderNames.ContentType, out headerValues)); + Assert.Equal("text/plain", headerValues.First()); + + Assert.True(response.Headers.TryGetValues("MultiHeader", out headerValues)); + Assert.Equal(2, headerValues.Count()); + Assert.Equal("1", headerValues.First()); + Assert.Equal("2", headerValues.Last()); + } + + [ConditionalFact] + public async Task ErrorCodeIsSetForExceptionDuringRequest() + { + var response = await _fixture.Client.GetAsync("Throw"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + Assert.Equal("Internal Server Error", response.ReasonPhrase); + } + + [ConditionalTheory] + [InlineData(200, "custom", "custom", null)] + [InlineData(200, "custom", "custom", "Custom body")] + [InlineData(200, "custom", "custom", "")] + + + [InlineData(500, "", "Internal Server Error", null)] + [InlineData(500, "", "Internal Server Error", "Custom body")] + [InlineData(500, "", "Internal Server Error", "")] + + [InlineData(400, "custom", "custom", null)] + [InlineData(400, "", "Bad Request", "Custom body")] + [InlineData(400, "", "Bad Request", "")] + + [InlineData(999, "", "", null)] + [InlineData(999, "", "", "Custom body")] + [InlineData(999, "", "", "")] + public async Task CustomErrorCodeWorks(int code, string reason, string expectedReason, string body) + { + var response = await _fixture.Client.GetAsync($"SetCustomErorCode?code={code}&reason={reason}&writeBody={body != null}&body={body}"); + Assert.Equal((HttpStatusCode)code, response.StatusCode); + Assert.Equal(expectedReason, response.ReasonPhrase); + + // ReadAsStringAsync returns empty string for empty results + Assert.Equal(body ?? string.Empty, await response.Content.ReadAsStringAsync()); + } + + [ConditionalFact] + public async Task ServerHeaderIsOverriden() + { + var response = await _fixture.Client.GetAsync("OverrideServer"); + Assert.Equal("MyServer/7.8", response.Headers.Server.Single().Product.ToString()); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..c39e155e77cecfc0f3a104c47d66d9ab533e979c --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ResponseInvalidOrderingTests.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.Threading.Tasks; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class ResponseInvalidOrderingTest + { + private readonly IISTestSiteFixture _fixture; + + public ResponseInvalidOrderingTest(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData("SetStatusCodeAfterWrite")] + [InlineData("SetHeaderAfterWrite")] + public async Task ResponseInvalidOrderingTests_ExpectFailure(string path) + { + Assert.Equal($"Started_{path}Threw_Finished", await _fixture.Client.GetStringAsync("/ResponseInvalidOrdering/" + path)); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..d18c4c7f093f728b5f7080223ed5943745c4bb89 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/ServerVariablesTest.cs @@ -0,0 +1,59 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class ServerVariablesTest + { + private readonly IISTestSiteFixture _fixture; + + public ServerVariablesTest(IISTestSiteFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ProvidesAccessToServerVariables() + { + var port = _fixture.Client.BaseAddress.Port; + Assert.Equal("SERVER_PORT: " + port, await _fixture.Client.GetStringAsync("/ServerVariable?q=SERVER_PORT")); + Assert.Equal("QUERY_STRING: q=QUERY_STRING", await _fixture.Client.GetStringAsync("/ServerVariable?q=QUERY_STRING")); + } + + [ConditionalFact] + public async Task ReturnsNullForUndefinedServerVariable() + { + Assert.Equal("THIS_VAR_IS_UNDEFINED: (null)", await _fixture.Client.GetStringAsync("/ServerVariable?q=THIS_VAR_IS_UNDEFINED")); + } + + [ConditionalFact] + public async Task CanSetAndReadVariable() + { + Assert.Equal("ROUNDTRIP: 1", await _fixture.Client.GetStringAsync("/ServerVariable?v=1&q=ROUNDTRIP")); + } + + [ConditionalFact] + public async Task BasePathIsNotPrefixedBySlashSlashQuestionMark() + { + Assert.DoesNotContain(@"\\?\", await _fixture.Client.GetStringAsync("/BasePath")); + } + + [ConditionalFact] + public async Task GetServerVariableDoesNotCrash() + { + await Helpers.StressLoad(_fixture.Client, "/GetServerVariableStress", response => { + var text = response.Content.ReadAsStringAsync().Result; + Assert.StartsWith("Response Begin", text); + Assert.EndsWith("Response End", text); + }); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..cadfed97819d974907bb78218bce3907e23d8138 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupExceptionTests.cs @@ -0,0 +1,100 @@ +// 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.Net; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class StartupExceptionTests : LogFileTestBase + { + private readonly PublishedSitesFixture _fixture; + + public StartupExceptionTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData("CheckLargeStdErrWrites")] + [InlineData("CheckLargeStdOutWrites")] + [InlineData("CheckOversizedStdErrWrites")] + [InlineData("CheckOversizedStdOutWrites")] + public async Task CheckStdoutWithLargeWrites_TestSink(string mode) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} {mode}"); + var deploymentResult = await DeployAsync(deploymentParameters); + + await AssertFailsToStart(deploymentResult); + var expectedString = new string('a', 30000); + Assert.Contains(TestSink.Writes, context => context.Message.Contains(expectedString)); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", expectedString)); + } + + [ConditionalTheory] + [InlineData("CheckLargeStdErrWrites")] + [InlineData("CheckLargeStdOutWrites")] + [InlineData("CheckOversizedStdErrWrites")] + [InlineData("CheckOversizedStdOutWrites")] + public async Task CheckStdoutWithLargeWrites_LogFile(string mode) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} {mode}"); + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await AssertFailsToStart(deploymentResult); + + var contents = GetLogFileContent(deploymentResult); + var expectedString = new string('a', 30000); + + Assert.Contains(expectedString, contents); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", expectedString)); + } + + [ConditionalFact] + public async Task CheckValidConsoleFunctions() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} CheckConsoleFunctions"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await AssertFailsToStart(deploymentResult); + + Assert.Contains(TestSink.Writes, context => context.Message.Contains("Is Console redirection: True")); + } + + private async Task AssertFailsToStart(IISDeploymentResult deploymentResult) + { + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + } + + [ConditionalFact] + public async Task Gets500_30_ErrorPage() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.False(response.IsSuccessStatusCode); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Contains("500.30 - ANCM In-Process Start Failure", responseText); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..3bcc134cb26378f76684860d735c2127a3f1ee4a --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/StartupTests.cs @@ -0,0 +1,479 @@ +// 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.Net; +using System.Text.RegularExpressions; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Newtonsoft.Json; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class StartupTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public StartupTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + private readonly string _dotnetLocation = DotNetCommands.GetDotNetExecutable(RuntimeArchitecture.x64); + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task ExpandEnvironmentVariableInWebConfig() + { + // Point to dotnet installed in user profile. + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + deploymentParameters.EnvironmentVariables["DotnetPath"] = _dotnetLocation; + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", "%DotnetPath%")); + await StartAsync(deploymentParameters); + } + + [ConditionalTheory] + [InlineData("bogus", "", @"Executable was not found at '.*?\\bogus.exe")] + [InlineData("c:\\random files\\dotnet.exe", "something.dll", @"Could not find dotnet.exe at '.*?\\dotnet.exe'")] + [InlineData(".\\dotnet.exe", "something.dll", @"Could not find dotnet.exe at '.*?\\.\\dotnet.exe'")] + [InlineData("dotnet.exe", "", @"Application arguments are empty.")] + [InlineData("dotnet.zip", "", @"Process path 'dotnet.zip' doesn't have '.exe' extension.")] + public async Task InvalidProcessPath_ExpectServerError(string path, string arguments, string subError) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("arguments", arguments)); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, $@"Application '{Regex.Escape(deploymentResult.ContentRoot)}\\' wasn't able to start. {subError}"); + + Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync()); + } + + [ConditionalFact] + public async Task StartsWithDotnetLocationWithoutExe() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + + var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf(".")); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension)); + + await StartAsync(deploymentParameters); + } + + [ConditionalFact] + public async Task StartsWithDotnetLocationUppercase() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + + var dotnetLocationWithoutExtension = _dotnetLocation.Substring(0, _dotnetLocation.LastIndexOf(".")).ToUpperInvariant(); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", dotnetLocationWithoutExtension)); + + await StartAsync(deploymentParameters); + } + + [ConditionalTheory] + [InlineData("dotnet")] + [InlineData("dotnet.EXE")] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task StartsWithDotnetOnThePath(string path) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + + deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(_dotnetLocation); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("processPath", path)); + + var deploymentResult = await DeployAsync(deploymentParameters); + await deploymentResult.AssertStarts(); + + StopServer(); + // Verify that in this scenario where.exe was invoked only once by shim and request handler uses cached value + Assert.Equal(1, TestSink.Writes.Count(w => w.Message.Contains("Invoking where.exe to find dotnet.exe"))); + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22) + .WithAllApplicationTypes() + .WithAncmV2InProcess(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task HelloWorld(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + await StartAsync(deploymentParameters); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + public async Task StartsWithPortableAndBootstraperExe() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + // We need the right dotnet on the path in IIS + deploymentParameters.EnvironmentVariables["PATH"] = Path.GetDirectoryName(DotNetCommands.GetDotNetExecutable(deploymentParameters.RuntimeArchitecture)); + + // rest publisher as it doesn't support additional parameters + deploymentParameters.ApplicationPublisher = null; + // ReferenceTestTasks is workaround for https://github.com/dotnet/sdk/issues/2482 + deploymentParameters.AdditionalPublishParameters = "-p:RuntimeIdentifier=win7-x64 -p:UseAppHost=true -p:SelfContained=false -p:ReferenceTestTasks=false"; + var deploymentResult = await DeployAsync(deploymentParameters); + + Assert.True(File.Exists(Path.Combine(deploymentResult.ContentRoot, "InProcessWebSite.exe"))); + Assert.False(File.Exists(Path.Combine(deploymentResult.ContentRoot, "hostfxr.dll"))); + Assert.Contains("InProcessWebSite.exe", Helpers.ReadAllTextFromFile(Path.Combine(deploymentResult.ContentRoot, "web.config"), Logger)); + + await deploymentResult.AssertStarts(); + } + + [ConditionalFact] + public async Task DetectsOverriddenServer() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} OverriddenServer"); + + var deploymentResult = await DeployAsync(deploymentParameters); + var response = await deploymentResult.HttpClient.GetAsync("/"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"), + EventLogHelpers.InProcessThreadException(deploymentResult, ".*?Application is running inside IIS process but is not configured to use IIS server")); + } + + [ConditionalFact] + public async Task LogsStartupExceptionExitError() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} Throw"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"), + EventLogHelpers.InProcessThreadException(deploymentResult, ", exception code = '0xe0434352'")); + } + + [ConditionalFact] + public async Task LogsUnexpectedThreadExitError() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} EarlyReturn"); + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.InProcessFailedToStart(deploymentResult, "CLR worker thread exited prematurely"), + EventLogHelpers.InProcessThreadExit(deploymentResult, "12")); + } + + [ConditionalFact] + public async Task RemoveHostfxrFromApp_InProcessHostfxrInvalid() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.ApplicationType = ApplicationType.Standalone; + var deploymentResult = await DeployAsync(deploymentParameters); + + File.Copy( + Path.Combine(deploymentResult.ContentRoot, "aspnetcorev2_inprocess.dll"), + Path.Combine(deploymentResult.ContentRoot, "hostfxr.dll"), + true); + await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessHostfxrInvalid(deploymentResult), Logger); + } + + [ConditionalFact] + public async Task TargedDifferenceSharedFramework_FailedToFindNativeDependencies() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + var deploymentResult = await DeployAsync(deploymentParameters); + + Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult); + await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindNativeDependencies(deploymentResult), Logger); + } + + [ConditionalFact] + public async Task RemoveInProcessReference_FailedToFindRequestHandler() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.ApplicationType = ApplicationType.Standalone; + var deploymentResult = await DeployAsync(deploymentParameters); + + File.Delete(Path.Combine(deploymentResult.ContentRoot, "aspnetcorev2_inprocess.dll")); + + await AssertSiteFailsToStartWithInProcessStaticContent(deploymentResult); + + if (DeployerSelector.IsForwardsCompatibilityTest) + { + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindNativeDependencies(deploymentResult), Logger); + } + else + { + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessFailedToFindRequestHandler(deploymentResult), Logger); + } + } + + [ConditionalFact] + public async Task StartupTimeoutIsApplied() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} Hang"); + deploymentParameters.WebConfigActionList.Add( + WebConfigHelpers.AddOrModifyAspNetCoreSection("startupTimeLimit", "1")); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.InProcessFailedToStart(deploymentResult, "Managed server didn't initialize after 1000 ms.") + ); + } + + [ConditionalFact] + public async Task ShutdownTimeoutIsApplied() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} HangOnStop"); + deploymentParameters.WebConfigActionList.Add( + WebConfigHelpers.AddOrModifyAspNetCoreSection("shutdownTimeLimit", "1")); + + var deploymentResult = await DeployAsync(deploymentParameters); + + Assert.Equal("Hello World", await deploymentResult.HttpClient.GetStringAsync("/HelloWorld")); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.InProcessStarted(deploymentResult), + EventLogHelpers.InProcessFailedToStop(deploymentResult, "")); + } + + [ConditionalFact] + public async Task CheckInvalidHostingModelParameter() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + deploymentParameters.WebConfigActionList.Add(WebConfigHelpers.AddOrModifyAspNetCoreSection("hostingModel", "bogus")); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.ConfigurationLoadError(deploymentResult, "Unknown hosting model 'bogus'. Please specify either hostingModel=\"inprocess\" or hostingModel=\"outofprocess\" in the web.config file.") + ); + } + + private static Dictionary<string, (string, Action<XElement>)> InvalidConfigTransformations = InitInvalidConfigTransformations(); + public static IEnumerable<object[]> InvalidConfigTransformationsScenarios => InvalidConfigTransformations.ToTheoryData(); + + [ConditionalTheory] + [MemberData(nameof(InvalidConfigTransformationsScenarios))] + public async Task ReportsWebConfigAuthoringErrors(string scenario) + { + var (expectedError, action) = InvalidConfigTransformations[scenario]; + var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + iisDeploymentParameters.WebConfigActionList.Add((element, _) => action(element)); + var deploymentResult = await DeployAsync(iisDeploymentParameters); + var result = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.Equal(HttpStatusCode.InternalServerError, result.StatusCode); + + // Config load errors might not allow us to initialize log file + deploymentResult.AllowNoLogs(); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvents(deploymentResult, + EventLogHelpers.ConfigurationLoadError(deploymentResult, expectedError) + ); + } + + public static Dictionary<string, (string, Action<XElement>)> InitInvalidConfigTransformations() + { + var dictionary = new Dictionary<string, (string, Action<XElement>)>(); + dictionary.Add("Empty process path", + ( + "Attribute 'processPath' is required.", + element => element.Descendants("aspNetCore").Single().SetAttributeValue("processPath", "") + )); + dictionary.Add("Unknown hostingModel", + ( + "Unknown hosting model 'asdf'.", + element => element.Descendants("aspNetCore").Single().SetAttributeValue("hostingModel", "asdf") + )); + dictionary.Add("environmentVariables with add", + ( + "Unable to get required configuration section 'system.webServer/aspNetCore'. Possible reason is web.config authoring error.", + element => element.Descendants("aspNetCore").Single().GetOrAdd("environmentVariables").GetOrAdd("add") + )); + return dictionary; + } + + private static Dictionary<string, Func<IISDeploymentParameters, string>> PortableConfigTransformations = InitPortableWebConfigTransformations(); + public static IEnumerable<object[]> PortableConfigTransformationsScenarios => PortableConfigTransformations.ToTheoryData(); + + [ConditionalTheory] + [MemberData(nameof(PortableConfigTransformationsScenarios))] + public async Task StartsWithWebConfigVariationsPortable(string scenario) + { + var action = PortableConfigTransformations[scenario]; + var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + var expectedArguments = action(iisDeploymentParameters); + var result = await DeployAsync(iisDeploymentParameters); + Assert.Equal(expectedArguments, await result.HttpClient.GetStringAsync("/CommandLineArgs")); + } + + public static Dictionary<string, Func<IISDeploymentParameters, string>> InitPortableWebConfigTransformations() + { + var dictionary = new Dictionary<string, Func<IISDeploymentParameters, string>>(); + var pathWithSpace = "\u03c0 \u2260 3\u00b714"; + + dictionary.Add("App in bin subdirectory full path to dll using exec and quotes", + parameters => { + MoveApplication(parameters, "bin"); + parameters.TransformArguments((arguments, root) => "exec " + Path.Combine(root, "bin", arguments)); + return ""; + }); + + dictionary.Add("App in subdirectory with space", + parameters => { + MoveApplication(parameters, pathWithSpace); + parameters.TransformArguments((arguments, root) => Path.Combine(pathWithSpace, arguments)); + return ""; + }); + + dictionary.Add("App in subdirectory with space and full path to dll", + parameters => { + MoveApplication(parameters, pathWithSpace); + parameters.TransformArguments((arguments, root) => Path.Combine(root, pathWithSpace, arguments)); + return ""; + }); + + dictionary.Add("App in bin subdirectory with space full path to dll using exec and quotes", + parameters => { + MoveApplication(parameters, pathWithSpace); + parameters.TransformArguments((arguments, root) => "exec \"" + Path.Combine(root, pathWithSpace, arguments) + "\" extra arguments"); + return "extra|arguments"; + }); + + dictionary.Add("App in bin subdirectory and quoted argument", + parameters => { + MoveApplication(parameters, "bin"); + parameters.TransformArguments((arguments, root) => Path.Combine("bin", arguments) + " \"extra argument\""); + return "extra argument"; + }); + + dictionary.Add("App in bin subdirectory full path to dll", + parameters => { + MoveApplication(parameters, "bin"); + parameters.TransformArguments((arguments, root) => Path.Combine(root, "bin", arguments) + " extra arguments"); + return "extra|arguments"; + }); + return dictionary; + } + + + private static Dictionary<string, Func<IISDeploymentParameters, string>> StandaloneConfigTransformations = InitStandaloneConfigTransformations(); + public static IEnumerable<object[]> StandaloneConfigTransformationsScenarios => StandaloneConfigTransformations.ToTheoryData(); + + [ConditionalTheory] + [MemberData(nameof(StandaloneConfigTransformationsScenarios))] + public async Task StartsWithWebConfigVariationsStandalone(string scenario) + { + var action = StandaloneConfigTransformations[scenario]; + var iisDeploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + iisDeploymentParameters.ApplicationType = ApplicationType.Standalone; + var expectedArguments = action(iisDeploymentParameters); + var result = await DeployAsync(iisDeploymentParameters); + Assert.Equal(expectedArguments, await result.HttpClient.GetStringAsync("/CommandLineArgs")); + } + + public static Dictionary<string, Func<IISDeploymentParameters, string>> InitStandaloneConfigTransformations() + { + var dictionary = new Dictionary<string, Func<IISDeploymentParameters, string>>(); + var pathWithSpace = "\u03c0 \u2260 3\u00b714"; + + dictionary.Add("App in subdirectory", + parameters => { + MoveApplication(parameters, pathWithSpace); + parameters.TransformPath((path, root) => Path.Combine(pathWithSpace, path)); + parameters.TransformArguments((arguments, root) => "\"additional argument\""); + return "additional argument"; + }); + + dictionary.Add("App in bin subdirectory full path", + parameters => { + MoveApplication(parameters, pathWithSpace); + parameters.TransformPath((path, root) => Path.Combine(root, pathWithSpace, path)); + parameters.TransformArguments((arguments, root) => "additional arguments"); + return "additional|arguments"; + }); + + return dictionary; + } + + private static void MoveApplication( + IISDeploymentParameters parameters, + string subdirectory) + { + parameters.WebConfigActionList.Add((config, contentRoot) => + { + var source = new DirectoryInfo(contentRoot); + var subDirectoryPath = source.CreateSubdirectory(subdirectory); + + // Copy everything into a subfolder + Helpers.CopyFiles(source, subDirectoryPath, null); + // Cleanup files + foreach (var fileSystemInfo in source.GetFiles()) + { + fileSystemInfo.Delete(); + } + }); + } + + private async Task AssertSiteFailsToStartWithInProcessStaticContent(IISDeploymentResult deploymentResult) + { + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + Assert.Contains("HTTP Error 500.0 - ANCM In-Process Handler Load Failure", await response.Content.ReadAsStringAsync()); + StopServer(); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..03aa0e16e6b176f3b74ffaa4bd8fbf6ec4788763 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Inprocess/SynchronousReadAndWriteTests.cs @@ -0,0 +1,197 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class SynchronousReadAndWriteTests: FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public SynchronousReadAndWriteTests(IISTestSiteFixture fixture): base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ReadAndWriteSynchronously() + { + for (int i = 0; i < 100; i++) + { + var content = new StringContent(new string('a', 100000)); + var response = await _fixture.Client.PostAsync("ReadAndWriteSynchronously", content); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(expected: 110000, actual: responseText.Length); + } + } + + [ConditionalFact] + public async Task ReadAndWriteEcho() + { + var body = new string('a', 100000); + var content = new StringContent(body); + var response = await _fixture.Client.PostAsync("ReadAndWriteEcho", content); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(body, responseText); + } + + [ConditionalFact] + public async Task ReadAndWriteCopyToAsync() + { + var body = new string('a', 100000); + var content = new StringContent(body); + var response = await _fixture.Client.PostAsync("ReadAndWriteCopyToAsync", content); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(body, responseText); + } + + [ConditionalFact] + public async Task ReadAndWriteEchoTwice() + { + var requestBody = new string('a', 10000); + var content = new StringContent(requestBody); + var response = await _fixture.Client.PostAsync("ReadAndWriteEchoTwice", content); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(requestBody.Length * 2, responseText.Length); + } + + [ConditionalFact] + public async Task ReadSetHeaderWrite() + { + var body = "Body text"; + var content = new StringContent(body); + var response = await _fixture.Client.PostAsync("SetHeaderFromBody", content); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(body, response.Headers.GetValues("BodyAsString").Single()); + Assert.Equal(body, responseText); + } + + [ConditionalFact] + public async Task ReadAndWriteSlowConnection() + { + using (var connection = _fixture.CreateTestConnection()) + { + var testString = "hello world"; + var request = $"POST /ReadAndWriteSlowConnection HTTP/1.0\r\n" + + $"Content-Length: {testString.Length}\r\n" + + "Host: " + "localhost\r\n" + + "\r\n" + testString; + + foreach (var c in request) + { + await connection.Send(c.ToString()); + await Task.Delay(10); + } + + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + await connection.ReceiveHeaders(); + + for (int i = 0; i < 100; i++) + { + foreach (var c in testString) + { + await connection.Receive(c.ToString()); + } + await Task.Delay(10); + } + await connection.WaitForConnectionClose(); + } + } + + [ConditionalFact] + public async Task ReadAndWriteInterleaved() + { + using (var connection = _fixture.CreateTestConnection()) + { + var requestLength = 0; + var messages = new List<string>(); + for (var i = 1; i < 100; i++) + { + var message = i + Environment.NewLine; + requestLength += message.Length; + messages.Add(message); + } + + await connection.Send( + "POST /ReadAndWriteEchoLines HTTP/1.0", + $"Content-Length: {requestLength}", + "Host: localhost", + "", + ""); + + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + await connection.ReceiveHeaders(); + + foreach (var message in messages) + { + await connection.Send(message); + await connection.Receive(message); + } + + await connection.Send("\r\n"); + await connection.WaitForConnectionClose(); + } + } + + [ConditionalFact] + public async Task ConsumePartialBody() + { + using (var connection = _fixture.CreateTestConnection()) + { + var message = "Hello"; + await connection.Send( + "POST /ReadPartialBody HTTP/1.1", + $"Content-Length: {100}", + "Host: localhost", + "Connection: close", + "", + ""); + + await connection.Send(message); + + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + + // This test can return both content length or chunked response + // depending on if appfunc managed to complete before write was + // issued + var headers = await connection.ReceiveHeaders(); + if (headers.Contains("Content-Length: 5")) + { + await connection.Receive("Hello"); + } + else + { + await connection.Receive( + "5", + message, + ""); + await connection.Receive( + "0", + "", + ""); + } + + await connection.WaitForConnectionClose(); + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs b/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..1e15cde5c297387e326f09f241dc7f2898fef389 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/LogFileTests.cs @@ -0,0 +1,242 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class LoggingTests : LogFileTestBase + { + private readonly PublishedSitesFixture _fixture; + + public LoggingTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22) + .WithAllApplicationTypes() + .WithAncmVersions(AncmVersion.AspNetCoreModuleV2) + .WithAllHostingModels(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task CheckStdoutLoggingToFile(TestVariant variant) + { + await CheckStdoutToFile(variant, "ConsoleWrite"); + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task CheckStdoutErrLoggingToFile(TestVariant variant) + { + await CheckStdoutToFile(variant, "ConsoleErrorWrite"); + } + + private async Task CheckStdoutToFile(TestVariant variant, string path) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await Helpers.AssertStarts(deploymentResult, path); + + StopServer(); + + var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger); + + Assert.Contains("TEST MESSAGE", contents); + } + + // Move to separate file + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task InvalidFilePathForLogs_ServerStillRuns(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + + deploymentParameters.WebConfigActionList.Add( + WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogEnabled", "true")); + deploymentParameters.WebConfigActionList.Add( + WebConfigHelpers.AddOrModifyAspNetCoreSection("stdoutLogFile", Path.Combine("Q:", "std"))); + + var deploymentResult = await DeployAsync(deploymentParameters); + + await Helpers.AssertStarts(deploymentResult, "HelloWorld"); + + StopServer(); + if (variant.HostingModel == HostingModel.InProcess) + { + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not start stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070003"); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Could not stop stdout redirection in (.*)aspnetcorev2.dll. Exception message: HRESULT 0x80070002"); + } + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task StartupMessagesAreLoggedIntoDebugLogFile(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.HandlerSettings["debugLevel"] = "file"; + deploymentParameters.HandlerSettings["debugFile"] = "debug.txt"; + + var deploymentResult = await DeployAsync(deploymentParameters); + + await deploymentResult.HttpClient.GetAsync("/"); + + AssertLogs(Path.Combine(deploymentResult.ContentRoot, "debug.txt")); + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task StartupMessagesAreLoggedIntoDefaultDebugLogFile(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.HandlerSettings["debugLevel"] = "file"; + + var deploymentResult = await DeployAsync(deploymentParameters); + + await deploymentResult.HttpClient.GetAsync("/"); + + AssertLogs(Path.Combine(deploymentResult.ContentRoot, "aspnetcore-debug.log")); + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [MemberData(nameof(TestVariants))] + public async Task StartupMessagesAreLoggedIntoDefaultDebugLogFileWhenEnabledWithEnvVar(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG"] = "file"; + // Add empty debugFile handler setting to prevent IIS deployer from overriding debug settings + deploymentParameters.HandlerSettings["debugFile"] = ""; + var deploymentResult = await DeployAsync(deploymentParameters); + + await deploymentResult.HttpClient.GetAsync("/"); + + AssertLogs(Path.Combine(deploymentResult.ContentRoot, "aspnetcore-debug.log")); + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [MemberData(nameof(TestVariants))] + public async Task StartupMessagesLogFileSwitchedWhenLogFilePresentInWebConfig(TestVariant variant) + { + var firstTempFile = Path.GetTempFileName(); + var secondTempFile = Path.GetTempFileName(); + + try + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_DEBUG_FILE"] = firstTempFile; + deploymentParameters.AddDebugLogToWebConfig(secondTempFile); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/"); + + StopServer(); + var logContents = Helpers.ReadAllTextFromFile(firstTempFile, Logger); + + Assert.Contains("Switching debug log files to", logContents); + + AssertLogs(secondTempFile); + } + finally + { + File.Delete(firstTempFile); + File.Delete(secondTempFile); + } + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + + public async Task DebugLogsAreWrittenToEventLog(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.HandlerSettings["debugLevel"] = "file,eventlog"; + var deploymentResult = await StartAsync(deploymentParameters); + StopServer(); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, @"\[aspnetcorev2.dll\] Initializing logs for .*?Description: IIS ASP.NET Core Module V2"); + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task CheckUTF8File(TestVariant variant) + { + var path = "CheckConsoleFunctions"; + + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, variant.HostingModel, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); // For standalone this will need to remove space + + var logFolderPath = _logFolderPath + "\\彡⾔"; + deploymentParameters.EnableLogging(logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync(path); + + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, logFolderPath), Logger); + Assert.Contains("彡⾔", contents); + + if (variant.HostingModel == HostingModel.InProcess) + { + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.InProcessThreadExitStdOut(deploymentResult, "12", "(.*)彡⾔(.*)")); + } + else + { + EventLogHelpers.VerifyEventLogEvent(deploymentResult, EventLogHelpers.OutOfProcessFailedToStart(deploymentResult)); + } + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task OnlyOneFileCreatedWithProcessStartTime(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + await Helpers.AssertStarts(deploymentResult, "ConsoleWrite"); + + StopServer(); + + Assert.Single(Directory.GetFiles(_logFolderPath), Helpers.GetExpectedLogName(deploymentResult, _logFolderPath)); + } + + private static string ReadLogs(string logPath) + { + using (var stream = File.Open(logPath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite)) + using (var streamReader = new StreamReader(stream)) + { + return streamReader.ReadToEnd(); + } + } + + private static void AssertLogs(string logPath) + { + var logContents = ReadLogs(logPath); + Assert.Contains("[aspnetcorev2.dll]", logContents); + Assert.True(logContents.Contains("[aspnetcorev2_inprocess.dll]") || logContents.Contains("[aspnetcorev2_outofprocess.dll]")); + Assert.Contains("Description: IIS ASP.NET Core Module V2. Commit:", logContents); + Assert.Contains("Description: IIS ASP.NET Core Module V2 Request Handler. Commit:", logContents); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs b/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..3723369c89ed96c6be6efdb027a171c9803e7a8c --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/MultiApplicationTests.cs @@ -0,0 +1,144 @@ +// 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.Xml.Linq; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class MultiApplicationTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + private PublishedApplication _publishedApplication; + private PublishedApplication _rootApplication; + + public MultiApplicationTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task RunsTwoOutOfProcessApps() + { + var parameters = _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + parameters.ServerConfigActionList.Add(DuplicateApplication); + var result = await DeployAsync(parameters); + var id1 = await result.HttpClient.GetStringAsync("/app1/ProcessId"); + var id2 = await result.HttpClient.GetStringAsync("/app2/ProcessId"); + Assert.NotEqual(id2, id1); + } + + [ConditionalFact] + public async Task FailsAndLogsWhenRunningTwoInProcessApps() + { + var parameters = _fixture.GetBaseDeploymentParameters(HostingModel.InProcess, publish: true); + parameters.ServerConfigActionList.Add(DuplicateApplication); + + var result = await DeployAsync(parameters); + var result1 = await result.HttpClient.GetAsync("/app1/HelloWorld"); + var result2 = await result.HttpClient.GetAsync("/app2/HelloWorld"); + Assert.Equal(200, (int)result1.StatusCode); + Assert.Equal(500, (int)result2.StatusCode); + StopServer(); + EventLogHelpers.VerifyEventLogEvent(result, "Only one inprocess application is allowed per IIS application pool"); + } + + [ConditionalTheory] + [InlineData(HostingModel.OutOfProcess)] + [InlineData(HostingModel.InProcess)] + public async Task FailsAndLogsEventLogForMixedHostingModel(HostingModel firstApp) + { + var parameters = _fixture.GetBaseDeploymentParameters(firstApp, publish: true); + parameters.ServerConfigActionList.Add(DuplicateApplication); + var result = await DeployAsync(parameters); + + // Modify hosting model of other app to be the opposite + var otherApp = firstApp == HostingModel.InProcess ? HostingModel.OutOfProcess : HostingModel.InProcess; + SetHostingModel(_publishedApplication.Path, otherApp); + + var result1 = await result.HttpClient.GetAsync("/app1/HelloWorld"); + var result2 = await result.HttpClient.GetAsync("/app2/HelloWorld"); + Assert.Equal(200, (int)result1.StatusCode); + Assert.Equal(500, (int)result2.StatusCode); + StopServer(); + EventLogHelpers.VerifyEventLogEvent(result, "Mixed hosting model is not supported."); + } + + private void SetHostingModel(string directory, HostingModel model) + { + var webConfigLocation = GetWebConfigLocation(directory); + XDocument webConfig = XDocument.Load(webConfigLocation); + webConfig.Root + .Descendants("system.webServer") + .Single() + .GetOrAdd("aspNetCore") + .SetAttributeValue("hostingModel", model.ToString()); + webConfig.Save(webConfigLocation); + } + + private void DuplicateApplication(XElement config, string contentRoot) + { + var siteElement = config + .RequiredElement("system.applicationHost") + .RequiredElement("sites") + .RequiredElement("site"); + + var application = siteElement + .RequiredElement("application"); + + application.SetAttributeValue("path", "/app1"); + + var source = new DirectoryInfo(contentRoot); + + var destination = new DirectoryInfo(contentRoot + "anotherApp"); + destination.Create(); + Helpers.CopyFiles(source, destination, Logger); + + _publishedApplication = new PublishedApplication(destination.FullName, Logger); + + var newApplication = new XElement(application); + newApplication.SetAttributeValue("path", "/app2"); + newApplication.RequiredElement("virtualDirectory") + .SetAttributeValue("physicalPath", destination.FullName); + + siteElement.Add(newApplication); + + // IIS Express requires root application to exist + var rootApplicationDirectory = new DirectoryInfo(contentRoot + "rootApp"); + rootApplicationDirectory.Create(); + + _rootApplication = new PublishedApplication(rootApplicationDirectory.FullName, Logger); + File.WriteAllText(GetWebConfigLocation(rootApplicationDirectory.FullName), "<configuration></configuration>"); + + var rootApplication = new XElement(application); + rootApplication.SetAttributeValue("path", "/"); + rootApplication.RequiredElement("virtualDirectory") + .SetAttributeValue("physicalPath", rootApplicationDirectory.FullName); + + siteElement.Add(rootApplication); + } + + private static string GetWebConfigLocation(string siteRoot) + { + return Path.Combine(siteRoot, "web.config"); + } + + public override void Dispose() + { + base.Dispose(); + _rootApplication.Dispose(); + _publishedApplication.Dispose(); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..3b866627172ff0819315fd20843fcd02b6fa5e59 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/AspNetCorePortTests.cs @@ -0,0 +1,125 @@ +// 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.Net; +using System.Net.Sockets; +using System.Threading.Tasks; +using Xunit; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class AspNetCorePortTests : IISFunctionalTestBase + { + // Port range allowed by ANCM config + private const int _minPort = 1025; + private const int _maxPort = 48000; + + private static readonly Random _random = new Random(); + + private readonly PublishedSitesFixture _fixture; + + public AspNetCorePortTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22) + .WithApplicationTypes(ApplicationType.Portable) + .WithAllAncmVersions(); + + public static IEnumerable<object[]> InvalidTestVariants + => from v in TestVariants.Select(v => v.Single()) + from s in new string[] { (_minPort - 1).ToString(), (_maxPort + 1).ToString(), "noninteger" } + select new object[] { v, s }; + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task EnvVarInWebConfig_Valid(TestVariant variant) + { + // Must publish to set env vars in web.config + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + var port = GetUnusedRandomPort(); + deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = port.ToString(); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var responseText = await deploymentResult.HttpClient.GetStringAsync("/ServerAddresses"); + + Assert.Equal(port, new Uri(responseText).Port); + } + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task EnvVarInWebConfig_Empty(TestVariant variant) + { + // Must publish to set env vars in web.config + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = string.Empty; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var responseText = await deploymentResult.HttpClient.GetStringAsync("/ServerAddresses"); + + // If env var is empty, ANCM should assign a random port (same as no env var) + Assert.InRange(new Uri(responseText).Port, _minPort, _maxPort); + } + + [ConditionalTheory] + [MemberData(nameof(InvalidTestVariants))] + public async Task EnvVarInWebConfig_Invalid(TestVariant variant, string port) + { + // Must publish to set env vars in web.config + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant, publish: true); + deploymentParameters.WebConfigBasedEnvironmentVariables["ASPNETCORE_PORT"] = port; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/ServerAddresses"); + + Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode); + } + + private static int GetUnusedRandomPort() + { + // Large number of retries to prevent test failures due to port collisions, but not infinite + // to prevent infinite loop in case Bind() fails repeatedly for some other reason. + const int retries = 100; + + List<Exception> exceptions = null; + + for (var i = 0; i < retries; i++) + { + var port = _random.Next(_minPort, _maxPort); + + using (var socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp)) + { + try + { + socket.Bind(new IPEndPoint(IPAddress.Loopback, port)); + return port; + } + catch (Exception e) + { + // Bind failed, most likely because port is in use. Save exception and retry. + if (exceptions == null) + { + exceptions = new List<Exception>(retries); + } + exceptions.Add(e); + } + } + } + + throw new AggregateException($"Unable to find unused random port after {retries} retries.", exceptions); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..f9e6836b6fcc9dafb1b4e643c1802bd384da102e --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/GlobalVersionTests.cs @@ -0,0 +1,252 @@ +// 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.Net; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class GlobalVersionTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public GlobalVersionTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + private const string _handlerVersion20 = "2.0.0"; + private const string _helloWorldRequest = "HelloWorld"; + private const string _helloWorldResponse = "Hello World"; + + [ConditionalFact] + public async Task GlobalVersion_DefaultWorks() + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + + deploymentParameters.HandlerSettings["handlerVersion"] = _handlerVersion20; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(_helloWorldResponse, responseText); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [RequiresNewShim] + public async Task GlobalVersion_EnvironmentVariableWorks() + { + var temporaryFile = Path.GetTempFileName(); + try + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + CopyShimToOutput(deploymentParameters); + deploymentParameters.PublishApplicationBeforeDeployment = true; + deploymentParameters.EnvironmentVariables["ASPNETCORE_MODULE_OUTOFPROCESS_HANDLER"] = temporaryFile; + + var deploymentResult = await DeployAsync(deploymentParameters); + var requestHandlerPath = Path.Combine(GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20), "aspnetcorev2_outofprocess.dll"); + + File.Delete(temporaryFile); + File.Move(requestHandlerPath, temporaryFile); + + var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(_helloWorldResponse, responseText); + StopServer(); + } + finally + { + File.Delete(temporaryFile); + } + } + + [ConditionalTheory] + [InlineData("2.1.0")] + [InlineData("2.1.0-preview")] + public async Task GlobalVersion_NewVersionNumber_Fails(string version) + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + deploymentParameters.HandlerSettings["handlerVersion"] = version; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest); + Assert.False(response.IsSuccessStatusCode); + var responseString = await response.Content.ReadAsStringAsync(); + Assert.Contains("HTTP Error 500.0 - ANCM Out-Of-Process Handler Load Failure", responseString); + } + + [ConditionalTheory] + [InlineData("2.1.0")] + [InlineData("2.1.0-preview")] + public async Task GlobalVersion_NewVersionNumber(string version) + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + CopyShimToOutput(deploymentParameters); + deploymentParameters.HandlerSettings["handlerVersion"] = version; + + var deploymentResult = await DeployAsync(deploymentParameters); + + var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20); + var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version); + Directory.Move(originalANCMPath, newANCMPath); + + var response = await deploymentResult.HttpClient.GetAsync(_helloWorldRequest); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(_helloWorldResponse, responseText); + AssertLoadedVersion(version); + } + + [ConditionalTheory] + [InlineData("2.1.0")] + [InlineData("2.1.0-preview")] + public async Task GlobalVersion_MultipleRequestHandlers_PicksHighestOne(string version) + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + CopyShimToOutput(deploymentParameters); + var deploymentResult = await DeployAsync(deploymentParameters); + + var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20); + + var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version); + + CopyDirectory(originalANCMPath, newANCMPath); + + deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath); + var response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion"); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(_helloWorldResponse, responseText); + AssertLoadedVersion(version); + } + + [ConditionalTheory] + [InlineData("2.1.0")] + [InlineData("2.1.0-preview")] + public async Task GlobalVersion_MultipleRequestHandlers_UpgradeWorks(string version) + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + CopyShimToOutput(deploymentParameters); + var deploymentResult = await DeployAsync(deploymentParameters); + + var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20); + + deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", originalANCMPath); + var response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion"); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(_helloWorldResponse, responseText); + + StopServer(); + + deploymentResult = await DeployAsync(deploymentParameters); + + originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20); + + var newANCMPath = GetANCMRequestHandlerPath(deploymentResult, version); + + CopyDirectory(originalANCMPath, newANCMPath); + + deploymentResult.HttpClient.DefaultRequestHeaders.Add("ANCMRHPath", newANCMPath); + response = await deploymentResult.HttpClient.GetAsync("CheckRequestHandlerVersion"); + responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal(_helloWorldResponse, responseText); + AssertLoadedVersion(version); + } + + [ConditionalFact] + public async Task DoesNotCrashWhenNoVersionsAvailable() + { + var deploymentParameters = GetGlobalVersionBaseDeploymentParameters(); + CopyShimToOutput(deploymentParameters); + var deploymentResult = await DeployAsync(deploymentParameters); + + var originalANCMPath = GetANCMRequestHandlerPath(deploymentResult, _handlerVersion20); + Directory.Delete(originalANCMPath, true); + var response = await deploymentResult.HttpClient.GetAsync("HelloWorld"); + + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); + } + + private IISDeploymentParameters GetGlobalVersionBaseDeploymentParameters() + { + return _fixture.GetBaseDeploymentParameters(HostingModel.OutOfProcess, publish: true); + } + + private void CopyDirectory(string from, string to) + { + var toInfo = new DirectoryInfo(to); + toInfo.Create(); + + foreach (var file in new DirectoryInfo(from).GetFiles()) + { + file.CopyTo(Path.Combine(toInfo.FullName, file.Name)); + } + } + + private string GetANCMRequestHandlerPath(IISDeploymentResult deploymentResult, string version) + { + return Path.Combine(deploymentResult.ContentRoot, + deploymentResult.DeploymentParameters.RuntimeArchitecture.ToString(), + version); + } + + private void AssertLoadedVersion(string version) + { + StopServer(); + Assert.Contains(TestSink.Writes, context => context.Message.Contains(version + @"\aspnetcorev2_outofprocess.dll")); + } + + private static void CopyShimToOutput(IISDeploymentParameters parameters) + { + parameters.AddServerConfigAction( + (config, contentRoot) => { + var moduleNodes = config.DescendantNodesAndSelf() + .OfType<XElement>() + .Where(element => + element.Name == "add" && + element.Attribute("name")?.Value.StartsWith("AspNetCoreModule") == true && + element.Attribute("image") != null); + + var sourceDirectory = new DirectoryInfo(Path.GetDirectoryName(moduleNodes.First().Attribute("image").Value)); + var destinationDirectory = new DirectoryInfo(Path.Combine(contentRoot, sourceDirectory.Name)); + destinationDirectory.Create(); + foreach (var element in moduleNodes) + { + var imageAttribute = element.Attribute("image"); + imageAttribute.Value = imageAttribute.Value.Replace(sourceDirectory.FullName, destinationDirectory.FullName); + } + CopyFiles(sourceDirectory, destinationDirectory); + }); + } + + private static void CopyFiles(DirectoryInfo source, DirectoryInfo target) + { + foreach (DirectoryInfo directoryInfo in source.GetDirectories()) + { + CopyFiles(directoryInfo, target.CreateSubdirectory(directoryInfo.Name)); + } + + foreach (FileInfo fileInfo in source.GetFiles()) + { + var destFileName = Path.Combine(target.FullName, fileInfo.Name); + fileInfo.CopyTo(destFileName); + } + } + + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..f6e36613d78684f9328c82e7d2b37342d7c762d9 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/OutOfProcess/HelloWorldTest.cs @@ -0,0 +1,81 @@ +// 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.Linq; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class HelloWorldTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public HelloWorldTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22, Tfm.Net461) + .WithAllApplicationTypes() + .WithAllAncmVersions(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task HelloWorld(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant); + deploymentParameters.ServerConfigActionList.Add( + (element, _) => { + element + .RequiredElement("system.webServer") + .RequiredElement("security") + .RequiredElement("authentication") + .Element("windowsAuthentication") + ?.SetAttributeValue("enabled", "false"); + }); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal("Hello World", responseText); + + response = await deploymentResult.HttpClient.GetAsync("/Path/%3F%3F?query"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("/??", responseText); + + response = await deploymentResult.HttpClient.GetAsync("/Query/%3FPath?query?"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("?query?", responseText); + + response = await deploymentResult.HttpClient.GetAsync("/BodyLimit"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("null", responseText); + + response = await deploymentResult.HttpClient.GetAsync("/Auth"); + responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal("null", responseText); + + Assert.Equal( + $"ContentRootPath {deploymentResult.ContentRoot}" + Environment.NewLine + + $"WebRootPath {deploymentResult.ContentRoot}\\wwwroot" + Environment.NewLine + + $"CurrentDirectory {deploymentResult.ContentRoot}", + await deploymentResult.HttpClient.GetStringAsync("/HostingEnvironment")); + + var expectedDll = variant.AncmVersion == AncmVersion.AspNetCoreModule ? "aspnetcore.dll" : "aspnetcorev2.dll"; + Assert.Contains(deploymentResult.HostProcess.Modules.OfType<ProcessModule>(), m=> m.FileName.Contains(expectedDll)); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs new file mode 100644 index 0000000000000000000000000000000000000000..282ee261098321396498e9c79ae489bd541f90fc --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/PublishedSitesFixture.cs @@ -0,0 +1,65 @@ +// 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 Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + /// <summary> + /// This type just maps collection names to available fixtures + /// </summary> + [CollectionDefinition(Name)] + public class PublishedSitesCollection : ICollectionFixture<PublishedSitesFixture>, ICollectionFixture<ClientCertificateFixture> + { + public const string Name = nameof(PublishedSitesCollection); + } + + public class PublishedSitesFixture : IDisposable + { + public CachingApplicationPublisher InProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetInProcessTestSitesPath()); + public CachingApplicationPublisher OutOfProcessTestSite { get; } = new CachingApplicationPublisher(Helpers.GetOutOfProcessTestSitesPath()); + + public void Dispose() + { + InProcessTestSite.Dispose(); + OutOfProcessTestSite.Dispose(); + } + + public IISDeploymentParameters GetBaseDeploymentParameters(HostingModel hostingModel = HostingModel.InProcess, bool publish = false) + { + var publisher = hostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite; + return GetBaseDeploymentParameters(publisher, hostingModel, publish); + } + public IISDeploymentParameters GetBaseDeploymentParameters(TestVariant variant, bool publish = false) + { + var publisher = variant.HostingModel == HostingModel.InProcess ? InProcessTestSite : OutOfProcessTestSite; + return GetBaseDeploymentParameters(publisher, new DeploymentParameters(variant), publish); + } + + public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, HostingModel hostingModel = HostingModel.InProcess, bool publish = false) + { + return GetBaseDeploymentParameters( + publisher, + new DeploymentParameters(publisher.ApplicationPath, DeployerSelector.ServerType, RuntimeFlavor.CoreClr, RuntimeArchitecture.x64) + { + HostingModel = hostingModel, + TargetFramework = "netcoreapp2.2", + AncmVersion = AncmVersion.AspNetCoreModuleV2 + }, + publish); + } + + public IISDeploymentParameters GetBaseDeploymentParameters(ApplicationPublisher publisher, DeploymentParameters baseParameters, bool publish = false) + { + return new IISDeploymentParameters(baseParameters) + { + ApplicationPublisher = publisher, + ApplicationPath = publisher.ApplicationPath, + PublishApplicationBeforeDeployment = publish + }; + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs new file mode 100644 index 0000000000000000000000000000000000000000..cbe43ec0c72297fb2dfc196a050d95c230f4354d --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewHandler.cs @@ -0,0 +1,16 @@ +// 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 Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class RequiresNewHandlerAttribute : Attribute, ITestCondition + { + public bool IsMet => !DeployerSelector.IsForwardsCompatibilityTest; + + public string SkipReason => "Test verifies new behavior in the aspnetcorev2_inprocess.dll that isn't supported in earlier versions."; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs new file mode 100644 index 0000000000000000000000000000000000000000..b0bc50a83b7869a80f17231a1518d8a8e98b66d0 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/RequiresNewShim.cs @@ -0,0 +1,16 @@ +// 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 Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class RequiresNewShimAttribute : Attribute, ITestCondition + { + public bool IsMet => !DeployerSelector.IsBackwardsCompatiblityTest; + + public string SkipReason => "Test verifies new behavior in the aspnetcorev2.dll that isn't supported in earlier versions."; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs b/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..8ebd70db12ef5186bb87d9bb4f17b3ead3632ff3 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/ServerAbortTests.cs @@ -0,0 +1,65 @@ +// 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.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public abstract class ServerAbortTests: FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + [Collection(IISTestSiteCollection.Name)] + public class InProc: ServerAbortTests + { + public InProc(IISTestSiteFixture fixture) : base(fixture) { } + } + + [Collection(OutOfProcessTestSiteCollection.Name)] + public class OutOfProcess: ServerAbortTests + { + public OutOfProcess(OutOfProcessTestSiteFixture fixture) : base(fixture) { } + } + + [Collection(OutOfProcessV1TestSiteCollection.Name)] + public class OutOfProcessV1: ServerAbortTests + { + public OutOfProcessV1(OutOfProcessV1TestSiteFixture fixture) : base(fixture) { } + } + + protected ServerAbortTests(IISTestSiteFixture fixture) : base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ClosesConnectionOnServerAbort() + { + try + { + var response = await _fixture.Client.GetAsync("/Abort").DefaultTimeout(); + + // 502 is expected for outofproc but not for inproc + if (_fixture.DeploymentResult.DeploymentParameters.HostingModel == HostingModel.OutOfProcess) + { + Assert.Equal(HttpStatusCode.BadGateway, response.StatusCode); + // 0x80072f78 ERROR_HTTP_INVALID_SERVER_RESPONSE The server returned an invalid or unrecognized response + Assert.Contains("0x80072f78", await response.Content.ReadAsStringAsync()); + } + else + { + Assert.True(false, "Should not reach here"); + } + } + catch (HttpRequestException) + { + // Connection reset is expected both for outofproc and inproc + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..d2acb704158f339901d69a81ee6eebfbd50d7503 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/SkipIfNotAdminAttribute.cs @@ -0,0 +1,25 @@ +// 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.Security.Principal; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class SkipIfNotAdminAttribute : Attribute, ITestCondition + { + public bool IsMet + { + get + { + var identity = WindowsIdentity.GetCurrent(); + var principal = new WindowsPrincipal(identity); + return principal.IsInRole(WindowsBuiltInRole.Administrator); + } + } + + public string SkipReason => "The current process is not running as admin."; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..8e88fc8c26ea6fec910da3c537448ad60b4737d4 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/SkipVSTSAttribute.cs @@ -0,0 +1,17 @@ +// 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 Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class SkipInVSTSAttribute : Attribute, ITestCondition + { + public bool IsMet => string.IsNullOrEmpty(Environment.GetEnvironmentVariable("SYSTEM_TASKDEFINITIONSURI")); + + public string SkipReason => "Running in VSTS"; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs new file mode 100644 index 0000000000000000000000000000000000000000..7984193e295ed493eb0f7c955a9c61be9aa451d3 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/AppVerifier.cs @@ -0,0 +1,83 @@ +// 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.Linq; + +namespace Microsoft.AspNetCore.Server.IntegrationTesting +{ + public class AppVerifier + { + private static readonly TimeSpan AppVerifierCommandTimeout = TimeSpan.FromSeconds(5); + + public static IDisposable Disable(ServerType serverType, int code) + { + // Set in SetupTestEnvironment.ps1 + var enabledCodes = (Environment.GetEnvironmentVariable("APPVERIFIER_ENABLED_CODES") ?? "").Split(' '); + string processName; + switch (serverType) + { + case ServerType.IISExpress: + processName = "iisexpress.exe"; + break; + case ServerType.IIS: + processName = "w3wp.exe"; + break; + default: + throw new ArgumentOutOfRangeException(nameof(serverType), serverType, null); + } + + if (!enabledCodes.Contains(code.ToString())) + { + return null; + } + + RunProcessAndWaitForExit("appverif.exe", $"-configure {code} -for {processName} -with ErrorReport=0", AppVerifierCommandTimeout); + return new AppVerifierToken(processName, code.ToString()); + } + + private static void RunProcessAndWaitForExit(string fileName, string arguments, TimeSpan timeout) + { + var startInfo = new ProcessStartInfo + { + FileName = fileName, + Arguments = arguments, + RedirectStandardOutput = true, + RedirectStandardError = true, + UseShellExecute = false, + }; + + var process = Process.Start(startInfo); + + if (!process.WaitForExit((int)timeout.TotalMilliseconds)) + { + process.Kill(); + } + + if (process.ExitCode != 0) + { + throw new InvalidOperationException($"Exit code {process.ExitCode} when running {fileName} {arguments}. Stdout: {process.StandardOutput.ReadToEnd()} Stderr: {process.StandardError.ReadToEnd()}"); + } + } + + public class AppVerifierToken : IDisposable + { + private readonly string _processName; + + private readonly string _codes; + + public AppVerifierToken(string processName, string codes) + { + _processName = processName; + _codes = codes; + } + + public void Dispose() + { + // + RunProcessAndWaitForExit("appverif.exe", $"-configure {_codes} -for {_processName} -with ErrorReport={Environment.GetEnvironmentVariable("APPVERIFIER_LEVEL")}", AppVerifierCommandTimeout); + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs new file mode 100644 index 0000000000000000000000000000000000000000..78c77fd2ca4f59500d052b16fdde32a6ca8eca12 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/EventLogHelpers.cs @@ -0,0 +1,210 @@ +// 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.Linq; +using System.Text.RegularExpressions; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.Extensions.Logging; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class EventLogHelpers + { + public static void VerifyEventLogEvent(IISDeploymentResult deploymentResult, string expectedRegexMatchString) + { + Assert.True(deploymentResult.HostProcess.HasExited); + + var entries = GetEntries(deploymentResult); + AssertSingleEntry(expectedRegexMatchString, entries); + } + + public static void VerifyEventLogEvent(IISDeploymentResult deploymentResult, string expectedRegexMatchString, ILogger logger) + { + Assert.True(deploymentResult.HostProcess.HasExited); + + var entries = GetEntries(deploymentResult); + try + { + AssertSingleEntry(expectedRegexMatchString, entries); + } + catch (Exception ex) + { + foreach (var entry in entries) + { + logger.LogInformation(entry.Message); + } + throw ex; + } + } + + public static void VerifyEventLogEvents(IISDeploymentResult deploymentResult, params string[] expectedRegexMatchString) + { + Assert.True(deploymentResult.HostProcess.HasExited); + + var entries = GetEntries(deploymentResult).ToList(); + foreach (var regexString in expectedRegexMatchString) + { + var matchedEntries = AssertSingleEntry(regexString, entries); + + foreach (var matchedEntry in matchedEntries) + { + entries.Remove(matchedEntry); + } + } + + Assert.True(0 == entries.Count, $"Some entries were not matched by any regex {FormatEntries(entries)}"); + } + + private static EventLogEntry[] AssertSingleEntry(string regexString, IEnumerable<EventLogEntry> entries) + { + var expectedRegex = new Regex(regexString, RegexOptions.Singleline); + var matchedEntries = entries.Where(entry => expectedRegex.IsMatch(entry.Message)).ToArray(); + Assert.True(matchedEntries.Length > 0, $"No entries matched by '{regexString}'"); + Assert.True(matchedEntries.Length < 2, $"Multiple entries matched by '{regexString}': {FormatEntries(matchedEntries)}"); + return matchedEntries; + } + + private static string FormatEntries(IEnumerable<EventLogEntry> entries) + { + return string.Join(",", entries.Select(e => e.Message)); + } + + private static IEnumerable<EventLogEntry> GetEntries(IISDeploymentResult deploymentResult) + { + var eventLog = new EventLog("Application"); + + // Eventlog is already sorted based on time of event in ascending time. + // Check results in reverse order. + var processIdString = $"Process Id: {deploymentResult.HostProcess.Id}."; + + // Event log messages round down to the nearest second, so subtract a second + var processStartTime = deploymentResult.HostProcess.StartTime.AddSeconds(-1); + for (var i = eventLog.Entries.Count - 1; i >= 0; i--) + { + var eventLogEntry = eventLog.Entries[i]; + if (eventLogEntry.TimeGenerated < processStartTime) + { + // If event logs is older than the process start time, we didn't find a match. + break; + } + + if (eventLogEntry.ReplacementStrings == null || + eventLogEntry.ReplacementStrings.Length < 3) + { + continue; + } + + // ReplacementStings == EventData collection in EventLog + // This is unaffected if event providers are not registered correctly + if (eventLogEntry.Source == AncmVersionToMatch(deploymentResult) && + processIdString == eventLogEntry.ReplacementStrings[1]) + { + yield return eventLogEntry; + } + } + } + + private static string AncmVersionToMatch(IISDeploymentResult deploymentResult) + { + return "IIS " + + (deploymentResult.DeploymentParameters.ServerType == ServerType.IISExpress ? "Express " : "") + + "AspNetCore Module" + + (deploymentResult.DeploymentParameters.AncmVersion == AncmVersion.AspNetCoreModuleV2 ? " V2" : ""); + } + + public static string Started(IISDeploymentResult deploymentResult) + { + if (deploymentResult.DeploymentParameters.HostingModel == HostingModel.InProcess) + { + return InProcessStarted(deploymentResult); + } + else + { + return OutOfProcessStarted(deploymentResult); + } + } + + public static string InProcessStarted(IISDeploymentResult deploymentResult) + { + return $"Application '{EscapedContentRoot(deploymentResult)}' started the coreclr in-process successfully"; + } + + public static string OutOfProcessStarted(IISDeploymentResult deploymentResult) + { + return $"Application '/LM/W3SVC/1/ROOT' started process '\\d+' successfully and process '\\d+' is listening on port '\\d+'."; + } + + public static string InProcessFailedToStart(IISDeploymentResult deploymentResult, string reason) + { + return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' failed to load clr and managed application. {reason}"; + } + + public static string InProcessFailedToStop(IISDeploymentResult deploymentResult, string reason) + { + return "Failed to gracefully shutdown application 'MACHINE/WEBROOT/APPHOST/.*?'."; + } + + public static string InProcessThreadException(IISDeploymentResult deploymentResult, string reason) + { + return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed exception{reason}"; + } + + public static string InProcessThreadExit(IISDeploymentResult deploymentResult, string code) + { + return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed background thread exit, exit code = '{code}'."; + } + public static string InProcessThreadExitStdOut(IISDeploymentResult deploymentResult, string code, string output) + { + return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' hit unexpected managed background thread exit, exit code = '{code}'. Last 4KB characters of captured stdout and stderr logs:\r\n{output}"; + } + + public static string FailedToStartApplication(IISDeploymentResult deploymentResult, string code) + { + return $"Failed to start application '/LM/W3SVC/1/ROOT', ErrorCode '{code}'."; + } + + public static string ConfigurationLoadError(IISDeploymentResult deploymentResult, string reason) + { + return $"Could not load configuration. Exception message: {reason}"; + } + + public static string OutOfProcessFailedToStart(IISDeploymentResult deploymentResult) + { + return $"Application '/LM/W3SVC/1/ROOT' with physical root '{EscapedContentRoot(deploymentResult)}' failed to start process with " + + $"commandline '(.*)' with multiple retries. " + + $"The last try of listening port is '(.*)'. See previous warnings for details."; + } + + public static string InProcessHostfxrInvalid(IISDeploymentResult deploymentResult) + { + return $"Hostfxr version used does not support 'hostfxr_get_native_search_directories', update the version of hostfxr to a higher version. Path to hostfxr: '(.*)'."; + } + + public static string InProcessFailedToFindNativeDependencies(IISDeploymentResult deploymentResult) + { + return "Invoking hostfxr to find the inprocess request handler failed without finding any native dependencies. " + + "This most likely means the app is misconfigured, please check the versions of Microsoft.NetCore.App and Microsoft.AspNetCore.App that " + + "are targeted by the application and are installed on the machine."; + } + + public static string InProcessFailedToFindRequestHandler(IISDeploymentResult deploymentResult) + { + return "Could not find the assembly '(.*)' referenced for the in-process application. Please confirm the Microsoft.AspNetCore.Server.IIS package is referenced in your application."; + } + + private static string EscapedContentRoot(IISDeploymentResult deploymentResult) + { + var contentRoot = deploymentResult.ContentRoot; + if (!contentRoot.EndsWith('\\')) + { + contentRoot += '\\'; + } + return Regex.Escape(contentRoot); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs new file mode 100644 index 0000000000000000000000000000000000000000..1a1a4ce490c65008aea7ecb88f34d31f09cd8e9e --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/FunctionalTestsBase.cs @@ -0,0 +1,59 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.Extensions.Logging.Testing; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Server.IntegrationTesting +{ + public class FunctionalTestsBase : LoggedTest + { + private const string DebugEnvironmentVariable = "ASPNETCORE_MODULE_DEBUG"; + + public FunctionalTestsBase(ITestOutputHelper output = null) : base(output) + { + } + + protected IISDeployerBase _deployer; + + protected ApplicationDeployer CreateDeployer(IISDeploymentParameters parameters) + { + if (parameters.ServerType == ServerType.IISExpress && + !parameters.EnvironmentVariables.ContainsKey(DebugEnvironmentVariable)) + { + parameters.EnvironmentVariables[DebugEnvironmentVariable] = "console"; + } + + return IISApplicationDeployerFactory.Create(parameters, LoggerFactory); + } + + protected virtual async Task<IISDeploymentResult> DeployAsync(IISDeploymentParameters parameters) + { + _deployer = (IISDeployerBase)CreateDeployer(parameters); + return (IISDeploymentResult)await _deployer.DeployAsync(); + } + + protected virtual async Task<IISDeploymentResult> StartAsync(IISDeploymentParameters parameters) + { + var result = await DeployAsync(parameters); + await result.AssertStarts(); + return result; + } + + public override void Dispose() + { + StopServer(false); + } + + public void StopServer(bool gracefulShutdown = true) + { + _deployer?.Dispose(gracefulShutdown); + _deployer = null; + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs new file mode 100644 index 0000000000000000000000000000000000000000..1e31126eabe4efd920be4720224d6800f2aaf511 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/Helpers.cs @@ -0,0 +1,241 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using System.Xml.Linq; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing; +using Microsoft.Extensions.Logging; +using Newtonsoft.Json; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public static class Helpers + { + private static readonly TimeSpan RetryRequestDelay = TimeSpan.FromMilliseconds(100); + private static readonly int RetryRequestCount = 10; + + public static string GetTestWebSitePath(string name) + { + return Path.Combine(TestPathUtilities.GetSolutionRootDirectory("IISIntegration"),"test", "WebSites", name); + } + + public static string GetInProcessTestSitesPath() + { + return DeployerSelector.IsForwardsCompatibilityTest ? GetTestWebSitePath("InProcessForwardsCompatWebSite") : GetTestWebSitePath("InProcessWebSite"); + } + + public static string GetOutOfProcessTestSitesPath() => GetTestWebSitePath("OutOfProcessWebSite"); + + public static async Task AssertStarts(this IISDeploymentResult deploymentResult, string path = "/HelloWorld") + { + var response = await deploymentResult.HttpClient.GetAsync(path); + + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.Equal("Hello World", responseText); + } + + public static async Task StressLoad(HttpClient httpClient, string path, Action<HttpResponseMessage> action) + { + async Task RunRequests() + { + var connection = new HttpClient() { BaseAddress = httpClient.BaseAddress }; + + for (int j = 0; j < 10; j++) + { + var response = await connection.GetAsync(path); + action(response); + } + } + + List<Task> tasks = new List<Task>(); + for (int i = 0; i < 10; i++) + { + tasks.Add(Task.Run(RunRequests)); + } + + await Task.WhenAll(tasks); + } + + public static string GetFrebFolder(string folder, IISDeploymentResult result) + { + if (result.DeploymentParameters.ServerType == ServerType.IISExpress) + { + return Path.Combine(folder, result.DeploymentParameters.SiteName); + } + else + { + return Path.Combine(folder, "W3SVC1"); + } + } + + public static void CopyFiles(DirectoryInfo source, DirectoryInfo target, ILogger logger) + { + foreach (DirectoryInfo directoryInfo in source.GetDirectories()) + { + if (directoryInfo.FullName != target.FullName) + { + CopyFiles(directoryInfo, target.CreateSubdirectory(directoryInfo.Name), logger); + } + } + logger?.LogDebug($"Processing {target.FullName}"); + foreach (FileInfo fileInfo in source.GetFiles()) + { + logger?.LogDebug($" Copying {fileInfo.Name}"); + var destFileName = Path.Combine(target.FullName, fileInfo.Name); + fileInfo.CopyTo(destFileName); + } + } + + public static void ModifyWebConfig(this DeploymentResult deploymentResult, Action<XElement> action) + { + var webConfigPath = Path.Combine(deploymentResult.ContentRoot, "web.config"); + var document = XDocument.Load(webConfigPath); + action(document.Root); + document.Save(webConfigPath); + } + + public static Task<HttpResponseMessage> RetryRequestAsync(this HttpClient client, string uri, Func<HttpResponseMessage, bool> predicate) + { + return RetryRequestAsync(client, uri, message => Task.FromResult(predicate(message))); + } + + public static async Task<HttpResponseMessage> RetryRequestAsync(this HttpClient client, string uri, Func<HttpResponseMessage, Task<bool>> predicate) + { + HttpResponseMessage response = await client.GetAsync(uri); + + for (var i = 0; i < RetryRequestCount && !await predicate(response); i++) + { + // Keep retrying until app_offline is present. + response = await client.GetAsync(uri); + await Task.Delay(RetryRequestDelay); + } + + if (!await predicate(response)) + { + throw new InvalidOperationException($"Didn't get response that satisfies predicate after {RetryRequestCount} retries"); + } + + return response; + } + + public static async Task Retry(Func<Task> func, int attempts, int msDelay) + { + var exceptions = new List<Exception>(); + + for (var attempt = 0; attempt < attempts; attempt++) + { + try + { + await func(); + return; + } + catch (Exception e) + { + exceptions.Add(e); + } + await Task.Delay(msDelay); + } + + throw new AggregateException(exceptions); + } + + public static void AssertWorkerProcessStop(this IISDeploymentResult deploymentResult, int? timeout = null) + { + var hostProcess = deploymentResult.HostProcess; + Assert.True(hostProcess.WaitForExit(timeout ?? (int)TimeoutExtensions.DefaultTimeoutValue.TotalMilliseconds)); + + if (deploymentResult.DeploymentParameters.ServerType == ServerType.IISExpress) + { + Assert.Equal(0, hostProcess.ExitCode); + } + } + + + public static async Task AssertRecycledAsync(this IISDeploymentResult deploymentResult, Func<Task> verificationAction = null) + { + if (deploymentResult.DeploymentParameters.HostingModel != HostingModel.InProcess) + { + throw new NotSupportedException(); + } + + deploymentResult.AssertWorkerProcessStop(); + if (deploymentResult.DeploymentParameters.ServerType == ServerType.IIS) + { + verificationAction = verificationAction ?? (() => deploymentResult.AssertStarts()); + await verificationAction(); + } + } + + public static IEnumerable<object[]> ToTheoryData<T>(this Dictionary<string, T> dictionary) + { + return dictionary.Keys.Select(k => new[] { k }); + } + + public static string GetExpectedLogName(IISDeploymentResult deploymentResult, string logFolderPath) + { + var startTime = deploymentResult.HostProcess.StartTime.ToUniversalTime(); + + if (deploymentResult.DeploymentParameters.HostingModel == HostingModel.InProcess) + { + return Path.Combine(logFolderPath, $"std_{startTime.Year}{startTime.Month:D2}" + + $"{startTime.Day:D2}{startTime.Hour:D2}" + + $"{startTime.Minute:D2}{startTime.Second:D2}_" + + $"{deploymentResult.HostProcess.Id}.log"); + } + else + { + return Directory.GetFiles(logFolderPath).Single(); + } + } + + public static void ModifyFrameworkVersionInRuntimeConfig(IISDeploymentResult deploymentResult) + { + var path = Path.Combine(deploymentResult.ContentRoot, "InProcessWebSite.runtimeconfig.json"); + dynamic depsFileContent = JsonConvert.DeserializeObject(File.ReadAllText(path)); + depsFileContent["runtimeOptions"]["framework"]["version"] = "2.9.9"; + var output = JsonConvert.SerializeObject(depsFileContent); + File.WriteAllText(path, output); + } + + public static void AllowNoLogs(this IISDeploymentResult deploymentResult) + { + File.AppendAllText( + Path.Combine(deploymentResult.DeploymentParameters.PublishedApplicationRootPath, "aspnetcore-debug.log"), + "Running test allowed log file to be empty." + Environment.NewLine); + } + + public static string ReadAllTextFromFile(string filename, ILogger logger) + { + try + { + return File.ReadAllText(filename); + } + catch (Exception ex) + { + // check if there is a dotnet.exe, iisexpress.exe, or w3wp.exe processes still running. + var hostingProcesses = Process.GetProcessesByName("dotnet") + .Concat(Process.GetProcessesByName("iisexpress")) + .Concat(Process.GetProcessesByName("w3wp")); + + logger.LogError($"Could not read file content. Exception message {ex.Message}"); + logger.LogError("Current hosting exes running:"); + + foreach (var hostingProcess in hostingProcesses) + { + logger.LogError($"{hostingProcess.ProcessName} pid: {hostingProcess.Id} hasExited: {hostingProcess.HasExited.ToString()}"); + } + throw ex; + } + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs new file mode 100644 index 0000000000000000000000000000000000000000..0a080bb702737ac0f8fbfe4a6964a17829d1667f --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCapability.cs @@ -0,0 +1,22 @@ +// 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.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Flags] + public enum IISCapability + { + None = 0, + Websockets = 1, + WindowsAuthentication = 2, + PoolEnvironmentVariables = 4, + ShutdownToken = 8, + DynamicCompression = 16, + ApplicationInitialization = 32, + TracingModule = 64, + FailedRequestTracingModule = 128, + BasicAuthentication = 256 + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs new file mode 100644 index 0000000000000000000000000000000000000000..2c424943f35ee6daa26cfe9d54eb35ce1c303282 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteCollection.cs @@ -0,0 +1,13 @@ +// 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 +{ + [CollectionDefinition(Name)] + public class IISCompressionSiteCollection : ICollectionFixture<IISCompressionSiteFixture> + { + public const string Name = nameof(IISCompressionSiteCollection); + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs new file mode 100644 index 0000000000000000000000000000000000000000..3aff68d11bc6b348a24c7a43ea119ab321d7cef6 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISCompressionSiteFixture.cs @@ -0,0 +1,44 @@ +// 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.Net.Http; +using System.Threading; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class IISCompressionSiteFixture : IISTestSiteFixture + { + public IISCompressionSiteFixture() : base(Configure) + { + } + + private static void Configure(IISDeploymentParameters deploymentParameters) + { + // Enable dynamic compression + deploymentParameters.ServerConfigActionList.Add( + (element, _) => { + var webServerElement = element + .RequiredElement("system.webServer"); + + webServerElement + .GetOrAdd("urlCompression") + .SetAttributeValue("doDynamicCompression", "true"); + + webServerElement + .GetOrAdd("httpCompression") + .GetOrAdd("dynamicTypes") + .GetOrAdd("add", "mimeType", "text/*") + .SetAttributeValue("enabled", "true"); + + }); + + deploymentParameters.EnableModule("DynamicCompressionModule", "%IIS_BIN%\\compdyn.dll"); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs new file mode 100644 index 0000000000000000000000000000000000000000..a20a5e2e0e073bd1ce21167bc1b2ca791418831f --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISFunctionalTestBase.cs @@ -0,0 +1,15 @@ +// 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.Server.IntegrationTesting; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities +{ + public class IISFunctionalTestBase : FunctionalTestsBase + { + public IISFunctionalTestBase(ITestOutputHelper output = null) : base(output) + { + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.cs new file mode 100644 index 0000000000000000000000000000000000000000..562d63adbee8484679fa91d6af074bbef93127d3 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteCollection.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 Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + /// <summary> + /// This type just maps collection names to available fixtures + /// </summary> + [CollectionDefinition(Name)] + public class IISTestSiteCollection : ICollectionFixture<IISTestSiteFixture> + { + public const string Name = nameof(IISTestSiteCollection); + } + + [CollectionDefinition(Name)] + public class OutOfProcessTestSiteCollection : ICollectionFixture<OutOfProcessTestSiteFixture> + { + public const string Name = nameof(OutOfProcessTestSiteCollection); + } + + [CollectionDefinition(Name)] + public class OutOfProcessV1TestSiteCollection : ICollectionFixture<OutOfProcessV1TestSiteFixture> + { + public const string Name = nameof(OutOfProcessV1TestSiteCollection); + } + +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs new file mode 100644 index 0000000000000000000000000000000000000000..e8cfd8f6411615a0c4672a237874d3d2d5cb97f5 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/IISTestSiteFixture.cs @@ -0,0 +1,191 @@ +// 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.Net.Http; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class OutOfProcessTestSiteFixture : IISTestSiteFixture + { + public OutOfProcessTestSiteFixture() : base(Configure) + { + } + + private static void Configure(IISDeploymentParameters deploymentParameters) + { + deploymentParameters.ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(); + deploymentParameters.HostingModel = HostingModel.OutOfProcess; + } + } + + public class OutOfProcessV1TestSiteFixture : IISTestSiteFixture + { + public OutOfProcessV1TestSiteFixture() : base(Configure) + { + } + + private static void Configure(IISDeploymentParameters deploymentParameters) + { + deploymentParameters.ApplicationPath = Helpers.GetOutOfProcessTestSitesPath(); + deploymentParameters.HostingModel = HostingModel.OutOfProcess; + deploymentParameters.AncmVersion = AncmVersion.AspNetCoreModule; + } + } + + public class IISTestSiteFixture : IDisposable + { + private ApplicationDeployer _deployer; + private ILoggerFactory _loggerFactory; + private ForwardingProvider _forwardingProvider; + private IISDeploymentResult _deploymentResult; + private readonly Action<IISDeploymentParameters> _configure; + + public IISTestSiteFixture() : this(_ => { }) + { + } + + public IISTestSiteFixture(Action<IISDeploymentParameters> configure) + { + var logging = AssemblyTestLog.ForAssembly(typeof(IISTestSiteFixture).Assembly); + _loggerFactory = logging.CreateLoggerFactory(null, nameof(IISTestSiteFixture)); + + _forwardingProvider = new ForwardingProvider(); + _loggerFactory.AddProvider(_forwardingProvider); + + _configure = configure; + } + + public HttpClient Client => DeploymentResult.HttpClient; + public IISDeploymentResult DeploymentResult + { + get + { + EnsureInitialized(); + return _deploymentResult; + } + } + + public TestConnection CreateTestConnection() + { + return new TestConnection(Client.BaseAddress.Port); + } + + public void Dispose() + { + _deployer?.Dispose(); + } + + public void Attach(LoggedTest test) + { + if (_forwardingProvider.LoggerFactory != null) + { + throw new InvalidOperationException("Test instance is already attached to this fixture"); + } + + _forwardingProvider.LoggerFactory = test.LoggerFactory; + } + + public void Detach(LoggedTest test) + { + if (_forwardingProvider.LoggerFactory != test.LoggerFactory) + { + throw new InvalidOperationException("Different test is attached to this fixture"); + } + + _forwardingProvider.LoggerFactory = null; + } + + private void EnsureInitialized() + { + if (_deployer != null) + { + return; + } + + var deploymentParameters = new IISDeploymentParameters(Helpers.GetInProcessTestSitesPath(), + DeployerSelector.ServerType, + RuntimeFlavor.CoreClr, + RuntimeArchitecture.x64) + { + TargetFramework = Tfm.NetCoreApp22, + AncmVersion = AncmVersion.AspNetCoreModuleV2, + HostingModel = HostingModel.InProcess, + PublishApplicationBeforeDeployment = true, + }; + + _configure(deploymentParameters); + + _deployer = IISApplicationDeployerFactory.Create(deploymentParameters, _loggerFactory); + _deploymentResult = (IISDeploymentResult)_deployer.DeployAsync().Result; + } + + private class ForwardingProvider : ILoggerProvider + { + private readonly List<ForwardingLogger> _loggers = new List<ForwardingLogger>(); + + private ILoggerFactory _loggerFactory; + + public ILoggerFactory LoggerFactory + { + get => _loggerFactory; + set + { + + lock (_loggers) + { + _loggerFactory = value; + foreach (var logger in _loggers) + { + logger.Logger = _loggerFactory?.CreateLogger("FIXTURE:" + logger.Name); + } + } + } + } + + public void Dispose() + { + lock (_loggers) + { + _loggers.Clear(); + } + } + + public ILogger CreateLogger(string categoryName) + { + lock (_loggers) + { + var logger = new ForwardingLogger(categoryName); + _loggers.Add(logger); + return logger; + } + } + } + + internal class ForwardingLogger : ILogger + { + public ForwardingLogger(string name) + { + Name = name; + } + + public ILogger Logger { get; set; } + public string Name { get; set; } + + public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter) + { + Logger?.Log(logLevel, eventId, state, exception, formatter); + } + + public bool IsEnabled(LogLevel logLevel) => Logger?.IsEnabled(logLevel) == true; + + public IDisposable BeginScope<TState>(TState state) => Logger?.BeginScope(state); + } + } + +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.cs new file mode 100644 index 0000000000000000000000000000000000000000..17885f3547c8a542dae1728914c0bc836b453e18 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/LogFileTestBase.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; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities +{ + public class LogFileTestBase : IISFunctionalTestBase + { + protected string _logFolderPath; + + public LogFileTestBase(ITestOutputHelper output = null) : base(output) + { + _logFolderPath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString()); + } + public override void Dispose() + { + base.Dispose(); + if (Directory.Exists(_logFolderPath)) + { + Directory.Delete(_logFolderPath, true); + } + } + + public string GetLogFileContent(IISDeploymentResult deploymentResult) + { + return Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger); + } + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..d2749db547d62c2589509a596cdb48088c5724f9 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/RequiresEnvironmentVariableAttribute.cs @@ -0,0 +1,24 @@ +// 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 Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class RequiresEnvironmentVariableAttribute : Attribute, ITestCondition + { + private readonly string _name; + + public RequiresEnvironmentVariableAttribute(string name) + { + _name = name; + } + + public bool IsMet => !string.IsNullOrWhiteSpace(Environment.GetEnvironmentVariable(_name)); + + public string SkipReason => $"Environment variable {_name} is required to run this test."; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs b/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..6cdd7253926dfc4f9d3267f063a1b91079200790 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/Utilities/SkipIfDebugAttribute.cs @@ -0,0 +1,22 @@ +// 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 Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class SkipIfDebugAttribute : Attribute, ITestCondition + { + public bool IsMet => + #if DEBUG + false; + #else + true; + #endif + + public string SkipReason => "Test cannot be run in Debug mode."; + } +} diff --git a/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs b/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..8431b1580199a022e2690e87e1cc6bfcf52c7299 --- /dev/null +++ b/src/IISIntegration/test/Common.FunctionalTests/WindowsAuthTests.cs @@ -0,0 +1,52 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class WindowsAuthTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public WindowsAuthTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22, Tfm.Net461) + .WithApplicationTypes(ApplicationType.Portable) + .WithAllAncmVersions() + .WithAllHostingModels(); + + [ConditionalTheory] + [RequiresIIS(IISCapability.WindowsAuthentication)] + [MemberData(nameof(TestVariants))] + public async Task WindowsAuthTest(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant); + deploymentParameters.SetAnonymousAuth(enabled: false); + deploymentParameters.SetWindowsAuth(); + + // The default in hosting sets windows auth to true. + var deploymentResult = await DeployAsync(deploymentParameters); + + var client = deploymentResult.CreateClient(new HttpClientHandler { UseDefaultCredentials = true }); + var response = await client.GetAsync("/Auth"); + var responseText = await response.Content.ReadAsStringAsync(); + + Assert.StartsWith("Windows:", responseText); + Assert.Contains(Environment.UserName, responseText); + } + } +} diff --git a/src/IISIntegration/test/Common.Tests/Common.Tests.csproj b/src/IISIntegration/test/Common.Tests/Common.Tests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..ede80732eeb913c81256b6cd0c41664eafa16988 --- /dev/null +++ b/src/IISIntegration/test/Common.Tests/Common.Tests.csproj @@ -0,0 +1,22 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <IsTestProject>false</IsTestProject> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs b/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs new file mode 100644 index 0000000000000000000000000000000000000000..78f76e41c2b27be1884ae1e9bd8a55555c19de67 --- /dev/null +++ b/src/IISIntegration/test/Common.Tests/Utilities/DisposableList.cs @@ -0,0 +1,25 @@ +// 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.AspNetCore.Server.IntegrationTesting +{ + public class DisposableList<T> : List<T>, IDisposable where T : IDisposable + { + public DisposableList() : base() { } + + public DisposableList(IEnumerable<T> collection) : base(collection) { } + + public DisposableList(int capacity) : base(capacity) { } + + public void Dispose() + { + foreach (var item in this) + { + item?.Dispose(); + } + } + } +} diff --git a/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs b/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs new file mode 100644 index 0000000000000000000000000000000000000000..3b7a870cf3ec09d908e7a80138f9755b18c988fb --- /dev/null +++ b/src/IISIntegration/test/Common.Tests/Utilities/TestConnections.cs @@ -0,0 +1,252 @@ +// 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.Net; +using System.Net.Sockets; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IntegrationTesting +{ + /// <summary> + /// Summary description for TestConnection + /// </summary> + public class TestConnection : IDisposable + { + private static readonly TimeSpan Timeout = TimeSpan.FromMinutes(1); + + private readonly bool _ownsSocket; + private readonly Socket _socket; + private readonly NetworkStream _stream; + + public TestConnection(int port) + : this(port, AddressFamily.InterNetwork) + { + } + + public TestConnection(int port, AddressFamily addressFamily) + : this(CreateConnectedLoopbackSocket(port, addressFamily), ownsSocket: true) + { + } + + public TestConnection(Socket socket) + : this(socket, ownsSocket: false) + { + } + + private TestConnection(Socket socket, bool ownsSocket) + { + _ownsSocket = ownsSocket; + _socket = socket; + _stream = new NetworkStream(_socket, ownsSocket: false); + } + + public Socket Socket => _socket; + public Stream Stream => _stream; + + public void Dispose() + { + _stream.Dispose(); + + if (_ownsSocket) + { + _socket.Dispose(); + } + } + + public async Task Send(params string[] lines) + { + var bytes = Encoding.ASCII.GetBytes(string.Join("\r\n", lines)); + + for (var index = 0; index < bytes.Length; index++) + { + await _stream.WriteAsync(bytes, index, 1).ConfigureAwait(false); + await _stream.FlushAsync().ConfigureAwait(false); + // Re-add delay to help find socket input consumption bugs more consistently + //await Task.Delay(TimeSpan.FromMilliseconds(5)); + } + } + + public async Task<int> ReadCharAsync() + { + var bytes = new byte[1]; + return (await _stream.ReadAsync(bytes, 0, 1) == 1) ? bytes[0] : -1; + } + + public async Task<string> ReadLineAsync() + { + var builder = new StringBuilder(); + var current = await ReadCharAsync(); + while (current != '\r') + { + builder.Append((char)current); + current = await ReadCharAsync(); + } + + // Consume \n + await ReadCharAsync(); + + return builder.ToString(); + } + + public async Task<Memory<byte>> ReceiveChunk() + { + var length = int.Parse(await ReadLineAsync(), System.Globalization.NumberStyles.HexNumber); + + var bytes = await Receive(length); + + await ReadLineAsync(); + + return bytes; + } + + public async Task ReceiveChunk(string expected) + { + Assert.Equal(expected, Encoding.ASCII.GetString((await ReceiveChunk()).Span)); + } + + public async Task Receive(params string[] lines) + { + var expected = string.Join("\r\n", lines); + var actual = await Receive(expected.Length); + + Assert.Equal(expected, Encoding.ASCII.GetString(actual.Span)); + } + + private async Task<Memory<byte>> Receive(int length) + { + var actual = new byte[length]; + int offset = 0; + try + { + while (offset < length) + { + var task = _stream.ReadAsync(actual, offset, actual.Length - offset); + if (!Debugger.IsAttached) + { + task = task.TimeoutAfter(Timeout); + } + + var count = await task.ConfigureAwait(false); + if (count == 0) + { + break; + } + + offset += count; + } + } + catch (TimeoutException ex) when (offset != 0) + { + throw new TimeoutException( + $"Did not receive a complete response within {Timeout}.{Environment.NewLine}{Environment.NewLine}" + + $"Expected:{Environment.NewLine}{length} bytes of data{Environment.NewLine}{Environment.NewLine}" + + $"Actual:{Environment.NewLine}{Encoding.ASCII.GetString(actual, 0, offset)}{Environment.NewLine}", + ex); + } + + return actual.AsMemory(0, offset); + } + + public async Task ReceiveStartsWith(string prefix, int maxLineLength = 1024) + { + var actual = new byte[maxLineLength]; + var offset = 0; + + while (offset < maxLineLength) + { + // Read one char at a time so we don't read past the end of the line. + var task = _stream.ReadAsync(actual, offset, 1); + if (!Debugger.IsAttached) + { + Assert.True(task.Wait(4000), "timeout"); + } + var count = await task.ConfigureAwait(false); + if (count == 0) + { + break; + } + + Assert.True(count == 1); + offset++; + + if (actual[offset - 1] == '\n') + { + break; + } + } + + var actualLine = Encoding.ASCII.GetString(actual, 0, offset); + Assert.StartsWith(prefix, actualLine); + } + + public async Task<string[]> ReceiveHeaders(params string[] lines) + { + List<string> headers = new List<string>(); + string line; + do + { + line = await ReadLineAsync(); + headers.Add(line); + } while (line != ""); + + foreach (var s in lines) + { + Assert.Contains(s, headers); + } + + return headers.ToArray(); + } + + public Task WaitForConnectionClose() + { + var tcs = new TaskCompletionSource<object>(); + var eventArgs = new SocketAsyncEventArgs(); + eventArgs.SetBuffer(new byte[128], 0, 128); + eventArgs.Completed += ReceiveAsyncCompleted; + eventArgs.UserToken = tcs; + + if (!_socket.ReceiveAsync(eventArgs)) + { + ReceiveAsyncCompleted(this, eventArgs); + } + + return tcs.Task; + } + + private void ReceiveAsyncCompleted(object sender, SocketAsyncEventArgs e) + { + var tcs = (TaskCompletionSource<object>)e.UserToken; + if (e.BytesTransferred == 0) + { + tcs.SetResult(null); + } + else + { + tcs.SetException(new IOException( + $"Expected connection close, received data instead: \"{Encoding.ASCII.GetString(e.Buffer, 0, e.BytesTransferred)}\"")); + } + } + + public static Socket CreateConnectedLoopbackSocket(int port, AddressFamily addressFamily) + { + if (addressFamily != AddressFamily.InterNetwork && addressFamily != AddressFamily.InterNetworkV6) + { + throw new ArgumentException($"TestConnection does not support address family of type {addressFamily}", nameof(addressFamily)); + } + + var socket = new Socket(addressFamily, SocketType.Stream, ProtocolType.Tcp); + var address = addressFamily == AddressFamily.InterNetworkV6 + ? IPAddress.IPv6Loopback + : IPAddress.Loopback; + socket.Connect(new IPEndPoint(address, port)); + return socket; + } + } +} diff --git a/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs b/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.cs new file mode 100644 index 0000000000000000000000000000000000000000..ce7175dff9207d06d6b80fa22bc5e288c9a48e3d --- /dev/null +++ b/src/IISIntegration/test/Common.Tests/Utilities/TimeoutExtensions.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 System; +using System.Runtime.CompilerServices; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing; + +namespace Microsoft.AspNetCore.Server.IntegrationTesting +{ + + public static class TimeoutExtensions + { + public static TimeSpan DefaultTimeoutValue = TimeSpan.FromSeconds(300); + + public static Task DefaultTimeout(this Task task, [CallerFilePath] string filePath = null, [CallerLineNumber] int lineNumber = -1) + { + return task.TimeoutAfter(DefaultTimeoutValue, filePath, lineNumber); + } + + public static Task<T> DefaultTimeout<T>(this Task<T> task, [CallerFilePath] string filePath = null, [CallerLineNumber] int lineNumber = -1) + { + return task.TimeoutAfter(DefaultTimeoutValue, filePath, lineNumber); + } + } +} diff --git a/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj b/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..87dbd1667563ae3836b179714f6416f466a72cfc --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/CommonLibTests.vcxproj @@ -0,0 +1,196 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <PropertyGroup Label="Globals"> + <ProjectGuid>{1eac8125-1765-4e2d-8cbe-56dc98a1c8c1}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + <ConfigurationType>Application</ConfigurationType> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings" /> + <ImportGroup Label="Shared" /> + <ImportGroup Label="PropertySheets" /> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <ItemGroup> + <ClInclude Include="Helpers.h" /> + <ClInclude Include="fakeclasses.h" /> + <ClInclude Include="stdafx.h" /> + </ItemGroup> + <ItemGroup> + <ClCompile Include="ConfigUtilityTests.cpp" /> + <ClCompile Include="FileOutputManagerTests.cpp" /> + <ClCompile Include="GlobalVersionTests.cpp" /> + <ClCompile Include="Helpers.cpp" /> + <ClCompile Include="hostfxr_utility_tests.cpp" /> + <ClCompile Include="inprocess_application_tests.cpp" /> + <ClCompile Include="main.cpp" /> + <ClCompile Include="PipeOutputManagerTests.cpp" /> + <ClCompile Include="utility_tests.cpp" /> + </ItemGroup> + <ItemGroup> + <ProjectReference Include="..\..\src\AspNetCoreModuleV2\AspNetCore\AspNetCore.vcxproj"> + <Project>{ec82302f-d2f0-4727-99d1-eabc0dd9dc3b}</Project> + </ProjectReference> + <ProjectReference Include="..\..\src\AspNetCoreModuleV2\CommonLib\CommonLib.vcxproj"> + <Project>{55494e58-e061-4c4c-a0a8-837008e72f85}</Project> + </ProjectReference> + <ProjectReference Include="..\..\src\AspNetCoreModuleV2\IISLib\IISLib.vcxproj"> + <Project>{09d9d1d6-2951-4e14-bc35-76a23cf9391a}</Project> + </ProjectReference> + <ProjectReference Include="..\..\src\AspNetCoreModuleV2\RequestHandlerLib\RequestHandlerLib.vcxproj"> + <Project>{1533e271-f61b-441b-8b74-59fb61df0552}</Project> + </ProjectReference> + <ProjectReference Include="..\gtest\gtest.vcxproj"> + <Project>{cac1267b-8778-4257-aac6-caf481723b01}</Project> + </ProjectReference> + <ProjectReference Include="..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\InProcessRequestHandler.vcxproj"> + <Project>{d57ea297-6dc2-4bc0-8c91-334863327863}</Project> + </ProjectReference> + </ItemGroup> + <ItemDefinitionGroup /> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <AdditionalIncludeDirectories>$(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\</AdditionalIncludeDirectories> + <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions> + <LanguageStandard>stdcpp17</LanguageStandard> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\$(Configuration)\;</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <Lib> + <AdditionalDependencies> + </AdditionalDependencies> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <Optimization>Disabled</Optimization> + <PreprocessorDefinitions>X64;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <MinimalRebuild>true</MinimalRebuild> + <BasicRuntimeChecks>EnableFastChecks</BasicRuntimeChecks> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <AdditionalIncludeDirectories>$(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\</AdditionalIncludeDirectories> + <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions> + <LanguageStandard>stdcpp17</LanguageStandard> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\x64\$(Configuration)\;</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <Lib> + <AdditionalDependencies> + </AdditionalDependencies> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <PreprocessorDefinitions>WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <AdditionalIncludeDirectories>$(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\</AdditionalIncludeDirectories> + <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions> + <LanguageStandard>stdcpp17</LanguageStandard> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\$(Configuration)\;</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <Lib> + <AdditionalDependencies> + </AdditionalDependencies> + </Lib> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <PreprocessorDefinitions>X64;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <PrecompiledHeaderOutputFile>$(IntDir)$(TargetName).pch</PrecompiledHeaderOutputFile> + <PrecompiledHeaderFile>stdafx.h</PrecompiledHeaderFile> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + <WarningLevel>Level3</WarningLevel> + <DebugInformationFormat>ProgramDatabase</DebugInformationFormat> + <AdditionalIncludeDirectories>$(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\</AdditionalIncludeDirectories> + <AdditionalOptions>/D "_SILENCE_TR1_NAMESPACE_DEPRECATION_WARNING" </AdditionalOptions> + <LanguageStandard>stdcpp17</LanguageStandard> + </ClCompile> + <Link> + <GenerateDebugInformation>true</GenerateDebugInformation> + <SubSystem>Console</SubSystem> + <AdditionalOptions>/NODEFAULTLIB:libucrt.lib /DEFAULTLIB:ucrt.lib %(AdditionalOptions)</AdditionalOptions> + <OptimizeReferences>true</OptimizeReferences> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <AdditionalLibraryDirectories>..\..\src\AspNetCoreModuleV2\InProcessRequestHandler\x64\$(Configuration)\;</AdditionalLibraryDirectories> + <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;inprocessapplication.obj;inprocesshandler.obj;ahadmin.lib;Rpcrt4.lib;inprocessapplicationbase.obj;stdafx.obj;version.lib;inprocessoptions.obj;%(AdditionalDependencies)</AdditionalDependencies> + <LinkTimeCodeGeneration>UseLinkTimeCodeGeneration</LinkTimeCodeGeneration> + </Link> + <Lib> + <AdditionalDependencies> + </AdditionalDependencies> + </Lib> + </ItemDefinitionGroup> + <Import Project=".\NativeTests.targets" /> +</Project> \ No newline at end of file diff --git a/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp b/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..9b5bf6e9e69a579db0e64b2ea9accf54fb7a5cc8 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/ConfigUtilityTests.cpp @@ -0,0 +1,123 @@ +// 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. + +#include "stdafx.h" +#include "gmock/gmock.h" +using ::testing::_; +using ::testing::NiceMock; + +namespace ConfigUtilityTests +{ + using ::testing::Test; + + class ConfigUtilityTest : public Test + { + protected: + void TestHandlerVersion(std::wstring key, std::wstring value, std::wstring expected, HRESULT(*func)(IAppHostElement*, STRU&)) + { + IAppHostElement* retElement = NULL; + + STRU handlerVersion; + + // NiceMock removes warnings about "uninteresting calls", + auto element = std::make_unique<NiceMock<MockElement>>(); + auto innerElement = std::make_unique<NiceMock<MockElement>>(); + auto collection = std::make_unique<NiceMock<MockCollection>>(); + auto nameElement = std::make_unique<NiceMock<MockElement>>(); + auto mockProperty = std::make_unique<NiceMock<MockProperty>>(); + + ON_CALL(*element, GetElementByName(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(innerElement.get()), testing::Return(S_OK))); + ON_CALL(*innerElement, get_Collection(_)) + .WillByDefault(testing::DoAll(testing::SetArgPointee<0>(collection.get()), testing::Return(S_OK))); + ON_CALL(*collection, get_Count(_)) + .WillByDefault(DoAll(testing::SetArgPointee<0>(1), testing::Return(S_OK))); + ON_CALL(*collection, get_Item(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(nameElement.get()), testing::Return(S_OK))); + ON_CALL(*nameElement, GetPropertyByName(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(mockProperty.get()), testing::Return(S_OK))); + EXPECT_CALL(*mockProperty, get_StringValue(_)) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(key.c_str())), testing::Return(S_OK))) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(value.c_str())), testing::Return(S_OK))); + + HRESULT hr = func(element.get(), handlerVersion); + + EXPECT_EQ(hr, S_OK); + EXPECT_STREQ(handlerVersion.QueryStr(), expected.c_str()); + } + }; + + TEST_F(ConfigUtilityTest, CheckHandlerVersionKeysAndValues) + { + auto func = ConfigUtility::FindHandlerVersion; + TestHandlerVersion(L"handlerVersion", L"value", L"value", func); + TestHandlerVersion(L"handlerversion", L"value", L"value", func); + TestHandlerVersion(L"HandlerversioN", L"value", L"value", func); + TestHandlerVersion(L"randomvalue", L"value", L"", func); + TestHandlerVersion(L"", L"value", L"", func); + TestHandlerVersion(L"", L"", L"", func); + } + + TEST_F(ConfigUtilityTest, CheckDebugLogFile) + { + auto func = ConfigUtility::FindDebugFile; + + TestHandlerVersion(L"debugFile", L"value", L"value", func); + TestHandlerVersion(L"debugFILE", L"value", L"value", func); + } + + TEST_F(ConfigUtilityTest, CheckDebugLevel) + { + auto func = ConfigUtility::FindDebugLevel; + + TestHandlerVersion(L"debugLevel", L"value", L"value", func); + TestHandlerVersion(L"debugLEVEL", L"value", L"value", func); + } + + TEST(ConfigUtilityTestSingle, MultipleElements) + { + IAppHostElement* retElement = NULL; + STRU handlerVersion; + + auto element = std::make_unique<NiceMock<MockElement>>(); + auto innerElement = std::make_unique<NiceMock<MockElement>>(); + auto collection = std::make_unique<NiceMock<MockCollection>>(); + auto nameElement = std::make_unique<NiceMock<MockElement>>(); + auto mockProperty = std::make_unique<NiceMock<MockProperty>>(); + + ON_CALL(*element, GetElementByName(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(innerElement.get()), testing::Return(S_OK))); + ON_CALL(*innerElement, get_Collection(_)) + .WillByDefault(testing::DoAll(testing::SetArgPointee<0>(collection.get()), testing::Return(S_OK))); + ON_CALL(*collection, get_Count(_)) + .WillByDefault(DoAll(testing::SetArgPointee<0>(2), testing::Return(S_OK))); + ON_CALL(*collection, get_Item(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(nameElement.get()), testing::Return(S_OK))); + ON_CALL(*nameElement, GetPropertyByName(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(mockProperty.get()), testing::Return(S_OK))); + EXPECT_CALL(*mockProperty, get_StringValue(_)) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"key")), testing::Return(S_OK))) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"value")), testing::Return(S_OK))) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"handlerVersion")), testing::Return(S_OK))) + .WillOnce(DoAll(testing::SetArgPointee<0>(SysAllocString(L"value2")), testing::Return(S_OK))); + + HRESULT hr = ConfigUtility::FindHandlerVersion(element.get(), handlerVersion); + + EXPECT_EQ(hr, S_OK); + EXPECT_STREQ(handlerVersion.QueryStr(), L"value2"); + } + + TEST(ConfigUtilityTestSingle, IgnoresFailedGetElement) + { + STRU handlerVersion; + + auto element = std::make_unique<NiceMock<MockElement>>(); + ON_CALL(*element, GetElementByName(_, _)) + .WillByDefault(DoAll(testing::SetArgPointee<1>(nullptr), testing::Return(HRESULT_FROM_WIN32( ERROR_INVALID_INDEX )))); + + HRESULT hr = ConfigUtility::FindHandlerVersion(element.get(), handlerVersion); + + EXPECT_EQ(hr, S_OK); + EXPECT_STREQ(handlerVersion.QueryStr(), L""); + } +} diff --git a/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp b/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..66a9ff7f0b7f4133d655135f52df51149455afb9 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/FileOutputManagerTests.cpp @@ -0,0 +1,152 @@ +// 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. + +#include "stdafx.h" +#include "gtest/internal/gtest-port.h" +#include "FileOutputManager.h" + +class FileManagerWrapper +{ +public: + FileOutputManager* manager; + FileManagerWrapper(FileOutputManager* m) + : manager(m) + { + manager->Start(); + } + + ~FileManagerWrapper() + { + delete manager; + } +}; + +namespace FileOutManagerStartupTests +{ + using ::testing::Test; + class FileOutputManagerTest : public Test + { + protected: + void + Test(std::wstring fileNamePrefix, FILE* out) + { + PCWSTR expected = L"test"; + + auto tempDirectory = TempDirectory(); + FileOutputManager* pManager = new FileOutputManager(fileNamePrefix, tempDirectory.path()); + + { + FileManagerWrapper wrapper(pManager); + + wprintf(expected, out); + } + + for (auto & p : std::filesystem::directory_iterator(tempDirectory.path())) + { + std::wstring filename(p.path().filename()); + ASSERT_EQ(filename.substr(0, fileNamePrefix.size()), fileNamePrefix); + + std::wstring content = Helpers::ReadFileContent(std::wstring(p.path())); + } + } + }; + + TEST_F(FileOutputManagerTest, WriteToFileCheckContentsWritten) + { + Test(L"", stdout); + Test(L"log", stdout); + } + + TEST_F(FileOutputManagerTest, WriteToFileCheckContentsWrittenErr) + { + Test(L"", stderr); + Test(L"log", stderr); + } +} + +namespace FileOutManagerOutputTests +{ + TEST(FileOutManagerOutputTest, StdOut) + { + PCWSTR expected = L"test"; + + auto tempDirectory = TempDirectory(); + + FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path()); + { + FileManagerWrapper wrapper(pManager); + + fwprintf(stdout, expected); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_FALSE(output.empty()); + + ASSERT_STREQ(output.c_str(), expected); + } + } + + TEST(FileOutManagerOutputTest, StdErr) + { + PCWSTR expected = L"test"; + + auto tempDirectory = TempDirectory(); + + FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path().c_str()); + { + FileManagerWrapper wrapper(pManager); + + fwprintf(stderr, expected); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_FALSE(output.empty()); + + ASSERT_STREQ(output.c_str(), expected); + } + } + + TEST(FileOutManagerOutputTest, CapAt30KB) + { + PCWSTR expected = L"hello world"; + + auto tempDirectory = TempDirectory(); + + FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path()); + { + FileManagerWrapper wrapper(pManager); + + for (int i = 0; i < 3000; i++) + { + wprintf(expected); + } + pManager->Stop(); + auto output = pManager->GetStdOutContent(); + ASSERT_FALSE(output.empty()); + + ASSERT_EQ(output.size(), 30000); + } + } + + TEST(FileOutManagerOutputTest, StartStopRestoresCorrectly) + { + PCWSTR expected = L"test"; + + auto tempDirectory = TempDirectory(); + + for (int i = 0; i < 10; i++) + { + FileOutputManager* pManager = new FileOutputManager(L"", tempDirectory.path()); + { + FileManagerWrapper wrapper(pManager); + + wprintf(expected); + pManager->Stop(); + auto output = pManager->GetStdOutContent(); + ASSERT_FALSE(output.empty()); + + ASSERT_STREQ(output.c_str(), expected); + } + } + } +} diff --git a/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp b/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..f38c9361d223c6d72b4d5a7c2da63f25bf8ba3e9 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/GlobalVersionTests.cpp @@ -0,0 +1,153 @@ +// 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. + +#include "stdafx.h" +#include "gtest/internal/gtest-port.h" + +namespace GlobalVersionTests +{ + using ::testing::Test; + namespace fs = std::filesystem; + + class GlobalVersionTest : public Test + { + protected: + void + RemoveFileNamePath(PCWSTR dllPath, PCWSTR expected) + { + std::wstring res = GlobalVersionUtility::RemoveFileNameFromFolderPath(dllPath); + EXPECT_STREQ(res.c_str(), expected); + } + }; + + TEST_F(GlobalVersionTest, RemovesPathCorrectly) + { + RemoveFileNamePath(L"test\\log.txt", L"test"); + RemoveFileNamePath(L"test\\log", L"test"); + RemoveFileNamePath(L"C:\\Program Files\\IIS\\aspnetcorev2.dll", L"C:\\Program Files\\IIS"); + RemoveFileNamePath(L"test\\log.txt", L"test"); + } + + TEST(GetRequestHandlerVersions, GetFolders) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / L"2.0.0")); + + auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str()); + EXPECT_EQ(res.size(), 1); + EXPECT_EQ(res.at(0), fx_ver_t(2, 0, 0, std::wstring())); + } + + TEST(GetRequestHandlerVersions, GetFolderPreview) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / L"2.0.0-preview")); + + auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str()); + EXPECT_EQ(res.size(), 1); + EXPECT_EQ(res.at(0), fx_ver_t(2, 0, 0, std::wstring(L"-preview"))); + } + + TEST(GetRequestHandlerVersions, GetFolderManyVersions) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"1.9.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / + L"2.1.0")); + + auto res = GlobalVersionUtility::GetRequestHandlerVersions(tempPath.path().c_str()); + EXPECT_EQ(res.size(), 3); + EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(1, 9, 0, std::wstring())) != std::end(res)); + EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(2, 0, 0, std::wstring())) != std::end(res)); + EXPECT_TRUE(std::find(res.begin(), res.end(), fx_ver_t(2, 1, 0, std::wstring())) != std::end(res)); + } + + TEST(FindHighestGlobalVersion, HighestVersionWithSingleFolder) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + + auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str()); + + EXPECT_STREQ(res.c_str(), L"2.0.0"); + } + + TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersions) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0")); + + auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str()); + + EXPECT_STREQ(res.c_str(), L"2.1.0"); + } + + TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersionsPreview) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.2.0-preview")); + + auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str()); + + EXPECT_STREQ(res.c_str(), L"2.2.0-preview"); + } + + TEST(FindHighestGlobalVersion, HighestVersionWithMultipleVersionNoPreview) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0")); + + auto res = GlobalVersionUtility::FindHighestGlobalVersion(tempPath.path().c_str()); + + EXPECT_STREQ(res.c_str(), L"2.1.0"); + } + + TEST(GetGlobalRequestHandlerPath, FindHighestVersionNoHandlerName) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"", L"aspnetcorev2_outofprocess.dll"); + + EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.0.0\\aspnetcorev2_outofprocess.dll").c_str()); + } + + TEST(GetGlobalRequestHandlerPath, FindHighestVersionPreviewWins) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview")); + + auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"", L"aspnetcorev2_outofprocess.dll"); + + EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.1.0-preview\\aspnetcorev2_outofprocess.dll").c_str()); + } + + TEST(GetGlobalRequestHandlerPath, FindHighestVersionSpecificVersion) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview")); + + auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"2.0.0", L"aspnetcorev2_outofprocess.dll"); + + EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.0.0\\aspnetcorev2_outofprocess.dll").c_str()); + } + + TEST(GetGlobalRequestHandlerPath, FindHighestVersionSpecificPreview) + { + auto tempPath = TempDirectory(); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.0.0")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.1.0-preview")); + EXPECT_TRUE(fs::create_directories(tempPath.path() / "2.2.0")); + + + auto result = GlobalVersionUtility::GetGlobalRequestHandlerPath(tempPath.path().c_str(), L"2.1.0-preview", L"aspnetcorev2_outofprocess.dll"); + + EXPECT_STREQ(result.c_str(), (tempPath.path() / L"2.1.0-preview\\aspnetcorev2_outofprocess.dll").c_str()); + } +} diff --git a/src/IISIntegration/test/CommonLibTests/Helpers.cpp b/src/IISIntegration/test/CommonLibTests/Helpers.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ccca6cad5b9d5cad0c0db3688b5f243296fc0792 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/Helpers.cpp @@ -0,0 +1,41 @@ +// 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" + +std::wstring +Helpers::ReadFileContent(std::wstring file) +{ + std::wcout << file << std::endl; + + std::fstream t(file); + std::stringstream buffer; + buffer << t.rdbuf(); + + int nChars = MultiByteToWideChar(CP_ACP, 0, buffer.str().c_str(), -1, NULL, 0); + + std::wstring retVal(nChars, '\0'); + + MultiByteToWideChar(CP_UTF8, 0, buffer.str().c_str(), -1, retVal.data(), nChars); + + return retVal; +} + +TempDirectory::TempDirectory() +{ + UUID uuid; + UuidCreate(&uuid); + RPC_CSTR szUuid = NULL; + if (UuidToStringA(&uuid, &szUuid) == RPC_S_OK) + { + m_path = std::filesystem::temp_directory_path() / reinterpret_cast<PCHAR>(szUuid); + RpcStringFreeA(&szUuid); + return; + } + throw std::exception("Cannot create temp directory"); +} + +TempDirectory::~TempDirectory() +{ + std::filesystem::remove_all(m_path); +} diff --git a/src/IISIntegration/test/CommonLibTests/Helpers.h b/src/IISIntegration/test/CommonLibTests/Helpers.h new file mode 100644 index 0000000000000000000000000000000000000000..67256966bbda3ac59c0c21129da0670ccb34a9dd --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/Helpers.h @@ -0,0 +1,28 @@ +// 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 Helpers +{ +public: + static + std::wstring + ReadFileContent(std::wstring file); +}; + +class TempDirectory +{ +public: + + TempDirectory(); + + ~TempDirectory(); + + std::filesystem::path path() const + { + return m_path; + } + +private: + std::filesystem::path m_path; +}; diff --git a/src/IISIntegration/test/CommonLibTests/NativeTests.targets b/src/IISIntegration/test/CommonLibTests/NativeTests.targets new file mode 100644 index 0000000000000000000000000000000000000000..f3d2caf9306a0a9b6304e8394e2e9429869e7f42 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/NativeTests.targets @@ -0,0 +1,8 @@ +<Project> + <PropertyGroup> + <VsTestConsole>$(VCIDEInstallDir)..\CommonExtensions\Microsoft\TestWindow\vstest.console.exe</VsTestConsole> + </PropertyGroup> + <Target Name="Test" DependsOnTargets="Build"> + <Exec Command=""$(TargetPath)"" /> + </Target> +</Project> \ No newline at end of file diff --git a/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp b/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..385d6df9e0f32f737ec9e708045f200c8ccebb38 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/PipeOutputManagerTests.cpp @@ -0,0 +1,162 @@ +// 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. + +#include "stdafx.h" +#include "gtest/internal/gtest-port.h" +#include "PipeOutputManager.h" + +class FileManagerWrapper +{ +public: + PipeOutputManager * manager; + FileManagerWrapper(PipeOutputManager* m) + : manager(m) + { + manager->Start(); + } + + ~FileManagerWrapper() + { + delete manager; + } +}; + +namespace PipeOutputManagerTests +{ + TEST(PipeManagerOutputTest, StdOut) + { + PCWSTR expected = L"test"; + + PipeOutputManager* pManager = new PipeOutputManager(true); + + pManager->Start(); + fwprintf(stdout, expected); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_STREQ(output.c_str(), expected); + delete pManager; + } + + TEST(PipeManagerOutputTest, StdOutMultiToWide) + { + PipeOutputManager* pManager = new PipeOutputManager(true); + + pManager->Start(); + fprintf(stdout, "test"); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_STREQ(output.c_str(), L"test"); + delete pManager; + } + + TEST(PipeManagerOutputTest, StdErr) + { + PCWSTR expected = L"test"; + + PipeOutputManager* pManager = new PipeOutputManager(); + + pManager->Start(); + fwprintf(stderr, expected); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_STREQ(output.c_str(), expected); + delete pManager; + } + + TEST(PipeManagerOutputTest, CheckMaxPipeSize) + { + std::wstring test; + for (int i = 0; i < 3000; i++) + { + test.append(L"hello world"); + } + + PipeOutputManager* pManager = new PipeOutputManager(); + + pManager->Start(); + wprintf(test.c_str()); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_EQ(output.size(), (DWORD)30000); + delete pManager; + } + + TEST(PipeManagerOutputTest, SetInvalidHandlesForErrAndOut) + { + auto m_fdPreviousStdOut = _dup(_fileno(stdout)); + auto m_fdPreviousStdErr = _dup(_fileno(stderr)); + + SetStdHandle(STD_ERROR_HANDLE, INVALID_HANDLE_VALUE); + SetStdHandle(STD_OUTPUT_HANDLE, INVALID_HANDLE_VALUE); + + PCWSTR expected = L"test"; + + PipeOutputManager* pManager = new PipeOutputManager(); + pManager->Start(); + + _dup2(m_fdPreviousStdOut, _fileno(stdout)); + _dup2(m_fdPreviousStdErr, _fileno(stderr)); + + // Test will fail if we didn't redirect stdout back to a file descriptor. + // This is because gtest relies on console output to know if a test succeeded or failed. + // If the output still points to a file/pipe, the test (and all other tests after it) will fail. + delete pManager; + } + + TEST(PipeManagerOutputTest, CreateDeleteMultipleTimesStdOutWorks) + { + for (int i = 0; i < 10; i++) + { + auto stdoutBefore = _fileno(stdout); + auto stderrBefore = _fileno(stderr); + PCWSTR expected = L"test"; + + PipeOutputManager* pManager = new PipeOutputManager(); + + pManager->Start(); + fwprintf(stdout, expected); + + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_STREQ(output.c_str(), expected); + ASSERT_EQ(stdoutBefore, _fileno(stdout)); + ASSERT_EQ(stderrBefore, _fileno(stderr)); + delete pManager; + } + // When this returns, we get an AV from gtest. + } + + TEST(PipeManagerOutputTest, CreateDeleteKeepOriginalStdErr) + { + for (int i = 0; i < 10; i++) + { + auto stdoutBefore = _fileno(stdout); + auto stderrBefore = _fileno(stderr); + auto stdoutHandle = GetStdHandle(STD_OUTPUT_HANDLE); + auto stderrHandle = GetStdHandle(STD_ERROR_HANDLE); + PCWSTR expected = L"test"; + + PipeOutputManager* pManager = new PipeOutputManager(); + + pManager->Start(); + fwprintf(stderr, expected); + pManager->Stop(); + + auto output = pManager->GetStdOutContent(); + ASSERT_STREQ(output.c_str(), expected); + ASSERT_EQ(stdoutBefore, _fileno(stdout)); + + ASSERT_EQ(stderrBefore, _fileno(stderr)); + + delete pManager; + } + + wprintf(L"Hello!"); + } +} + diff --git a/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp b/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d0a9e97fdbc4c05a3143d20242effc16cf0897c2 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/exception_handler_tests.cpp @@ -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. + +#include "stdafx.h" + +TEST(CaughtExceptionHResult, ReturnsOutOfMemoryForBadAlloc) +{ + HRESULT hr; + try + { + throw std::bad_alloc(); + } + catch(...) + { + hr = CaughtExceptionHResult(); + } + + EXPECT_EQ(E_OUTOFMEMORY, hr); +} + +TEST(CaughtExceptionHResult, ReturnsValueForSystemError) +{ + HRESULT hr; + try + { + throw std::system_error(E_INVALIDARG, std::system_category()); + } + catch(...) + { + hr = CaughtExceptionHResult(); + } + + EXPECT_EQ(E_INVALIDARG, hr); +} + +TEST(CaughtExceptionHResult, ReturnsUhandledExceptionForOtherExceptions) +{ + HRESULT hr; + try + { + throw E_INVALIDARG; + } + catch(...) + { + hr = CaughtExceptionHResult(); + } + + EXPECT_EQ(HRESULT_FROM_WIN32(ERROR_UNHANDLED_EXCEPTION), hr); +} diff --git a/src/IISIntegration/test/CommonLibTests/fakeclasses.h b/src/IISIntegration/test/CommonLibTests/fakeclasses.h new file mode 100644 index 0000000000000000000000000000000000000000..a6f4a3e1118ebd2f0d396bd7dcebaf1b5d2dc9bf --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/fakeclasses.h @@ -0,0 +1,190 @@ +// 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. + +#pragma once + +#include "gtest/gtest.h" +#include "gmock/gmock.h" +#include "InProcessOptions.h" + +class MockProperty : public IAppHostProperty +{ +public: + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject)); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG()); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG()); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Name, HRESULT(BSTR* pbstrValue)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Value, HRESULT(VARIANT * pVariant)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, put_Value, HRESULT(VARIANT value)); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT()); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_StringValue, HRESULT(BSTR* pbstrValue)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Exception, HRESULT(IAppHostPropertyException ** ppException)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT * pValue)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, SetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT value)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostPropertySchema ** ppSchema)); +}; + +class MockCollection : public IAppHostElementCollection +{ +public: + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject)); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG()); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG()); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT()); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostCollectionSchema** pSchema)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Count, HRESULT(DWORD * dwordElem)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, get_Item, HRESULT(VARIANT cIndex, IAppHostElement ** ppElement)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, AddElement, HRESULT(IAppHostElement * pElement, INT cPosition)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, DeleteElement, HRESULT(VARIANT cIndex)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, CreateNewElement, HRESULT(BSTR bstrElementName, IAppHostElement** ppElement)); +}; + +class MockElement : public IAppHostElement +{ +public: + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, QueryInterface, HRESULT(REFIID riid, void ** ppvObject)); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, AddRef, ULONG()); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Release, ULONG()); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Name, HRESULT(BSTR * pbstrName)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Collection, HRESULT(IAppHostElementCollection ** ppCollection)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Properties, HRESULT(IAppHostPropertyCollection ** ppProperties)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_ChildElements, HRESULT(IAppHostChildElementCollection ** ppElements)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT * pValue)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, SetMetadata, HRESULT(BSTR bstrMetadataType, VARIANT value)); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Schema, HRESULT(IAppHostElementSchema** pSchema)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetElementByName, HRESULT(BSTR bstrSubName, IAppHostElement ** ppElement)); + MOCK_METHOD2_WITH_CALLTYPE(__stdcall, GetPropertyByName, HRESULT(BSTR bstrSubName, IAppHostProperty ** ppProperty)); + MOCK_METHOD0_WITH_CALLTYPE(__stdcall, Clear, HRESULT()); + MOCK_METHOD1_WITH_CALLTYPE(__stdcall, get_Methods, HRESULT(IAppHostMethodCollection ** ppMethods)); +}; + +class MockHttpServer : public IHttpServer +{ + // Inherited via IHttpServer + virtual BOOL IsCommandLineLaunch(VOID) const override + { + return 0; + } + virtual PCWSTR GetAppPoolName(VOID) const override + { + return PCWSTR(); + } + virtual HRESULT AssociateWithThreadPool(HANDLE hHandle, LPOVERLAPPED_COMPLETION_ROUTINE completionRoutine) override + { + return E_NOTIMPL; + } + virtual VOID IncrementThreadCount(VOID) override + { + return VOID(); + } + virtual VOID DecrementThreadCount(VOID) override + { + return VOID(); + } + virtual VOID ReportUnhealthy(PCWSTR pszReasonString, HRESULT hrReason) override + { + return VOID(); + } + virtual VOID RecycleProcess(PCWSTR pszReason) override + { + return VOID(); + } + virtual IAppHostAdminManager * GetAdminManager(VOID) const override + { + return nullptr; + } + virtual HRESULT GetFileInfo(PCWSTR pszPhysicalPath, HANDLE hUserToken, PSID pSid, PCWSTR pszChangeNotificationPath, HANDLE hChangeNotificationToken, BOOL fCache, IHttpFileInfo ** ppFileInfo, IHttpTraceContext * pHttpTraceContext = NULL) override + { + return E_NOTIMPL; + } + virtual HRESULT FlushKernelCache(PCWSTR pszUrl) override + { + return E_NOTIMPL; + } + virtual HRESULT DoCacheOperation(CACHE_OPERATION cacheOperation, IHttpCacheKey * pCacheKey, IHttpCacheSpecificData ** ppCacheSpecificData, IHttpTraceContext * pHttpTraceContext = NULL) override + { + return E_NOTIMPL; + } + virtual GLOBAL_NOTIFICATION_STATUS NotifyCustomNotification(ICustomNotificationProvider * pCustomOutput) override + { + return GLOBAL_NOTIFICATION_STATUS(); + } + virtual IHttpPerfCounterInfo * GetPerfCounterInfo(VOID) override + { + return nullptr; + } + virtual VOID RecycleApplication(PCWSTR pszAppConfigPath) override + { + return VOID(); + } + virtual VOID NotifyConfigurationChange(PCWSTR pszPath) override + { + return VOID(); + } + virtual VOID NotifyFileChange(PCWSTR pszFileName) override + { + return VOID(); + } + virtual IDispensedHttpModuleContextContainer * DispenseContainer(VOID) override + { + return nullptr; + } + virtual HRESULT AddFragmentToCache(HTTP_DATA_CHUNK * pDataChunk, PCWSTR pszFragmentName) override + { + return E_NOTIMPL; + } + virtual HRESULT ReadFragmentFromCache(PCWSTR pszFragmentName, BYTE * pvBuffer, DWORD cbSize, DWORD * pcbCopied) override + { + return E_NOTIMPL; + } + virtual HRESULT RemoveFragmentFromCache(PCWSTR pszFragmentName) override + { + return E_NOTIMPL; + } + virtual HRESULT GetWorkerProcessSettings(IWpfSettings ** ppWorkerProcessSettings) override + { + return E_NOTIMPL; + } + virtual HRESULT GetProtocolManagerCustomInterface(PCWSTR pProtocolManagerDll, PCWSTR pProtocolManagerDllInitFunction, DWORD dwCustomInterfaceId, PVOID * ppCustomInterface) override + { + return E_NOTIMPL; + } + virtual BOOL SatisfiesPrecondition(PCWSTR pszPrecondition, BOOL * pfUnknownPrecondition = NULL) const override + { + return 0; + } + virtual IHttpTraceContext * GetTraceContext(VOID) const override + { + return nullptr; + } + virtual HRESULT RegisterFileChangeMonitor(PCWSTR pszPath, HANDLE hToken, IHttpFileMonitor ** ppFileMonitor) override + { + return E_NOTIMPL; + } + virtual HRESULT GetExtendedInterface(HTTP_SERVER_INTERFACE_VERSION version, PVOID * ppInterface) override + { + return E_NOTIMPL; + } +}; + + +class MockHttpApplication: public IHttpApplication +{ +public: + MOCK_CONST_METHOD0(GetApplicationPhysicalPath, PCWSTR ()); + MOCK_CONST_METHOD0(GetApplicationId, PCWSTR ()); + MOCK_CONST_METHOD0(GetAppConfigPath, PCWSTR ()); + MOCK_METHOD0(GetModuleContextContainer, IHttpModuleContextContainer* ()); +}; + +class MockInProcessOptions : public InProcessOptions +{ +public: + static + MockInProcessOptions* + CreateConfig() + { + return new MockInProcessOptions; + } +}; + diff --git a/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp b/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..01c9541429cd68ad49151f5f61ef4e18a6df02fd --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/hostfxr_utility_tests.cpp @@ -0,0 +1,122 @@ +// 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. + +#include "stdafx.h" +#include <filesystem> +#include <vector> +#include <string> +#include "hostfxr_utility.h" +#include "Environment.h" + +TEST(ParseHostFxrArguments, BasicHostFxrArguments) +{ + std::vector<std::wstring> bstrArray; + + HOSTFXR_UTILITY::AppendArguments( + L"exec \"test.dll\"", // args + L"invalid", // physical path to application + bstrArray); // args array. + + EXPECT_EQ(2, bstrArray.size()); + ASSERT_STREQ(L"exec", bstrArray[0].c_str()); + ASSERT_STREQ(L"test.dll", bstrArray[1].c_str()); +} + +TEST(ParseHostFxrArguments, NoExecProvided) +{ + std::vector<std::wstring> bstrArray; + + HOSTFXR_UTILITY::AppendArguments( + L"test.dll", // args + L"ignored", // physical path to application + bstrArray); // args array. + + EXPECT_EQ(1, bstrArray.size()); + ASSERT_STREQ(L"test.dll", bstrArray[0].c_str()); +} + +TEST(ParseHostFxrArguments, ConvertDllToAbsolutePath) +{ + std::vector<std::wstring> bstrArray; + // we need to use existing dll so let's use ntdll that we know exists everywhere + auto system32 = Environment::ExpandEnvironmentVariables(L"%WINDIR%\\System32"); + HOSTFXR_UTILITY::AppendArguments( + L"exec \"ntdll.dll\"", // args + system32, // physical path to application + bstrArray, // args array. + true); // expandDllPaths + + EXPECT_EQ(2, bstrArray.size()); + ASSERT_STREQ(L"exec", bstrArray[0].c_str()); + ASSERT_STREQ((system32 + L"\\ntdll.dll").c_str(), bstrArray[1].c_str()); +} + +TEST(ParseHostFxrArguments, ProvideNoArgs_InvalidArgs) +{ + std::vector<std::wstring> bstrArray; + std::filesystem::path struHostFxrDllLocation; + std::filesystem::path struExeLocation; + + EXPECT_THROW(HOSTFXR_UTILITY::GetHostFxrParameters( + L"dotnet", // processPath + L"some\\path", // application physical path, ignored. + L"", //arguments + struHostFxrDllLocation, + struExeLocation, + bstrArray), // args array. + InvalidOperationException); +} + +TEST(GetAbsolutePathToDotnetFromProgramFiles, BackupWorks) +{ + STRU struAbsolutePathToDotnet; + BOOL fDotnetInProgramFiles; + BOOL is64Bit; + BOOL fIsWow64 = FALSE; + SYSTEM_INFO systemInfo; + IsWow64Process(GetCurrentProcess(), &fIsWow64); + if (fIsWow64) + { + is64Bit = FALSE; + } + else + { + GetNativeSystemInfo(&systemInfo); + is64Bit = systemInfo.wProcessorArchitecture == PROCESSOR_ARCHITECTURE_AMD64; + } + + if (is64Bit) + { + fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files/dotnet/dotnet.exe"); + } + else + { + fDotnetInProgramFiles = std::filesystem::is_regular_file(L"C:/Program Files (x86)/dotnet/dotnet.exe"); + } + + auto dotnetPath = HOSTFXR_UTILITY::GetAbsolutePathToDotnetFromProgramFiles(); + if (fDotnetInProgramFiles) + { + EXPECT_TRUE(dotnetPath.has_value()); + } + else + { + EXPECT_FALSE(dotnetPath.has_value()); + } +} + +TEST(GetHostFxrArguments, InvalidParams) +{ + std::vector<std::wstring> bstrArray; + std::filesystem::path struHostFxrDllLocation; + std::filesystem::path struExeLocation; + + EXPECT_THROW(HOSTFXR_UTILITY::GetHostFxrParameters( + L"bogus", // processPath + L"", // application physical path, ignored. + L"ignored", //arguments + struHostFxrDllLocation, + struExeLocation, + bstrArray), // args array. + InvalidOperationException); +} diff --git a/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp b/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..d2ec985723bbdd67c6350e9c470a39de3d9c4d13 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/inprocess_application_tests.cpp @@ -0,0 +1,85 @@ +// 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. + +#include "stdafx.h" + +#include <array> +#include "inprocessapplication.h" +#include "fakeclasses.h" + +using ::testing::_; +using ::testing::NiceMock; + +// Externals defined in inprocess +BOOL g_fProcessDetach; +HANDLE g_hEventLog; + +namespace InprocessTests +{ + TEST(InProcessTest, NoNullRefForExePath) + { + MockHttpServer server; + NiceMock<MockHttpApplication> application; + + ON_CALL(application, GetApplicationPhysicalPath()) + .WillByDefault(testing::Return(L"Some path")); + + ON_CALL(application, GetAppConfigPath()) + .WillByDefault(testing::Return(L"")); + + ON_CALL(application, GetApplicationId()) + .WillByDefault(testing::Return(L"")); + + auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig()); + + std::wstring exePath(L"hello"); + + std::array<APPLICATION_PARAMETER, 1> parameters{ + {"InProcessExeLocation", exePath.data()} + }; + + IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), parameters.data(), 1); + + ASSERT_STREQ(app->QueryExeLocation().c_str(), L"hello"); + } + + TEST(InProcessTest, GeneratesVirtualPath) + { + MockHttpServer server; + NiceMock<MockHttpApplication> application; + + ON_CALL(application, GetApplicationPhysicalPath()) + .WillByDefault(testing::Return(L"Some path")); + + ON_CALL(application, GetAppConfigPath()) + .WillByDefault(testing::Return(L"SECTION1/SECTION2/SECTION3/SECTION4/SECTION5")); + + ON_CALL(application, GetApplicationId()) + .WillByDefault(testing::Return(L"")); + + auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig()); + IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), nullptr, 0); + + ASSERT_STREQ(app->QueryApplicationVirtualPath().c_str(), L"/SECTION5"); + } + + TEST(InProcessTest, GeneratesVirtualPathForDefaultApp) + { + MockHttpServer server; + NiceMock<MockHttpApplication> application; + + ON_CALL(application, GetApplicationPhysicalPath()) + .WillByDefault(testing::Return(L"Some path")); + + ON_CALL(application, GetAppConfigPath()) + .WillByDefault(testing::Return(L"SECTION1/SECTION2/SECTION3/SECTION4")); + + ON_CALL(application, GetApplicationId()) + .WillByDefault(testing::Return(L"")); + + auto requestHandlerConfig = std::unique_ptr<InProcessOptions>(MockInProcessOptions::CreateConfig()); + IN_PROCESS_APPLICATION *app = new IN_PROCESS_APPLICATION(server, application, std::move(requestHandlerConfig), nullptr, 0); + + ASSERT_STREQ(app->QueryApplicationVirtualPath().c_str(), L"/"); + } +} diff --git a/src/IISIntegration/test/CommonLibTests/main.cpp b/src/IISIntegration/test/CommonLibTests/main.cpp new file mode 100644 index 0000000000000000000000000000000000000000..1ad0a10ccdd38811f02a826a1cb604b9b4035dee --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/main.cpp @@ -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. + +#include "stdafx.h" + +DECLARE_DEBUG_PRINT_OBJECT2("tests", ASPNETCORE_DEBUG_FLAG_INFO | ASPNETCORE_DEBUG_FLAG_CONSOLE); + +int wmain(int argc, wchar_t* argv[]) +{ + ::testing::InitGoogleTest(&argc, argv); + RUN_ALL_TESTS(); +} diff --git a/src/IISIntegration/test/CommonLibTests/stdafx.h b/src/IISIntegration/test/CommonLibTests/stdafx.h new file mode 100644 index 0000000000000000000000000000000000000000..4b9ac7cd27890f15590dfb43b3a97e60607dfc32 --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/stdafx.h @@ -0,0 +1,59 @@ +// 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 WIN32_LEAN_AND_MEAN + +#include <Windows.h> +#include <atlbase.h> +#include <pdh.h> +#include <vector> +#include <Shlobj.h> +#include <httpserv.h> +#include <winhttp.h> +#include <httptrace.h> +#include <cstdlib> +#include <wchar.h> +#include <io.h> +#include <stdio.h> +#include <filesystem> +#include <fstream> + +#include <hashfn.h> +#include <hashtable.h> +#include "stringa.h" +#include "stringu.h" +#include "dbgutil.h" +#include "ahutil.h" +#include "multisz.h" +#include "multisza.h" +#include "base64.h" +#include <listentry.h> +#include <datetime.h> +#include <reftrace.h> +#include <acache.h> +#include <time.h> + +#include "stringu.h" +#include "stringa.h" +#include "multisz.h" +#include "dbgutil.h" +#include "hashfn.h" + +#include "requesthandler_config.h" +#include "hostfxr_utility.h" +#include "config_utility.h" +#include "environmentvariablehash.h" +#include "iapplication.h" +#include "debugutil.h" +#include "requesthandler.h" +#include "resources.h" +#include "aspnetcore_msg.h" +#include "Helpers.h" +#include "GlobalVersionUtility.h" + +#undef assert // Macro redefinition in IISLib. +#include "gtest/gtest.h" +#include "fakeclasses.h" + diff --git a/src/IISIntegration/test/CommonLibTests/utility_tests.cpp b/src/IISIntegration/test/CommonLibTests/utility_tests.cpp new file mode 100644 index 0000000000000000000000000000000000000000..ee69d790543ad3ba11178935fe10119e7f013c6d --- /dev/null +++ b/src/IISIntegration/test/CommonLibTests/utility_tests.cpp @@ -0,0 +1,75 @@ +// 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. + +#include "stdafx.h" +#include "Environment.h" +#include "StringHelpers.h" + +TEST(PassUnexpandedEnvString, ExpandsResult) +{ + HRESULT hr = S_OK; + PCWSTR unexpandedString = L"ANCM_TEST_ENV_VAR"; + PCWSTR unexpandedStringValue = L"foobar"; + STRU struExpandedString; + SetEnvironmentVariable(L"ANCM_TEST_ENV_VAR", unexpandedStringValue); + + hr = struExpandedString.CopyAndExpandEnvironmentStrings(L"%ANCM_TEST_ENV_VAR%"); + EXPECT_EQ(hr, S_OK); + EXPECT_STREQ(L"foobar", struExpandedString.QueryStr()); +} + +TEST(PassUnexpandedEnvString, LongStringExpandsResults) +{ + HRESULT hr = S_OK; + PCWSTR unexpandedString = L"ANCM_TEST_ENV_VAR_LONG"; + STRU struStringValue; + STACK_STRU(struExpandedString, MAX_PATH); + + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + struStringValue.Append(L"TestValueThatIsLongerThan256CharactersLongToTriggerResize"); + + SetEnvironmentVariable(unexpandedString, struStringValue.QueryStr()); + + hr = struExpandedString.CopyAndExpandEnvironmentStrings(L"%ANCM_TEST_ENV_VAR_LONG%"); + EXPECT_EQ(hr, S_OK); + EXPECT_EQ(struStringValue.QueryCCH(), struExpandedString.QueryCCH()); + // The values are exactly the same, however EXPECT_EQ is returning false. + //EXPECT_EQ(struStringValue.QueryStr(), struExpandedString.QueryStr()); + EXPECT_STREQ(struStringValue.QueryStr(), struExpandedString.QueryStr()); +} + + +TEST(GetEnvironmentVariableValue, ReturnsCorrectLenght) +{ + SetEnvironmentVariable(L"RANDOM_ENV_VAR_1", L"test"); + + auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_1"); + EXPECT_TRUE(result.has_value()); + EXPECT_EQ(result.value().length(), 4); + EXPECT_STREQ(result.value().c_str(), L"test"); +} + + +TEST(GetEnvironmentVariableValue, ReturnsNulloptWhenNotFound) +{ + auto result = Environment::GetEnvironmentVariableValue(L"RANDOM_ENV_VAR_2"); + EXPECT_FALSE(result.has_value()); +} + +TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeString) +{ + std::string testString = "test"; + auto result = format(testString); + EXPECT_EQ(testString.size(), result.size()); +} + +TEST(CheckStringHelpers, FormatWithoutContentDoesNotIncreaseSizeWstring) +{ + std::wstring testString = L"test"; + auto result = format(testString); + EXPECT_EQ(testString.size(), result.size()); +} diff --git a/src/IISIntegration/test/Directory.Build.props b/src/IISIntegration/test/Directory.Build.props new file mode 100644 index 0000000000000000000000000000000000000000..edfd666254558b9d6b005d104d93a620fee1a3a7 --- /dev/null +++ b/src/IISIntegration/test/Directory.Build.props @@ -0,0 +1,16 @@ +<Project> + <Import Project="..\Directory.Build.props" /> + + <PropertyGroup> + <!-- These tests are remaining at netcoreapp2.2 because the Benchmarks and functional tests use the same websites. + We must leave the benchmarks at 2.1, and if you try to import a project that uses 22 to a 21 project it complains. --> + <DeveloperBuildTestTfms>netcoreapp2.2</DeveloperBuildTestTfms> + <StandardTestTfms>$(DeveloperBuildTestTfms)</StandardTestTfms> + <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' ">$(StandardTestTfms)</StandardTestTfms> + <StandardTestTfms Condition=" '$(DeveloperBuild)' != 'true' AND '$(OS)' == 'Windows_NT' ">$(StandardTestTfms);net461</StandardTestTfms> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Internal.AspNetCore.Sdk" PrivateAssets="All" Version="$(InternalAspNetCoreSdkPackageVersion)" /> + </ItemGroup> +</Project> diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..2e4a7b1c4062c58f942d8b35540558eee34c4704 --- /dev/null +++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/BackwardsCompatibilityTests.cs @@ -0,0 +1,39 @@ +// 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; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; +using Xunit.Sdk; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class BackwardsCompatibilityTests : FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public BackwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task CheckBackwardsCompatibilityIsUsed() + { + var response = await _fixture.Client.GetAsync("/HelloWorld"); + var handles = _fixture.DeploymentResult.HostProcess.Modules; + + foreach (ProcessModule handle in handles) + { + if (handle.ModuleName == "aspnetcorev2.dll") + { + Assert.Equal("12.2.18287.0", handle.FileVersionInfo.FileVersion); + return; + } + } + throw new XunitException($"Could not find aspnetcorev2.dll loaded in process {_fixture.DeploymentResult.HostProcess.ProcessName}"); + } + } +} diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs new file mode 100644 index 0000000000000000000000000000000000000000..5c6f3739a4d02f0d15b48090bfbcb34c79eb665c --- /dev/null +++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/DeployerSelector.cs @@ -0,0 +1,14 @@ +// 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.Server.IntegrationTesting; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public static class DeployerSelector + { + public static ServerType ServerType => ServerType.IIS; + public static bool IsBackwardsCompatiblityTest => true; + public static bool IsForwardsCompatibilityTest => false; + } +} diff --git a/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..c819a03ab19ac3a3f0b90872020cc779b8f4a01d --- /dev/null +++ b/src/IISIntegration/test/IIS.BackwardsCompatibility.FunctionalTests/IIS.BackwardsCompatibility.FunctionalTests.csproj @@ -0,0 +1,46 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <TestGroupName>IISBackwardsCompatibility.FunctionalTests</TestGroupName> + <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck> + </PropertyGroup> + + <ItemGroup> + <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" /> + <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" /> + <ProjectReference Include="..\WebSites\InProcessWebSite\InProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\Common.FunctionalTests\**\*.cs" /> + <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.AspNetCoreModule" Version="$(MicrosoftAspNetCoreAspNetCoreModuleStablePackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.AspNetCoreModuleV2" Version="$(MicrosoftAspNetCoreAspNetCoreModuleV2StablePackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs new file mode 100644 index 0000000000000000000000000000000000000000..bd7aabbe0f9ed3526396e7fffd105bd62d4ac392 --- /dev/null +++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/DeployerSelector.cs @@ -0,0 +1,14 @@ +// 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.Server.IntegrationTesting; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public static class DeployerSelector + { + public static ServerType ServerType => ServerType.IIS; + public static bool IsBackwardsCompatiblityTest => false; + public static bool IsForwardsCompatibilityTest => true; + } +} diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..5f4ebb5608d52f4b0adf31bd49133dc226919a8c --- /dev/null +++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/ForwardsCompatibilityTests.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.Diagnostics; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; +using Xunit.Sdk; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + public class ForwardsCompatibilityTests : FixtureLoggedTest + { + private readonly IISTestSiteFixture _fixture; + + public ForwardsCompatibilityTests(IISTestSiteFixture fixture) : base(fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task CheckForwardsCompatibilityIsUsed() + { + var response = await _fixture.Client.GetAsync("/HelloWorld"); + var handles = _fixture.DeploymentResult.HostProcess.Modules; + foreach (ProcessModule handle in handles) + { + if (handle.ModuleName == "aspnetcorev2_inprocess.dll") + { + Assert.Equal("12.2.18287.0", handle.FileVersionInfo.FileVersion); + return; + } + } + throw new XunitException($"Could not find aspnetcorev2_inprocess.dll loaded in process {_fixture.DeploymentResult.HostProcess.ProcessName}"); + } + } +} diff --git a/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..929f6ec6b033fb28cec43af5cb76ebb5a07cbc63 --- /dev/null +++ b/src/IISIntegration/test/IIS.ForwardsCompatibility.FunctionalTests/IIS.ForwardsCompatibility.FunctionalTests.csproj @@ -0,0 +1,45 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <TestGroupName>IISForwardsCompatibility.FunctionalTests</TestGroupName> + <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck> + </PropertyGroup> + + <ItemGroup> + <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" /> + <ProjectReference Include="..\WebSites\InProcessForwardsCompatWebSite\InProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\Common.FunctionalTests\**\*.cs" /> + <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" /> + </ItemGroup> + + <Import Project="..\..\build\functional-test-assets.targets" /> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs new file mode 100644 index 0000000000000000000000000000000000000000..f2e1be321edcaee83a3eed7ebe8a52336b4f7588 --- /dev/null +++ b/src/IISIntegration/test/IIS.FunctionalTests/DeployerSelector.cs @@ -0,0 +1,14 @@ +// 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.Server.IntegrationTesting; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public static class DeployerSelector + { + public static ServerType ServerType => ServerType.IIS; + public static bool IsBackwardsCompatiblityTest => false; + public static bool IsForwardsCompatibilityTest => false; + } +} diff --git a/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj b/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..62dec62e60d98f1b70fd54bd1a4abab87371e553 --- /dev/null +++ b/src/IISIntegration/test/IIS.FunctionalTests/IIS.FunctionalTests.csproj @@ -0,0 +1,46 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <TestGroupName>IIS.FunctionalTests</TestGroupName> + <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck> + </PropertyGroup> + + <ItemGroup> + <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" /> + <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" /> + <ProjectReference Include="..\WebSites\InProcessWebSite\InProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\OutOfProcessWebSite\OutOfProcessWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + <ProjectReference Include="..\WebSites\StressTestWebSite\StressTestWebSite.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\Common.FunctionalTests\**\*.cs" /> + <Compile Include="..\IIS.Shared.FunctionalTests\**\*.cs" /> + </ItemGroup> + + <Import Project="..\..\build\functional-test-assets.targets" /> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..35f10b13ab1f7766d3939fdce04b70a913b9e430 --- /dev/null +++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Inprocess/StdOutRedirectionTests.cs @@ -0,0 +1,150 @@ +// 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 Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Newtonsoft.Json; +using Xunit; + +namespace IIS.FunctionalTests.Inprocess +{ + [Collection(PublishedSitesCollection.Name)] + public class StdOutRedirectionTests : LogFileTestBase + { + private readonly PublishedSitesFixture _fixture; + + public StdOutRedirectionTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + [SkipIfDebug] + public async Task FrameworkNotFoundExceptionLogged_Pipe() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + + var deploymentResult = await DeployAsync(deploymentParameters); + + Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, + "The specified framework 'Microsoft.NETCore.App', version '2.9.9' was not found."); + } + + [ConditionalFact] + [SkipIfDebug] + public async Task FrameworkNotFoundExceptionLogged_File() + { + var deploymentParameters = + _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + Helpers.ModifyFrameworkVersionInRuntimeConfig(deploymentResult); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + var contents = Helpers.ReadAllTextFromFile(Helpers.GetExpectedLogName(deploymentResult, _logFolderPath), Logger); + var expectedString = "The specified framework 'Microsoft.NETCore.App', version '2.9.9' was not found."; + EventLogHelpers.VerifyEventLogEvent(deploymentResult, expectedString); + Assert.Contains(expectedString, contents); + } + + [ConditionalFact] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [SkipIfDebug] + public async Task EnableCoreHostTraceLogging_TwoLogFilesCreated() + { + var deploymentParameters = + _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.TransformArguments((a, _) => $"{a} CheckLargeStdOutWrites"); + + deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1"; + + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + var fileInDirectory = Directory.GetFiles(_logFolderPath).Single(); + var contents = Helpers.ReadAllTextFromFile(fileInDirectory, Logger); + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr"); + Assert.Contains("Invoked hostfxr", contents); + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [SkipIfDebug] + [InlineData("CheckLargeStdErrWrites")] + [InlineData("CheckLargeStdOutWrites")] + [InlineData("CheckOversizedStdErrWrites")] + [InlineData("CheckOversizedStdOutWrites")] + public async Task EnableCoreHostTraceLogging_PipeCaptureNativeLogs(string path) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1"; + deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr"); + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.PoolEnvironmentVariables)] + [SkipIfDebug] + [InlineData("CheckLargeStdErrWrites")] + [InlineData("CheckLargeStdOutWrites")] + [InlineData("CheckOversizedStdErrWrites")] + [InlineData("CheckOversizedStdOutWrites")] + public async Task EnableCoreHostTraceLogging_FileCaptureNativeLogs(string path) + { + var deploymentParameters = + _fixture.GetBaseDeploymentParameters(_fixture.InProcessTestSite, publish: true); + deploymentParameters.EnvironmentVariables["COREHOST_TRACE"] = "1"; + deploymentParameters.TransformArguments((a, _) => $"{a} {path}"); + + deploymentParameters.EnableLogging(_logFolderPath); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/HelloWorld"); + Assert.False(response.IsSuccessStatusCode); + + StopServer(); + + var fileInDirectory = Directory.GetFiles(_logFolderPath).First(); + var contents = Helpers.ReadAllTextFromFile(fileInDirectory, Logger); + + EventLogHelpers.VerifyEventLogEvent(deploymentResult, "Invoked hostfxr"); + Assert.Contains("Invoked hostfxr", contents); + } + } +} diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..a054225ac52cf2c4c59829f192853156e6ac6ece --- /dev/null +++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/MofFileTests.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 System.Diagnostics; +using System.IO; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Testing; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace IIS.FunctionalTests +{ + public class MofFileTests + { + [ConditionalFact] + [OSSkipCondition(OperatingSystems.Linux | OperatingSystems.MacOSX)] + [RequiresIIS(IISCapability.TracingModule)] + public void CheckMofFile() + { + var path = Path.Combine(TestPathUtilities.GetSolutionRootDirectory("IISIntegration"), "src", "aspnetcoremodulev2", "aspnetcore", "ancm.mof"); + var process = Process.Start("mofcomp.exe", path); + process.WaitForExit(); + Assert.Equal(0, process.ExitCode); + } + } +} diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..b26f48a8159df06f5af2735263bc80cdeec3a14f --- /dev/null +++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +// 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.Server.IISIntegration.FunctionalTests; +using Microsoft.Extensions.Logging.Testing; +using Xunit; + +[assembly: CollectionBehavior(DisableTestParallelization = true)] +[assembly: RequiresIIS] +[assembly: ShortClassName] diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..cfbbf7048676a886f47145fa1304fe0c84d6933d --- /dev/null +++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/RequiresIISAttribute.cs @@ -0,0 +1,150 @@ +// 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.Principal; +using System.Xml.Linq; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Win32; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class RequiresIISAttribute : Attribute, ITestCondition + { + private static readonly (IISCapability Capability, string DllName)[] Modules = + { + (IISCapability.Websockets, "iiswsock.dll"), + (IISCapability.WindowsAuthentication, "authsspi.dll"), + (IISCapability.DynamicCompression, "compdyn.dll"), + (IISCapability.ApplicationInitialization, "warmup.dll"), + (IISCapability.TracingModule, "iisetw.dll"), + (IISCapability.FailedRequestTracingModule, "iisfreb.dll"), + (IISCapability.BasicAuthentication, "authbas.dll"), + }; + + private static readonly bool _isMetStatic; + private static readonly string _skipReasonStatic; + private static readonly bool _poolEnvironmentVariablesAvailable; + private static readonly IISCapability _modulesAvailable; + + static RequiresIISAttribute() + { + if (Environment.GetEnvironmentVariable("ASPNETCORE_TEST_SKIP_IIS") == "true") + { + _skipReasonStatic = "Test skipped using ASPNETCORE_TEST_SKIP_IIS environment variable"; + return; + } + + if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) + { + _skipReasonStatic = "IIS tests can only be run on Windows"; + return; + } + + var identity = WindowsIdentity.GetCurrent(); + var principal = new WindowsPrincipal(identity); + if (!principal.IsInRole(WindowsBuiltInRole.Administrator)) + { + _skipReasonStatic += "The current console is not running as admin."; + return; + } + + if (!File.Exists(Path.Combine(Environment.SystemDirectory, "inetsrv", "w3wp.exe"))) + { + _skipReasonStatic += "The machine does not have IIS installed."; + return; + } + + var ancmConfigPath = Path.Combine(Environment.SystemDirectory, "inetsrv", "config", "schema", "aspnetcore_schema_v2.xml"); + + if (!File.Exists(ancmConfigPath)) + { + _skipReasonStatic = "IIS Schema is not installed."; + return; + } + + XDocument ancmConfig; + + try + { + ancmConfig = XDocument.Load(ancmConfigPath); + } + catch + { + _skipReasonStatic = "Could not read ANCM schema configuration"; + return; + } + + _isMetStatic = ancmConfig + .Root + .Descendants("attribute") + .Any(n => "hostingModel".Equals(n.Attribute("name")?.Value, StringComparison.Ordinal)); + + _skipReasonStatic = _isMetStatic ? null : "IIS schema needs to be upgraded to support ANCM."; + + foreach (var module in Modules) + { + if (File.Exists(Path.Combine(Environment.SystemDirectory, "inetsrv", module.DllName))) + { + _modulesAvailable |= module.Capability; + } + } + + var iisRegistryKey = Registry.LocalMachine.OpenSubKey(@"Software\Microsoft\InetStp", writable: false); + if (iisRegistryKey == null) + { + _poolEnvironmentVariablesAvailable = false; + } + else + { + var majorVersion = (int)iisRegistryKey.GetValue("MajorVersion", -1); + var minorVersion = (int)iisRegistryKey.GetValue("MinorVersion", -1); + var version = new Version(majorVersion, minorVersion); + _poolEnvironmentVariablesAvailable = version >= new Version(10, 0); + } + } + + public RequiresIISAttribute() + : this(IISCapability.None) { } + + public RequiresIISAttribute(IISCapability capabilities) + { + IsMet = _isMetStatic; + SkipReason = _skipReasonStatic; + if (capabilities.HasFlag(IISCapability.PoolEnvironmentVariables)) + { + IsMet &= _poolEnvironmentVariablesAvailable; + if (!_poolEnvironmentVariablesAvailable) + { + SkipReason += "The machine does allow for setting environment variables on application pools."; + } + } + + if (capabilities.HasFlag(IISCapability.ShutdownToken)) + { + IsMet = false; + SkipReason += "https://github.com/aspnet/IISIntegration/issues/1074"; + } + + foreach (var module in Modules) + { + if (capabilities.HasFlag(module.Capability)) + { + var available = _modulesAvailable.HasFlag(module.Capability); + IsMet &= available; + if (!available) + { + SkipReason += $"The machine does have {module.Capability} available."; + } + } + } + } + + public bool IsMet { get; } + public string SkipReason { get; } + } +} diff --git a/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs b/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..875b5b13be8db4d091763b09849b8661749c1f8c --- /dev/null +++ b/src/IISIntegration/test/IIS.Shared.FunctionalTests/ServicesTests.cs @@ -0,0 +1,96 @@ +// 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.ServiceProcess; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace IIS.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class ApplicationInitializationTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public ApplicationInitializationTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.ApplicationInitialization)] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task ApplicationPreloadStartsApp(HostingModel hostingModel) + { + // This test often hits a memory leak in warmup.dll module, it has been reported to IIS team + using (AppVerifier.Disable(DeployerSelector.ServerType, 0x900)) + { + var baseDeploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true); + baseDeploymentParameters.TransformArguments( + (args, contentRoot) => $"{args} CreateFile \"{Path.Combine(contentRoot, "Started.txt")}\""); + EnablePreload(baseDeploymentParameters); + + var result = await DeployAsync(baseDeploymentParameters); + + await Helpers.Retry(async () => await File.ReadAllTextAsync(Path.Combine(result.ContentRoot, "Started.txt")), 10, 200); + StopServer(); + EventLogHelpers.VerifyEventLogEvent(result, EventLogHelpers.Started(result)); + } + } + + [ConditionalTheory] + [RequiresIIS(IISCapability.ApplicationInitialization)] + [InlineData(HostingModel.InProcess)] + [InlineData(HostingModel.OutOfProcess)] + public async Task ApplicationInitializationPageIsRequested(HostingModel hostingModel) + { + // This test often hits a memory leak in warmup.dll module, it has been reported to IIS team + using (AppVerifier.Disable(DeployerSelector.ServerType, 0x900)) + { + var baseDeploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true); + EnablePreload(baseDeploymentParameters); + + baseDeploymentParameters.ServerConfigActionList.Add( + (config, _) => { + config + .RequiredElement("system.webServer") + .GetOrAdd("applicationInitialization") + .GetOrAdd("add", "initializationPage", "/CreateFile"); + }); + + var result = await DeployAsync(baseDeploymentParameters); + + await Helpers.Retry(async () => await File.ReadAllTextAsync(Path.Combine(result.ContentRoot, "Started.txt")), 10, 200); + StopServer(); + EventLogHelpers.VerifyEventLogEvent(result, EventLogHelpers.Started(result)); + } + } + + private static void EnablePreload(IISDeploymentParameters baseDeploymentParameters) + { + baseDeploymentParameters.EnsureSection("applicationInitialization", "system.webServer"); + baseDeploymentParameters.ServerConfigActionList.Add( + (config, _) => { + + config + .RequiredElement("system.applicationHost") + .RequiredElement("sites") + .RequiredElement("site") + .RequiredElement("application") + .SetAttributeValue("preloadEnabled", true); + }); + + baseDeploymentParameters.EnableModule("ApplicationInitializationModule", "%IIS_BIN%\\warmup.dll"); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config b/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config new file mode 100644 index 0000000000000000000000000000000000000000..5e994d28551dacdd79bd73ae1ac335882ca9ac70 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/AppHostConfig/HostableWebCore.config @@ -0,0 +1,198 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!-- + + IIS configuration sections. + + For schema documentation, see + %windir%\system32\inetsrv\config\schema\IIS_schema.xml. + + Please make a backup of this file before making any changes to it. + +--> + +<configuration> + + <!-- + + The <configSections> section controls the registration of sections. + Section is the basic unit of deployment, locking, searching and + containment for configuration settings. + + Every section belongs to one section group. + A section group is a container of logically-related sections. + + Sections cannot be nested. + Section groups may be nested. + + <section + name="" [Required, Collection Key] [XML name of the section] + allowDefinition="Everywhere" [MachineOnly|MachineToApplication|AppHostOnly|Everywhere] [Level where it can be set] + overrideModeDefault="Allow" [Allow|Deny] [Default delegation mode] + allowLocation="true" [true|false] [Allowed in location tags] + /> + + The recommended way to unlock sections is by using a location tag: + <location path="Default Web Site" overrideMode="Allow"> + <system.webServer> + <asp /> + </system.webServer> + </location> + + --> + <configSections> + <sectionGroup name="system.applicationHost"> + <section name="applicationPools" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="configHistory" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="customMetadata" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="listenerAdapters" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="log" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="serviceAutoStartProviders" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="sites" overrideModeDefault="Allow" /> + <section name="webLimits" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + </sectionGroup> + + <sectionGroup name="system.webServer"> + <section name="asp" overrideModeDefault="Deny" /> + <section name="caching" overrideModeDefault="Allow" /> + <section name="aspNetCore" overrideModeDefault="Allow" /> + <section name="cgi" overrideModeDefault="Deny" /> + <section name="defaultDocument" overrideModeDefault="Allow" /> + <section name="directoryBrowse" overrideModeDefault="Allow" /> + <section name="fastCgi" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="globalModules" overrideModeDefault="Allow" /> + <section name="handlers" allowDefinition="MachineToApplication" overrideModeDefault="Allow" /> + <section name="httpCompression" overrideModeDefault="Allow" /> + <section name="httpErrors" overrideModeDefault="Allow" /> + <section name="httpLogging" overrideModeDefault="Deny" /> + <section name="httpProtocol" overrideModeDefault="Allow" /> + <section name="httpRedirect" overrideModeDefault="Allow" /> + <section name="httpTracing" overrideModeDefault="Deny" /> + <section name="isapiFilters" allowDefinition="MachineToApplication" overrideModeDefault="Deny" /> + <section name="modules" allowDefinition="MachineToApplication" overrideModeDefault="Deny" /> + <section name="applicationInitialization" allowDefinition="MachineToApplication" overrideModeDefault="Allow" /> + <section name="odbcLogging" overrideModeDefault="Deny" /> + <sectionGroup name="security"> + <section name="access" overrideModeDefault="Deny" /> + <section name="applicationDependencies" overrideModeDefault="Deny" /> + <sectionGroup name="authentication"> + <section name="anonymousAuthentication" overrideModeDefault="Deny" /> + <section name="basicAuthentication" overrideModeDefault="Deny" /> + <section name="clientCertificateMappingAuthentication" overrideModeDefault="Deny" /> + <section name="digestAuthentication" overrideModeDefault="Deny" /> + <section name="iisClientCertificateMappingAuthentication" overrideModeDefault="Deny" /> + <section name="windowsAuthentication" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="authorization" overrideModeDefault="Allow" /> + <section name="ipSecurity" overrideModeDefault="Deny" /> + <section name="dynamicIpSecurity" overrideModeDefault="Deny" /> + <section name="isapiCgiRestriction" allowDefinition="AppHostOnly" overrideModeDefault="Deny" /> + <section name="requestFiltering" overrideModeDefault="Allow" /> + </sectionGroup> + <section name="serverRuntime" overrideModeDefault="Deny" /> + <section name="serverSideInclude" overrideModeDefault="Deny" /> + <section name="staticContent" overrideModeDefault="Allow" /> + <sectionGroup name="tracing"> + <section name="traceFailedRequests" overrideModeDefault="Allow" /> + <section name="traceProviderDefinitions" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="urlCompression" overrideModeDefault="Allow" /> + <section name="validation" overrideModeDefault="Allow" /> + <sectionGroup name="webdav"> + <section name="globalSettings" overrideModeDefault="Deny" /> + <section name="authoring" overrideModeDefault="Deny" /> + <section name="authoringRules" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="webSocket" overrideModeDefault="Deny" /> + </sectionGroup> + <sectionGroup name="system.ftpServer"> + <section name="log" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="firewallSupport" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="caching" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + <section name="providerDefinitions" overrideModeDefault="Deny" /> + <sectionGroup name="security"> + <section name="ipSecurity" overrideModeDefault="Deny" /> + <section name="requestFiltering" overrideModeDefault="Deny" /> + <section name="authorization" overrideModeDefault="Deny" /> + <section name="authentication" overrideModeDefault="Deny" /> + </sectionGroup> + <section name="serverRuntime" overrideModeDefault="Deny" allowDefinition="AppHostOnly" /> + </sectionGroup> + </configSections> + + <system.applicationHost> + + <applicationPools> + <add name="DefaultAppPool" /> + <applicationPoolDefaults managedRuntimeVersion="v4.0"> + <processModel identityType="ApplicationPoolIdentity" /> + </applicationPoolDefaults> + </applicationPools> + + <!-- + + The <customMetadata> section is used internally by the Admin Base Objects + (ABO) Compatibility component. Please do not modify its content. + + --> + <customMetadata /> + + <!-- + + The <listenerAdapters> section defines the protocols with which the + Windows Process Activation Service (WAS) binds. + + --> + <listenerAdapters> + <add name="http" /> + </listenerAdapters> + + <log> + <centralBinaryLogFile enabled="false" /> + <centralW3CLogFile enabled="false" /> + </log> + + <sites> + <site name="Default Web Site" id="1"> + <application path="/"> + <virtualDirectory path="/" physicalPath="." /> + </application> + <bindings> + <binding protocol="http" bindingInformation="*:50691:localhost" /> + </bindings> + </site> + <applicationDefaults applicationPool="DefaultAppPool" /> + <virtualDirectoryDefaults allowSubDirConfig="true" /> + </sites> + + <webLimits /> + + </system.applicationHost> + + <system.webServer> + + <!-- + + The <globalModules> section defines all native-code modules. + To enable a module, specify it in the <modules> section. + + --> + <globalModules> + <add name="AnonymousAuthenticationModule" image="%windir%\System32\inetsrv\authanon.dll" /> + <add name="AspNetCoreModuleV2" image="aspnetcorev2.dll" /> + </globalModules> + + <handlers accessPolicy="Read, Script"> + <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> + </handlers> + + + <modules> + <add name="AnonymousAuthenticationModule" lockItem="true" /> + <add name="AspNetCoreModuleV2" lockItem="true" /> + </modules> + + <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" hostingModel="inprocess" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" /> + + </system.webServer> + +</configuration> diff --git a/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs b/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..dbe562aa7cf4242ee0c23090234fdd2c03b1b8db --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/ClientDisconnectTests.cs @@ -0,0 +1,302 @@ +// 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.Connections; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [SkipIfHostableWebCoreNotAvailable] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")] + public class ClientDisconnectTests : StrictTestServerTests + { + [ConditionalFact] + public async Task WritesSucceedAfterClientDisconnect() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var clientDisconnectedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + var data = new byte[1024]; + using (var testServer = await TestServer.Create( + async ctx => + { + requestStartedCompletionSource.SetResult(true); + await clientDisconnectedCompletionSource.Task; + for (var i = 0; i < 1000; i++) + { + await ctx.Response.Body.WriteAsync(data); + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await requestStartedCompletionSource.Task.DefaultTimeout(); + } + clientDisconnectedCompletionSource.SetResult(true); + + await requestCompletedCompletionSource.Task.DefaultTimeout(); + } + + AssertConnectionDisconnectLog(); + } + + [ConditionalFact] + public async Task WritesCancelledWhenUsingAbortedToken() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + Exception exception = null; + + var data = new byte[1]; + using (var testServer = await TestServer.Create(async ctx => + { + requestStartedCompletionSource.SetResult(true); + try + { + while (true) + { + await ctx.Response.Body.WriteAsync(data, ctx.RequestAborted); + } + } + catch (Exception e) + { + exception = e; + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + + await requestStartedCompletionSource.Task.DefaultTimeout(); + } + + await requestCompletedCompletionSource.Task.DefaultTimeout(); + + Assert.IsType<OperationCanceledException>(exception); + } + + AssertConnectionDisconnectLog(); + } + + [ConditionalFact] + public async Task ReadThrowsAfterClientDisconnect() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + Exception exception = null; + + var data = new byte[1024]; + using (var testServer = await TestServer.Create(async ctx => + { + requestStartedCompletionSource.SetResult(true); + try + { + await ctx.Request.Body.ReadAsync(data); + } + catch (Exception e) + { + exception = e; + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await requestStartedCompletionSource.Task.DefaultTimeout(); + } + + await requestCompletedCompletionSource.Task.DefaultTimeout(); + } + + Assert.IsType<ConnectionResetException>(exception); + Assert.Equal("The client has disconnected", exception.Message); + + AssertConnectionDisconnectLog(); + } + + [ConditionalFact] + public async Task WriterThrowsCancelledException() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + Exception exception = null; + var cancellationTokenSource = new CancellationTokenSource(); + + var data = new byte[1]; + using (var testServer = await TestServer.Create(async ctx => + { + requestStartedCompletionSource.SetResult(true); + try + { + while (true) + { + await ctx.Response.Body.WriteAsync(data, cancellationTokenSource.Token); + } + } + catch (Exception e) + { + exception = e; + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + + await requestStartedCompletionSource.Task.DefaultTimeout(); + cancellationTokenSource.Cancel(); + await requestCompletedCompletionSource.Task.DefaultTimeout(); + } + + Assert.IsType<OperationCanceledException>(exception); + } + } + + [ConditionalFact] + public async Task ReaderThrowsCancelledException() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + Exception exception = null; + var cancellationTokenSource = new CancellationTokenSource(); + + var data = new byte[1024]; + using (var testServer = await TestServer.Create(async ctx => + { + requestStartedCompletionSource.SetResult(true); + try + { + await ctx.Request.Body.ReadAsync(data, cancellationTokenSource.Token); + } + catch (Exception e) + { + exception = e; + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await requestStartedCompletionSource.Task.DefaultTimeout(); + cancellationTokenSource.Cancel(); + await requestCompletedCompletionSource.Task.DefaultTimeout(); + } + Assert.IsType<OperationCanceledException>(exception); + } + } + + [ConditionalFact] + public async Task ReaderThrowsResetExceptionOnInvalidBody() + { + var requestStartedCompletionSource = CreateTaskCompletionSource(); + var requestCompletedCompletionSource = CreateTaskCompletionSource(); + + Exception exception = null; + + var data = new byte[1024]; + using (var testServer = await TestServer.Create(async ctx => + { + requestStartedCompletionSource.SetResult(true); + try + { + await ctx.Request.Body.ReadAsync(data); + } + catch (Exception e) + { + exception = e; + } + + requestCompletedCompletionSource.SetResult(true); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await connection.Send( + "POST / HTTP/1.1", + "Transfer-Encoding: chunked", + "Host: localhost", + "Connection: close", + "", + ""); + + await requestStartedCompletionSource.Task; + await connection.Send( + "ZZZZZZZZZZZZZ"); + + await connection.Receive( + "HTTP/1.1 400 Bad Request", + "" + ); + + } + await requestCompletedCompletionSource.Task.DefaultTimeout(); + } + + Assert.IsType<ConnectionResetException>(exception); + Assert.Equal("The client has disconnected", exception.Message); + AssertConnectionDisconnectLog(); + } + + [ConditionalFact] + public async Task RequestAbortedIsTrippedWithoutIO() + { + var requestStarted = CreateTaskCompletionSource(); + var requestAborted = CreateTaskCompletionSource(); + + using (var testServer = await TestServer.Create( + async ctx => { + ctx.RequestAborted.Register(() => requestAborted.SetResult(true)); + requestStarted.SetResult(true); + await requestAborted.Task; + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await requestStarted.Task; + } + await requestAborted.Task; + } + + AssertConnectionDisconnectLog(); + } + + private void AssertConnectionDisconnectLog() + { + Assert.Single(TestSink.Writes, w => w.EventId.Name == "ConnectionDisconnect"); + } + + private static async Task SendContentLength1Post(TestConnection connection) + { + await connection.Send( + "POST / HTTP/1.1", + "Content-Length: 1", + "Host: localhost", + "Connection: close", + "", + ""); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs b/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..37e69b3a32d1efc44753cc22db6c254afb10a02e --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/ConnectionIdFeatureTests.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; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [SkipIfHostableWebCoreNotAvailable] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")] + public class HttpBodyControlFeatureTests : StrictTestServerTests + { + [ConditionalFact] + public async Task ThrowsOnSyncReadOrWrite() + { + Exception writeException = null; + Exception readException = null; + using (var testServer = await TestServer.Create( + ctx => { + var bodyControl = ctx.Features.Get<IHttpBodyControlFeature>(); + bodyControl.AllowSynchronousIO = false; + + try + { + ctx.Response.Body.Write(new byte[10]); + } + catch (Exception ex) + { + writeException = ex; + } + + try + { + ctx.Request.Body.Read(new byte[10]); + } + catch (Exception ex) + { + readException = ex; + } + + return Task.CompletedTask; + }, LoggerFactory)) + { + await testServer.HttpClient.GetStringAsync("/"); + } + + Assert.IsType<InvalidOperationException>(readException); + Assert.IsType<InvalidOperationException>(writeException); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs b/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..3d91c445caf7e5206c321d4f3000e82037a76716 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/HttpBodyControlFeatureTests.cs @@ -0,0 +1,31 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [SkipIfHostableWebCoreNotAvailable] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")] + public class ConnectionIdFeatureTests : StrictTestServerTests + { + [ConditionalFact] + public async Task ProvidesConnectionId() + { + string connectionId = null; + using (var testServer = await TestServer.Create(ctx => { + var connectionIdFeature = ctx.Features.Get<IHttpConnectionFeature>(); + connectionId = connectionIdFeature.ConnectionId; + return Task.CompletedTask; + }, LoggerFactory)) + { + await testServer.HttpClient.GetStringAsync("/"); + } + + Assert.NotNull(connectionId); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj b/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..3fdb2a53635127e9146a9453ee68a771ad25c60c --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/IIS.Tests.csproj @@ -0,0 +1,32 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + </PropertyGroup> + + <Import Project="..\..\build\functional-test-assets.targets" /> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IIS\Microsoft.AspNetCore.Server.IIS.csproj" /> + <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" /> + </ItemGroup> + + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + </ItemGroup> + + <ItemGroup> + <None Include="AppHostConfig\HostableWebCore.config" CopyToOutputDirectory="PreserveNewest" Link="%(FileName)%(Extension)" /> + <None Include="$(AspNetCoreModuleV2ShimDll)" Condition="$(PackNativeAssets) == 'true'" CopyToOutputDirectory="PreserveNewest" Link="%(FileName)%(Extension)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs b/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..c7ec472586fd8072d631038b532660c871484641 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/ResponseAbortTests.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.Threading.Tasks; +using Microsoft.AspNetCore.Connections; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [SkipIfHostableWebCoreNotAvailable] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")] + public class ResponseAbortTests : StrictTestServerTests + { + [ConditionalFact] + public async Task ClosesWithoutSendingAnything() + { + using (var testServer = await TestServer.Create( + ctx => { + ctx.Abort(); + return Task.CompletedTask; + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await connection.WaitForConnectionClose(); + } + } + } + + [ConditionalFact] + public async Task ClosesAfterDataSent() + { + var bodyReceived = CreateTaskCompletionSource(); + using (var testServer = await TestServer.Create( + async ctx => { + await ctx.Response.WriteAsync("Abort"); + await ctx.Response.Body.FlushAsync(); + await bodyReceived.Task.DefaultTimeout(); + ctx.Abort(); + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await connection.Receive( + "HTTP/1.1 200 OK", + ""); + await connection.ReceiveHeaders( + "Transfer-Encoding: chunked"); + + await connection.ReceiveChunk("Abort"); + bodyReceived.SetResult(true); + await connection.WaitForConnectionClose(); + } + } + } + + [ConditionalFact] + public async Task ReadsThrowAfterAbort() + { + Exception exception = null; + + using (var testServer = await TestServer.Create( + async ctx => { + ctx.Abort(); + try + { + var a = new byte[10]; + await ctx.Request.Body.ReadAsync(a); + } + catch (Exception e) + { + exception = e; + } + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await connection.WaitForConnectionClose(); + } + } + + Assert.IsType<ConnectionAbortedException>(exception); + } + + [ConditionalFact] + public async Task WritesNoopAfterAbort() + { + Exception exception = null; + + using (var testServer = await TestServer.Create( + async ctx => { + ctx.Abort(); + try + { + await ctx.Response.Body.WriteAsync(new byte[10]); + } + catch (Exception e) + { + exception = e; + } + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await connection.WaitForConnectionClose(); + } + } + + Assert.Null(exception); + } + + [ConditionalFact] + public async Task RequestAbortedIsTrippedAfterAbort() + { + bool tokenAborted = false; + using (var testServer = await TestServer.Create( + ctx => { + ctx.Abort(); + tokenAborted = ctx.RequestAborted.IsCancellationRequested; + return Task.CompletedTask; + }, LoggerFactory)) + { + using (var connection = testServer.CreateConnection()) + { + await SendContentLength1Post(connection); + await connection.WaitForConnectionClose(); + } + } + + Assert.True(tokenAborted); + } + + private static async Task SendContentLength1Post(TestConnection connection) + { + await connection.Send( + "POST / HTTP/1.1", + "Content-Length: 1", + "Host: localhost", + "", + ""); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs b/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..c8f62beedbd3a5cbd1f24e5fc29c8fee8a7d5cb5 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/StrictTestServerTests.cs @@ -0,0 +1,24 @@ +// 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.Threading.Tasks; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Logging.Testing; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class StrictTestServerTests: LoggedTest + { + public override void Dispose() + { + base.Dispose(); + Assert.DoesNotContain(TestSink.Writes, w => w.LogLevel > LogLevel.Information); + } + + protected static TaskCompletionSource<bool> CreateTaskCompletionSource() + { + return new TaskCompletionSource<bool>(TaskCreationOptions.RunContinuationsAsynchronously); + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/TestServerTest.cs b/src/IISIntegration/test/IIS.Tests/TestServerTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..40b538ea52a25c49207bfa99b03629d549d4b018 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/TestServerTest.cs @@ -0,0 +1,35 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Testing.xunit; +using Microsoft.Extensions.Logging.Testing; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [SkipIfHostableWebCoreNotAvailable] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, "https://github.com/aspnet/IISIntegration/issues/866")] + public class TestServerTest : StrictTestServerTests + { + [ConditionalFact] + public async Task SingleProcessTestServer_HelloWorld() + { + var helloWorld = "Hello World"; + var expectedPath = "/Path"; + + string path = null; + using (var testServer = await TestServer.Create(ctx => + { + path = ctx.Request.Path.ToString(); + return ctx.Response.WriteAsync(helloWorld); + }, LoggerFactory)) + { + var result = await testServer.HttpClient.GetAsync(expectedPath); + Assert.Equal(helloWorld, await result.Content.ReadAsStringAsync()); + Assert.Equal(expectedPath, path); + } + } + } +} diff --git a/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs b/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..b63743f10638c57f2a552c0574a6fa49cd8d3928 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/Utilities/SkipIfHostableWebCoreNotAvailibleAttribute.cs @@ -0,0 +1,17 @@ +// 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 Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class SkipIfHostableWebCoreNotAvailableAttribute : Attribute, ITestCondition + { + public bool IsMet { get; } = File.Exists(TestServer.HostableWebCoreLocation); + + public string SkipReason { get; } = $"Hostable Web Core not available, {TestServer.HostableWebCoreLocation} not found."; + } +} diff --git a/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs b/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs new file mode 100644 index 0000000000000000000000000000000000000000..351b826316974e45c6904625ca6dbd2cf1398e14 --- /dev/null +++ b/src/IISIntegration/test/IIS.Tests/Utilities/TestServer.cs @@ -0,0 +1,211 @@ +// 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.Net.Http; +using System.Reflection; +using System.Runtime.InteropServices; +using System.Runtime.Loader; +using System.Threading; +using System.Threading.Tasks; +using System.Xml.Linq; +using System.Xml.XPath; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Extensions; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.Common; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Logging; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public class TestServer: IDisposable, IStartup + { + private const string InProcessHandlerDll = "aspnetcorev2_inprocess.dll"; + private const string AspNetCoreModuleDll = "aspnetcorev2.dll"; + private const string HWebCoreDll = "hwebcore.dll"; + + internal static string HostableWebCoreLocation => Environment.ExpandEnvironmentVariables($@"%windir%\system32\inetsrv\{HWebCoreDll}"); + internal static string BasePath => Path.GetDirectoryName(new Uri(typeof(TestServer).Assembly.CodeBase).AbsolutePath); + + internal static string AspNetCoreModuleLocation => Path.Combine(BasePath, AspNetCoreModuleDll); + + private static readonly SemaphoreSlim WebCoreLock = new SemaphoreSlim(1, 1); + + private static readonly int PortRetryCount = 10; + + private readonly TaskCompletionSource<object> _startedTaskCompletionSource = new TaskCompletionSource<object>(TaskCreationOptions.RunContinuationsAsynchronously); + + private readonly Action<IApplicationBuilder> _appBuilder; + private readonly ILoggerFactory _loggerFactory; + private readonly hostfxr_main_fn _hostfxrMainFn; + + private Uri BaseUri => new Uri("http://localhost:" + _currentPort); + public HttpClient HttpClient { get; private set; } + public TestConnection CreateConnection() => new TestConnection(_currentPort); + + private IWebHost _host; + + private string _appHostConfigPath; + private int _currentPort; + + private TestServer(Action<IApplicationBuilder> appBuilder, ILoggerFactory loggerFactory) + { + _hostfxrMainFn = Main; + _appBuilder = appBuilder; + _loggerFactory = loggerFactory; + } + + public static async Task<TestServer> Create(Action<IApplicationBuilder> appBuilder, ILoggerFactory loggerFactory) + { + await WebCoreLock.WaitAsync(); + var server = new TestServer(appBuilder, loggerFactory); + server.Start(); + (await server.HttpClient.GetAsync("/start")).EnsureSuccessStatusCode(); + await server._startedTaskCompletionSource.Task; + return server; + } + + public static Task<TestServer> Create(RequestDelegate app, ILoggerFactory loggerFactory) + { + return Create(builder => builder.Run(app), loggerFactory); + } + + private void Start() + { + LoadLibrary(HostableWebCoreLocation); + _appHostConfigPath = Path.GetTempFileName(); + + set_main_handler(_hostfxrMainFn); + + Retry(() => + { + _currentPort = TestPortHelper.GetNextPort(); + + InitializeConfig(_currentPort); + + var startResult = WebCoreActivate(_appHostConfigPath, null, "Instance"); + if (startResult != 0) + { + throw new InvalidOperationException($"Error while running WebCoreActivate: {startResult} on port {_currentPort}"); + } + }, PortRetryCount); + + HttpClient = new HttpClient(new LoggingHandler(new SocketsHttpHandler(), _loggerFactory.CreateLogger<TestServer>())) + { + BaseAddress = BaseUri + }; + } + + private void InitializeConfig(int port) + { + var webHostConfig = XDocument.Load(Path.GetFullPath("HostableWebCore.config")); + webHostConfig.XPathSelectElement("/configuration/system.webServer/globalModules/add[@name='AspNetCoreModuleV2']") + .SetAttributeValue("image", AspNetCoreModuleLocation); + + var siteElement = webHostConfig.Root + .RequiredElement("system.applicationHost") + .RequiredElement("sites") + .RequiredElement("site"); + + siteElement + .RequiredElement("bindings") + .RequiredElement("binding") + .SetAttributeValue("bindingInformation", $":{port}:localhost"); + + webHostConfig.Save(_appHostConfigPath); + } + + private int Main(IntPtr argc, IntPtr argv) + { + _host = new WebHostBuilder() + .UseIIS() + .ConfigureServices(services => { + services.AddSingleton<IStartup>(this); + services.AddSingleton(_loggerFactory); + }) + .UseSetting(WebHostDefaults.ApplicationKey, typeof(TestServer).GetTypeInfo().Assembly.FullName) + .Build(); + + var doneEvent = new ManualResetEventSlim(); + var lifetime = _host.Services.GetService<IApplicationLifetime>(); + + lifetime.ApplicationStopping.Register(() => doneEvent.Set()); + _host.Start(); + _startedTaskCompletionSource.SetResult(null); + doneEvent.Wait(); + _host.Dispose(); + return 0; + } + + public void Dispose() + { + HttpClient.Dispose(); + + // WebCoreShutdown occasionally AVs + // This causes the dotnet test process to crash + // To avoid this, we have to wait to shutdown + // and pass in true to immediately shutdown the hostable web core + // Both of these seem to be required. + Thread.Sleep(100); + WebCoreShutdown(immediate: true); + WebCoreLock.Release(); + } + + public IServiceProvider ConfigureServices(IServiceCollection services) + { + return services.BuildServiceProvider(); + } + + public void Configure(IApplicationBuilder app) + { + app.Map("/start", builder => builder.Run(context => context.Response.WriteAsync("Done"))); + _appBuilder(app); + } + + private delegate int hostfxr_main_fn(IntPtr argc, IntPtr argv); + + [DllImport(HWebCoreDll)] + private static extern int WebCoreActivate( + [In, MarshalAs(UnmanagedType.LPWStr)] + string appHostConfigPath, + [In, MarshalAs(UnmanagedType.LPWStr)] + string rootWebConfigPath, + [In, MarshalAs(UnmanagedType.LPWStr)] + string instanceName); + + [DllImport(HWebCoreDll)] + private static extern int WebCoreShutdown(bool immediate); + + [DllImport(InProcessHandlerDll)] + private static extern int set_main_handler(hostfxr_main_fn main); + + [DllImport("kernel32", SetLastError=true, CharSet = CharSet.Ansi)] + private static extern IntPtr LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpFileName); + + private void Retry(Action func, int attempts) + { + var exceptions = new List<Exception>(); + + for (var attempt = 0; attempt < attempts; attempt++) + { + try + { + func(); + return; + } + catch (Exception e) + { + exceptions.Add(e); + } + } + + throw new AggregateException(exceptions); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs new file mode 100644 index 0000000000000000000000000000000000000000..ba6a1ec6e2f3eb00e52233899f22a875d7162c25 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/DeployerSelector.cs @@ -0,0 +1,14 @@ +// 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.Server.IntegrationTesting; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + public static class DeployerSelector + { + public static ServerType ServerType => ServerType.IISExpress; + public static bool IsBackwardsCompatiblityTest => false; + public static bool IsForwardsCompatibilityTest => false; + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..ac58f73c0e3025a5fb842951dab7073c3a1d2470 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/HttpsTests.cs @@ -0,0 +1,60 @@ +// 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.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.Common; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class HttpsTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public HttpsTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22, Tfm.Net461) + .WithAllApplicationTypes() + .WithAllAncmVersions() + .WithAllHostingModels(); + + [ConditionalTheory] + [MemberData(nameof(TestVariants))] + public async Task HttpsHelloWorld(TestVariant variant) + { + var port = TestPortHelper.GetNextSSLPort(); + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant); + deploymentParameters.ApplicationBaseUriHint = $"https://localhost:{port}/"; + deploymentParameters.AddHttpsToServerConfig(); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var handler = new HttpClientHandler + { + ServerCertificateCustomValidationCallback = (a, b, c, d) => true + }; + var client = deploymentResult.CreateClient(handler); + var response = await client.GetAsync("HttpsHelloWorld"); + var responseText = await response.Content.ReadAsStringAsync(); + if (variant.HostingModel == HostingModel.OutOfProcess) + { + Assert.Equal("Scheme:https; Original:http", responseText); + } + else + { + Assert.Equal("Scheme:https; Original:", responseText); + } + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj b/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj new file mode 100644 index 0000000000000000000000000000000000000000..988c2d5943ec684829724e562fc70e76c26312da --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/IISExpress.FunctionalTests.csproj @@ -0,0 +1,38 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <DisableFastUpToDateCheck>True</DisableFastUpToDateCheck> + </PropertyGroup> + + <ItemGroup> + <Content Include="..\Common.FunctionalTests\AppHostConfig\*.config" CopyToOutputDirectory="PreserveNewest" /> + </ItemGroup> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IntegrationTesting.IIS\Microsoft.AspNetCore.Server.IntegrationTesting.IIS.csproj" /> + <ProjectReference Include="..\Common.Tests\Common.Tests.csproj" /> + <ProjectReference Include="..\WebSites\**\*.csproj"> + <ReferenceOutputAssembly>False</ReferenceOutputAssembly> + </ProjectReference> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\Common.FunctionalTests\**\*.cs" /> + </ItemGroup> + + <Import Project="..\..\build\functional-test-assets.targets" /> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IntegrationTesting" Version="$(MicrosoftAspNetCoreServerIntegrationTestingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging" Version="$(MicrosoftExtensionsLoggingPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Testing" Version="$(MicrosoftExtensionsLoggingTestingPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="System.Diagnostics.EventLog" Version="$(SystemDiagnosticsEventLogPackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..47fb3a6553ec1ac3a432c56415d4ce26c4feb573 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/AuthenticationTests.cs @@ -0,0 +1,70 @@ +// 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.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class AuthenticationTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public AuthenticationTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + [RequiresIIS(IISCapability.WindowsAuthentication)] + public async Task Authentication_InProcess() + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(publish: true); + deploymentParameters.SetWindowsAuth(); + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("/AuthenticationAnonymous"); + + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Anonymous?True", responseText); + + response = await deploymentResult.HttpClient.GetAsync("/AuthenticationRestricted"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString()); + Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString()); + + response = await deploymentResult.HttpClient.GetAsync("/AuthenticationRestrictedNTLM"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString()); + // Note we can't restrict a challenge to a specific auth type, the native auth modules always add themselves. + Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString()); + + response = await deploymentResult.HttpClient.GetAsync("/AuthenticationForbidden"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode); + + var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; + var httpClient = deploymentResult.CreateHttpClient(httpClientHandler); + + response = await httpClient.GetAsync("/AuthenticationAnonymous"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Anonymous?True", responseText); + + response = await httpClient.GetAsync("/AuthenticationRestricted"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotEmpty(responseText); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..caaf728c64d0a58e3c2d349748bf13673f08b727 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/ShutdownTests.cs @@ -0,0 +1,90 @@ +// 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.Net.Sockets; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class ShutdownTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public ShutdownTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public async Task ServerShutsDownWhenMainExits() + { + var parameters = _fixture.GetBaseDeploymentParameters(publish: true); + var deploymentResult = await DeployAsync(parameters); + try + { + await deploymentResult.HttpClient.GetAsync("/Shutdown"); + } + catch (HttpRequestException ex) when (ex.InnerException is IOException) + { + // Server might close a connection before request completes + } + + deploymentResult.AssertWorkerProcessStop(); + } + + + [ConditionalFact] + public async Task ServerShutsDownWhenMainExitsStress() + { + var parameters = _fixture.GetBaseDeploymentParameters(publish: true); + var deploymentResult = await StartAsync(parameters); + + var load = Helpers.StressLoad(deploymentResult.HttpClient, "/HelloWorld", response => { + var statusCode = (int)response.StatusCode; + Assert.True(statusCode == 200 || statusCode == 503, "Status code was " + statusCode); + }); + + try + { + await deploymentResult.HttpClient.GetAsync("/Shutdown"); + await load; + } + catch (HttpRequestException ex) when (ex.InnerException is IOException | ex.InnerException is SocketException) + { + // Server might close a connection before request completes + } + + deploymentResult.AssertWorkerProcessStop(); + } + + [ConditionalFact] + public async Task GracefulShutdown_DoesNotCrashProcess() + { + var parameters = _fixture.GetBaseDeploymentParameters(publish: true); + var result = await DeployAsync(parameters); + + var response = await result.HttpClient.GetAsync("/HelloWorld"); + StopServer(gracefulShutdown: true); + Assert.True(result.HostProcess.ExitCode == 0); + } + + [ConditionalFact] + public async Task ForcefulShutdown_DoesCrashProcess() + { + var parameters = _fixture.GetBaseDeploymentParameters(publish: true); + var result = await DeployAsync(parameters); + + var response = await result.HttpClient.GetAsync("/HelloWorld"); + StopServer(gracefulShutdown: false); + Assert.True(result.HostProcess.ExitCode == 1); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..826001c96d526262c23669461dd33a17b73ae38d --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/InProcess/WebSocketTests.cs @@ -0,0 +1,79 @@ +// 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.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(IISTestSiteCollection.Name)] + [OSSkipCondition(OperatingSystems.Windows, WindowsVersions.Win7, SkipReason = "No supported on this platform")] + public class WebSocketsTests + { + private readonly string _webSocketUri; + + public WebSocketsTests(IISTestSiteFixture fixture) + { + _webSocketUri = fixture.DeploymentResult.ApplicationBaseUri.Replace("http:", "ws:"); + } + + [ConditionalFact] + public async Task OnStartedCalledForWebSocket() + { + var cws = new ClientWebSocket(); + await cws.ConnectAsync(new Uri(_webSocketUri + "WebSocketLifetimeEvents"), default); + + await ReceiveMessage(cws, "OnStarting"); + await ReceiveMessage(cws, "Upgraded"); + } + + [ConditionalFact] + public async Task WebReadBeforeUpgrade() + { + var cws = new ClientWebSocket(); + await cws.ConnectAsync(new Uri(_webSocketUri + "WebReadBeforeUpgrade"), default); + + await ReceiveMessage(cws, "Yay"); + } + + [ConditionalFact] + public async Task CanSendAndReceieveData() + { + var cws = new ClientWebSocket(); + await cws.ConnectAsync(new Uri(_webSocketUri + "WebSocketEcho"), default); + + for (int i = 0; i < 1000; i++) + { + var mesage = i.ToString(); + await SendMessage(cws, mesage); + await ReceiveMessage(cws, mesage); + } + } + + private async Task SendMessage(ClientWebSocket webSocket, string message) + { + await webSocket.SendAsync(new ArraySegment<byte>(Encoding.ASCII.GetBytes(message)), WebSocketMessageType.Text, true, default); + } + + private async Task ReceiveMessage(ClientWebSocket webSocket, string expectedMessage) + { + var received = new byte[expectedMessage.Length]; + + var offset = 0; + WebSocketReceiveResult result; + do + { + result = await webSocket.ReceiveAsync(new ArraySegment<byte>(received, offset, received.Length - offset), default); + offset += result.Count; + } while (!result.EndOfMessage); + + Assert.Equal(expectedMessage, Encoding.ASCII.GetString(received)); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..349f72d7bfd49fd0763012801b675442b4409044 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/MultipleAppTests.cs @@ -0,0 +1,81 @@ +// 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.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class MultipleAppTests : IISFunctionalTestBase + { + private readonly PublishedSitesFixture _fixture; + + public MultipleAppTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalTheory] + [InlineData(AncmVersion.AspNetCoreModule)] + [InlineData(AncmVersion.AspNetCoreModuleV2)] + public Task Startup(AncmVersion ancmVersion) + { + // ANCM v1 currently does *not* retry if an app fails to start the first time due to a port collision. + // So, this test is expected to fail on v1 approximately 1 in 1,000 times (probably of at least one collision + // when 10 sites choose a random port from the range 1025-48000). Adding one retry should reduce the failure + // rate from 1 in 1,000 to 1 in 1,000,000. The previous product code (with "srand(GetTickCount())") should still + // fail the test reliably. + // https://github.com/aspnet/IISIntegration/issues/1350 + // + // ANCM v2 does retry on port collisions, so no retries should be required. + var attempts = (ancmVersion == AncmVersion.AspNetCoreModule) ? 2 : 1; + + return Helpers.Retry(async () => + { + const int numApps = 10; + + using (var deployers = new DisposableList<ApplicationDeployer>()) + { + var deploymentResults = new List<DeploymentResult>(); + + // Deploy all apps + for (var i = 0; i < numApps; i++) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel: IntegrationTesting.HostingModel.OutOfProcess); + deploymentParameters.AncmVersion = ancmVersion; + + var deployer = CreateDeployer(deploymentParameters); + deployers.Add(deployer); + deploymentResults.Add(await deployer.DeployAsync()); + } + + // Start all requests as quickly as possible, so apps are started as quickly as possible, + // to test possible race conditions when multiple apps start at the same time. + var requestTasks = new List<Task<HttpResponseMessage>>(); + foreach (var deploymentResult in deploymentResults) + { + requestTasks.Add(deploymentResult.HttpClient.GetAsync("/HelloWorld")); + } + + // Verify all apps started and return expected response + foreach (var requestTask in requestTasks) + { + var response = await requestTask; + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal("Hello World", responseText); + } + } + }, + attempts: attempts, msDelay: 0); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs new file mode 100644 index 0000000000000000000000000000000000000000..3ff46bf3043211b74da9af50008fae88a65d52cb --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/OutOfProcess/NtlmAuthentationTest.cs @@ -0,0 +1,87 @@ +// 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.Net; +using System.Net.Http; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; +using Xunit.Abstractions; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class NtlmAuthenticationTests : IISFunctionalTestBase + { + // Test only runs on IISExpress today as our CI machines do not have + // Windows auth installed globally. + // TODO either enable windows auth on our CI or use containers to test this + // behavior + + private readonly PublishedSitesFixture _fixture; + + public NtlmAuthenticationTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + public static TestMatrix TestVariants + => TestMatrix.ForServers(DeployerSelector.ServerType) + .WithTfms(Tfm.NetCoreApp22, Tfm.Net461) + .WithAllAncmVersions(); + + [ConditionalTheory] + [RequiresIIS(IISCapability.WindowsAuthentication)] + [MemberData(nameof(TestVariants))] + public async Task NtlmAuthentication(TestVariant variant) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(variant); + deploymentParameters.ApplicationBaseUriHint = $"https://localhost:0/"; + + deploymentParameters.SetWindowsAuth(enabled: true); + + var result = await DeployAsync(deploymentParameters); + var response = await result.HttpClient.GetAsync("/HelloWorld"); + + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Hello World", responseText); + + var httpClient = result.HttpClient; + response = await httpClient.GetAsync("/Anonymous"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Anonymous?True", responseText); + + response = await httpClient.GetAsync("/Restricted"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString()); + Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString()); + + response = await httpClient.GetAsync("/RestrictedNTLM"); + Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); + Assert.Contains("NTLM", response.Headers.WwwAuthenticate.ToString()); + // Note we can't restrict a challenge to a specific auth type, the native auth modules always add themselves. + Assert.Contains("Negotiate", response.Headers.WwwAuthenticate.ToString()); + + response = await httpClient.GetAsync("/Forbidden"); + Assert.Equal(HttpStatusCode.Forbidden, response.StatusCode); + + var httpClientHandler = new HttpClientHandler() { UseDefaultCredentials = true }; + httpClient = result.CreateClient(httpClientHandler); + + response = await httpClient.GetAsync("/Anonymous"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.Equal("Anonymous?True", responseText); + + response = await httpClient.GetAsync("/Restricted"); + responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + Assert.NotEmpty(responseText); + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs new file mode 100644 index 0000000000000000000000000000000000000000..b26f48a8159df06f5af2735263bc80cdeec3a14f --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/Properties/AssemblyInfo.cs @@ -0,0 +1,10 @@ +// 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.Server.IISIntegration.FunctionalTests; +using Microsoft.Extensions.Logging.Testing; +using Xunit; + +[assembly: CollectionBehavior(DisableTestParallelization = true)] +[assembly: RequiresIIS] +[assembly: ShortClassName] diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs new file mode 100644 index 0000000000000000000000000000000000000000..2e0a68b9f74231489809adcd9d0d0eb30f6dfb49 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/RequiresIISAttribute.cs @@ -0,0 +1,24 @@ +// 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 Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Testing.xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [AttributeUsage(AttributeTargets.Assembly | AttributeTargets.Class | AttributeTargets.Method)] + public sealed class RequiresIISAttribute : Attribute, ITestCondition + { + public bool IsMet => IISExpressAncmSchema.SupportsInProcessHosting; + + public string SkipReason => IISExpressAncmSchema.SkipReason; + + public RequiresIISAttribute() { } + + public RequiresIISAttribute(IISCapability capabilities) + { + // IISCapabilities aren't pertinent to IISExpress + } + } +} diff --git a/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs b/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..62d07c5fd9485aada79aae387931469dd32d85b9 --- /dev/null +++ b/src/IISIntegration/test/IISExpress.FunctionalTests/UpgradeFeatureDetectionTests.cs @@ -0,0 +1,83 @@ +// 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.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests.Utilities; +using Microsoft.AspNetCore.Server.IntegrationTesting; +using Microsoft.AspNetCore.Server.IntegrationTesting.IIS; +using Microsoft.AspNetCore.Testing.xunit; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration.FunctionalTests +{ + [Collection(PublishedSitesCollection.Name)] + public class UpgradeFeatureDetectionTests : IISFunctionalTestBase + { + private readonly string _isWebsocketsSupported = Environment.OSVersion.Version >= new Version(6, 2) ? "Enabled" : "Disabled"; + private readonly PublishedSitesFixture _fixture; + + public UpgradeFeatureDetectionTests(PublishedSitesFixture fixture) + { + _fixture = fixture; + } + + [ConditionalFact] + public Task UpgradeFeatureDetectionDisabled_InProcess() + { + // fails due to not modifying the apphost.config file. + return UpgradeFeatureDetectionDeployer( + disableWebSocket: true, + Helpers.GetInProcessTestSitesPath(), + "Disabled", HostingModel.InProcess); + } + + [ConditionalFact] + public Task UpgradeFeatureDetectionEnabled_InProcess() + { + return UpgradeFeatureDetectionDeployer( + disableWebSocket: false, + Helpers.GetInProcessTestSitesPath(), + _isWebsocketsSupported, HostingModel.InProcess); + } + + [ConditionalFact] + public Task UpgradeFeatureDetectionDisabled_OutOfProcess() + { + return UpgradeFeatureDetectionDeployer( + disableWebSocket: true, + Helpers.GetOutOfProcessTestSitesPath(), + "Disabled", HostingModel.OutOfProcess); + } + + [ConditionalFact] + public Task UpgradeFeatureDetectionEnabled_OutOfProcess() + { + return UpgradeFeatureDetectionDeployer( + disableWebSocket: false, + Helpers.GetOutOfProcessTestSitesPath(), + _isWebsocketsSupported, HostingModel.OutOfProcess); + } + + private async Task UpgradeFeatureDetectionDeployer(bool disableWebSocket, string sitePath, string expected, HostingModel hostingModel) + { + var deploymentParameters = _fixture.GetBaseDeploymentParameters(hostingModel, publish: true); + + if (disableWebSocket) + { + // For IIS, we need to modify the apphost.config file + deploymentParameters.AddServerConfigAction( + element => element.Descendants("webSocket") + .Single() + .SetAttributeValue("enabled", "false")); + } + + var deploymentResult = await DeployAsync(deploymentParameters); + + var response = await deploymentResult.HttpClient.GetAsync("UpgradeFeatureDetection"); + var responseText = await response.Content.ReadAsStringAsync(); + Assert.Equal(expected, responseText); + } + } +} diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..772fbde2c31cfc5e038420298f2c20ad69c89f62 --- /dev/null +++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISExtensionTests.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.Linq; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration +{ + public class IISExtensionTests + { + [Fact] + public void CallingUseIISIntegrationMultipleTimesWorks() + { + + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .UseIISIntegration() + .Configure(app => { }); + var server = new TestServer(builder); + + var filters = server.Host.Services.GetServices<IStartupFilter>() + .OfType<IISSetupFilter>(); + + Assert.Single(filters); + } + } +} diff --git a/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs new file mode 100644 index 0000000000000000000000000000000000000000..0898b7ae21aa1dd36b9a7f2e9cb98d1facf2065e --- /dev/null +++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/IISMiddlewareTests.cs @@ -0,0 +1,420 @@ +// 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.Net; +using System.Net.Http; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http.Features.Authentication; +using Microsoft.AspNetCore.TestHost; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace Microsoft.AspNetCore.Server.IISIntegration +{ + public class IISMiddlewareTests + { + [Fact] + public async Task MiddlewareSkippedIfTokenIsMissing() + { + var assertsExecuted = false; + + var builder = new WebHostBuilder() + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + app.Run(context => + { + var auth = context.Features.Get<IHttpAuthenticationFeature>(); + Assert.Null(auth); + assertsExecuted = true; + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var req = new HttpRequestMessage(HttpMethod.Get, ""); + req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + var response = await server.CreateClient().SendAsync(req); + Assert.True(assertsExecuted); + response.EnsureSuccessStatusCode(); + } + + [Fact] + public async Task MiddlewareRejectsRequestIfTokenHeaderIsMissing() + { + var assertsExecuted = false; + + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + app.Run(context => + { + var auth = context.Features.Get<IHttpAuthenticationFeature>(); + Assert.Null(auth); + assertsExecuted = true; + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var req = new HttpRequestMessage(HttpMethod.Get, ""); + var response = await server.CreateClient().SendAsync(req); + Assert.False(assertsExecuted); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + } + + [Theory] + [InlineData("/", "/iisintegration", "shutdown")] + [InlineData("/", "/iisintegration", "Shutdown")] + [InlineData("/pathBase", "/pathBase/iisintegration", "shutdown")] + [InlineData("/pathBase", "/pathBase/iisintegration", "Shutdown")] + public async Task MiddlewareShutsdownGivenANCMShutdown(string pathBase, string requestPath, string shutdownEvent) + { + var requestExecuted = new ManualResetEvent(false); + var applicationStoppingFired = new ManualResetEvent(false); + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", pathBase) + .UseIISIntegration() + .Configure(app => + { + var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); + appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set()); + + app.Run(context => + { + requestExecuted.Set(); + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var request = new HttpRequestMessage(HttpMethod.Post, requestPath); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", shutdownEvent); + var response = await server.CreateClient().SendAsync(request); + + Assert.True(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(5))); + Assert.False(requestExecuted.WaitOne(0)); + Assert.Equal(HttpStatusCode.Accepted, response.StatusCode); + } + + public static TheoryData<HttpMethod> InvalidShutdownMethods + { + get + { + return new TheoryData<HttpMethod> + { + HttpMethod.Put, + HttpMethod.Trace, + HttpMethod.Head, + HttpMethod.Get, + HttpMethod.Delete, + HttpMethod.Options + }; + } + } + + [Theory] + [MemberData(nameof(InvalidShutdownMethods))] + public async Task MiddlewareIgnoresShutdownGivenWrongMethod(HttpMethod method) + { + var requestExecuted = new ManualResetEvent(false); + var applicationStoppingFired = new ManualResetEvent(false); + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); + appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set()); + + app.Run(context => + { + requestExecuted.Set(); + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var request = new HttpRequestMessage(method, "/iisintegration"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", "shutdown"); + var response = await server.CreateClient().SendAsync(request); + + Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1))); + Assert.True(requestExecuted.WaitOne(0)); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Theory] + [InlineData("/")] + [InlineData("/path")] + [InlineData("/path/iisintegration")] + public async Task MiddlewareIgnoresShutdownGivenWrongPath(string path) + { + var requestExecuted = new ManualResetEvent(false); + var applicationStoppingFired = new ManualResetEvent(false); + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); + appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set()); + + app.Run(context => + { + requestExecuted.Set(); + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var request = new HttpRequestMessage(HttpMethod.Post, path); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", "shutdown"); + var response = await server.CreateClient().SendAsync(request); + + Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1))); + Assert.True(requestExecuted.WaitOne(0)); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Theory] + [InlineData("event")] + [InlineData("")] + [InlineData(null)] + public async Task MiddlewareIgnoresShutdownGivenWrongEvent(string shutdownEvent) + { + var requestExecuted = new ManualResetEvent(false); + var applicationStoppingFired = new ManualResetEvent(false); + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); + appLifetime.ApplicationStopping.Register(() => applicationStoppingFired.Set()); + + app.Run(context => + { + requestExecuted.Set(); + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var request = new HttpRequestMessage(HttpMethod.Post, "/iisintegration"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-EVENT", shutdownEvent); + var response = await server.CreateClient().SendAsync(request); + + Assert.False(applicationStoppingFired.WaitOne(TimeSpan.FromSeconds(1))); + Assert.True(requestExecuted.WaitOne(0)); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); + } + + [Fact] + public void UrlDelayRegisteredAndPreferHostingUrlsSet() + { + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + app.Run(context => Task.FromResult(0)); + }); + + Assert.Null(builder.GetSetting(WebHostDefaults.ServerUrlsKey)); + Assert.Null(builder.GetSetting(WebHostDefaults.PreferHostingUrlsKey)); + + // Adds a server and calls Build() + var server = new TestServer(builder); + + Assert.Equal("http://127.0.0.1:12345", builder.GetSetting(WebHostDefaults.ServerUrlsKey)); + Assert.Equal("true", builder.GetSetting(WebHostDefaults.PreferHostingUrlsKey)); + } + + [Fact] + public void PathBaseHiddenFromServer() + { + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/pathBase") + .UseIISIntegration() + .Configure(app => + { + app.Run(context => Task.FromResult(0)); + }); + new TestServer(builder); + + Assert.Equal("http://127.0.0.1:12345", builder.GetSetting(WebHostDefaults.ServerUrlsKey)); + } + + [Fact] + public async Task AddsUsePathBaseMiddlewareWhenPathBaseSpecified() + { + var requestPathBase = string.Empty; + var requestPath = string.Empty; + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/pathbase") + .UseIISIntegration() + .Configure(app => + { + app.Run(context => + { + requestPathBase = context.Request.PathBase.Value; + requestPath = context.Request.Path.Value; + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var request = new HttpRequestMessage(HttpMethod.Get, "/PathBase/Path"); + request.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + var response = await server.CreateClient().SendAsync(request); + + Assert.Equal("/PathBase", requestPathBase); + Assert.Equal("/Path", requestPath); + } + + [Fact] + public async Task AddsAuthenticationHandlerByDefault() + { + var assertsExecuted = false; + + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .Configure(app => + { + app.Run(async context => + { + var auth = context.RequestServices.GetRequiredService<IAuthenticationSchemeProvider>(); + var windows = await auth.GetSchemeAsync(IISDefaults.AuthenticationScheme); + Assert.NotNull(windows); + Assert.Null(windows.DisplayName); + Assert.Equal("Microsoft.AspNetCore.Server.IISIntegration.AuthenticationHandler", windows.HandlerType.FullName); + assertsExecuted = true; + }); + }); + var server = new TestServer(builder); + + var req = new HttpRequestMessage(HttpMethod.Get, ""); + req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + await server.CreateClient().SendAsync(req); + + Assert.True(assertsExecuted); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task OnlyAddAuthenticationHandlerIfForwardWindowsAuthentication(bool forward) + { + var assertsExecuted = false; + + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .ConfigureServices(services => + { + services.Configure<IISOptions>(options => + { + options.ForwardWindowsAuthentication = forward; + }); + }) + .Configure(app => + { + app.Run(async context => + { + var auth = context.RequestServices.GetService<IAuthenticationSchemeProvider>(); + Assert.NotNull(auth); + var windowsAuth = await auth.GetSchemeAsync(IISDefaults.AuthenticationScheme); + if (forward) + { + Assert.NotNull(windowsAuth); + Assert.Null(windowsAuth.DisplayName); + Assert.Equal("AuthenticationHandler", windowsAuth.HandlerType.Name); + } + else + { + Assert.Null(windowsAuth); + } + assertsExecuted = true; + }); + }); + var server = new TestServer(builder); + + var req = new HttpRequestMessage(HttpMethod.Get, ""); + req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + await server.CreateClient().SendAsync(req); + + Assert.True(assertsExecuted); + } + + [Theory] + [InlineData(true)] + [InlineData(false)] + public async Task DoesNotBlowUpWithoutAuth(bool forward) + { + var assertsExecuted = false; + + var builder = new WebHostBuilder() + .UseSetting("TOKEN", "TestToken") + .UseSetting("PORT", "12345") + .UseSetting("APPL_PATH", "/") + .UseIISIntegration() + .ConfigureServices(services => + { + services.Configure<IISOptions>(options => + { + options.ForwardWindowsAuthentication = forward; + }); + }) + .Configure(app => + { + app.Run(context => + { + assertsExecuted = true; + return Task.FromResult(0); + }); + }); + var server = new TestServer(builder); + + var req = new HttpRequestMessage(HttpMethod.Get, ""); + req.Headers.TryAddWithoutValidation("MS-ASPNETCORE-TOKEN", "TestToken"); + await server.CreateClient().SendAsync(req); + + Assert.True(assertsExecuted); + } + } +} 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 new file mode 100644 index 0000000000000000000000000000000000000000..ea19c2a1fc8924b2d04a5610691fbf986ae43a0f --- /dev/null +++ b/src/IISIntegration/test/Microsoft.AspNetCore.Server.IISIntegration.Tests/Microsoft.AspNetCore.Server.IISIntegration.Tests.csproj @@ -0,0 +1,18 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.TestHost" Version="$(MicrosoftAspNetCoreTestHostPackageVersion)" /> + <PackageReference Include="Microsoft.NET.Test.Sdk" Version="$(MicrosoftNETTestSdkPackageVersion)" /> + <PackageReference Include="xunit.runner.visualstudio" Version="$(XunitRunnerVisualStudioPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs b/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs new file mode 100644 index 0000000000000000000000000000000000000000..4da8129d718b5593db3f516204a98d0f975f93b0 --- /dev/null +++ b/src/IISIntegration/test/TestTasks/InjectRequestHandler.cs @@ -0,0 +1,62 @@ +// 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) + { + string rid = args[0]; + string libraryLocation = args[1]; + string depsFile = args[2]; + + 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 new file mode 100644 index 0000000000000000000000000000000000000000..aa4c144936ed01dfef867504051e2955347c7c7a --- /dev/null +++ b/src/IISIntegration/test/TestTasks/TestTasks.csproj @@ -0,0 +1,12 @@ +<Project Sdk="Microsoft.NET.Sdk"> + + <PropertyGroup> + <OutputType>Exe</OutputType> + <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks> + </PropertyGroup> + + <ItemGroup> + <PackageReference Include="Newtonsoft.Json" Version="$(Tooling_NewtonsoftJsonPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/WebSites/Directory.Build.props b/src/IISIntegration/test/WebSites/Directory.Build.props new file mode 100644 index 0000000000000000000000000000000000000000..9b29d34f1651f7ea5e77afeb4f9c362d3585d0b3 --- /dev/null +++ b/src/IISIntegration/test/WebSites/Directory.Build.props @@ -0,0 +1,7 @@ +<Project> + <Import Project="..\Directory.Build.props" /> + + <ItemGroup> + <PackageReference Remove="Internal.AspNetCore.Sdk" /> + </ItemGroup> +</Project> diff --git a/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj new file mode 100644 index 0000000000000000000000000000000000000000..4d0952108a176c59fa568b6935e653cd05b16072 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/InProcessWebSite.csproj @@ -0,0 +1,32 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <Import Project="..\..\..\build\testsite.props" /> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + </PropertyGroup> + + <ItemGroup> + <Compile Include="..\shared\**\*.cs" /> + <Compile Include="..\InProcessWebSite\*.cs" /> + <Compile Include="..\InProcessWebSite\Properties\*.cs" /> + <None Include="..\InProcessWebSite\web.config" CopyToOutputDirectory="Always" /> + </ItemGroup> + + <ItemGroup> + <None Include="wwwroot\**" CopyToOutputDirectory="Always" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.Server.IIS" Version="$(MicrosoftAspNetCoreServerIISStablePackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/launchSettings.json new file mode 100644 index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessForwardsCompatWebSite/Properties/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/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs new file mode 100644 index 0000000000000000000000000000000000000000..d122f057769e5426c91da57fbd26eab6510f69e5 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/DummyServer.cs @@ -0,0 +1,30 @@ +// 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.Hosting.Server; +using Microsoft.AspNetCore.Http.Features; + +namespace TestSite +{ + public class DummyServer : IServer + { + public void Dispose() + { + } + + public Task StartAsync<TContext>(IHttpApplication<TContext> 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/InProcessWebSite/InProcessWebSite.csproj b/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj new file mode 100644 index 0000000000000000000000000000000000000000..d007d2daa1041ff04aa737eb77a593dd212601ae --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/InProcessWebSite.csproj @@ -0,0 +1,33 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <Import Project="..\..\..\build\testsite.props" /> + + <PropertyGroup> + <TargetFrameworks>netcoreapp2.2</TargetFrameworks> + <InProcessTestSite>true</InProcessTestSite> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IIS\Microsoft.AspNetCore.Server.IIS.csproj" /> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\shared\**\*.cs" /> + </ItemGroup> + + <ItemGroup> + <None Include="wwwroot\**" CopyToOutputDirectory="Always" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Hosting" Version="$(MicrosoftAspNetCoreHostingPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..c40448ee918d50193adbb058e95a71e5ae8e9589 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Program.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.IO; +using System.Linq; +using System.Text; +using System.Threading; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; +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(); + case "CheckLargeStdOutWrites": + Console.WriteLine(new string('a', 30000)); + break; + case "CheckLargeStdErrWrites": + Console.Error.WriteLine(new string('a', 30000)); + Console.Error.Flush(); + break; + case "ConsoleWrite": + Console.WriteLine($"Random number: {args[1]}"); + break; + case "ConsoleErrorWrite": + Console.Error.WriteLine($"Random number: {args[1]}"); + Console.Error.Flush(); + break; + case "CheckOversizedStdErrWrites": + Console.WriteLine(new string('a', 31000)); + break; + case "CheckOversizedStdOutWrites": + Console.Error.WriteLine(new string('a', 31000)); + Console.Error.Flush(); + break; + case "Hang": + Thread.Sleep(Timeout.Infinite); + break; + case "Throw": + throw new InvalidOperationException("Program.Main exception"); + case "EarlyReturn": + return 12; + case "HangOnStop": + { + var host = new WebHostBuilder() + .UseIIS() + .UseStartup<Startup>() + .Build(); + host.Run(); + + Thread.Sleep(Timeout.Infinite); + } + break; + case "CheckConsoleFunctions": + // Call a bunch of console functions and make sure none return invalid handle. + Console.OutputEncoding = Encoding.UTF8; + Console.Title = "Test"; + Console.WriteLine($"Is Console redirection: {Console.IsOutputRedirected}"); + Console.BackgroundColor = ConsoleColor.Blue; + Console.WriteLine("彡⾔"); + break; + case "OverriddenServer": + { + var host = new WebHostBuilder() + .UseIIS() + .ConfigureServices(services => services.AddSingleton<IServer, DummyServer>()) + .Configure(builder => builder.Run(async context => { await context.Response.WriteAsync("I shouldn't work"); })) + .Build(); + host.Run(); + } + break; + case "ConsoleErrorWriteStartServer": + Console.Error.WriteLine("TEST MESSAGE"); + return StartServer(); + case "ConsoleWriteStartServer": + Console.WriteLine("TEST MESSAGE"); + return StartServer(); + default: + return StartServer(); + + } + return 12; + } + + private static int StartServer() + { + var host = new WebHostBuilder() + .ConfigureLogging((_, factory) => + { + factory.AddConsole(); + factory.AddFilter("Console", level => level >= LogLevel.Information); + }) + .UseIIS() + .UseStartup<Startup>() + .Build(); + + host.Run(); + return 0; + } + } +} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/launchSettings.json new file mode 100644 index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Properties/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/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs new file mode 100644 index 0000000000000000000000000000000000000000..d658ebd03fe0d647b97d275afee0e8bdf2005b81 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.WebSockets.cs @@ -0,0 +1,147 @@ +// 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.Net.WebSockets; +using System.Text; +using System.Threading; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Server.IIS.FunctionalTests; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace TestSite +{ + public partial class Startup + { + + private void WebsocketRequest(IApplicationBuilder app) + { + app.Run(async context => + { + await context.Response.WriteAsync("test"); + }); + } + + private void WebReadBeforeUpgrade(IApplicationBuilder app) + { + app.Run(async context => { + + var singleByteArray = new byte[1]; + Assert.Equal(0, await context.Request.Body.ReadAsync(singleByteArray, 0, 1)); + + var ws = await Upgrade(context); + await SendMessages(ws, "Yay"); + }); + } + + private void WebSocketEcho(IApplicationBuilder app) + { + app.Run(async context => + { + var ws = await Upgrade(context); + + var appLifetime = app.ApplicationServices.GetRequiredService<IApplicationLifetime>(); + + await Echo(ws, appLifetime.ApplicationStopping); + }); + } + + private void WebSocketLifetimeEvents(IApplicationBuilder app) + { + app.Run(async context => { + + var messages = new List<string>(); + + context.Response.OnStarting(() => { + context.Response.Headers["custom-header"] = "value"; + messages.Add("OnStarting"); + return Task.CompletedTask; + }); + + var ws = await Upgrade(context); + messages.Add("Upgraded"); + + await SendMessages(ws, messages.ToArray()); + }); + } + + private static async Task SendMessages(WebSocket webSocket, params string[] messages) + { + foreach (var message in messages) + { + await webSocket.SendAsync(new ArraySegment<byte>(Encoding.ASCII.GetBytes(message)), WebSocketMessageType.Text, true, CancellationToken.None); + } + } + + private static async Task<WebSocket> Upgrade(HttpContext context) + { + var upgradeFeature = context.Features.Get<IHttpUpgradeFeature>(); + + // 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)); + return ws; + } + + private async Task Echo(WebSocket webSocket, CancellationToken token) + { + var buffer = new byte[1024 * 4]; + var result = await webSocket.ReceiveAsync(new ArraySegment<byte>(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<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, token); + result = await webSocket.ReceiveAsync(new ArraySegment<byte>(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<byte>(buffer), CancellationToken.None); + } + } + } + } +} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs new file mode 100644 index 0000000000000000000000000000000000000000..eb84272b76cdc66f0d047d5005fac71ffeac0a07 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/Startup.cs @@ -0,0 +1,699 @@ +// 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.Net; +using System.Text; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IIS; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.Primitives; +using Xunit; + +namespace TestSite +{ + public partial class Startup + { + public void Configure(IApplicationBuilder app) + { + TestStartup.Register(app, this); + } + + private async Task ServerVariable(HttpContext ctx) + { + var varName = ctx.Request.Query["q"]; + var newValue = ctx.Request.Query["v"]; + var feature = ctx.Features.Get<IServerVariablesFeature>(); + if (newValue.Count != 0) + { + feature[varName] = newValue; + } + await ctx.Response.WriteAsync($"{varName}: {feature[varName] ?? "(null)"}"); + } + + private async Task AuthenticationAnonymous(HttpContext ctx) + { + await ctx.Response.WriteAsync("Anonymous?" + !ctx.User.Identity.IsAuthenticated); + } + + private async Task AuthenticationRestricted(HttpContext ctx) + { + if (ctx.User.Identity.IsAuthenticated) + { + await ctx.Response.WriteAsync(ctx.User.Identity.AuthenticationType); + } + else + { + await ctx.ChallengeAsync(IISServerDefaults.AuthenticationScheme); + } + } + + private async Task AuthenticationForbidden(HttpContext ctx) + { + await ctx.ForbidAsync(IISServerDefaults.AuthenticationScheme); + } + + private async Task AuthenticationRestrictedNTLM(HttpContext ctx) + { + if (string.Equals("NTLM", ctx.User.Identity.AuthenticationType, StringComparison.Ordinal)) + { + await ctx.Response.WriteAsync("NTLM"); + } + else + { + await ctx.ChallengeAsync(IISServerDefaults.AuthenticationScheme); + } + } + + private async Task FeatureCollectionSetRequestFeatures(HttpContext ctx) + { + try + { + Assert.Equal("GET", ctx.Request.Method); + ctx.Request.Method = "test"; + Assert.Equal("test", ctx.Request.Method); + + Assert.Equal("http", ctx.Request.Scheme); + ctx.Request.Scheme = "test"; + Assert.Equal("test", ctx.Request.Scheme); + + Assert.Equal("/FeatureCollectionSetRequestFeatures", ctx.Request.PathBase); + ctx.Request.PathBase = "/base"; + Assert.Equal("/base", ctx.Request.PathBase); + + Assert.Equal("/path", ctx.Request.Path); + ctx.Request.Path = "/path"; + Assert.Equal("/path", ctx.Request.Path); + + Assert.Equal("?query", ctx.Request.QueryString.Value); + ctx.Request.QueryString = QueryString.Empty; + Assert.Equal("", ctx.Request.QueryString.Value); + + Assert.Equal("HTTP/1.1", ctx.Request.Protocol); + ctx.Request.Protocol = "HTTP/1.0"; + Assert.Equal("HTTP/1.0", ctx.Request.Protocol); + + Assert.NotNull(ctx.Request.Headers); + var headers = new HeaderDictionary(); + ctx.Features.Get<IHttpRequestFeature>().Headers = headers; + Assert.Same(headers, ctx.Features.Get<IHttpRequestFeature>().Headers); + + Assert.NotNull(ctx.Request.Body); + var body = new MemoryStream(); + ctx.Request.Body = body; + Assert.Same(body, ctx.Request.Body); + + //Assert.NotNull(ctx.Features.Get<IHttpRequestIdentifierFeature>().TraceIdentifier); + //Assert.NotEqual(CancellationToken.None, ctx.RequestAborted); + //var token = new CancellationTokenSource().Token; + //ctx.RequestAborted = token; + //Assert.Equal(token, ctx.RequestAborted); + + await ctx.Response.WriteAsync("Success"); + return; + } + catch (Exception exception) + { + ctx.Response.StatusCode = 500; + await ctx.Response.WriteAsync(exception.ToString()); + } + await ctx.Response.WriteAsync("_Failure"); + } + + private async Task FeatureCollectionSetResponseFeatures(HttpContext ctx) + { + try + { + Assert.Equal(200, ctx.Response.StatusCode); + ctx.Response.StatusCode = 404; + Assert.Equal(404, ctx.Response.StatusCode); + ctx.Response.StatusCode = 200; + + Assert.Null(ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase); + ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase = "Set Response"; + Assert.Equal("Set Response", ctx.Features.Get<IHttpResponseFeature>().ReasonPhrase); + + Assert.NotNull(ctx.Response.Headers); + var headers = new HeaderDictionary(); + ctx.Features.Get<IHttpResponseFeature>().Headers = headers; + Assert.Same(headers, ctx.Features.Get<IHttpResponseFeature>().Headers); + + var originalBody = ctx.Response.Body; + Assert.NotNull(originalBody); + var body = new MemoryStream(); + ctx.Response.Body = body; + Assert.Same(body, ctx.Response.Body); + ctx.Response.Body = originalBody; + + await ctx.Response.WriteAsync("Success"); + return; + } + catch (Exception exception) + { + ctx.Response.StatusCode = 500; + await ctx.Response.WriteAsync(exception.ToString()); + } + await ctx.Response.WriteAsync("_Failure"); + } + + private async Task FeatureCollectionSetConnectionFeatures(HttpContext ctx) + { + try + { + Assert.True(IPAddress.IsLoopback(ctx.Connection.LocalIpAddress)); + ctx.Connection.LocalIpAddress = IPAddress.IPv6Any; + Assert.Equal(IPAddress.IPv6Any, ctx.Connection.LocalIpAddress); + + Assert.True(IPAddress.IsLoopback(ctx.Connection.RemoteIpAddress)); + ctx.Connection.RemoteIpAddress = IPAddress.IPv6Any; + Assert.Equal(IPAddress.IPv6Any, ctx.Connection.RemoteIpAddress); + await ctx.Response.WriteAsync("Success"); + return; + } + catch (Exception exception) + { + ctx.Response.StatusCode = 500; + await ctx.Response.WriteAsync(exception.ToString()); + } + await ctx.Response.WriteAsync("_Failure"); + } + + private void Throw(HttpContext ctx) + { + throw new Exception(); + } + + private async Task SetCustomErorCode(HttpContext ctx) + { + var feature = ctx.Features.Get<IHttpResponseFeature>(); + feature.ReasonPhrase = ctx.Request.Query["reason"]; + feature.StatusCode = int.Parse(ctx.Request.Query["code"]); + if (ctx.Request.Query["writeBody"] == "True") + { + await ctx.Response.WriteAsync(ctx.Request.Query["body"]); + } + } + + private async Task HelloWorld(HttpContext 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 async Task LargeResponseBody(HttpContext ctx) + { + if (int.TryParse(ctx.Request.Query["length"], out var length)) + { + await ctx.Response.WriteAsync(new string('a', length)); + } + } + + private async Task ResponseHeaders(HttpContext ctx) + { + ctx.Response.Headers["UnknownHeader"] = "test123=foo"; + ctx.Response.ContentType = "text/plain"; + ctx.Response.Headers["MultiHeader"] = new StringValues(new string[] { "1", "2" }); + await ctx.Response.WriteAsync("Request Complete"); + } + + private async Task ResponseInvalidOrdering(HttpContext ctx) + { + if (ctx.Request.Path.Equals("/SetStatusCodeAfterWrite")) + { + await ctx.Response.WriteAsync("Started_"); + try + { + ctx.Response.StatusCode = 200; + } + catch (InvalidOperationException) + { + await ctx.Response.WriteAsync("SetStatusCodeAfterWriteThrew_"); + } + await ctx.Response.WriteAsync("Finished"); + return; + } + else if (ctx.Request.Path.Equals("/SetHeaderAfterWrite")) + { + await ctx.Response.WriteAsync("Started_"); + try + { + ctx.Response.Headers["This will fail"] = "some value"; + } + catch (InvalidOperationException) + { + await ctx.Response.WriteAsync("SetHeaderAfterWriteThrew_"); + } + await ctx.Response.WriteAsync("Finished"); + return; + } + } + + private async Task CheckEnvironmentVariable(HttpContext ctx) + { + var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_VALUE"); + await ctx.Response.WriteAsync(variable); + } + + private async Task CheckEnvironmentLongValueVariable(HttpContext ctx) + { + var variable = Environment.GetEnvironmentVariable("ASPNETCORE_INPROCESS_TESTING_LONG_VALUE"); + await ctx.Response.WriteAsync(variable); + } + + private async Task CheckAppendedEnvironmentVariable(HttpContext ctx) + { + var variable = Environment.GetEnvironmentVariable("ProgramFiles"); + await ctx.Response.WriteAsync(variable); + } + + private async Task CheckRemoveAuthEnvironmentVariable(HttpContext ctx) + { + var variable = Environment.GetEnvironmentVariable("ASPNETCORE_IIS_HTTPAUTH"); + await ctx.Response.WriteAsync(variable); + } + private async Task ReadAndWriteSynchronously(HttpContext ctx) + { + var t2 = Task.Run(() => WriteManyTimesToResponseBody(ctx)); + var t1 = Task.Run(() => ReadRequestBody(ctx)); + await Task.WhenAll(t1, t2); + } + + private async Task ReadRequestBody(HttpContext ctx) + { + var readBuffer = new byte[1]; + var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, 1); + while (result != 0) + { + result = await ctx.Request.Body.ReadAsync(readBuffer, 0, 1); + } + } + + private async Task WriteManyTimesToResponseBody(HttpContext ctx) + { + for (var i = 0; i < 10000; i++) + { + await ctx.Response.WriteAsync("hello world"); + } + } + + private async Task ReadAndWriteEcho(HttpContext ctx) + { + var readBuffer = new byte[4096]; + var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + while (result != 0) + { + await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); + result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + } + } + private async Task ReadAndFlushEcho(HttpContext ctx) + { + var readBuffer = new byte[4096]; + var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + while (result != 0) + { + await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); + await ctx.Response.Body.FlushAsync(); + result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + } + } + + private async Task ReadAndWriteEchoLines(HttpContext ctx) + { + if (ctx.Request.Headers.TryGetValue("Response-Content-Type", out var contentType)) + { + ctx.Response.ContentType = contentType; + } + + //Send headers + await ctx.Response.Body.FlushAsync(); + + var reader = new StreamReader(ctx.Request.Body); + while (!reader.EndOfStream) + { + var line = await reader.ReadLineAsync(); + if (line == "") + { + return; + } + await ctx.Response.WriteAsync(line + Environment.NewLine); + await ctx.Response.Body.FlushAsync(); + } + } + + private async Task ReadAndWriteEchoLinesNoBuffering(HttpContext ctx) + { + var feature = ctx.Features.Get<IHttpBufferingFeature>(); + feature.DisableResponseBuffering(); + + if (ctx.Request.Headers.TryGetValue("Response-Content-Type", out var contentType)) + { + ctx.Response.ContentType = contentType; + } + + //Send headers + await ctx.Response.Body.FlushAsync(); + + var reader = new StreamReader(ctx.Request.Body); + while (!reader.EndOfStream) + { + var line = await reader.ReadLineAsync(); + if (line == "") + { + return; + } + await ctx.Response.WriteAsync(line + Environment.NewLine); + } + } + + private async Task ReadPartialBody(HttpContext ctx) + { + var data = new byte[5]; + var count = 0; + do + { + count += await ctx.Request.Body.ReadAsync(data, count, data.Length - count); + } while (count != data.Length); + await ctx.Response.Body.WriteAsync(data, 0, data.Length); + } + + private async Task SetHeaderFromBody(HttpContext ctx) + { + using (var reader = new StreamReader(ctx.Request.Body)) + { + var value = await reader.ReadToEndAsync(); + ctx.Response.Headers["BodyAsString"] = value; + await ctx.Response.WriteAsync(value); + } + } + + private async Task ReadAndWriteEchoTwice(HttpContext ctx) + { + var readBuffer = new byte[4096]; + var result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + while (result != 0) + { + await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); + await ctx.Response.Body.FlushAsync(); + await ctx.Response.WriteAsync(Encoding.UTF8.GetString(readBuffer, 0, result)); + await ctx.Response.Body.FlushAsync(); + result = await ctx.Request.Body.ReadAsync(readBuffer, 0, readBuffer.Length); + } + } + + private async Task ReadAndWriteSlowConnection(HttpContext ctx) + { + var t2 = Task.Run(() => WriteResponseBodyAFewTimes(ctx)); + var t1 = Task.Run(() => ReadRequestBody(ctx)); + await Task.WhenAll(t1, t2); + } + + private async Task WriteResponseBodyAFewTimes(HttpContext ctx) + { + for (var i = 0; i < 100; i++) + { + await ctx.Response.WriteAsync("hello world"); + } + } + + private async Task ReadAndWriteCopyToAsync(HttpContext ctx) + { + await ctx.Request.Body.CopyToAsync(ctx.Response.Body); + } + + private async Task UpgradeFeatureDetection(HttpContext ctx) + { + if (ctx.Features.Get<IHttpUpgradeFeature>() != null) + { + await ctx.Response.WriteAsync("Enabled"); + } + else + { + await ctx.Response.WriteAsync("Disabled"); + } + } + + private async Task TestReadOffsetWorks(HttpContext 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 async Task TestInvalidReadOperations(HttpContext ctx) + { + var success = false; + if (ctx.Request.Path.StartsWithSegments("/NullBuffer")) + { + try + { + await ctx.Request.Body.ReadAsync(null, 0, 0); + } + catch (Exception) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetSmall")) + { + try + { + await ctx.Request.Body.ReadAsync(new byte[1], -1, 0); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetLarge")) + { + try + { + await ctx.Request.Body.ReadAsync(new byte[1], 2, 0); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountSmall")) + { + try + { + await ctx.Request.Body.ReadAsync(new byte[1], 0, -1); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountLarge")) + { + try + { + await ctx.Request.Body.ReadAsync(new byte[1], 0, -1); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountWithOffset")) + { + try + { + await ctx.Request.Body.ReadAsync(new byte[3], 1, 3); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + + + await ctx.Response.WriteAsync(success ? "Success" : "Failure"); + } + + private async Task TestValidReadOperations(HttpContext ctx) + { + var count = -1; + + if (ctx.Request.Path.StartsWithSegments("/NullBuffer")) + { + count = await ctx.Request.Body.ReadAsync(null, 0, 0); + } + else if (ctx.Request.Path.StartsWithSegments("/NullBufferPost")) + { + count = await ctx.Request.Body.ReadAsync(null, 0, 0); + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountZeroRead")) + { + count = await ctx.Request.Body.ReadAsync(new byte[1], 0, 0); + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountZeroReadPost")) + { + count = await ctx.Request.Body.ReadAsync(new byte[1], 0, 0); + } + + await ctx.Response.WriteAsync(count == 0 ? "Success" : "Failure"); + } + + private async Task TestInvalidWriteOperations(HttpContext ctx) + { + var success = false; + + if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetSmall")) + { + try + { + await ctx.Response.Body.WriteAsync(new byte[1], -1, 0); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidOffsetLarge")) + { + try + { + await ctx.Response.Body.WriteAsync(new byte[1], 2, 0); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountSmall")) + { + try + { + await ctx.Response.Body.WriteAsync(new byte[1], 0, -1); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountLarge")) + { + try + { + await ctx.Response.Body.WriteAsync(new byte[1], 0, -1); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + else if (ctx.Request.Path.StartsWithSegments("/InvalidCountWithOffset")) + { + try + { + await ctx.Response.Body.WriteAsync(new byte[3], 1, 3); + } + catch (ArgumentOutOfRangeException) + { + success = true; + } + } + + await ctx.Response.WriteAsync(success ? "Success" : "Failure"); + } + + private async Task TestValidWriteOperations(HttpContext ctx) + { + if (ctx.Request.Path.StartsWithSegments("/NullBuffer")) + { + await ctx.Response.Body.WriteAsync(null, 0, 0); + } + else if (ctx.Request.Path.StartsWithSegments("/NullBufferPost")) + { + await ctx.Response.Body.WriteAsync(null, 0, 0); + } + + await ctx.Response.WriteAsync("Success"); + } + + private async Task LargeResponseFile(HttpContext 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 async Task BasePath(HttpContext ctx) + { + await ctx.Response.WriteAsync(AppDomain.CurrentDomain.BaseDirectory); + } + + private async Task Shutdown(HttpContext ctx) + { + await ctx.Response.WriteAsync("Shutting down"); + ctx.RequestServices.GetService<IApplicationLifetime>().StopApplication(); + } + + private async Task GetServerVariableStress(HttpContext ctx) + { + // This test simulates the scenario where native Flush call is being + // executed on background thread while request thread calls GetServerVariable + // concurrent native calls may cause native object corruption + + var serverVariableFeature = ctx.Features.Get<IServerVariablesFeature>(); + await ctx.Response.WriteAsync("Response Begin"); + for (int i = 0; i < 1000; i++) + { + await ctx.Response.WriteAsync(serverVariableFeature["REMOTE_PORT"]); + await ctx.Response.Body.FlushAsync(); + } + await ctx.Response.WriteAsync("Response End"); + } + + private async Task CommandLineArgs(HttpContext ctx) + { + await ctx.Response.WriteAsync(string.Join("|", Environment.GetCommandLineArgs().Skip(1))); + } + + public Task HttpsHelloWorld(HttpContext ctx) => + ctx.Response.WriteAsync("Scheme:" + ctx.Request.Scheme + "; Original:" + ctx.Request.Headers["x-original-proto"]); + } +} diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/web.config b/src/IISIntegration/test/WebSites/InProcessWebSite/web.config new file mode 100644 index 0000000000000000000000000000000000000000..2a9bd223c31b4ada3f770bcf831ac1e2a8505e86 --- /dev/null +++ b/src/IISIntegration/test/WebSites/InProcessWebSite/web.config @@ -0,0 +1,16 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <system.webServer> + <handlers> + <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /> + </handlers> + <aspNetCore processPath="%LAUNCHER_PATH%" arguments="%LAUNCHER_ARGS%" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" forwardWindowsAuthToken="false" hostingModel="inprocess"> + <environmentVariables> + <environmentVariable name="ASPNETCORE_INPROCESS_TESTING_VALUE" value="foobar" /> + <environmentVariable name="ASPNETCORE_INPROCESS_TESTING_LONG_VALUE" value="AReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNativeAReallyLongValueThatIsGreaterThan300CharactersToForceResizeInNative" /> + <environmentVariable name="ProgramFiles" value="foobarbaz" /> + <environmentVariable name="ASPNETCORE_IIS_HTTPAUTH" value="shouldberemoved" /> + </environmentVariables> + </aspNetCore> + </system.webServer> +</configuration> diff --git a/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt b/src/IISIntegration/test/WebSites/InProcessWebSite/wwwroot/static.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj new file mode 100644 index 0000000000000000000000000000000000000000..14beb7394ee8bab464dbd0426042da58f1b4fc49 --- /dev/null +++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/OutOfProcessWebSite.csproj @@ -0,0 +1,31 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <Import Project="..\..\..\build\testsite.props" /> + + <PropertyGroup> + <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" /> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\shared\**\*.cs" /> + </ItemGroup> + + <ItemGroup> + <None Include="wwwroot\**" CopyToOutputDirectory="Always" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.WebUtilities" Version="$(MicrosoftAspNetCoreWebUtilitiesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.EnvironmentVariables" Version="$(MicrosoftExtensionsConfigurationEnvironmentVariablesPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Configuration.Json" Version="$(MicrosoftExtensionsConfigurationJsonPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" /> + <PackageReference Include="xunit" Version="$(XunitPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..90895237d243c5e7855b3c39f0b07516e0787f8c --- /dev/null +++ b/src/IISIntegration/test/WebSites/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<Startup>() + .UseKestrel() + .Build(); + + host.Run(); + return 0; + } + } +} + diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/launchSettings.json new file mode 100644 index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56 --- /dev/null +++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Properties/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/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs new file mode 100644 index 0000000000000000000000000000000000000000..de54a85a8a3975c6c7af98b748f8b8ed15b7a0bf --- /dev/null +++ b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/Startup.cs @@ -0,0 +1,105 @@ +// 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 System.Security.Principal; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting.Server.Features; +using Microsoft.AspNetCore.Http; +using Microsoft.AspNetCore.Http.Features; +using Microsoft.AspNetCore.IISIntegration.FunctionalTests; +using Microsoft.AspNetCore.Server.IISIntegration; +using Microsoft.Extensions.DependencyInjection; +using Xunit; + +namespace TestSite +{ + public partial class Startup + { + private IServerAddressesFeature _serverAddresses; + + public void Configure(IApplicationBuilder app) + { + TestStartup.Register(app, this); + + _serverAddresses = app.ServerFeatures.Get<IServerAddressesFeature>(); + } + + public Task Path(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Request.Path.Value); + + public Task Query(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Request.QueryString.Value); + + public Task BodyLimit(HttpContext ctx) => ctx.Response.WriteAsync(ctx.Features.Get<IHttpMaxRequestBodySizeFeature>()?.MaxRequestBodySize?.ToString() ?? "null"); + + + public Task HelloWorld(HttpContext ctx) => ctx.Response.WriteAsync("Hello World"); + + public Task HttpsHelloWorld(HttpContext ctx) => + ctx.Response.WriteAsync("Scheme:" + ctx.Request.Scheme + "; Original:" + ctx.Request.Headers["x-original-proto"]); + + public Task Anonymous(HttpContext context) => context.Response.WriteAsync("Anonymous?" + !context.User.Identity.IsAuthenticated); + + public Task Restricted(HttpContext context) + { + if (context.User.Identity.IsAuthenticated) + { + Assert.IsType<WindowsPrincipal>(context.User); + return context.Response.WriteAsync(context.User.Identity.AuthenticationType); + } + else + { + return context.ChallengeAsync(IISDefaults.AuthenticationScheme); + } + } + + public Task Forbidden(HttpContext context) => context.ForbidAsync(IISDefaults.AuthenticationScheme); + + public Task RestrictedNTLM(HttpContext context) + { + if (string.Equals("NTLM", context.User.Identity.AuthenticationType, StringComparison.Ordinal)) + { + return context.Response.WriteAsync("NTLM"); + } + else + { + return context.ChallengeAsync(IISDefaults.AuthenticationScheme); + } + } + + public Task UpgradeFeatureDetection(HttpContext context) => + context.Response.WriteAsync(context.Features.Get<IHttpUpgradeFeature>() != null? "Enabled": "Disabled"); + + public Task CheckRequestHandlerVersion(HttpContext context) + { + // We need to check if the aspnetcorev2_outofprocess dll is loaded by iisexpress.exe + // As they aren't in the same process, we will try to delete the file and expect a file + // in use error + try + { + File.Delete(context.Request.Headers["ANCMRHPath"]); + } + catch(UnauthorizedAccessException) + { + // TODO calling delete on the file will succeed when running with IIS + return context.Response.WriteAsync("Hello World"); + } + + return context.Response.WriteAsync(context.Request.Headers["ANCMRHPath"]); + } + + private async Task ProcessId(HttpContext context) + { + await context.Response.WriteAsync(Process.GetCurrentProcess().Id.ToString()); + } + + private async Task ServerAddresses(HttpContext context) + { + await context.Response.WriteAsync(string.Join(",", _serverAddresses.Addresses)); + } + } +} diff --git a/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt b/src/IISIntegration/test/WebSites/OutOfProcessWebSite/wwwroot/static.txt new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Program.cs new file mode 100644 index 0000000000000000000000000000000000000000..e8e5392c2c7269b067b512e442dc7ca8ea5adda2 --- /dev/null +++ b/src/IISIntegration/test/WebSites/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<Startup>() + .Build(); + + host.Run(); + } + } +} diff --git a/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json b/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/launchSettings.json new file mode 100644 index 0000000000000000000000000000000000000000..246b7a0b47d4fd6d27518dc694f3490ac52f2a56 --- /dev/null +++ b/src/IISIntegration/test/WebSites/StressTestWebSite/Properties/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/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs b/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs new file mode 100644 index 0000000000000000000000000000000000000000..68f6eb1f770603de0a532811a5e1d2f0b8be9828 --- /dev/null +++ b/src/IISIntegration/test/WebSites/StressTestWebSite/Startup.cs @@ -0,0 +1,232 @@ +// 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.Server.IIS.FunctionalTests; +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<string>().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<IHttpUpgradeFeature>(); + + // 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<IApplicationLifetime>(); + + 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<byte>(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<byte>(buffer, 0, result.Count), result.MessageType, result.EndOfMessage, token); + result = await webSocket.ReceiveAsync(new ArraySegment<byte>(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<byte>(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 new file mode 100644 index 0000000000000000000000000000000000000000..25ae0322215f672533e780f5d6d1e87e37d9d7d3 --- /dev/null +++ b/src/IISIntegration/test/WebSites/StressTestWebSite/StressTestWebSite.csproj @@ -0,0 +1,25 @@ +<Project Sdk="Microsoft.NET.Sdk.Web"> + + <Import Project="..\..\..\build\testsite.props" /> + + <PropertyGroup> + <TargetFrameworks>$(StandardTestTfms)</TargetFrameworks> + <InProcessTestSite>true</InProcessTestSite> + </PropertyGroup> + + <ItemGroup> + <ProjectReference Include="..\..\..\src\Microsoft.AspNetCore.Server.IISIntegration\Microsoft.AspNetCore.Server.IISIntegration.csproj" /> + </ItemGroup> + + <ItemGroup> + <Compile Include="..\shared\**\*.cs" /> + </ItemGroup> + + <ItemGroup> + <PackageReference Include="Microsoft.AspNetCore.ResponseCompression" Version="$(MicrosoftAspNetCoreResponseCompressionPackageVersion)" /> + <PackageReference Include="Microsoft.AspNetCore.Server.Kestrel" Version="$(MicrosoftAspNetCoreServerKestrelPackageVersion)" /> + <PackageReference Include="Microsoft.Extensions.Logging.Console" Version="$(MicrosoftExtensionsLoggingConsolePackageVersion)" /> + <PackageReference Include="System.Net.WebSockets.WebSocketProtocol" Version="$(SystemNetWebSocketsWebSocketProtocolPackageVersion)" /> + </ItemGroup> + +</Project> diff --git a/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs b/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs new file mode 100644 index 0000000000000000000000000000000000000000..b5d7f0305f07e3302d2033c57eccf657ffe1f481 --- /dev/null +++ b/src/IISIntegration/test/WebSites/shared/SharedStartup/Startup.shared.cs @@ -0,0 +1,117 @@ +// 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; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Http; +using Microsoft.Extensions.DependencyInjection; + +namespace TestSite +{ + public partial class Startup + { + public void ConfigureServices(IServiceCollection serviceCollection) + { + serviceCollection.AddResponseCompression(); + } + + private async Task HostingEnvironment(HttpContext ctx) + { + var hostingEnv = ctx.RequestServices.GetService<IHostingEnvironment>(); + + await ctx.Response.WriteAsync("ContentRootPath " + hostingEnv.ContentRootPath + Environment.NewLine); + await ctx.Response.WriteAsync("WebRootPath " + hostingEnv.WebRootPath + Environment.NewLine); + await ctx.Response.WriteAsync("CurrentDirectory " + Environment.CurrentDirectory); + } + + private async Task ConsoleWrite(HttpContext ctx) + { + Console.WriteLine("TEST MESSAGE"); + + await ctx.Response.WriteAsync("Hello World"); + } + + private async Task ConsoleErrorWrite(HttpContext ctx) + { + Console.Error.WriteLine("TEST MESSAGE"); + + await ctx.Response.WriteAsync("Hello World"); + } + + public async Task Auth(HttpContext ctx) + { + var authProvider = ctx.RequestServices.GetService<IAuthenticationSchemeProvider>(); + var authScheme = (await authProvider.GetAllSchemesAsync()).SingleOrDefault(); + + await ctx.Response.WriteAsync(authScheme?.Name ?? "null"); + if (ctx.User.Identity.Name != null) + { + await ctx.Response.WriteAsync(":" + ctx.User.Identity.Name); + } + } + + public async Task GetClientCert(HttpContext context) + { + var clientCert = context.Connection.ClientCertificate; + await context.Response.WriteAsync(clientCert != null ? $"Enabled;{clientCert.GetCertHashString()}" : "Disabled"); + } + + private static int _waitingRequestCount; + + public Task WaitForAbort(HttpContext context) + { + Interlocked.Increment(ref _waitingRequestCount); + try + { + context.RequestAborted.WaitHandle.WaitOne(); + return Task.CompletedTask; + } + finally + { + Interlocked.Decrement(ref _waitingRequestCount); + } + } + + public Task Abort(HttpContext context) + { + context.Abort(); + return Task.CompletedTask; + } + + public async Task WaitingRequestCount(HttpContext context) + { + await context.Response.WriteAsync(_waitingRequestCount.ToString()); + } + + public Task CreateFile(HttpContext context) + { + var hostingEnv = context.RequestServices.GetService<IHostingEnvironment>(); + File.WriteAllText(System.IO.Path.Combine(hostingEnv.ContentRootPath, "Started.txt"), ""); + return Task.CompletedTask; + } + + public Task OverrideServer(HttpContext context) + { + context.Response.Headers["Server"] = "MyServer/7.8"; + return Task.CompletedTask; + } + + public void CompressedData(IApplicationBuilder builder) + { + builder.UseResponseCompression(); + // write random bytes to check that compressed data is passed through + builder.Run( + async context => + { + context.Response.ContentType = "text/html"; + await context.Response.Body.WriteAsync(new byte[100], 0, 100); + }); + } + } +} diff --git a/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs new file mode 100644 index 0000000000000000000000000000000000000000..95b53003cc9f4ceb5940ecd036662083713999cf --- /dev/null +++ b/src/IISIntegration/test/WebSites/shared/WebSockets/Constants.cs @@ -0,0 +1,17 @@ +// 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.Server.IIS.FunctionalTests +{ + 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/shared/WebSockets/HandshakeHelpers.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs new file mode 100644 index 0000000000000000000000000000000000000000..b079ea3f857888bbdc4e28a8c76c89f8ebb1f290 --- /dev/null +++ b/src/IISIntegration/test/WebSites/shared/WebSockets/HandshakeHelpers.cs @@ -0,0 +1,41 @@ +// 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 Microsoft.AspNetCore.Server.IIS.FunctionalTests +{ + internal static class HandshakeHelpers + { + public static IEnumerable<KeyValuePair<string, string>> GenerateResponseHeaders(string key) + { + yield return new KeyValuePair<string, string>(Constants.Headers.Connection, Constants.Headers.Upgrade); + yield return new KeyValuePair<string, string>(Constants.Headers.Upgrade, Constants.Headers.UpgradeWebSocket); + yield return new KeyValuePair<string, string>(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/test/WebSites/shared/WebSockets/TestStartup.cs b/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs new file mode 100644 index 0000000000000000000000000000000000000000..b1604e367afb2df3371f60a00adb8c3c775a2827 --- /dev/null +++ b/src/IISIntegration/test/WebSites/shared/WebSockets/TestStartup.cs @@ -0,0 +1,38 @@ +using System; +using System.Reflection; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Http; + +namespace Microsoft.AspNetCore.IISIntegration.FunctionalTests +{ + public static class TestStartup + { + public static void Register(IApplicationBuilder app, object startup) + { + var type = startup.GetType(); + foreach (var method in type.GetMethods(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance)) + { + var parameters = method.GetParameters(); + if (method.Name != "Configure" && + parameters.Length == 1) + { + Action<IApplicationBuilder> appfunc = null; + if (parameters[0].ParameterType == typeof(IApplicationBuilder)) + { + appfunc = innerAppBuilder => method.Invoke(startup, new[] { innerAppBuilder }); + } + else if (parameters[0].ParameterType == typeof(HttpContext)) + { + appfunc = innerAppBuilder => innerAppBuilder.Run(ctx => (Task)method.Invoke(startup, new[] { ctx })); + } + + if (appfunc != null) + { + app.Map("/" + method.Name, appfunc); + } + } + } + } + } +} diff --git a/src/IISIntegration/test/gtest/gtest.vcxproj b/src/IISIntegration/test/gtest/gtest.vcxproj new file mode 100644 index 0000000000000000000000000000000000000000..924f26337ddf1a946f9c1a6e3114846ae1a5fbf9 --- /dev/null +++ b/src/IISIntegration/test/gtest/gtest.vcxproj @@ -0,0 +1,180 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003"> + <ItemGroup Label="ProjectConfigurations"> + <ProjectConfiguration Include="Debug|Win32"> + <Configuration>Debug</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|Win32"> + <Configuration>Release</Configuration> + <Platform>Win32</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Debug|x64"> + <Configuration>Debug</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + <ProjectConfiguration Include="Release|x64"> + <Configuration>Release</Configuration> + <Platform>x64</Platform> + </ProjectConfiguration> + </ItemGroup> + <ItemGroup> + <ClCompile Include="googletest\googlemock\src\gmock-all.cc" /> + <ClCompile Include="googletest\googletest\src\gtest-all.cc" /> + </ItemGroup> + <PropertyGroup Label="Globals"> + <VCProjectVersion>15.0</VCProjectVersion> + <ProjectGuid>{CAC1267B-8778-4257-AAC6-CAF481723B01}</ProjectGuid> + <Keyword>Win32Proj</Keyword> + <RootNamespace>gtest</RootNamespace> + <WindowsTargetPlatformVersion>10.0.15063.0</WindowsTargetPlatformVersion> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + <TargetName>gtestd</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + <TargetName>gtest</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>true</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <CharacterSet>Unicode</CharacterSet> + <TargetName>gtestd</TargetName> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration"> + <ConfigurationType>StaticLibrary</ConfigurationType> + <UseDebugLibraries>false</UseDebugLibraries> + <PlatformToolset>v141</PlatformToolset> + <WholeProgramOptimization>true</WholeProgramOptimization> + <CharacterSet>Unicode</CharacterSet> + <TargetName>gtest</TargetName> + </PropertyGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> + <ImportGroup Label="ExtensionSettings"> + </ImportGroup> + <ImportGroup Label="Shared"> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> + </ImportGroup> + <PropertyGroup Label="UserMacros" /> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <LinkIncremental>true</LinkIncremental> + <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath> + <SourcePath>$(VC_SourcePath);</SourcePath> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <LinkIncremental>true</LinkIncremental> + <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath> + <SourcePath>$(VC_SourcePath);</SourcePath> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <LinkIncremental>false</LinkIncremental> + <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath> + <SourcePath>$(VC_SourcePath);</SourcePath> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <LinkIncremental>false</LinkIncremental> + <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);</IncludePath> + <SourcePath>$(VC_SourcePath);</SourcePath> + <OutDir>$(MSBuildProjectDirectory)\bin\$(Configuration)\$(Platform)\</OutDir> + </PropertyGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>Disabled</Optimization> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>_DEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>WIN32;NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> + <ClCompile> + <PrecompiledHeader>NotUsing</PrecompiledHeader> + <WarningLevel>Level3</WarningLevel> + <Optimization>MaxSpeed</Optimization> + <FunctionLevelLinking>true</FunctionLevelLinking> + <IntrinsicFunctions>true</IntrinsicFunctions> + <SDLCheck>true</SDLCheck> + <PreprocessorDefinitions>NDEBUG;_LIB;%(PreprocessorDefinitions)</PreprocessorDefinitions> + <ConformanceMode>true</ConformanceMode> + <AdditionalIncludeDirectories>googletest\googletest\include;googletest\googletest;googletest\googlemock;googletest\googlemock\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories> + <RuntimeLibrary>MultiThreaded</RuntimeLibrary> + </ClCompile> + <Link> + <SubSystem>Windows</SubSystem> + <EnableCOMDATFolding>true</EnableCOMDATFolding> + <OptimizeReferences>true</OptimizeReferences> + <GenerateDebugInformation>true</GenerateDebugInformation> + </Link> + </ItemDefinitionGroup> + <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> + <ImportGroup Label="ExtensionTargets"> + </ImportGroup> +</Project> \ No newline at end of file diff --git a/tools/GenerateNativeAssets.ps1 b/src/IISIntegration/tools/GenerateNativeAssets.ps1 similarity index 100% rename from tools/GenerateNativeAssets.ps1 rename to src/IISIntegration/tools/GenerateNativeAssets.ps1 diff --git a/tools/SetupTestEnvironment.ps1 b/src/IISIntegration/tools/SetupTestEnvironment.ps1 similarity index 100% rename from tools/SetupTestEnvironment.ps1 rename to src/IISIntegration/tools/SetupTestEnvironment.ps1 diff --git a/tools/UpdateIISExpressCertificate.ps1 b/src/IISIntegration/tools/UpdateIISExpressCertificate.ps1 similarity index 100% rename from tools/UpdateIISExpressCertificate.ps1 rename to src/IISIntegration/tools/UpdateIISExpressCertificate.ps1 diff --git a/tools/certificate.ps1 b/src/IISIntegration/tools/certificate.ps1 similarity index 100% rename from tools/certificate.ps1 rename to src/IISIntegration/tools/certificate.ps1 diff --git a/tools/httpsys.ps1 b/src/IISIntegration/tools/httpsys.ps1 similarity index 100% rename from tools/httpsys.ps1 rename to src/IISIntegration/tools/httpsys.ps1 diff --git a/tools/installancm.ps1 b/src/IISIntegration/tools/installancm.ps1 similarity index 100% rename from tools/installancm.ps1 rename to src/IISIntegration/tools/installancm.ps1 diff --git a/tools/update_schema.ps1 b/src/IISIntegration/tools/update_schema.ps1 similarity index 100% rename from tools/update_schema.ps1 rename to src/IISIntegration/tools/update_schema.ps1 diff --git a/version.props b/src/IISIntegration/version.props similarity index 100% rename from version.props rename to src/IISIntegration/version.props diff --git a/test/gtest/googletest b/test/gtest/googletest deleted file mode 160000 index 4e4df226fc197c0dda6e37f5c8c3845ca1e73a49..0000000000000000000000000000000000000000 --- a/test/gtest/googletest +++ /dev/null @@ -1 +0,0 @@ -Subproject commit 4e4df226fc197c0dda6e37f5c8c3845ca1e73a49