Example #1
0
		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");
			}
		}
Example #2
0
		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 ();
		}
Example #3
0
		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)
		{

		}
Example #6
0
		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;

		}