/// <summary> /// Method to handler the input from developer. /// </summary> /// <param name="ev"></param> /// <returns>new OutputStream</returns> public static HttpOutputStream OutputHandler(HttpRequestEventArgs ev) { // The response must be written to e.Response.OutputStream. // When writing text, a StreamWriter can be used. string dirPath = @"C:\Users\Hector Aristy\Documents\GitHub\HekoFramework\src\PHttp\Resources"; string filePath = dirPath + ev.Request.Path; if (ev.Request.Path.Equals("/")) { filePath = dirPath + '/' + @"index.html"; } string extension = Path.GetExtension(filePath); string mime = HttpMimeType.GetMimeType(extension); ev.Response.ContentType = mime; byte[] data; if (!File.Exists(filePath)) { data = File.ReadAllBytes(dirPath + '/' + "404.html"); ev.Response.StatusCode = 404; ev.Response.ContentType = "text/html"; } else { data = File.ReadAllBytes(filePath); } MemoryStream stream = new MemoryStream(data); return(new HttpOutputStream(stream)); }
/// <summary> /// This is a method that responds to the customer according to the event received. /// </summary> /// <param name="requestEvent">HttpRequestEventArgs: Request event.</param> /// <returns>HttpOutputStream: Event respond of the argument received.</returns> public HttpOutputStream GetRespond(HttpRequestEventArgs requestEvent) { ActionRequest = new Dictionary <string, object>(); Site site; /// Array of the URL path received. string[] UrlSplited = requestEvent.Request.Path.Replace("favicon.ico", string.Empty).Split('/'); string SiteName = UrlSplited[1]; // show state in the console. Console.WriteLine("Client: {0} makes request => {1}", SiteName, requestEvent.Request.Path); if (requestEvent.Request.Path.Equals("/")) { requestEvent.Response.ContentType = HttpMimeType .GetMimeType(Path.GetExtension(configurationManager.defaultDocument["index"])); requestEvent.Response.Status = "200"; data = File.ReadAllBytes(configurationManager.defaultDocument["index"]); } else { // Do it if the site not exist. if (!Exist(SiteName)) { requestEvent.Response.ContentType = HttpMimeType .GetMimeType(Path.GetExtension(configurationManager.errorPages["404"])); requestEvent.Response.Status = "404"; data = File.ReadAllBytes(configurationManager.errorPages["404"]); } // else: execute method of one of the apps loaded. else { string URLPath = requestEvent.Request.Path.Replace("/", "").ToLower(); if (URLPath.Equals(SiteName.ToLower())) { site = configurationManager.GetSiteByVirtualPath(SiteName); if (string.IsNullOrEmpty(site.defaultDocument["index"])) { requestEvent.Response.ContentType = HttpMimeType.GetMimeType(Path.GetExtension(configurationManager.defaultDocument["index"])); requestEvent.Response.Status = "200"; data = File.ReadAllBytes(configurationManager.defaultDocument["index"]); } else { requestEvent.Response.ContentType = HttpMimeType.GetMimeType(Path.GetExtension(site.defaultDocument["index"])); requestEvent.Response.Status = "200"; data = File.ReadAllBytes(site.defaultDocument["index"]); } } else // TODO: verificar esta parte. { ActionRequest.Add("URLPath", requestEvent.Request.Path.Replace("/" + SiteName, "").ToLower()); ActionRequest.Add("HttpMethod", requestEvent.Request.HttpMethod); ActionRequest.Add("Params", requestEvent.Request.Form); ActionRequest.Add("Header", requestEvent.Request.Headers); ActionRequest.Add("QueryString", requestEvent.Request.QueryString); Dictionary <string, HttpFile> files = new Dictionary <string, HttpFile>(); for (int i = 0; i < requestEvent.Request.Files.Count; i++) { HttpPostedFile file = requestEvent.Request.Files.Get(i); HttpFile httpFile = new HttpFile(file.ContentLength, file.ContentType, file.FileName, file.InputStream); files.Add(requestEvent.Request.Files.GetKey(i), httpFile); } ActionRequest.Add("Files", files); foreach (IPHttpApplication Application in AllApps.Result) { Site AppSite = (Site)Application.GetSite(); if (AppSite.virtualPath.ToLower() == SiteName.ToLower()) { var response = Application.ExecuteAction(ActionRequest); requestEvent.Response.Status = ((AResult)response).StatusCode().ToString(); requestEvent.Response.ContentType = ((AResult)response).ContentType(); try { stream = (MemoryStream)((AResult)response).Content(); return(new HttpOutputStream(stream)); } catch (Exception ex) { requestEvent.Response.ContentType = HttpMimeType.GetMimeType(Path.GetExtension(configurationManager.errorPages["404"])); requestEvent.Response.Status = "404"; data = File.ReadAllBytes(configurationManager.errorPages["404"]); } } } } /// TODO:hacer que se actualize site en el js despues que el user cree algun view. } } stream = new MemoryStream(data); return(new HttpOutputStream(stream)); }
public IHttpAction Handle(Request request) { if (request.Object.Method == "GET" || request.Object.Method == "HEAD") { var includeBody = request.Object.Method != "HEAD"; var httpHeaders = new HttpHeaders(); var fileSystem = new FileSystem(Path.Combine(DirectoryRoot, "www", request.VirtualHost.Directory, request.Object.Uri.Url), request.VirtualHost.DefaultIndex); var fileDescription = fileSystem.GetFile(); if (fileDescription == null) { return(new NotFound(includeBody)); } var dateChange = new HttpDate(fileDescription.GetLastModified()); httpHeaders.Add("Content-Type", HttpMimeType.GetByExtension(fileDescription.GetExtension()) + "; charset=" + fileDescription.GetEncoding()); httpHeaders.Add("Last-Modified", dateChange.ToString()); if (request.Object.HttpRange != null) { try { request.Object.HttpRange.Normalize(fileDescription.GetFileSize() - 1); var bytesArray = fileDescription.GetRangeBytes(request.Object.HttpRange); if (bytesArray.Length > 0) { httpHeaders.Add("Content-Range", request.Object.HttpRange.ToString()); return(new PartialContent(httpHeaders, bytesArray, includeBody)); } else { return(new NotSatisfiable(includeBody)); } } catch (Exception) { request.Object.HttpRange = null; } } if (request.Object["If-Modified-Since"] != null) { try { var requestDate = DateTime.Parse(request.Object["If-Modified-Since"].Trim()); if (requestDate >= dateChange.DateTime) { return(new NotModified(httpHeaders, includeBody)); } } catch { // ignored } } return(new Ok(httpHeaders, fileDescription.GetAllBytes(), includeBody)); } return(NextHandler != null?NextHandler.Handle(request) : new NotImplemented()); }