public http_exception (http_request req,String msg,Exception innerex,int http_status):base(msg,innerex) { _res = http_response.CreateBasic(req,http_status); if(http_status >= 200 && http_status != 204 && http_status != 304) { byte[] messagebytes = Encoding.Default.GetBytes(msg); _res.Body.Write(messagebytes,0,messagebytes.Length); _res.Header.ContentLength = (int)_res.Body.Length; _res.Header.ContentType = "text/plain; charset=" +Encoding.Default.WebName.ToUpper(); _res.Header.SetValue("Cache-Control","no-cache"); } }
string[] find_htaccess_files(http_request req, DataAccessLayer d) { List<String> paths = new List<string> (); string[] folders = req.script_name.Split (new string[] { "/" }, StringSplitOptions.RemoveEmptyEntries); String path = ""; foreach (string folder in folders) { path = Path.Combine (path, folder); if(d.FileExists(Path.Combine(path,".htaccess"))) paths.Add(Path.Combine(path,".htaccess")); } return paths.ToArray (); }
public static string get_var(string v, http_request req) { string retval = ""; switch (v) { case "QUERY_STRING": retval = req.Uri.Query.Replace ("?", ""); break; case "REQUEST_URI": retval = req.Header.Target; break; case "REQUEST_FILENAME": retval = req.script_name; break; case "PATH_INFO": retval = req.Header.Target.Replace(req.script_name, ""); break; default: #if DEBUG Console.Error.WriteLine ("Missing cgi var: " + v); #endif break; } return retval; }
public static proxied_http_response Create(http_request req, connection con) { if (req.Header.Values.ContainsKey("Proxy-Connection")) { String pcon = req.Header.GetValue("Proxy-Connection"); req.Header.Values.Remove("Proxy-Connection"); if (String.IsNullOrEmpty(pcon) == false) req.Header.SetValue("Connection", pcon); } //ALL CUSTOM TAGS MUST BE REMOVED BEFORE SENDING HEADERS. //THIS IS FOR ONE TAG, NEEDS TO BE MORE ABSTACT. SUCH AS //REMOVE ALL "X-ANYTHING" TAGS. NEED TO FIND A WAY TO DO //THIS IN THE HEADER LOGIC POSSIBLY! if(req.Header.Values.ContainsKey("X-Profile")) req.Header.Values.Remove("X-Profile"); // Formatting the proper header needs to happen before now // Correcting Target header. if(req.Header.Target.ToLower().StartsWith("http")) { if(req.Uri.OriginalString.Contains(String.Format("{0}:{1}",req.Uri.Host,req.Uri.Port))) { req.Header.Target = req.Uri.OriginalString.Substring( req.Uri.OriginalString.IndexOf(String.Format("{0}:{1}",req.Uri.Host,req.Uri.Port)) + String.Format("{0}:{1}",req.Uri.Host,req.Uri.Port).Length); } else { req.Header.Target = req.Uri.OriginalString.Substring( req.Uri.OriginalString.IndexOf(req.Uri.Host) + req.Uri.Host.Length); } } #if !OFFLINE_DEBUG if(con.data_available) { #if DEBUG byte[] bytes = con.read(); Console.Error.WriteLine(String.Format("{0}: {1}","EARLY SERVER DATA!",Encoding.Default.GetString(bytes))); #endif proxied_retry_exception ex = new proxied_retry_exception(req,"We have not sent a request, yet the server has sent us something! This should not happen ever!",null,502); ex.secure = con.stream is SslStream; throw ex; } ///Send Request if (con.Client.Connected) { if (con.Client.Client.Poll(1, SelectMode.SelectWrite) && !con.Client.Client.Poll(1,SelectMode.SelectError)) { ///req.toByteArray() should be the entire request including POST! byte[] requestbytes = req.ToByteArray(); try { con.stream.Write(requestbytes, 0, requestbytes.Length); con.stream.Flush(); } catch { proxied_retry_exception ex = new proxied_retry_exception(req,"Can not send request upstream!",null,502); ex.secure = con.stream is SslStream; throw ex; } } else { proxied_retry_exception ex = new proxied_retry_exception(req,"Can not send request upstream!",null,502); ex.secure = con.stream is SslStream; throw ex; } } else { proxied_retry_exception ex = new proxied_retry_exception(req,"Upstream server disconnected while send request!",null,502); ex.secure = con.stream is SslStream; throw ex; } //wait for data int count = 0; while (!con.is_disposed && !con.data_available && count < 3000 && con.Client.Client.Connected && req.Connection.Client.Connected && !con.Client.Client.Poll(1, SelectMode.SelectError) && !req.Connection.Client.Poll(1, SelectMode.SelectError)) { //if(server.Client.Poll(100, SelectMode.SelectRead)) // throw new Exception("Server connection failed!"); if(count == 2999) { proxied_retry_exception ex = new proxied_retry_exception(req,"Server failed to respond in a timely manner after sending request!",null,502); ex.secure = con.stream is SslStream; throw ex; } System.Threading.Thread.Sleep(100); count += 1; } #endif proxied_http_response pres = new proxied_http_response(); pres.Request = req; return pres; }
public proxied_retry_exception (http_request req,String msg,Exception innerex,int http_status):base(req,msg,innerex,http_status) { }
public static http_response CreateBasic(http_request req,int http_status) { http_response res = new http_response (); res.Request = req; switch (http_status) { case 200: res.Header.Statusmessage = "OK"; break; case 204: res.Header.Statusmessage = "No Content"; break; case 206: res.Header.Statusmessage = "Partial Content"; break; case 301: res.Header.Statusmessage = "Moved Permanently"; break; case 302: res.Header.Statusmessage = "Found"; break; case 304: res.Header.Statusmessage = "Not Modified"; break; case 400: res.Header.Statusmessage = "Bad Request"; break; case 401: res.Header.Statusmessage = "Unauthorized"; break; case 403: res.Header.Statusmessage = "Forbidden"; break; case 404: res.Header.Statusmessage = "Not Found"; break; case 406: res.Header.Statusmessage = "Not Acceptable"; break; case 407: res.Header.Statusmessage = "Proxy Authentication Required"; break; case 408: res.Header.Statusmessage = "Request Timeout"; break; case 411: res.Header.Statusmessage = "Length Required"; break; case 500: res.Header.Statusmessage = "Internal Server Error"; break; case 501: res.Header.Statusmessage = "Not Implemented"; break; case 502: res.Header.Statusmessage = "Bad Gateway"; break; case 504: res.Header.Statusmessage = "Gateway Timeout"; break; case 505: res.Header.Statusmessage = "HTTP Version Not Supported"; break; default: throw new Exception("Status: " + http_status + " not defined!"); } res.Header.Statuscode = http_status.ToString(); res.Header.SetValue("Date", DateTime.Now.ToUniversalTime().ToString("r")); res.Header.SetValue ( "Server", String.Format("{0}/{1}",Assembly.GetEntryAssembly().GetName().Name,Assembly.GetEntryAssembly().GetName().Version)); if (req.Header.Values.ContainsKey("Connection") && !req.Header.GetValue("Connection").ToLower().Equals("keep-alive")) res.Header.SetValue("Connection", "close"); return res; }