89 lines
3.2 KiB
C#
89 lines
3.2 KiB
C#
using System;
|
|
using System.Buffers;
|
|
using System.Net;
|
|
using System.Threading.Tasks;
|
|
using Microsoft.AspNetCore.Builder;
|
|
using Microsoft.AspNetCore.Connections;
|
|
using Microsoft.AspNetCore.Hosting;
|
|
using Microsoft.AspNetCore.Server.Kestrel.Core;
|
|
using Microsoft.Extensions.Hosting;
|
|
using Microsoft.Extensions.Logging;
|
|
|
|
namespace QuicSampleApp
|
|
{
|
|
public class Startup
|
|
{
|
|
public void Configure(IApplicationBuilder app)
|
|
{
|
|
app.Run((httpContext) =>
|
|
{
|
|
return Task.CompletedTask;
|
|
});
|
|
}
|
|
|
|
public static void Main(string[] args)
|
|
{
|
|
var hostBuilder = new HostBuilder()
|
|
.ConfigureWebHost(webHostBuilder =>
|
|
{
|
|
webHostBuilder
|
|
.UseKestrel()
|
|
.UseQuic(options =>
|
|
{
|
|
options.Certificate = null;
|
|
options.Alpn = "QuicTest";
|
|
options.IdleTimeout = TimeSpan.FromHours(1);
|
|
})
|
|
.ConfigureKestrel((context, options) =>
|
|
{
|
|
var basePort = 5555;
|
|
|
|
options.Listen(IPAddress.Any, basePort, listenOptions =>
|
|
{
|
|
listenOptions.Protocols = HttpProtocols.Http3;
|
|
|
|
async Task EchoServer(MultiplexedConnectionContext connection)
|
|
{
|
|
// For graceful shutdown
|
|
|
|
while (true)
|
|
{
|
|
var stream = await connection.AcceptAsync();
|
|
while (true)
|
|
{
|
|
var result = await stream.Transport.Input.ReadAsync();
|
|
|
|
if (result.IsCompleted)
|
|
{
|
|
break;
|
|
}
|
|
|
|
await stream.Transport.Output.WriteAsync(result.Buffer.ToArray());
|
|
|
|
stream.Transport.Input.AdvanceTo(result.Buffer.End);
|
|
}
|
|
}
|
|
}
|
|
|
|
((IMultiplexedConnectionBuilder)listenOptions).Use(next =>
|
|
{
|
|
return context =>
|
|
{
|
|
return EchoServer(context);
|
|
};
|
|
});
|
|
});
|
|
})
|
|
.UseStartup<Startup>();
|
|
})
|
|
.ConfigureLogging((_, factory) =>
|
|
{
|
|
factory.SetMinimumLevel(LogLevel.Debug);
|
|
factory.AddConsole();
|
|
});
|
|
|
|
hostBuilder.Build().Run();
|
|
}
|
|
}
|
|
}
|