예제 #1
0
        public Task Execute(HttpContext context)
        {
            var match = _pattern.Match(context.Request.Path);

            if (!match.Success)
            {
                return(Task.CompletedTask);
            }
            var newRequest = HttpIO.ReplaceVars(context, _rewriteData);

            for (var i = 0; i < match.Captures.Count; i++)
            {
                newRequest = newRequest.Replace($"${i + 1}", match.Captures[i].Value);
            }

            /*foreach (Match match in _pattern.Matches(context.Request.Path)) {
             *  newRequest = newRequest.Replace($"${match.Name}", match.Value);
             * }*/
            /*var rewriteQuery = _rewriteData.Split("?");
             *  request = rewriteQuery[0].Replace("$scheme", context.Request.Scheme);
             *  if (rewriteQuery.Length == 1) {
             *      request = _rewriteData;
             *      Logger.Info($"{request}");
             *      for (var p = 1; p < requestParts.Length; p++) {
             *          request = request.Replace($"${p}", requestParts[p]);
             *      }
             *      Logger.Info($"{request}");
             *  } else if (rewriteQuery.Length == 2) {
             *      var queryParts = rewriteQuery[1].Split("&");
             *      foreach (var query in queryParts) {
             *          var queryData = query.Split("=");
             *          var key = queryData[0];
             *          var value = queryData[1];
             *          for (var p = 1; p < requestParts.Length; p++) {
             *              value = value.Replace($"${p}", requestParts[p]);
             *          }
             *          context.Request.Query.Add(key, value);
             *      }
             *  }*/
            /*if (_flag.Equals("last", StringComparison.CurrentCultureIgnoreCase)) {
             *  context.Request
             * }
             * if (_flag.Equals("break", StringComparison.CurrentCultureIgnoreCase)) {
             *
             * }*/
            if (_flag.Equals("redirect", StringComparison.CurrentCultureIgnoreCase))
            {
                context.Response.StatusCode = 302;
                context.Response.Headers.Add("Location", newRequest);
                context.Response.HasFinished = true;
            }
            if (_flag.Equals("permanent", StringComparison.CurrentCultureIgnoreCase))
            {
                context.Response.StatusCode = 301;
                context.Response.Headers.Add("Location", newRequest);
                context.Response.HasFinished = true;
            }
            context.Request.RequestPath = newRequest;
            return(Task.CompletedTask);
        }
예제 #2
0
        public async Task Execute(HttpContext context)
        {
            foreach (string file in _pages)
            {
                string tempPath = HttpIO.ReplaceVars(context, file);
                if (tempPath[0].Equals('='))
                {
                    if (int.TryParse(tempPath.Remove(0, 1), out int statusCode))
                    {
                        await context.ServerInfo.ErrorMessageManager.SendError(context, statusCode);

                        context.Response.HasFinished = true;
                        return;
                    }
                    await context.ServerInfo.ErrorMessageManager.SendError(context, 500);

                    context.Response.HasFinished = true;
                    return;
                }
                if (tempPath[0].Equals('@'))
                {
                    foreach (var location in _httpLocationManager.Locations)
                    {
                        if (!location.Key.Equals(tempPath, StringComparison.CurrentCultureIgnoreCase))
                        {
                            continue;
                        }
                        await location.Execute(context);

                        context.Response.HasFinished = true;
                        return;
                    }
                }
                if (!UrlMapper.RegisteredPages.ContainsKey(tempPath.ToLower()))
                {
                    continue;
                }
                await UrlMapper.RegisteredPages[tempPath.ToLower()].OnHttpPageRequest(context, tempPath.ToLower());
                context.Response.HasFinished = true;
            }
        }
예제 #3
0
        public async Task Execute(HttpContext context)
        {
            if (_type == 1)
            {
                await context.ServerInfo.ErrorMessageManager.SendError(context, _statusCode);

                context.Response.HasFinished = true;
            }
            else if (_type == 2)
            {
                context.Response.StatusCode = _statusCode;
                context.Response.Headers.Add("Location", HttpIO.ReplaceVars(context, _data));
                context.Response.HasFinished = true;
            }
            else if (_type == 3)
            {
                context.Response.StatusCode = _statusCode;
                await context.Response.WriteAsync(HttpIO.ReplaceVars(context, _data));

                context.Response.HasFinished = true;
            }
        }
예제 #4
0
        public async Task Execute(HttpContext context)
        {
            foreach (string i in _indexes)
            {
                string index = HttpIO.ReplaceVars(context, i);
                if (index.Equals("$internal_indexes"))
                {
                    foreach (string j in UrlMapper.IndexFiles)
                    {
                        string indexPath = Path.Combine(context.ServerInfo.RootPath, j[0].Equals('/') ? j.Remove(0, 1) : Path.Combine(context.Request.Path, j).Remove(0, 1));
                        if (!File.Exists(indexPath))
                        {
                            continue;
                        }
                        string extension = Path.GetExtension(indexPath);
                        context.Request.RequestFilePath = indexPath;
                        if (UrlMapper.ExtensionPlugins.TryGetValue(extension.ToLower(), out var plugin))
                        {
                            await plugin.OnHttpExtensionRequest(context, indexPath, extension.ToLower());

                            context.Response.HasFinished = true;
                            return;
                        }
                        try {
                            await HttpIO.SendFile(context, indexPath);

                            context.Response.HasFinished = true;
                        } catch (Exception) {
                            await context.ServerInfo.ErrorMessageManager.SendError(context, 500);

                            context.Response.HasFinished = true;
                        }
                        return;
                    }
                }
                else
                {
                    string indexPath = Path.Combine(context.ServerInfo.RootPath, index[0].Equals('/') ? index.Remove(0, 1) : Path.Combine(context.Request.Path, index).Remove(0, 1));
                    if (!File.Exists(indexPath))
                    {
                        continue;
                    }
                    string extension = Path.GetExtension(indexPath);
                    context.Request.RequestFilePath = indexPath;
                    if (UrlMapper.ExtensionPlugins.TryGetValue(extension.ToLower(), out var plugin))
                    {
                        await plugin.OnHttpExtensionRequest(context, indexPath, extension.ToLower());

                        context.Response.HasFinished = true;
                        return;
                    }
                    try {
                        await HttpIO.SendFile(context, indexPath);

                        context.Response.HasFinished = true;
                    } catch {
                        await context.ServerInfo.ErrorMessageManager.SendError(context, 500);

                        context.Response.HasFinished = true;
                    }
                    return;
                }
            }
        }
예제 #5
0
        public async Task Execute(HttpContext context)
        {
            foreach (string file in _files)
            {
                string tempPath = HttpIO.ReplaceVars(context, file);
                if (tempPath[0].Equals('='))
                {
                    if (int.TryParse(tempPath.Remove(0, 1), out int statusCode))
                    {
                        await context.ServerInfo.ErrorMessageManager.SendError(context, statusCode);

                        context.Response.HasFinished = true;
                        return;
                    }
                    await context.ServerInfo.ErrorMessageManager.SendError(context, 500);

                    context.Response.HasFinished = true;
                    return;
                }
                if (tempPath[0].Equals('@'))
                {
                    foreach (var location in _httpLocationManager.Locations)
                    {
                        if (!location.Key.Equals(tempPath, StringComparison.CurrentCultureIgnoreCase))
                        {
                            continue;
                        }
                        await location.Execute(context);

                        context.Response.HasFinished = true;
                        return;
                    }
                }
                context.Request.TranslatedPath = Path.GetFullPath(Path.Combine(context.ServerInfo.RootPath, tempPath.Remove(0, 1)));
                if (File.Exists(context.Request.TranslatedPath))
                {
                    string extension = Path.GetExtension(context.Request.TranslatedPath);
                    if (UrlMapper.ExtensionPlugins.ContainsKey(extension.ToLower()))
                    {
                        await UrlMapper.ExtensionPlugins[extension.ToLower()].OnHttpExtensionRequest(context, context.Request.TranslatedPath, extension.ToLower());
                        context.Response.HasFinished = true;
                    }
                    else
                    {
                        try {
                            await HttpIO.SendFile(context, context.Request.TranslatedPath);

                            context.Response.HasFinished = true;
                        } catch {
                            await context.ServerInfo.ErrorMessageManager.SendError(context, 500);

                            context.Response.HasFinished = true;
                        }
                    }
                }
                else if (Directory.Exists(context.Request.TranslatedPath))
                {
                    if (!context.Request.RequestPath.EndsWith('/'))
                    {
                        context.Response.Redirect(context.Request.RequestPath + "/");
                        context.Response.HasFinished = true;
                    }
                    //context.ErrorMessageManager.SendError(context, 404);
                    // Do indexer
                }
            }
        }