Skip to content

Commit efafd21

Browse files
authored
Improve treatment of SocketException (#29)
1 parent dd0a32a commit efafd21

File tree

1 file changed

+75
-84
lines changed

1 file changed

+75
-84
lines changed

nanoFramework.WebServer/WebServer.cs

Lines changed: 75 additions & 84 deletions
Original file line numberDiff line numberDiff line change
@@ -228,7 +228,7 @@ public WebServer(int port, HttpProtocol protocol, Type[] controllers)
228228
}
229229
}
230230

231-
_callbackRoutes.Add(callbackRoutes);
231+
_callbackRoutes.Add(callbackRoutes);
232232
}
233233
}
234234
}
@@ -495,106 +495,97 @@ private void StartListener()
495495
new Thread(() =>
496496
{
497497
bool isRoute = false;
498-
CallbackRoutes route;
499-
int urlParam;
498+
string rawUrl = context.Request.RawUrl;
499+
500+
//This is for handling with transitory or bad requests
501+
if (rawUrl == null)
502+
{
503+
return;
504+
}
505+
506+
int urlParam = rawUrl.IndexOf(ParamStart);
507+
508+
// Variables used only within the "for". They are here for performance reasons
500509
bool isFound;
510+
string routeStr;
501511
int incForSlash;
502512
string toCompare;
503-
string routeStr;
504-
string rawUrl;
513+
bool mustAuthenticate;
514+
bool isAuthOk;
515+
//
505516

506517
foreach (var rt in _callbackRoutes)
507518
{
508-
route = (CallbackRoutes)rt;
509-
urlParam = context.Request.RawUrl.IndexOf(ParamStart);
510-
isFound = false;
519+
CallbackRoutes route = (CallbackRoutes)rt;
520+
511521
routeStr = route.Route;
512-
rawUrl = context.Request.RawUrl;
513522
incForSlash = routeStr.IndexOf('/') == 0 ? 0 : 1;
514523
toCompare = route.CaseSensitive ? rawUrl : rawUrl.ToLower();
515-
if (toCompare.IndexOf(routeStr) == incForSlash)
524+
525+
if (urlParam > 0)
526+
{
527+
isFound = urlParam == routeStr.Length + incForSlash;
528+
}
529+
else
530+
{
531+
isFound = toCompare.Length == routeStr.Length + incForSlash;
532+
}
533+
534+
// Matching the route name
535+
// Matching the method type
536+
if (!isFound ||
537+
(toCompare.IndexOf(routeStr) != incForSlash) ||
538+
(route.Method != string.Empty && context.Request.HttpMethod != route.Method)
539+
)
516540
{
517-
if (urlParam > 0)
541+
continue;
542+
}
543+
544+
// Starting a new thread to be able to handle a new request in parallel
545+
isRoute = true;
546+
547+
// Check auth first
548+
mustAuthenticate = route.Authentication != null && route.Authentication.AuthenticationType != AuthenticationType.None;
549+
isAuthOk = false;
550+
551+
if (mustAuthenticate)
552+
{
553+
if (route.Authentication.AuthenticationType == AuthenticationType.Basic)
518554
{
519-
if (urlParam == routeStr.Length + incForSlash)
520-
{
521-
isFound = true;
522-
}
555+
var credSite = route.Authentication.Credentials ?? Credential;
556+
var credReq = context.Request.Credentials;
557+
558+
isAuthOk = credReq != null
559+
&& (credSite.UserName == credReq.UserName)
560+
&& (credSite.Password == credReq.Password);
523561
}
524-
else
562+
else if (route.Authentication.AuthenticationType == AuthenticationType.ApiKey)
525563
{
526-
if (toCompare.Length == routeStr.Length + incForSlash)
527-
{
528-
isFound = true;
529-
}
564+
var apikeySite = route.Authentication.ApiKey ?? ApiKey;
565+
var apikeyReq = GetApiKeyFromHeaders(context.Request.Headers);
566+
567+
isAuthOk = apikeyReq != null
568+
&& apikeyReq == apikeySite;
530569
}
570+
}
531571

532-
if (isFound
533-
&& (route.Method == string.Empty
534-
|| (context.Request.HttpMethod == route.Method)))
572+
if (mustAuthenticate && isAuthOk)
573+
{
574+
route.Callback.Invoke(null, new object[] { new WebServerEventArgs(context) });
575+
context.Response.Close();
576+
context.Close();
577+
}
578+
else
579+
{
580+
if (route.Authentication.AuthenticationType == AuthenticationType.Basic)
535581
{
536-
// Starting a new thread to be able to handle a new request in parallel
537-
isRoute = true;
538-
539-
// Check auth first
540-
bool isAuthOk = false;
541-
if (route.Authentication != null)
542-
{
543-
if (route.Authentication.AuthenticationType == AuthenticationType.None)
544-
{
545-
isAuthOk = true;
546-
}
547-
}
548-
else
549-
{
550-
isAuthOk = true;
551-
}
552-
553-
if (!isAuthOk)
554-
{
555-
if (route.Authentication.AuthenticationType == AuthenticationType.Basic)
556-
{
557-
var credSite = route.Authentication.Credentials ?? Credential;
558-
var credReq = context.Request.Credentials;
559-
if (credReq != null
560-
&& (credSite.UserName == credReq.UserName)
561-
&& (credSite.Password == credReq.Password))
562-
{
563-
isAuthOk = true;
564-
}
565-
}
566-
else if (route.Authentication.AuthenticationType == AuthenticationType.ApiKey)
567-
{
568-
var apikeySite = route.Authentication.ApiKey ?? ApiKey;
569-
var apikeyReq = GetApiKeyFromHeaders(context.Request.Headers);
570-
571-
if (apikeyReq != null
572-
&& apikeyReq == apikeySite)
573-
{
574-
isAuthOk = true;
575-
}
576-
}
577-
}
578-
579-
if (isAuthOk)
580-
{
581-
route.Callback.Invoke(null, new object[] { new WebServerEventArgs(context) });
582-
context.Response.Close();
583-
context.Close();
584-
}
585-
else
586-
{
587-
if (route.Authentication.AuthenticationType == AuthenticationType.Basic)
588-
{
589-
context.Response.Headers.Add("WWW-Authenticate", $"Basic realm=\"Access to {routeStr}\"");
590-
}
591-
592-
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
593-
context.Response.ContentLength64 = 0;
594-
context.Response.Close();
595-
context.Close();
596-
}
582+
context.Response.Headers.Add("WWW-Authenticate", $"Basic realm=\"Access to {routeStr}\"");
597583
}
584+
585+
context.Response.StatusCode = (int)HttpStatusCode.Unauthorized;
586+
context.Response.ContentLength64 = 0;
587+
context.Response.Close();
588+
context.Close();
598589
}
599590
}
600591

0 commit comments

Comments
 (0)