Ejemplo n.º 1
0
        /// <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));
        }
Ejemplo n.º 2
0
        /// <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));
        }
Ejemplo n.º 3
0
        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());
        }