Skip to content

Commit 5005556

Browse files
committed
issues#88,issues#86,issues#83,issues#82
1 parent 083a679 commit 5005556

File tree

11 files changed

+86
-77
lines changed

11 files changed

+86
-77
lines changed

src/ActionHandlerFactory.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -340,10 +340,10 @@ private void Register(HttpOptions config, Type controllerType, object controller
340340
route = put.Route;
341341
}
342342

343-
if (server.Options.UrlIgnoreCase)
344-
{
345-
url = sourceUrl.ToLower();
346-
}
343+
//if (server.Options.UrlIgnoreCase)
344+
//{
345+
// url = sourceUrl.ToLower();
346+
//}
347347
RouteTemplateAttribute ra = null;
348348
if (!string.IsNullOrEmpty(route))
349349
{
@@ -457,8 +457,8 @@ public void ExecuteWithWS(HttpRequest request, HttpApiServer server, JToken toke
457457
}
458458
result.Url = url.Value<string>();
459459
string baseurl = result.Url;
460-
if (server.Options.UrlIgnoreCase)
461-
baseurl = HttpParse.CharToLower(result.Url);
460+
//if (server.Options.UrlIgnoreCase)
461+
// baseurl = HttpParse.CharToLower(result.Url);
462462
if (baseurl[0] != '/')
463463
baseurl = "/" + baseurl;
464464
result.Url = baseurl;

src/BeetleX.FastHttpApi.csproj

Lines changed: 5 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,16 +6,16 @@
66
<Authors>henryfan</Authors>
77
<Company>ikende.com</Company>
88
<Description>high performance and lightweight web api and websocket server components for .NETCore,performance higher than asp.net core mvc api 200%.</Description>
9-
<Version>1.7.4</Version>
9+
<Version>1.7.6</Version>
1010
<PackageProjectUrl>https://github.com/IKende/FastHttpApi</PackageProjectUrl>
1111
<PackageLicenseUrl>https://github.com/IKende/FastHttpApi/blob/master/LICENSE</PackageLicenseUrl>
12-
<AssemblyVersion>1.7.4.0</AssemblyVersion>
13-
<FileVersion>1.7.4.0</FileVersion>
12+
<AssemblyVersion>1.7.6.0</AssemblyVersion>
13+
<FileVersion>1.7.6.0</FileVersion>
1414
<LangVersion>7.3</LangVersion>
1515
<Product>BeetleX.FastHttpApi</Product>
1616
<PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance>
1717
<PackageReleaseNotes>high performance and lightweight web api and websocket server components for .NETCore,performance higher than asp.net core mvc api 200%.</PackageReleaseNotes>
18-
<SignAssembly>true</SignAssembly>
18+
<SignAssembly>false</SignAssembly>
1919
<AssemblyOriginatorKeyFile>Beetlex.FastHttpApi.pfx</AssemblyOriginatorKeyFile>
2020
<DelaySign>false</DelaySign>
2121
</PropertyGroup>
@@ -43,11 +43,8 @@
4343
</ItemGroup>
4444

4545
<ItemGroup>
46+
<PackageReference Include="BeetleX" Version="1.4.7" />
4647
<PackageReference Include="Newtonsoft.Json" Version="11.0.2" />
4748
</ItemGroup>
4849

49-
<ItemGroup>
50-
<ProjectReference Include="..\src\BeetleX\BeetleX.csproj" />
51-
</ItemGroup>
52-
5350
</Project>

src/HttpApiServer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -214,7 +214,7 @@ public object this[string name]
214214

215215
public void Register(params System.Reflection.Assembly[] assemblies)
216216
{
217-
mUrlRewrite.UrlIgnoreCase = Options.UrlIgnoreCase;
217+
//mUrlRewrite.UrlIgnoreCase = Options.UrlIgnoreCase;
218218
mAssemblies.AddRange(assemblies);
219219
try
220220
{
@@ -252,7 +252,7 @@ public void Open()
252252
var ct = ContentTypes.TEXT_UTF8;
253253
var a = HeaderTypeFactory.Find("Content-Length");
254254
AppDomain.CurrentDomain.AssemblyResolve += ResolveHandler;
255-
HttpPacket hp = new HttpPacket(this, this);
255+
HttpPacket hp = new HttpPacket(this, this.FrameSerializer);
256256
var gtmdate = GMTDate.Default;
257257
string serverInfo = $"Server: BeetleX[{typeof(BeetleX.BXException).Assembly.GetName().Version}]/FastHttpApi[{typeof(HttpApiServer).Assembly.GetName().Version}]\r\n";
258258
HeaderTypeFactory.SERVAR_HEADER_BYTES = Encoding.ASCII.GetBytes(serverInfo);
@@ -310,7 +310,7 @@ public void Open()
310310
StartTime = DateTime.Now;
311311
mServer.Open();
312312
mServerCounter = new ServerCounter(this);
313-
mUrlRewrite.UrlIgnoreCase = Options.UrlIgnoreCase;
313+
// mUrlRewrite.UrlIgnoreCase = Options.UrlIgnoreCase;
314314
mUrlRewrite.Load();
315315
//mUrlRewrite.AddRegion(this.Options.Routes);
316316
HeaderTypeFactory.Find(HeaderTypeFactory.HOST);

src/HttpOptions.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public HttpOptions()
3636
FileManager = false;
3737
CacheFileSize = 500;
3838
PacketCombined = 0;
39-
UrlIgnoreCase = true;
39+
// UrlIgnoreCase = true;
4040
UseIPv6 = true;
4141
SessionTimeOut = 60 * 30;
4242
BufferPoolMaxMemory = 500;
@@ -105,7 +105,7 @@ public void SetDebug(string viewpath = null)
105105

106106
public bool UseIPv6 { get; set; }
107107

108-
public bool UrlIgnoreCase { get; set; }
108+
// public bool UrlIgnoreCase { get; set; }
109109

110110
[JsonIgnore]
111111
public OptionsAttribute CrossDomain { get; set; }

src/HttpPacket.cs

Lines changed: 29 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,7 @@ private void OnHttpDecode(ISession session, PipeStream pstream)
6666
}
6767
else
6868
{
69+
HttpToken token = (HttpToken)session.Tag;
6970
if (session.Server.EnableLog(LogType.Info))
7071
session.Server.Log(LogType.Info, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} request from multi receive");
7172
if (mRequest.State == LoadedState.None)
@@ -76,7 +77,10 @@ private void OnHttpDecode(ISession session, PipeStream pstream)
7677
{
7778
session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} receive data error!");
7879
}
79-
session.Dispose();
80+
token.KeepAlive = false;
81+
var response = mRequest.CreateResponse();
82+
InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request http receive data error!");
83+
response.Result(innerErrorResult);
8084
return;
8185
}
8286
var span = pstream.FirstBuffer.Memory.Slice(0, 10).Span;
@@ -89,29 +93,34 @@ private void OnHttpDecode(ISession session, PipeStream pstream)
8993
if (session.Server.EnableLog(LogType.Warring))
9094
{
9195
session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} protocol data error!");
92-
}
93-
session.Dispose();
96+
}
97+
token.KeepAlive = false;
98+
var response = mRequest.CreateResponse();
99+
InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request http protocol data error!");
100+
response.Result(innerErrorResult);
94101
return;
95102
}
96103
}
97-
if ((int)mRequest.State < (int)LoadedState.Header && pstream.Length > 1024 * 4)
104+
if ((int)mRequest.State < (int)LoadedState.Header && (pstream.Length > 1024 * 4 || mReceives > 20))
98105
{
99106
if (session.Server.EnableLog(LogType.Warring))
100107
{
101108
session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} header too long!");
102109
}
103-
session.Dispose();
110+
token.KeepAlive = false;
111+
var response = mRequest.CreateResponse();
112+
InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request header too large");
113+
response.Result(innerErrorResult);
104114
}
105115
else if (mRequest.Length > mServerConfig.MaxBodyLength)
106116
{
107117
if (session.Server.EnableLog(LogType.Warring))
108118
{
109119
session.Server.Log(LogType.Warring, session, $"HTTP {mRequest.ID} {session.RemoteEndPoint} body too long!");
110120
}
111-
HttpToken token = (HttpToken)session.Tag;
112121
token.KeepAlive = false;
113122
var response = mRequest.CreateResponse();
114-
InnerErrorResult innerErrorResult = new InnerErrorResult("413", "Request Entity Too Large");
123+
InnerErrorResult innerErrorResult = new InnerErrorResult("400", "Request entity too large");
115124
response.Result(innerErrorResult);
116125
return;
117126
}
@@ -130,22 +139,27 @@ private void OnWebSocketDecode(ISession session, PipeStream pstream)
130139
{
131140
mWebSocketRequest++;
132141
long now = session.Server.GetRunTime();
133-
if (now - mLastTime > 1000)
142+
if (now - mLastTime < 1000)
134143
{
135144
if (mServerConfig.WebSocketMaxRPS > 0 && mWebSocketRequest > mServerConfig.WebSocketMaxRPS)
136145
{
137146
if (session.Server.EnableLog(LogType.Warring))
138147
{
139-
session.Server.Log(LogType.Warring, session, $"Websocket {mRequest?.ID} {session.RemoteEndPoint} session rps to max!");
148+
session.Server.Log(LogType.Warring, session, $"Websocket {mRequest?.ID} {session.RemoteEndPoint} session rps limit!");
140149
}
141-
session.Dispose();
142-
}
143-
else
144-
{
145-
mWebSocketRequest = 0;
146-
mLastTime = now;
150+
HttpToken token = (HttpToken)session.Tag;
151+
token.KeepAlive = false;
152+
var error = new ActionResult(500, "session rps limit!");
153+
var frame = mServer.CreateDataFrame(error);
154+
frame.Send(session);
155+
// session.Dispose();
147156
}
148157
}
158+
else
159+
{
160+
mWebSocketRequest = 0;
161+
mLastTime = now;
162+
}
149163
DataFrame data = mDataPacket;
150164
mDataPacket = null;
151165
Completed?.Invoke(this, mCompletedArgs.SetInfo(session, data));

src/HttpParse.cs

Lines changed: 3 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -496,28 +496,17 @@ public static int ReadUrlQueryString(ReadOnlySpan<char> url, QueryString querySt
496496

497497
public static void ReadUrlPathAndExt(ReadOnlySpan<char> url, QueryString queryString, HttpRequest request, HttpOptions config)
498498
{
499-
bool urlIgnoreCase = config.UrlIgnoreCase;
500-
501-
if (urlIgnoreCase)
502-
request.BaseUrl = CharToLower(url);
503-
else
504-
request.BaseUrl = new string(url);
499+
request.BaseUrl = new string(url);
505500
for (int i = url.Length - 1; i >= 0; i--)
506501
{
507502
if (url[i] == '.' && request.Ext == null)
508-
{
509-
//if (urlIgnoreCase)
503+
{
510504
request.Ext = CharToLower(url.Slice(i + 1, url.Length - i - 1));
511-
//else
512-
// request.Ext = new string(url.Slice(i + 1, url.Length - i - 1));
513505
continue;
514506
}
515507
if (url[i] == '/')
516508
{
517-
if (urlIgnoreCase)
518-
request.Path = CharToLower(url.Slice(0, i + 1));
519-
else
520-
request.Path = new string(url.Slice(0, i + 1));
509+
request.Path = new string(url.Slice(0, i + 1));
521510
return;
522511
}
523512
}

src/HttpRequest.cs

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -38,17 +38,23 @@ public HttpRequest()
3838

3939
private static long mID = 0;
4040

41+
private static object mLockID = new object();
42+
4143
internal static long GetID()
4244
{
43-
var id = System.Threading.Interlocked.Increment(ref mID);
44-
if (id > 10000000)
45+
lock (mLockID)
4546
{
46-
long prefix = (long)(DateTime.Now - DateTime.Parse("1970-1-1")).TotalSeconds;
47-
prefix = prefix << 24;
48-
System.Threading.Interlocked.Exchange(ref mID, 0);
49-
System.Threading.Interlocked.Exchange(ref mIDPrefix, prefix);
47+
var id = ++mID;
48+
long result = mIDPrefix | id;
49+
if (id == 5000000)
50+
{
51+
long prefix = (long)(DateTime.Now - DateTime.Parse("1970-1-1")).TotalSeconds;
52+
prefix = prefix << 24;
53+
mIDPrefix = prefix;
54+
mID = 0;
55+
}
56+
return result;
5057
}
51-
return mIDPrefix | id;
5258
}
5359

5460
public long ID { get; internal set; }
@@ -91,9 +97,9 @@ internal HttpResponse CreateResponse()
9197
else
9298
Response.Reset();
9399
HttpResponse response = Response;
94-
response.HttpVersion = this.HttpVersion;
95100
response.Session = this.Session;
96-
response.HttpVersion = this.HttpVersion;
101+
if (this.HttpVersion != null)
102+
response.HttpVersion = this.HttpVersion;
97103
response.Request = this;
98104
if (VersionNumber == "1.0" && this.KeepAlive)
99105
response.Header[HeaderTypeFactory.CONNECTION] = "Keep-Alive";
@@ -274,7 +280,7 @@ private void LoadMethod(PipeStream stream)
274280
if (mQueryStringIndex > 0)
275281
HttpParse.ReadUrlPathAndExt(Url.AsSpan().Slice(0, mQueryStringIndex), mQueryString, this, this.Server.Options);
276282
else
277-
HttpParse.ReadUrlPathAndExt(Url.AsSpan(), mQueryString, this, this.Server.Options);
283+
HttpParse.ReadUrlPathAndExt(Url.AsSpan(), mQueryString, this, this.Server.Options);
278284
mState = LoadedState.Method;
279285
}
280286
}

src/HttpResponse.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -143,7 +143,7 @@ public void SetContentType(string type)
143143
Header[HeaderTypeFactory.CONTENT_TYPE] = type;
144144
}
145145

146-
public string HttpVersion { get; set; }
146+
public string HttpVersion { get; set; } = "HTTP/1.1";
147147

148148
public void SetStatus(string code, string msg)
149149
{

src/Route/RouteRewrite.cs

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -17,15 +17,12 @@ public class RouteRewrite
1717
public RouteRewrite(HttpApiServer server)
1818
{
1919
mServer = server;
20-
this.UrlIgnoreCase = mServer.Options.UrlIgnoreCase;
2120
mRouteCached = new LRUCached(mServer.Options.RewriteIgnoreCase ? StringComparer.OrdinalIgnoreCase : StringComparer.Ordinal);
2221
mRouteCached.MaxSize = mServer.Options.RewriteCachedSize;
2322
}
2423

2524
private long mVersion = 0;
2625

27-
public bool UrlIgnoreCase { get; set; }
28-
2926
private LRUCached mRouteCached;
3027

3128
private ConcurrentDictionary<string, RouteGroup> mRoutes = new ConcurrentDictionary<string, RouteGroup>(StringComparer.OrdinalIgnoreCase);
@@ -73,7 +70,6 @@ private void ChangeVersion()
7370
private void Add(UrlRoute item)
7471
{
7572
mServer.Log(EventArgs.LogType.Info, $"HTTP set rewrite url [{item.Host}{item.Url}] to [{item.Rewrite}]");
76-
item.UrlIgnoreCase = this.UrlIgnoreCase;
7773
item.Init();
7874
RouteGroup rg = null;
7975
mRoutes.TryGetValue(item.Path, out rg);

src/StaticResurce/ResourceCenter.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -55,9 +55,9 @@ public void SetFileExts(string exts)
5555
}
5656
}
5757

58-
private ConcurrentDictionary<string, FileResource> mResources = new ConcurrentDictionary<string, FileResource>();
58+
private ConcurrentDictionary<string, FileResource> mResources = new ConcurrentDictionary<string, FileResource>(StringComparer.OrdinalIgnoreCase);
5959

60-
private ConcurrentDictionary<string, FileContentType> mExts = new ConcurrentDictionary<string, FileContentType>();
60+
private ConcurrentDictionary<string, FileContentType> mExts = new ConcurrentDictionary<string, FileContentType>(StringComparer.OrdinalIgnoreCase);
6161

6262
private List<FileSystemWatcher> mFileWatch = new List<FileSystemWatcher>();
6363

@@ -108,9 +108,9 @@ private string GetResourceUrl(string name)
108108
{
109109
charname[indexs[i]] = '/';
110110
}
111-
if (Server.Options.UrlIgnoreCase)
112-
return HttpParse.CharToLower(charname);
113-
else
111+
//if (Server.Options.UrlIgnoreCase)
112+
// return HttpParse.CharToLower(charname);
113+
//else
114114
return new string(charname);
115115
}
116116

@@ -264,8 +264,8 @@ private void OutputFileResource(FileContentType fct, FileResource fr, HttpRespon
264264
public void ProcessFile(HttpRequest request, HttpResponse response)
265265
{
266266
string url = request.BaseUrl;
267-
if (Server.Options.UrlIgnoreCase)
268-
url = HttpParse.CharToLower(request.BaseUrl);
267+
//if (Server.Options.UrlIgnoreCase)
268+
// url = HttpParse.CharToLower(request.BaseUrl);
269269
if (url[url.Length - 1] == '/')
270270
{
271271
for (int i = 0; i < mDefaultPages.Count; i++)
@@ -411,9 +411,9 @@ public string GetUrl(string file)
411411
}
412412
else
413413
{
414-
if (Server.Options.UrlIgnoreCase)
415-
charbuffer[i + offset] = Char.ToLower(filebuffer[i]);
416-
else
414+
//if (Server.Options.UrlIgnoreCase)
415+
// charbuffer[i + offset] = Char.ToLower(filebuffer[i]);
416+
//else
417417
charbuffer[i + offset] = filebuffer[i];
418418
}
419419
}

0 commit comments

Comments
 (0)