From c29d14e24153bc7147519e97c8fe4bac0e8a0528 Mon Sep 17 00:00:00 2001 From: jinnan Date: Sun, 27 Mar 2022 10:15:43 +0800 Subject: [PATCH] Add missing samples for chapter 18 --- 18/S1802/App.csproj | 4 -- 18/S1802/HttpParserHandler.cs | 22 ------- 18/S1802/Program.cs | 55 ++--------------- 18/S1803/App.csproj | 1 + 18/S1803/Program.cs | 61 ++++++++++++++++--- 18/S1804/App.csproj | 17 +++--- 18/{S1803 => S1804}/HostedApplication.cs | 0 18/S1804/HttpParserHandler.cs | 22 +++++++ .../KestrelServerOptionsExtensions.cs | 0 18/{S1803 => S1804}/MiniKestrelServer.cs | 0 18/S1804/Program.cs | 43 +++---------- 18/{S1803 => S1804}/StreamBodyFeature.cs | 0 18/S1805/App.csproj | 2 + 18/S1806/App.csproj | 10 +++ 18/{S1804 => S1806}/App.sln | 0 18/S1806/Program.cs | 25 ++++++++ 18/app.sln | 58 ++++++++++++------ 17 files changed, 175 insertions(+), 145 deletions(-) delete mode 100644 18/S1802/HttpParserHandler.cs rename 18/{S1803 => S1804}/HostedApplication.cs (100%) create mode 100644 18/S1804/HttpParserHandler.cs rename 18/{S1803 => S1804}/KestrelServerOptionsExtensions.cs (100%) rename 18/{S1803 => S1804}/MiniKestrelServer.cs (100%) rename 18/{S1803 => S1804}/StreamBodyFeature.cs (100%) create mode 100644 18/S1806/App.csproj rename 18/{S1804 => S1806}/App.sln (100%) create mode 100644 18/S1806/Program.cs diff --git a/18/S1802/App.csproj b/18/S1802/App.csproj index 1793b97..c5efc25 100644 --- a/18/S1802/App.csproj +++ b/18/S1802/App.csproj @@ -7,8 +7,4 @@ true - - - - diff --git a/18/S1802/HttpParserHandler.cs b/18/S1802/HttpParserHandler.cs deleted file mode 100644 index 557376a..0000000 --- a/18/S1802/HttpParserHandler.cs +++ /dev/null @@ -1,22 +0,0 @@ -using HttpMachine; -using Microsoft.AspNetCore.Http.Features; - -namespace App -{ -public class HttpParserHandler : IHttpParserHandler -{ - public HttpRequestFeature Request { get; } = new HttpRequestFeature(); - - private string? headerName = null; - public void OnBody(HttpParser parser, ArraySegment data)=> Request.Body = new MemoryStream(data.Array!, data.Offset, data.Count); - public void OnFragment(HttpParser parser, string fragment) { } - public void OnHeaderName(HttpParser parser, string name)=> headerName = name; - public void OnHeadersEnd(HttpParser parser) { } - public void OnHeaderValue(HttpParser parser, string value)=> Request.Headers[headerName!] = value; - public void OnMessageBegin(HttpParser parser) { } - public void OnMessageEnd(HttpParser parser) { } - public void OnMethod(HttpParser parser, string method)=> Request.Method = method; - public void OnQueryString(HttpParser parser, string queryString)=> Request.QueryString = queryString; - public void OnRequestUri(HttpParser parser, string requestUri)=> Request.Path = requestUri; -} -} diff --git a/18/S1802/Program.cs b/18/S1802/Program.cs index 98db2cd..11f40bc 100644 --- a/18/S1802/Program.cs +++ b/18/S1802/Program.cs @@ -1,53 +1,10 @@ -using App; -using HttpMachine; -using Microsoft.AspNetCore.Connections; -using Microsoft.AspNetCore.Http.Features; -using System.Buffers; -using System.IO.Pipelines; -using System.Net; -using System.Text; +var builder = WebApplication.CreateBuilder(args); +builder.WebHost + .UseKestrel(kestrel => kestrel.ListenLocalhost(8000)) + .UseUrls("http://localhost:9000"); +var app = builder.Build(); +app.Run(); -var factory = WebApplication.Create().Services.GetRequiredService(); -var listener = await factory.BindAsync(new IPEndPoint(IPAddress.Any, 5000)); -while (true) -{ - var context = await listener.AcceptAsync(); - _ = HandleAsync(context!); - static async Task HandleAsync(ConnectionContext connection) - { - var reader = connection!.Transport.Input; - while (true) - { - var result = await reader.ReadAsync(); - var request = ParseRequest(result); - reader.AdvanceTo(result.Buffer.End); - Console.WriteLine("[{0}]Receive request: {1} {2} Connection:{3}", connection.ConnectionId, request.Method, request.Path, request.Headers?["Connection"] ?? "N/A"); - var response = @"HTTP/1.1 200 OK -Content-Type: text/plain; charset=utf-8 -Content-Length: 12 -Hello World!"; - await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes(response)); - if (request.Headers!.TryGetValue("Connection", out var value) && string.Compare(value, "close", true) == 0) - { - await connection.DisposeAsync(); - return; - } - if (result.IsCompleted) - { - break; - } - } - await reader.CompleteAsync(); - } - - static HttpRequestFeature ParseRequest(ReadResult result) - { - var handler = new HttpParserHandler(); - var parserHandler = new HttpParser(handler); - parserHandler.Execute(new ArraySegment(result.Buffer.ToArray())); - return handler.Request; - } -} \ No newline at end of file diff --git a/18/S1803/App.csproj b/18/S1803/App.csproj index bdeeda6..1793b97 100644 --- a/18/S1803/App.csproj +++ b/18/S1803/App.csproj @@ -10,4 +10,5 @@ + diff --git a/18/S1803/Program.cs b/18/S1803/Program.cs index 290afe6..98db2cd 100644 --- a/18/S1803/Program.cs +++ b/18/S1803/Program.cs @@ -1,10 +1,53 @@ using App; -using Microsoft.AspNetCore.Hosting.Server; -using Microsoft.Extensions.DependencyInjection.Extensions; - -var builder = WebApplication.CreateBuilder(); -builder.WebHost.UseKestrel(kestrel => kestrel.ListenLocalhost(5000)); -builder.Services.Replace(ServiceDescriptor.Singleton()); -var app = builder.Build(); -app.Run(context => context.Response.WriteAsync("Hello World!")); -app.Run(); \ No newline at end of file +using HttpMachine; +using Microsoft.AspNetCore.Connections; +using Microsoft.AspNetCore.Http.Features; +using System.Buffers; +using System.IO.Pipelines; +using System.Net; +using System.Text; + +var factory = WebApplication.Create().Services.GetRequiredService(); +var listener = await factory.BindAsync(new IPEndPoint(IPAddress.Any, 5000)); +while (true) +{ + var context = await listener.AcceptAsync(); + _ = HandleAsync(context!); + + static async Task HandleAsync(ConnectionContext connection) + { + var reader = connection!.Transport.Input; + while (true) + { + var result = await reader.ReadAsync(); + var request = ParseRequest(result); + reader.AdvanceTo(result.Buffer.End); + Console.WriteLine("[{0}]Receive request: {1} {2} Connection:{3}", connection.ConnectionId, request.Method, request.Path, request.Headers?["Connection"] ?? "N/A"); + + var response = @"HTTP/1.1 200 OK +Content-Type: text/plain; charset=utf-8 +Content-Length: 12 + +Hello World!"; + await connection.Transport.Output.WriteAsync(Encoding.UTF8.GetBytes(response)); + if (request.Headers!.TryGetValue("Connection", out var value) && string.Compare(value, "close", true) == 0) + { + await connection.DisposeAsync(); + return; + } + if (result.IsCompleted) + { + break; + } + } + await reader.CompleteAsync(); + } + + static HttpRequestFeature ParseRequest(ReadResult result) + { + var handler = new HttpParserHandler(); + var parserHandler = new HttpParser(handler); + parserHandler.Execute(new ArraySegment(result.Buffer.ToArray())); + return handler.Request; + } +} \ No newline at end of file diff --git a/18/S1804/App.csproj b/18/S1804/App.csproj index efdcf3b..bdeeda6 100644 --- a/18/S1804/App.csproj +++ b/18/S1804/App.csproj @@ -1,12 +1,13 @@ - - net6.0 - enable - enable - true - OutOfProcess - - + + net6.0 + enable + enable + true + + + + diff --git a/18/S1803/HostedApplication.cs b/18/S1804/HostedApplication.cs similarity index 100% rename from 18/S1803/HostedApplication.cs rename to 18/S1804/HostedApplication.cs diff --git a/18/S1804/HttpParserHandler.cs b/18/S1804/HttpParserHandler.cs new file mode 100644 index 0000000..449e2a3 --- /dev/null +++ b/18/S1804/HttpParserHandler.cs @@ -0,0 +1,22 @@ +using HttpMachine; +using Microsoft.AspNetCore.Http.Features; + +namespace App +{ + public class HttpParserHandler : IHttpParserHandler + { + public HttpRequestFeature Request { get; } = new HttpRequestFeature(); + + private string? headerName = null; + public void OnBody(HttpParser parser, ArraySegment data) => Request.Body = new MemoryStream(data.Array!, data.Offset, data.Count); + public void OnFragment(HttpParser parser, string fragment) { } + public void OnHeaderName(HttpParser parser, string name) => headerName = name; + public void OnHeadersEnd(HttpParser parser) { } + public void OnHeaderValue(HttpParser parser, string value) => Request.Headers[headerName!] = value; + public void OnMessageBegin(HttpParser parser) { } + public void OnMessageEnd(HttpParser parser) { } + public void OnMethod(HttpParser parser, string method) => Request.Method = method; + public void OnQueryString(HttpParser parser, string queryString) => Request.QueryString = queryString; + public void OnRequestUri(HttpParser parser, string requestUri) => Request.Path = requestUri; + } +} diff --git a/18/S1803/KestrelServerOptionsExtensions.cs b/18/S1804/KestrelServerOptionsExtensions.cs similarity index 100% rename from 18/S1803/KestrelServerOptionsExtensions.cs rename to 18/S1804/KestrelServerOptionsExtensions.cs diff --git a/18/S1803/MiniKestrelServer.cs b/18/S1804/MiniKestrelServer.cs similarity index 100% rename from 18/S1803/MiniKestrelServer.cs rename to 18/S1804/MiniKestrelServer.cs diff --git a/18/S1804/Program.cs b/18/S1804/Program.cs index e05ecff..290afe6 100644 --- a/18/S1804/Program.cs +++ b/18/S1804/Program.cs @@ -1,33 +1,10 @@ -using Microsoft.AspNetCore.Server.Kestrel.Core; -using System.Diagnostics; -using System.Text; - -var app = WebApplication.Create(args); -app.Run(HandleAsync); -app.Run(); - -static Task HandleAsync(HttpContext httpContext) -{ - var request = httpContext.Request; - var configuration = httpContext.RequestServices.GetRequiredService(); - var builder = new StringBuilder(); - builder.AppendLine($"Process: {Process.GetCurrentProcess().ProcessName}"); - builder.AppendLine($"MS-ASPNETCORE-TOKEN: {request.Headers["MS-ASPNETCORE-TOKEN"]}"); - builder.AppendLine($"PathBase: {request.PathBase}"); - builder.AppendLine("Environment Variables"); - foreach (string key in Environment.GetEnvironmentVariables().Keys) - { - if (key.StartsWith("ASPNETCORE_")) - { - builder.AppendLine($"\t{key}={Environment.GetEnvironmentVariable(key)}"); - } - } - return httpContext.Response.WriteAsync(builder.ToString()); -} - - - - -// -// Summary: -// The minimum data rate for incoming connections. +using App; +using Microsoft.AspNetCore.Hosting.Server; +using Microsoft.Extensions.DependencyInjection.Extensions; + +var builder = WebApplication.CreateBuilder(); +builder.WebHost.UseKestrel(kestrel => kestrel.ListenLocalhost(5000)); +builder.Services.Replace(ServiceDescriptor.Singleton()); +var app = builder.Build(); +app.Run(context => context.Response.WriteAsync("Hello World!")); +app.Run(); \ No newline at end of file diff --git a/18/S1803/StreamBodyFeature.cs b/18/S1804/StreamBodyFeature.cs similarity index 100% rename from 18/S1803/StreamBodyFeature.cs rename to 18/S1804/StreamBodyFeature.cs diff --git a/18/S1805/App.csproj b/18/S1805/App.csproj index b21a5bb..efdcf3b 100644 --- a/18/S1805/App.csproj +++ b/18/S1805/App.csproj @@ -5,6 +5,8 @@ enable enable true + OutOfProcess + diff --git a/18/S1806/App.csproj b/18/S1806/App.csproj new file mode 100644 index 0000000..b21a5bb --- /dev/null +++ b/18/S1806/App.csproj @@ -0,0 +1,10 @@ + + + + net6.0 + enable + enable + true + + + diff --git a/18/S1804/App.sln b/18/S1806/App.sln similarity index 100% rename from 18/S1804/App.sln rename to 18/S1806/App.sln diff --git a/18/S1806/Program.cs b/18/S1806/Program.cs new file mode 100644 index 0000000..9bbed5f --- /dev/null +++ b/18/S1806/Program.cs @@ -0,0 +1,25 @@ +using System.Diagnostics; +using System.Text; + +var app = WebApplication.Create(args); +app.Run(HandleAsync); +app.Run(); + +static Task HandleAsync(HttpContext httpContext) +{ + var request = httpContext.Request; + var configuration = httpContext.RequestServices.GetRequiredService(); + var builder = new StringBuilder(); + builder.AppendLine($"Process: {Process.GetCurrentProcess().ProcessName}"); + builder.AppendLine($"MS-ASPNETCORE-TOKEN: {request.Headers["MS-ASPNETCORE-TOKEN"]}"); + builder.AppendLine($"PathBase: {request.PathBase}"); + builder.AppendLine("Environment Variables"); + foreach (string key in Environment.GetEnvironmentVariables().Keys) + { + if (key.StartsWith("ASPNETCORE_")) + { + builder.AppendLine($"\t{key}={Environment.GetEnvironmentVariable(key)}"); + } + } + return httpContext.Response.WriteAsync(builder.ToString()); +} \ No newline at end of file diff --git a/18/app.sln b/18/app.sln index 71e137c..2dff469 100644 --- a/18/app.sln +++ b/18/app.sln @@ -9,15 +9,23 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1801\App\App.csproj EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02", "02", "{7A396472-0AD9-45F8-A9FA-8822B388C1B8}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1802\App.csproj", "{3DC6FF7F-0947-4FC0-A086-1BC729892C57}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "03", "03", "{766E89F3-040A-4F01-8DB0-81B4FFA6DA41}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1803\App.csproj", "{16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF}" -EndProject Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "04", "04", "{F0B75382-6AD2-451E-928E-4A588386B9A3}" EndProject -Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1804\App.csproj", "{243DF55D-2E11-481F-AA7A-141C2A75792D}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1802\App.csproj", "{B301EF61-F0FC-4365-8BB1-795D44DAA596}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1803\App.csproj", "{7FEC7E96-490F-437A-842B-8FD5C8E1ACD0}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1804\App.csproj", "{32FCB6EE-F393-4200-AB7E-53AC505E4045}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "05", "05", "{833C70FB-5505-4028-8AA7-746387DF6057}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1805\App.csproj", "{4CEA307B-C6E9-482D-9552-FD887B06A870}" +EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "06", "06", "{D23C6AF0-1B3F-47D2-A4C1-663C69C1B50E}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "App", "S1806\App.csproj", "{F6052059-ECC2-4371-88ED-CAFACBF9FDAE}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -29,27 +37,37 @@ Global {D2C80B62-059F-4289-912B-2AC841C2E8C4}.Debug|Any CPU.Build.0 = Debug|Any CPU {D2C80B62-059F-4289-912B-2AC841C2E8C4}.Release|Any CPU.ActiveCfg = Release|Any CPU {D2C80B62-059F-4289-912B-2AC841C2E8C4}.Release|Any CPU.Build.0 = Release|Any CPU - {3DC6FF7F-0947-4FC0-A086-1BC729892C57}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {3DC6FF7F-0947-4FC0-A086-1BC729892C57}.Debug|Any CPU.Build.0 = Debug|Any CPU - {3DC6FF7F-0947-4FC0-A086-1BC729892C57}.Release|Any CPU.ActiveCfg = Release|Any CPU - {3DC6FF7F-0947-4FC0-A086-1BC729892C57}.Release|Any CPU.Build.0 = Release|Any CPU - {16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF}.Debug|Any CPU.Build.0 = Debug|Any CPU - {16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF}.Release|Any CPU.ActiveCfg = Release|Any CPU - {16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF}.Release|Any CPU.Build.0 = Release|Any CPU - {243DF55D-2E11-481F-AA7A-141C2A75792D}.Debug|Any CPU.ActiveCfg = Debug|Any CPU - {243DF55D-2E11-481F-AA7A-141C2A75792D}.Debug|Any CPU.Build.0 = Debug|Any CPU - {243DF55D-2E11-481F-AA7A-141C2A75792D}.Release|Any CPU.ActiveCfg = Release|Any CPU - {243DF55D-2E11-481F-AA7A-141C2A75792D}.Release|Any CPU.Build.0 = Release|Any CPU + {B301EF61-F0FC-4365-8BB1-795D44DAA596}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {B301EF61-F0FC-4365-8BB1-795D44DAA596}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B301EF61-F0FC-4365-8BB1-795D44DAA596}.Release|Any CPU.ActiveCfg = Release|Any CPU + {B301EF61-F0FC-4365-8BB1-795D44DAA596}.Release|Any CPU.Build.0 = Release|Any CPU + {7FEC7E96-490F-437A-842B-8FD5C8E1ACD0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {7FEC7E96-490F-437A-842B-8FD5C8E1ACD0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {7FEC7E96-490F-437A-842B-8FD5C8E1ACD0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {7FEC7E96-490F-437A-842B-8FD5C8E1ACD0}.Release|Any CPU.Build.0 = Release|Any CPU + {32FCB6EE-F393-4200-AB7E-53AC505E4045}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {32FCB6EE-F393-4200-AB7E-53AC505E4045}.Debug|Any CPU.Build.0 = Debug|Any CPU + {32FCB6EE-F393-4200-AB7E-53AC505E4045}.Release|Any CPU.ActiveCfg = Release|Any CPU + {32FCB6EE-F393-4200-AB7E-53AC505E4045}.Release|Any CPU.Build.0 = Release|Any CPU + {4CEA307B-C6E9-482D-9552-FD887B06A870}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CEA307B-C6E9-482D-9552-FD887B06A870}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CEA307B-C6E9-482D-9552-FD887B06A870}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CEA307B-C6E9-482D-9552-FD887B06A870}.Release|Any CPU.Build.0 = Release|Any CPU + {F6052059-ECC2-4371-88ED-CAFACBF9FDAE}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {F6052059-ECC2-4371-88ED-CAFACBF9FDAE}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F6052059-ECC2-4371-88ED-CAFACBF9FDAE}.Release|Any CPU.ActiveCfg = Release|Any CPU + {F6052059-ECC2-4371-88ED-CAFACBF9FDAE}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE EndGlobalSection GlobalSection(NestedProjects) = preSolution {D2C80B62-059F-4289-912B-2AC841C2E8C4} = {85F54F4E-7E46-4420-85A4-41BAB938AD0A} - {3DC6FF7F-0947-4FC0-A086-1BC729892C57} = {7A396472-0AD9-45F8-A9FA-8822B388C1B8} - {16E2A3BF-02D6-48CD-AD75-C2EFE66A94DF} = {766E89F3-040A-4F01-8DB0-81B4FFA6DA41} - {243DF55D-2E11-481F-AA7A-141C2A75792D} = {F0B75382-6AD2-451E-928E-4A588386B9A3} + {B301EF61-F0FC-4365-8BB1-795D44DAA596} = {7A396472-0AD9-45F8-A9FA-8822B388C1B8} + {7FEC7E96-490F-437A-842B-8FD5C8E1ACD0} = {766E89F3-040A-4F01-8DB0-81B4FFA6DA41} + {32FCB6EE-F393-4200-AB7E-53AC505E4045} = {F0B75382-6AD2-451E-928E-4A588386B9A3} + {4CEA307B-C6E9-482D-9552-FD887B06A870} = {833C70FB-5505-4028-8AA7-746387DF6057} + {F6052059-ECC2-4371-88ED-CAFACBF9FDAE} = {D23C6AF0-1B3F-47D2-A4C1-663C69C1B50E} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {EC3FCBE3-E76D-4127-B472-026A2C510F05}