using System;
using System.Collections.Generic;
using System.IO;
using System.Reflection;
using System.Threading;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Hosting.Server;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Http.Features;
using Vit.Core.Module.Log;
using Vit.Extensions;
using Vit.Extensions.ObjectExt;
namespace Sers.Serslot
{
public class SerslotServer : IServer
{
///
///
///
public IServiceProvider serviceProvider { get; set; }
#region PairingToken
string pairingToken;
public void InitPairingToken(IWebHostBuilder hostBuilder)
{
//search "MS-ASPNETCORE-TOKEN" to know why
string PairingToken = "TOKEN";
pairingToken = hostBuilder.GetSetting(PairingToken) ?? Environment.GetEnvironmentVariable($"ASPNETCORE_{PairingToken}");
}
#endregion
#region ProcessRequest
Action OnProcessRequest;
public IHttpResponseFeature ProcessRequest(HttpRequestFeature requestFeature)
{
if (requestFeature.Headers == null)
requestFeature.Headers = new HeaderDictionary();
//var header = "{\"Cache-Control\":\"max-age=0\",\"Connection\":\"Keep-Alive\",\"Accept\":\"text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8\",\"Accept-Encoding\":\"gzip, deflate\",\"Accept-Language\":\"zh-CN,zh;q=0.8\",\"Host\":\"localhost:44308\",\"User-Agent\":\"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0\",\"Upgrade-Insecure-Requests\":\"1\",\"X-Forwarded-For\":\"127.0.0.1:53093\",\"X-Forwarded-Proto\":\"https\"}";
//header = "{\"Host\":\"localhost:44308\",\"X-Forwarded-For\":\"127.0.0.1:53093\",\"X-Forwarded-Proto\":\"https\"}";
//使用Add可能报错 An item with the same key has already been added. Key: X-Forwarded-Proto"
//requestFeature.Headers.Add("MS-ASPNETCORE-TOKEN", pairingToken);
//requestFeature.Headers.Add("X-Forwarded-Proto", "https");
requestFeature.Headers["MS-ASPNETCORE-TOKEN"] = pairingToken;
requestFeature.Headers["X-Forwarded-Proto"] = "https";
var features = new FeatureCollection();
features.Set(requestFeature);
//var _responseFeature = new SerslotResponseFeature() { Body = new MemoryStream() };
var _responseFeature = new HttpResponseFeature() { Body = new MemoryStream() };
features.Set(_responseFeature);
//IHttpResponseBodyFeature
if (Type_IResponseBodyFeature != null)
{
features[Type_IResponseBodyFeature] = Activator.CreateInstance(Type_ResponseBodyFeature, _responseFeature.Body);
}
OnProcessRequest(features);
return _responseFeature;
}
#region SerslotResponseFeature
class SerslotResponseFeature : IHttpResponseFeature
{
public SerslotResponseFeature()
{
StatusCode = 200;
Headers = new HeaderDictionary();
Body = Stream.Null;
}
public int StatusCode
{
get;
set;
}
public string ReasonPhrase
{
get;
set;
}
public IHeaderDictionary Headers
{
get;
set;
}
public Stream Body
{
get;
set;
}
public virtual bool HasStarted { get; set; } = false;
private Stack, object>> _onStarting;
private Stack, object>> _onCompleted;
#region OnStarting
public virtual void OnStarting(Func