From cf72fece6db782530086724cd704261ccfb8c986 Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Sat, 18 Dec 2010 18:23:51 -0800 Subject: [PATCH] Replaced the HttpServer_OpenSim.dll with one compiled for .NET 3.5 (the last one was 4.0, and that doesn't work). Also added the corresponding .xml and .pdb, if that makes any difference. --- bin/HttpServer_OpenSim.dll | Bin 116224 -> 115712 bytes bin/HttpServer_OpenSim.pdb | Bin 382464 -> 409088 bytes bin/HttpServer_OpenSim.xml | 8116 ++++++++++++++++++------------------ 3 files changed, 4058 insertions(+), 4058 deletions(-) diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll index cdd4655abb3074c240d92fef569f1b27bfb1126d..d7503a0915af2502889385f98811510dc784a79a 100644 GIT binary patch delta 42025 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 delta 42475 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

mQPwH5sRPtMr2ctzk78XL-BoA8nU$!z(ZF*6H6U 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 - -

- Inversion of control interface. - - - - - Add a component instance - - Interface type - Instance to add - - - - Get a component. - - Interface type - Component if registered, otherwise null. - - Component will get created if needed. - - - - - Checks if the specified component interface have been added. - - - true if found; otherwise false. - - - - Add a component. - - Type being requested. - Type being created. - - - - A HttpModule can be used to serve Uri's. The module itself - decides if it should serve a Uri or not. In this way, you can - get a very flexible http application since you can let multiple modules - serve almost similar urls. - - - Throw if you are using a and want to prompt for user name/password. - - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - true if this module handled the request. - - - - Set the log writer to use. - - logwriter to use. - - - - Log something. - - importance of log message - message - - - - If true specifies that the module doesn't consume the processing of a request so that subsequent modules - can continue processing afterwards. Default is false. - - - - - Container to bind resource names to assemblies - - - - - Instantiates an instance of - - The dot seperated uri the resource maps to - The full resource name - The assembly the resource exists in - - - - Retrieves a stream to the resource - - Null if the resource couldn't be located somehow - - - - Retrieves the assembly the resource resides in - - - - - Retrieves the full name/path of the assembly - - - - - Retrieves the extension of the resource - - - - Returns the Uri without extension - - - Retrieves the full path name to the resource file - - - - The object form class takes an object and creates form items for it. - - - - - Initializes a new instance of the class. - - - form name *and* id. - action to do when form is posted. - - - - - Initializes a new instance of the class. - - form name *and* id. - action to do when form is posted. - object to get values from - - - - Initializes a new instance of the class. - - form action. - object to get values from. - - - - write out the FORM-tag. - - generated html code - - - - Writeout the form tag - - form should be posted through ajax. - generated html code - - - - Generates a text box. - - - - generated html code - - - - password box - - - - generated html code - - - - Hiddens the specified property name. - - Name of the property. - The options. - generated html code - - - - Labels the specified property name. - - property in object. - caption - generated html code - - - - Generate a checkbox - - property in object - checkbox value - additional html attributes. - generated html code - - - - Write a html select tag - - object property. - id column - The title column. - The options. - - - - - Selects the specified property name. - - Name of the property. - The items. - The id column. - The title column. - The options. - - - - - Write a submit tag. - - button caption - html submit tag - - - - html end form tag - - html - - - - This decoder converts XML documents to form items. - Each element becomes a subitem in the form, and each attribute becomes an item. - - - // xml: somethingdata - // result: - // form["hello"].Value = "something" - // form["hello"]["id"].Value = 1 - // form["hello"]["world]["id"].Value = 1 - // form["hello"]["world"].Value = "data" - - - The original xml document is stored in form["__xml__"].Value. - - - - - Interface for form content decoders. - - - + + The request could not be understood by the server due to malformed syntax. + The client SHOULD NOT repeat the request without modifications. - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream enconding - A http form, or null if content could not be parsed. - If contents in the stream is not valid input data. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream encoding - Note: contentType and encoding are not used? - A http form, or null if content could not be parsed. - - - - - Recursive function that will go through an xml element and store it's content - to the form item. - - (parent) Item in form that content should be added to. - Node that should be parsed. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - The server encountered an unexpected condition which prevented it from fulfilling the request. + Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php @@ -331,166 +37,462 @@ status code to use in the response. - + - Initializes a new instance of the class. + Create a new bad request exception. + reason to why the request was bad. - + - Initializes a new instance of the class. + Create a new bad request exception. - error message. + reason to why the request was bad. + inner exception - + - Initializes a new instance of the class. + Implements HTTP Digest authentication. It's more secure than Basic auth since password is + encrypted with a "key" from the server. - error message. - inner exception. - - - - Session store using memory for each session. - - - - - A session store is used to store and load sessions on a media. - The default implementation () saves/retrieves sessions from memory. - - - - - Creates a new http session with a generated id. - - A object - - - - Creates a new http session with a specific id - - Id used to identify the new cookie.. - A object. - Id should be generated by the store implementation if it's null or . + Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - + - Load an existing session. - - Session id (usually retrieved from a client side cookie). - A session if found; otherwise null. - - - - Save an updated session to the store. - - Session id (usually retrieved from a client side cookie). - If Id property have not been specified. - - - - We use the flyweight pattern which reuses small objects - instead of creating new each time. - - Unused session that should be reused next time Create is called. - - - - Remove expired sessions + Authentication modules are used to implement different + kind of HTTP authentication. - + - Remove a session - - id of the session. - - - - Load a session from the store - - - null if session is not found. - - - - Number of minutes before a session expires. - - Default time is 20 minutes. - - - - Initializes the class setting the expirationtimer to clean the session every minute + Tag used for authentication. - + - Delegate for the cleanup timer + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Array with optional options. + A correct authentication request. + If realm is empty or null. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + options to specific implementations + Authentication object that is stored for the request. A user class or something like that. + if is invalid + If any of the parameters is empty or null. + + + + Used to invoke the authentication delegate that is used to lookup the user name/realm. + + Realm (domain) that user want to authenticate in + User name + Password used for validation. Some implementations got password in clear text, they are then sent to client. + object that will be stored in the request to help you identify the user if authentication was successful. + true if authentication was successful + + + + Determines if authentication is required. + + HTTP request from browser + true if user should be authenticated. + throw from your delegate if no more attempts are allowed. + If no more attempts are allowed + + + + name used in HTTP request. - + - Creates a new http session + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Used by test classes to be able to use hardcoded values + + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + First option: true if username/password is correct but not cnonce + + Authentication object that is stored for the request. A user class or something like that. + + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + Encrypts parameters into a Digest string + + Realm that the user want to log into. + User logging in + Users password. + HTTP method. + Uri/domain that generated the login prompt. + Quality of Protection. + "Number used ONCE" + Hexadecimal request counter. + "Client Number used ONCE" + Digest encrypted string + + + + + + Md5 hex encoded "userName:realm:password", without the quotes. + Md5 hex encoded "method:uri", without the quotes + Quality of Protection + "Number used ONCE" + Hexadecimal request counter. + Client number used once + + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + First options specifies if true if username/password is correct but not cnonce. + A correct auth request. + If realm is empty or null. + + + + Decodes authorization header value + + header value + Encoding that the buffer is in + All headers and their values if successful; otherwise null + + NameValueCollection header = DigestAuthentication.Decode("response=\"6629fae49393a05397450978507c4ef1\",\r\nc=00001", Encoding.ASCII); + + Can handle lots of whitespaces and new lines without failing. + + + + Gets the current nonce. - + - Creates a new http session with a specific id + Gets the Md5 hash bin hex2. - Id used to identify the new cookie.. - A object. - - Id should be generated by the store implementation if it's null or . - - - - - Load an existing session. - - + To be hashed. - + - Save an updated session to the store. + determines if the nonce is valid or has expired. - + nonce value (check wikipedia for info) + true if the nonce has not expired. - + - We use the flyweight pattern which reuses small objects - instead of creating new each time. - - EmptyLanguageNode (unused) session that should be reused next time Create is called. - - - - Remove expired sessions + name used in http request. - + - Remove a session + Gets or sets whether the token supplied in is a + HA1 generated string. - id of the session. - + - Load a session from the store + Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules + a regular expression can be used to identify redirect URLs and their targets. - - null if session is not found. + + [a-z0-9]+)", "/users/${target}?find=true", RegexOptions.IgnoreCase) + ]]> + - + - Number of minutes before a session expires. - Default is 20 minutes. + redirects from one URL to another. + + + Rules are used to perform operations before a request is being handled. + Rules can be used to create routing etc. + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + If request or response is null. + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Initializes a new instance of the class. + + Absolute path (no server name) + Absolute path (no server name) + true if request should be redirected, false if the request URI should be replaced. + + server.Add(new RedirectRule("/", "/user/index")); + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + + + + Gets string to match request URI with. + + Is compared to request.Uri.AbsolutePath + + + + Gets where to redirect. + + + + + Gets whether server should redirect client. + + + false means that the rule will replace + the current request URI with the new one from this class. + true means that a redirect response is sent to the client. + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + + [a-zA-Z0-9]+)", "/user/${first}")); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to use, can be null + + [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + + + + Initializes a new instance of the class. + + Expression to match URL + Expression to generate URL + Regular expression options to apply + true if request should be redirected, false if the request URI should be replaced. + + [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); + Result of ie. /employee1 will then be /user/employee1 + ]]> + + Argument is null. + + + + + Process the incoming request. + + incoming HTTP request + outgoing HTTP response + true if response should be sent to the browser directly (no other rules or modules will be processed). + + returning true means that no modules will get the request. Returning true is typically being done + for redirects. + + If request or response is null + + + + We dont want to let the server to die due to exceptions thrown in worker threads. + therefore we use this delegate to give you a change to handle uncaught exceptions. + + Class that the exception was thrown in. + Exception + + Server will throw a InternalServerException in release version if you dont + handle this delegate. + + + + + Delegate used to let authentication modules authenticate the user name and password. + + Realm that the user want to authenticate in + User name specified by client + Can either be user password or implementation specific token. + object that will be stored in a session variable called if authentication was successful. + throw forbidden exception if too many attempts have been made. + + + Use to specify that the token is a HA1 token. (MD5 generated + string from realm, user name and password); Md5String(userName + ":" + realm + ":" + password); + + + + + + Let's you decide on a system level if authentication is required. + + HTTP request from client + true if user should be authenticated. + throw if no more attempts are allowed. + If no more attempts are allowed + + + + Interface for sessions + + + + + Remove everything from the session + + + + + Remove everything from the session + + True if the session is cleared due to expiration + + + + Session id + + + + + Should + + Name of the session variable + null if it's not set + If the object cant be serialized. + + + + When the session was last accessed. + This property is touched by the http server each time the + session is requested. + + + + + Number of session variables. + + + + + Event triggered upon clearing the session + + + + + Arguments sent when a is cleared + + + + + Instantiates the arguments for the event + + True if the session is cleared due to expiration + + + + Returns true if the session is cleared due to expiration + + + + + Delegate for when a IHttpSession is cleared + + this is being cleared. + Arguments for the clearing + Cookies that should be set. @@ -541,35 +543,29 @@ Gets the cookie of a given identifier (null if not existing). - + - Small design by contract implementation. + Creates request parsers when needed. - + - Check whether a parameter is empty. + Creates request parsers when needed. - Parameter value - Parameter name, or error description. - value is empty. - + - Checks whether a parameter is null. + Create a new request parser. - Parameter value - Parameter name, or error description. - value is null. + Used when logging should be enabled. + A new request parser. - + - Checks whether a parameter is null. + Create a new request parser. - - Parameter value - Parameter name, or error description. - value is null. + Used when logging should be enabled. + A new request parser. @@ -707,33 +703,20 @@ A header have been received. - + - The website module let's you handle multiple websites in the same server. - It uses the "Host" header to check which site you want. + Used to inform http server that - It's recommended that you do not - add any other modules to HttpServer if you are using the website module. Instead, - add all wanted modules to each website. - + - + Eventarguments used when an exception is thrown by a module - domain name that should be handled. - + the exception - + - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - - - - Name of site. + Exception thrown in a module @@ -927,78 +910,491 @@ 0 if no files are added - + + + Interface for form content decoders. + + + - The request could not be understood by the server due to malformed syntax. - The client SHOULD NOT repeat the request without modifications. - Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream enconding + A http form, or null if content could not be parsed. + If contents in the stream is not valid input data. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + Lists content type mime types. - + - Create a new bad request exception. + text/plain - reason to why the request was bad. - + - Create a new bad request exception. + text/haml + + + + + content type for javascript documents = application/javascript + + + + RFC 4329 states that text/javascript have been superseeded by + application/javascript. You might still want to check browser versions + since older ones do not support application/javascript. + + Browser support: http://krijnhoetmer.nl/stuff/javascript/mime-types/ + + + + + text/xml + + + + + A list of content types + + + + + + + Semicolon separated content types. + + + + Returns an enumerator that iterates through a collection. + + + An object that can be used to iterate through the collection. + + + + + Searches for the specified type + + Can also be a part of a type (searching for "xml" would return true for "application/xml"). + true if type was found. + + + + Get this first content type. + + + + + Fetch a content type + + Part of type ("xml" would return "application/xml") + + All content types are in lower case. + + + + A HttpModule can be used to serve Uri's. The module itself + decides if it should serve a Uri or not. In this way, you can + get a very flexible http application since you can let multiple modules + serve almost similar urls. + + + Throw if you are using a and want to prompt for user name/password. + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + true if this module handled the request. + + + + Set the log writer to use. + + logwriter to use. + + + + Log something. + + importance of log message + message + + + + If true specifies that the module doesn't consume the processing of a request so that subsequent modules + can continue processing afterwards. Default is false. + + + + + Webhelper provides helpers for common tasks in HTML. + + + + + Used to let the website use different javascript libraries. + Default is + + + + + Creates a link that invokes through ajax. + + url to fetch + link title + + optional options in format "key, value, key, value". + Javascript options starts with ':'. + + a link tag + + WebHelper.AjaxRequest("/users/add/", "Add user", "method:", "post", "onclick", "validate('this');"); + + + + + Builds a link that updates an element with the fetched ajax content. + + Url to fetch content from + link title + html element to update with the results of the ajax request. + optional options in format "key, value, key, value" + A link tag. + + + + A link that pop ups a Dialog (overlay div) + + url to contents of dialog + link title + name/value of html attributes. + A "a"-tag that popups a dialog when clicked + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + Create/Open a dialog box using ajax + + + + + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + Create a <form> tag. + + name of form + action to invoke on submit + form should be posted as ajax + html code + + WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); + + + + + Create a link tag. + + url to go to + link title (text that is displayed) + html attributes, name, value, name, value + html code + + WebHelper.Link("/user/show/1", "Show user", "id", "showUser", "onclick", "return confirm('Are you shure?');"); + + + + + Build a link + + url to go to. + title of link (displayed text) + extra html attributes. + a complete link + + + + Build a link + + url to go to. + title of link (displayed text) + extra html attributes. + a complete link + more options + + + + Obsolete + + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + + + + Obsolete + + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + Obsolete + + + + Render errors into a UL with class "errors" + + class used by UL-tag. + items to list + an unordered html list. + + + + Render errors into a UL with class "errors" + + class used by UL-tag. + items to list + an unordered html list. + + + + Render errors into a UL with class "errors" + + + + + + + Generates a list with html attributes. + + StringBuilder that the options should be added to. + attributes set by user. + attributes set by any of the helper classes. + + + + Generates a list with html attributes. + + StringBuilder that the options should be added to. + + + + + Purpose of this class is to create a javascript toolkit independent javascript helper. + + + + + Generates a list with JS options. + + StringBuilder that the options should be added to. + the javascript options. name, value pairs. each string value should be escaped by YOU! + true if we should start with a comma. + + + + Removes any javascript parameters from an array of parameters + + The array of parameters to remove javascript params from + An array of html parameters + + + + javascript action that should be added to the "onsubmit" event in the form tag. + + + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + Requests a url through ajax + + url to fetch + optional options in format "key, value, key, value", used in JS request object. + a link tag + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + Ajax requests that updates an element with + the fetched content + + Url to fetch content from + element to update + optional options in format "key, value, key, value", used in JS updater object. + A link tag. + All javascript option names should end with colon. + + + JSHelper.AjaxUpdater("/user/show/1", "userInfo", "onsuccess:", "alert('Successful!');"); + + + + + + A link that pop ups a Dialog (overlay div) + + url to contents of dialog + link title + A "a"-tag that popups a dialog when clicked + name/value of html attributes + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + Creates a new modal dialog window + + url to open in window. + window title (may not be supported by all js implementations) + + + + + + Class that receives Requests from a . + + + + + Client have been disconnected. + + Client that was disconnected. + Reason + + + + + Invoked when a client context have received a new HTTP request + + Client that received the request. + Request that was received. + + + + + Generic helper functions for HTTP + + + + + Version string for HTTP v1.0 + + + + + Version string for HTTP v1.1 + + + + + An empty URI + + + + + Parses a query string. + + Query string (URI encoded) + A object if successful; otherwise + queryString is null. + If string cannot be parsed. + + + + This provider is used to let us implement any type of form decoding we want without + having to rewrite anything else in the server. + + + + + + + Should contain boundary and type, as in: multipart/form-data; boundary=---------------------------230051238959 + Stream containing form data. + Encoding used when decoding the stream + if no parser was found. + If stream is null or not readable. + If stream contents cannot be decoded properly. + + + + Add a decoder. + + + + + + + Number of added decoders. + + + + + Use with care. + + + + + Decoder used for unknown content types. - reason to why the request was bad. - inner exception A session stored in memory. - - - Interface for sessions - - - - - Remove everything from the session - - - - - Remove everything from the session - - True if the session is cleared due to expiration - - - - Session id - - - - - Should - - Name of the session variable - null if it's not set - If the object cant be serialized. - - - - When the session was last accessed. - This property is touched by the http server each time the - session is requested. - - - - - Number of session variables. - - - - - Event triggered upon clearing the session - - @@ -1064,113 +1460,624 @@ Event triggered upon clearing the session - + - redirects from one URL to another. + This decoder converts XML documents to form items. + Each element becomes a subitem in the form, and each attribute becomes an item. - - - - Rules are used to perform operations before a request is being handled. - Rules can be used to create routing etc. - - - - - Process the incoming request. - - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - - If request or response is null. - - - - Initializes a new instance of the class. - - Absolute path (no server name) - Absolute path (no server name) - server.Add(new RedirectRule("/", "/user/index")); + // xml: somethingdata + // result: + // form["hello"].Value = "something" + // form["hello"]["id"].Value = 1 + // form["hello"]["world]["id"].Value = 1 + // form["hello"]["world"].Value = "data" + + + The original xml document is stored in form["__xml__"].Value. + + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream encoding + Note: contentType and encoding are not used? + A http form, or null if content could not be parsed. + + + + + Recursive function that will go through an xml element and store it's content + to the form item. + + (parent) Item in form that content should be added to. + Node that should be parsed. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + + + + + + + + Represents a field in a multipart form + + + + The server encountered an unexpected condition which prevented it from fulfilling the request. + + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + error message. + + + + Initializes a new instance of the class. + + error message. + inner exception. + + + + Current state in the parsing. + + + + + Should parse the request line + + + + + Searching for a complete header name + + + + + Searching for colon after header name (ignoring white spaces) + + + + + Searching for start of header value (ignoring white spaces) + + + + + Searching for a complete header value (can span over multiple lines, as long as they are prefixed with one/more whitespaces) + + + + + Adding bytes to body + + + + + A reverse proxy are used to act as a bridge between local (protected/hidden) websites + and public clients. + + A typical usage is to allow web servers on non standard ports to still be available + to the public clients, or allow web servers on private ips to be available. + + + + + + + Base url requested from browser + Base url on private web server + + // this will return contents from http://192.168.1.128/view/jonas when client requests http://www.gauffin.com/user/view/jonas + _server.Add(new ReverseProxyModule("http://www.gauffin.com/user/", "http://192.168.1.128/"); - + - Initializes a new instance of the class. + Method that determines if an url should be handled or not by the module - Absolute path (no server name) - Absolute path (no server name) - true if request should be redirected, false if the request URI should be replaced. - - server.Add(new RedirectRule("/", "/user/index")); - + Url requested by the client. + true if module should handle the url. - + - Process the incoming request. + Method that process the url - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to - + - Gets string to match request URI with. - - Is compared to request.Uri.AbsolutePath - - - - Gets where to redirect. + Contains all HTTP Methods (according to the HTTP 1.1 specification) + + See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + - + - Gets whether server should redirect client. + The DELETE method requests that the origin server delete the resource identified by the Request-URI. - false means that the rule will replace - the current request URI with the new one from this class. - true means that a redirect response is sent to the client. + + This method MAY be overridden by human intervention (or other means) on the origin server. + The client cannot be guaranteed that the operation has been carried out, even if the status code + returned from the origin server indicates that the action has been completed successfully. + + + However, the server SHOULD NOT indicate success unless, at the time the response is given, + it intends to delete the resource or move it to an inaccessible location. + + + A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, + 202 (Accepted) if the action has not yet been enacted, + or 204 (No Content) if the action has been enacted but the response does not include an entity. + + + If the request passes through a cache and the Request-URI identifies one or more currently cached entities, + those entries SHOULD be treated as stale. Responses to this method are not cacheable. + - + - cookie sent by the client/browser + The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. - + + + If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the + entity in the response and not the source text of the process, unless that text happens to be the output of the process. + + + The semantics of the GET method change to a "conditional GET" if the request message includes an + If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. + A conditional GET method requests that the entity be transferred only under the circumstances described + by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network + usage by allowing cached entities to be refreshed without requiring multiple requests or transferring + data already held by the client. + + - + - Constructor. + The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. - cookie identifier - cookie content - id or content is null - id is empty + + The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the + information sent in response to a GET request. This method can be used for obtaining meta information about + the entity implied by the request without transferring the entity-body itself. + + This method is often used for testing hypertext links for validity, accessibility, and recent modification. + - + - Gets the cookie HTML representation. + The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. - cookie string + + This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. + - + - Gets the cookie identifier. + The POST method is used to request that the origin server accept the entity enclosed + in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. + + + POST is designed to allow a uniform method to cover the following functions: + + + Annotation of existing resources; + + Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; + + Providing a block of data, such as the result of submitting a form, to a data-handling process; + + Extending a database through an append operation. + + + + If a resource has been created on the origin server, the response SHOULD be 201 (Created) and + contain an entity which describes the status of the request and refers to the new resource, and a + Location header (see section 14.30). + + + The action performed by the POST method might not result in a resource that can be identified by a URI. + In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on + whether or not the response includes an entity that describes the result. + + Responses to this method are not cacheable, unless the response includes appropriate Cache-Control + or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent + to retrieve a cacheable resource. + + + + + + The PUT method requests that the enclosed entity be stored under the supplied Request-URI. + + + + + If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a + modified version of the one residing on the origin server. + + If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new + resource by the requesting user agent, the origin server can create the resource with that URI. + + If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. + + If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to + indicate successful completion of the request. + + If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be + given that reflects the nature of the problem. + + + + The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not + understand or implement and MUST return a 501 (Not Implemented) response in such cases. + + + + + + The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - + - Cookie value. Set to null to remove cookie. + Contains all HTTP Methods (according to the HTTP 1.1 specification) + + See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html + + + + + + The DELETE method requests that the origin server delete the resource identified by the Request-URI. + + + + This method MAY be overridden by human intervention (or other means) on the origin server. + The client cannot be guaranteed that the operation has been carried out, even if the status code + returned from the origin server indicates that the action has been completed successfully. + + + However, the server SHOULD NOT indicate success unless, at the time the response is given, + it intends to delete the resource or move it to an inaccessible location. + + + A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, + 202 (Accepted) if the action has not yet been enacted, + or 204 (No Content) if the action has been enacted but the response does not include an entity. + + + If the request passes through a cache and the Request-URI identifies one or more currently cached entities, + those entries SHOULD be treated as stale. Responses to this method are not cacheable. + + + + + + The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. + + + + If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the + entity in the response and not the source text of the process, unless that text happens to be the output of the process. + + + The semantics of the GET method change to a "conditional GET" if the request message includes an + If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. + A conditional GET method requests that the entity be transferred only under the circumstances described + by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network + usage by allowing cached entities to be refreshed without requiring multiple requests or transferring + data already held by the client. + + + + + + The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. + + + The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the + information sent in response to a GET request. This method can be used for obtaining meta information about + the entity implied by the request without transferring the entity-body itself. + + This method is often used for testing hypertext links for validity, accessibility, and recent modification. + + + + + The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. + + + This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. + + + + + The POST method is used to request that the origin server accept the entity enclosed + in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. + + + POST is designed to allow a uniform method to cover the following functions: + + + Annotation of existing resources; + + Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; + + Providing a block of data, such as the result of submitting a form, to a data-handling process; + + Extending a database through an append operation. + + + + If a resource has been created on the origin server, the response SHOULD be 201 (Created) and + contain an entity which describes the status of the request and refers to the new resource, and a + Location header (see section 14.30). + + + The action performed by the POST method might not result in a resource that can be identified by a URI. + In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on + whether or not the response includes an entity that describes the result. + + Responses to this method are not cacheable, unless the response includes appropriate Cache-Control + or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent + to retrieve a cacheable resource. + + + + + + The PUT method requests that the enclosed entity be stored under the supplied Request-URI. + + + + + If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a + modified version of the one residing on the origin server. + + If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new + resource by the requesting user agent, the origin server can create the resource with that URI. + + If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. + + If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to + indicate successful completion of the request. + + If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be + given that reflects the nature of the problem. + + + + The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not + understand or implement and MUST return a 501 (Not Implemented) response in such cases. + + + + + + The TRACE method is used to invoke a remote, application-layer loop- back of the request message. + + + + + New implementation of the HTTP listener. + + + Use the Create methods to create a default listener. + + + + + Contains a listener that doesn't do anything with the connections. + + + + + Listen for regular HTTP connections + + IP Address to accept connections on + TCP Port to listen on, default HTTP port is 80. + Factory used to create es. + address is null. + Port must be a positive number. + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTPS port is 443 + Factory used to create es. + Certificate to use + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTPS port is 443 + Factory used to create es. + Certificate to use + which HTTPS protocol to use, default is TLS. + + + Exception. + + + + Will try to accept connections one more time. + + If any exceptions is thrown. + + + + Can be used to create filtering of new connections. + + Accepted socket + true if connection can be accepted; otherwise false. + + + + Start listen for new connections + + Number of connections that can stand in a queue to be accepted. + Listener have already been started. + + + + Stop the listener + + + + + + Gives you a change to receive log entries for all internals of the HTTP library. + + + You may not switch log writer after starting the listener. + + + + + True if we should turn on trace logs. + + + + + Catch exceptions not handled by the listener. + + + Exceptions will be thrown during debug mode if this event is not used, + exceptions will be printed to console and suppressed during release mode. + + + + + A request have been received from a . + + + + + Initializes a new instance of the class. + + IP Address to accept connections on + TCP Port to listen on, default HTTP port is 80. + Factory used to create es. + address is null. + Port must be a positive number. + + + + Initializes a new instance of the class. + + The address. + The port. + The factory. + The certificate. + + + + Initializes a new instance of the class. + + The address. + The port. + The factory. + The certificate. + The protocol. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + Created HTTP listener. + + + + Creates a new instance with default factories. + + Address that the listener should accept connections on. + Port that listener should accept connections on. + Certificate to use + which HTTPS protocol to use, default is TLS. + Created HTTP listener. + + + + Can be used to create filtering of new connections. + + Accepted socket + + true if connection can be accepted; otherwise false. + + + + + A client have been accepted, but not handled, by the listener. + + + + + Event arguments used when a new header have been parsed. + + + + + Initializes a new instance of the class. + + Name of header. + Header value. + + + + Initializes a new instance of the class. + + + + + Gets or sets header name. + + + + + Gets or sets header value. @@ -1268,27 +2175,6 @@ Importance of the log message The message. - - - Class that receives Requests from a . - - - - - Client have been disconnected. - - Client that was disconnected. - Reason - - - - - Invoked when a client context have received a new HTTP request - - Client that received the request. - Request that was received. - - Will contain helper functions for javascript. @@ -1342,6 +2228,2471 @@ javascript for closing a dialog. + + + Delegate used by to populate select options. + + current object (for instance a User). + Text that should be displayed in the value part of a <optiongt;-tag. + Text shown in the select list. + + // Class that is going to be used in a SELECT-tag. + public class User + { + private readonly string _realName; + private readonly int _id; + public User(int id, string realName) + { + _id = id; + _realName = realName; + } + public string RealName + { + get { return _realName; } + } + + public int Id + { + get { return _id; } + } + } + + // Using an inline delegate to generate the select list + public void UserInlineDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + }, 2, true); + } + + // Using an method as delegate to generate the select list. + public void UseExternalDelegate() + { + List<User> items = new List<User>(); + items.Add(new User(1, "adam")); + items.Add(new User(2, "bertial")); + items.Add(new User(3, "david")); + string htmlSelect = Select("users", "users", items, UserOptions, 1, true); + } + + // delegate returning id and title + public static void UserOptions(object o, out object id, out object title) + { + User user = (User)o; + id = user.Id; + value = user.RealName; + } /// + + + + Arguments used when more body bytes have come. + + + + + Initializes a new instance of the class. + + buffer that contains the received bytes. + offset in buffer where to start processing. + number of bytes from that should be parsed. + + + + Initializes a new instance of the class. + + + + + Gets or sets buffer that contains the received bytes. + + + + + Gets or sets number of bytes from that should be parsed. + + + + + Gets or sets offset in buffer where to start processing. + + + + + Response that is sent back to the web browser / client. + + A response can be sent if different ways. The easiest one is + to just fill the Body stream with content, everything else + will then be taken care of by the framework. The default content-type + is text/html, you should change it if you send anything else. + + The second and slighty more complex way is to send the response + as parts. Start with sending the header using the SendHeaders method and + then you can send the body using SendBody method, but do not forget + to set ContentType and ContentLength before doing so. + + + public void MyHandler(IHttpRequest request, IHttpResponse response) + { + + } + + + + + Add another header to the document. + + Name of the header, case sensitive, use lower cases. + Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n + If headers already been sent. + If value conditions have not been met. + Adding any header will override the default ones and those specified by properties. + + + + Send headers and body to the browser. + + If content have already been sent. + + + + Make sure that you have specified ContentLength and sent the headers first. + + + If headers have not been sent. + + offest of first byte to send + number of bytes to send. + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Make sure that you have specified ContentLength and sent the headers first. + + + If headers have not been sent. + + + + This method can be used if you want to send body contents without caching them first. This + is recommended for larger files to keep the memory usage low. + + + + Send headers to the client. + + If headers already been sent. + + + + + + + Redirect client to somewhere else using the 302 status code. + + Destination of the redirect + If headers already been sent. + You can not do anything more with the request when a redirect have been done. This should be your last + action. + + + + redirect to somewhere + + where the redirect should go + + No body are allowed when doing redirects. + + + + + The body stream is used to cache the body contents + before sending everything to the client. It's the simplest + way to serve documents. + + + + + Defines the version of the HTTP Response for applications where it's required + for this to be forced. + + + + + The chunked encoding modifies the body of a message in order to + transfer it as a series of chunks, each with its own size indicator, + followed by an OPTIONAL trailer containing entity-header fields. This + allows dynamically produced content to be transferred along with the + information necessary for the recipient to verify that it has + received the full message. + + + + + Kind of connection + + + + + Encoding to use when sending stuff to the client. + + Default is UTF8 + + + + Number of seconds to keep connection alive + + Only used if Connection property is set to ConnectionType.KeepAlive + + + + Status code that is sent to the client. + + Default is HttpStatusCode.Ok + + + + Information about why a specific status code was used. + + + + + Size of the body. MUST be specified before sending the header, + unless property Chunked is set to true. + + + + + Kind of content in the body + + Default is text/html + + + + Headers have been sent to the client- + + You can not send any additional headers if they have already been sent. + + + + The whole response have been sent. + + + + + Cookies that should be created/changed. + + + + + Type of HTTP connection + + + + + Connection is closed after each request-response + + + + + Connection is kept alive for X seconds (unless another request have been made) + + + + + Contains server side HTTP request information. + + + + + Called during parsing of a . + + Name of the header, should not be URL encoded + Value of the header, should not be URL encoded + If a header is incorrect. + + + + Add bytes to the body + + buffer to read bytes from + where to start read + number of bytes to read + Number of bytes actually read (same as length unless we got all body bytes). + If body is not writable + bytes is null. + offset is out of range. + + + + Clear everything in the request + + + + + Decode body into a form. + + A list with form decoders. + If body contents is not valid for the chosen decoder. + If body is still being transferred. + + + + Sets the cookies. + + The cookies. + + + + Create a response object. + + Context for the connected client. + A new . + + + + Gets kind of types accepted by the client. + + + + + Gets or sets body stream. + + + + + Gets whether the body is complete. + + + + + Gets or sets kind of connection used for the session. + + + + + Gets or sets number of bytes in the body. + + + + + Gets cookies that was sent with the request. + + + + + Gets form parameters. + + + + + Gets headers sent by the client. + + + + + Gets or sets version of HTTP protocol that's used. + + + Probably or . + + + + + + Gets whether the request was made by Ajax (Asynchronous JavaScript) + + + + + Gets or sets requested method. + + + Will always be in upper case. + + + + + + Gets parameter from or . + + + + + Gets variables sent in the query string + + + + + Gets or sets requested URI. + + + + + Gets URI absolute path divided into parts. + + + // URI is: http://gauffin.com/code/tiny/ + Console.WriteLine(request.UriParts[0]); // result: code + Console.WriteLine(request.UriParts[1]); // result: tiny + + + If you're using controllers than the first part is controller name, + the second part is method name and the third part is Id property. + + + + + + Gets or sets path and query. + + + + Are only used during request parsing. Cannot be set after "Host" header have been + added. + + + + + Contains a connection to a browser/client. + + + + + Disconnect from client + + error to report in the event. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + HTML body contents, can be null or empty. + A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty + If is invalid. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + + + + Send a response. + + + + + + send a whole buffer + + buffer to send + + + + + Send data using the stream + + Contains data to send + Start position in buffer + number of bytes to send + + + + + + Closes the streams and disposes of the unmanaged resources + + + + + Using SSL or other encryption method. + + + + + Using SSL or other encryption method. + + + + + The context have been disconnected. + + + Event can be used to clean up a context, or to reuse it. + + + + + A request have been received in the context. + + + + + A have been disconnected. + + + + + Initializes a new instance of the class. + + Reason to disconnection. + + + + Gets reason to why client disconnected. + + + + + + + + + + Initializes a new instance of the class. + + The request. + + + + Gets received request. + + + + + The website module let's you handle multiple websites in the same server. + It uses the "Host" header to check which site you want. + + It's recommended that you do not + add any other modules to HttpServer if you are using the website module. Instead, + add all wanted modules to each website. + + + + + + domain name that should be handled. + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + + + + Name of site. + + + + + represents a HTTP input item. Each item can have multiple sub items, a sub item + is made in a HTML form by using square brackets + + + // becomes: + Console.WriteLine("Value: {0}", form["user"]["FirstName"].Value); + + + All names in a form SHOULD be in lowercase. + + + + Representation of a non-initialized . + + + + Initializes an input item setting its name/identifier and value + + Parameter name/id + Parameter value + + + Creates a deep copy of the item specified + The item to copy + The function makes a deep copy of quite a lot which can be slow + + + + Add another value to this item + + Value to add. + Cannot add stuff to . + + + + checks if a sub-item exists (and has a value). + + name in lower case + true if the sub-item exists and has a value; otherwise false. + + + Returns a formatted representation of the instance with the values of all contained parameters + + + + Outputs the string in a formatted manner + + A prefix to append, used internally + produce a query string + + + + Add a sub item. + + Can contain array formatting, the item is then parsed and added in multiple levels + Value to add. + Argument is null. + Cannot add stuff to . + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + + An object that can be used to iterate through the collection. + + 2 + + + + Outputs the string in a formatted manner + + A prefix to append, used internally + + + + + Number of values + + + + + Get a sub item + + name in lower case. + if no item was found. + + + + Name of item (in lower case). + + + + + Returns the first value, or null if no value exist. + + + + + Returns the last value, or null if no value exist. + + + + + Returns the list with values. + + + + + + + name in lower case + + + + + Container class for posted files + + + + + Creates a container for a posted file + + The identifier of the post field + The file path + The content type of the file + The name of the file uploaded + If any parameter is null or empty + + + + Creates a container for a posted file + + If any parameter is null or empty + + + Destructor disposing the file + + + + Deletes the temporary file + + True if manual dispose + + + + Disposing interface, cleans up managed resources (the temporary file) and suppresses finalization + + + + + The name/id of the file + + + + + The full file path + + + + + The name of the uploaded file + + + + + The type of file + + + + + PrototypeJS implementation of the javascript functions. + + + + + Requests a url through ajax + + url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. + optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. + a link tag + onclick attribute is used by this method. + + + // plain text + JSHelper.AjaxRequest("'/user/show/1'"); + + // ajax request using this.href + string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; + + + + + + Determins if a list of strings contains a specific value + + options to check in + value to find + true if value was found + case insensitive + + + + Ajax requests that updates an element with + the fetched content + + URL to fetch. URL is NOT enclosed in quotes by the implementation. You need to do that yourself. + element to update + options in format "key, value, key, value". All keys should end with colon. + A link tag. + + + JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); + + + + + + A link that pop ups a Dialog (overlay div) + + URL to contents of dialog + link title + name, value, name, value + + A "a"-tag that popups a dialog when clicked + + Requires Control.Modal found here: http://livepipe.net/projects/control_modal/ + And the following JavaScript (load it in application.js): + + Event.observe(window, 'load', + function() { + document.getElementsByClassName('modal').each(function(link){ new Control.Modal(link); }); + } + ); + + + + WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); + + + + + create a modal dialog (usually using DIVs) + + url to fetch + dialog title + javascript/html attributes. javascript options ends with colon ':'. + + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + javascript action that should be added to the "onsubmit" event in the form tag. + + remember to encapsulate strings in '' + + All javascript option names should end with colon. + + + JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); + + + + + + The request requires user authentication. The response MUST include a + WWW-Authenticate header field (section 14.47) containing a challenge + applicable to the requested resource. + + The client MAY repeat the request with a suitable Authorization header + field (section 14.8). If the request already included Authorization + credentials, then the 401 response indicates that authorization has been + refused for those credentials. If the 401 response contains the same challenge + as the prior response, and the user agent has already attempted authentication + at least once, then the user SHOULD be presented the entity that was given in the response, + since that entity might include relevant diagnostic information. + + HTTP access authentication is explained in rfc2617: + http://www.ietf.org/rfc/rfc2617.txt + + (description is taken from + http://www.submissionchamber.com/help-guides/error-codes.php#sec10.4.2) + + + + + Create a new unauhtorized exception. + + + + + + Create a new unauhtorized exception. + + reason to why the request was unauthorized. + inner exception + + + + Create a new unauhtorized exception. + + reason to why the request was unauthorized. + + + + The server understood the request, but is refusing to fulfill it. + Authorization will not help and the request SHOULD NOT be repeated. + If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, + it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information + available to the client, the status code 404 (Not Found) can be used instead. + + Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php + + + + + Initializes a new instance of the class. + + error message + + + + The "basic" authentication scheme is based on the model that the + client must authenticate itself with a user-ID and a password for + each realm. The realm value should be considered an opaque string + which can only be compared for equality with other realms on that + server. The server will service the request only if it can validate + the user-ID and password for the protection space of the Request-URI. + There are no optional authentication parameters. + + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + Delegate used to determine if authentication is required (may be null). + + + + Initializes a new instance of the class. + + Delegate used to provide information used during authentication. + + + + Create a response that can be sent in the WWW-Authenticate header. + + Realm that the user should authenticate in + Not used in basic auth + A correct auth request. + + + + An authentication response have been received from the web browser. + Check if it's correct + + Contents from the Authorization header + Realm that should be authenticated + GET/POST/PUT/DELETE etc. + Not used in basic auth + Authentication object that is stored for the request. A user class or something like that. + if authenticationHeader is invalid + If any of the paramters is empty or null. + + + + name used in http request. + + + + + A session store is used to store and load sessions on a media. + The default implementation () saves/retrieves sessions from memory. + + + + + Creates a new http session with a generated id. + + A object + + + + Creates a new http session with a specific id + + Id used to identify the new cookie.. + A object. + + Id should be generated by the store implementation if it's null or . + + + + + Load an existing session. + + Session id (usually retrieved from a client side cookie). + A session if found; otherwise null. + + + + Save an updated session to the store. + + Session id (usually retrieved from a client side cookie). + If Id property have not been specified. + + + + We use the flyweight pattern which reuses small objects + instead of creating new each time. + + Unused session that should be reused next time Create is called. + + + + Remove expired sessions + + + + + Remove a session + + id of the session. + + + + Load a session from the store + + + null if session is not found. + + + + Number of minutes before a session expires. + + Default time is 20 minutes. + + + + This class is created as a wrapper, since there are two different cookie types in .Net (Cookie and HttpCookie). + The framework might switch class in the future and we dont want to have to replace all instances + + + + + Let's copy all the cookies. + + value from cookie header. + + + + Adds a cookie in the collection. + + cookie to add + cookie is null + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Remove all cookies. + + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Remove a cookie from the collection. + + Name of cookie. + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + Inversion of control interface. + + + + + Add a component instance + + Interface type + Instance to add + + + + Get a component. + + Interface type + Component if registered, otherwise null. + + Component will get created if needed. + + + + + Checks if the specified component interface have been added. + + + true if found; otherwise false. + + + + Add a component. + + Type being requested. + Type being created. + + + + Contains server side HTTP request information. + + + + + Chars used to split an URL path into multiple parts. + + + + + Assign a form. + + + + + + Creates a new object that is a copy of the current instance. + + + + A new object that is a copy of this instance. + + 2 + + + + Decode body into a form. + + A list with form decoders. + If body contents is not valid for the chosen decoder. + If body is still being transferred. + + + + Cookies + + the cookies + + + + Create a response object. + + A new . + + + + Called during parsing of a . + + Name of the header, should not be URL encoded + Value of the header, should not be URL encoded + If a header is incorrect. + + + + Add bytes to the body + + buffer to read bytes from + where to start read + number of bytes to read + Number of bytes actually read (same as length unless we got all body bytes). + If body is not writable + bytes is null. + offset is out of range. + + + + Clear everything in the request + + + + + Gets or sets a value indicating whether this is secure. + + + + + Path and query (will be merged with the host header) and put in Uri + + + + + + Gets whether the body is complete. + + + + + Gets kind of types accepted by the client. + + + + + Gets or sets body stream. + + + + + Gets or sets kind of connection used for the session. + + + + + Gets or sets number of bytes in the body. + + + + + Gets headers sent by the client. + + + + + Gets or sets version of HTTP protocol that's used. + + + Probably or . + + + + + + Gets or sets requested method. + + + + Will always be in upper case. + + + + + + Gets variables sent in the query string + + + + + Gets or sets requested URI. + + + + + Uri absolute path splitted into parts. + + + // uri is: http://gauffin.com/code/tiny/ + Console.WriteLine(request.UriParts[0]); // result: code + Console.WriteLine(request.UriParts[1]); // result: tiny + + + If you're using controllers than the first part is controller name, + the second part is method name and the third part is Id property. + + + + + + Gets parameter from or . + + + + + Gets form parameters. + + + + + Gets whether the request was made by Ajax (Asynchronous JavaScript) + + + + + Gets cookies that was sent with the request. + + + + + The object form class takes an object and creates form items for it. + + + + + Initializes a new instance of the class. + + + form name *and* id. + action to do when form is posted. + + + + + Initializes a new instance of the class. + + form name *and* id. + action to do when form is posted. + object to get values from + + + + Initializes a new instance of the class. + + form action. + object to get values from. + + + + write out the FORM-tag. + + generated html code + + + + Writeout the form tag + + form should be posted through ajax. + generated html code + + + + Generates a text box. + + + + generated html code + + + + password box + + + + generated html code + + + + Hiddens the specified property name. + + Name of the property. + The options. + generated html code + + + + Labels the specified property name. + + property in object. + caption + generated html code + + + + Generate a checkbox + + property in object + checkbox value + additional html attributes. + generated html code + + + + Write a html select tag + + object property. + id column + The title column. + The options. + + + + + Selects the specified property name. + + Name of the property. + The items. + The id column. + The title column. + The options. + + + + + Write a submit tag. + + button caption + html submit tag + + + + html end form tag + + html + + + + Can handle application/x-www-form-urlencoded + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream encoding + + A HTTP form, or null if content could not be parsed. + + If contents in the stream is not valid input data. + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + + + + http://www.faqs.org/rfcs/rfc1867.html + + + + + multipart/form-data + + + + + form-data + + + + + + + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream enconding + A http form, or null if content could not be parsed. + If contents in the stream is not valid input data. + If any parameter is null + + + + Checks if the decoder can handle the mime type + + Content type (with any additional info like boundry). Content type is always supplied in lower case. + True if the decoder can parse the specified content type + + + + Invoked when a client have been accepted by the + + + Can be used to revoke incoming connections + + + + + Initializes a new instance of the class. + + The socket. + + + + Client may not be handled. + + + + + Accepted socket. + + + + + Client should be revoked. + + + + + The purpose of this module is to serve files. + + + + + Initializes a new instance of the class. + + Uri to serve, for instance "/files/" + Path on hard drive where we should start looking for files + If true a Last-Modifed header will be sent upon requests urging web browser to cache files + + + + Initializes a new instance of the class. + + Uri to serve, for instance "/files/" + Path on hard drive where we should start looking for files + + + + Mimtypes that this class can handle per default + + + + + Determines if the request should be handled by this module. + Invoked by the + + + true if this module should handle it. + + + Illegal path + + + + check if source contains any of the chars. + + + + + + + + Method that process the Uri. + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + Failed to find file extension + File type is forbidden. + + + + return a file extension from an absolute Uri path (or plain filename) + + + + + + + List with all mime-type that are allowed. + + All other mime types will result in a Forbidden http status code. + + + + characters that may not exist in a path. + + + fileMod.ForbiddenChars = new string[]{ "\\", "..", ":" }; + + + + + Helpers to make XML handling easier + + + + + Serializes object to XML. + + object to serialize. + XML + + Removes name spaces and adds indentation + + + + + Create an object from a XML string + + Type of object + XML string + object + + + + The requested resource was not found in the web server. + + + + + Create a new exception + + message describing the error + inner exception + + + + Create a new exception + + message describing the error + + + + cookie sent by the client/browser + + + + + + Constructor. + + cookie identifier + cookie content + id or content is null + id is empty + + + + Gets the cookie HTML representation. + + cookie string + + + + Gets the cookie identifier. + + + + + Cookie value. Set to null to remove cookie. + + + + + Returns item either from a form or a query string (checks them in that order) + + + + Representation of a non-initialized HttpParam + + + Initialises the class to hold a value either from a post request or a querystring request + + + + The add method is not availible for HttpParam + since HttpParam checks both Request.Form and Request.QueryString + + name identifying the value + value to add + + + + + Checks whether the form or querystring has the specified value + + Name, case sensitive + true if found; otherwise false. + + + + Returns an enumerator that iterates through the collection. + + + + A that can be used to iterate through the collection. + + 1 + + + + Returns an enumerator that iterates through a collection. + + + + An object that can be used to iterate through the collection. + + 2 + + + + Fetch an item from the form or querystring (in that order). + + + Item if found; otherwise HttpInputItem.EmptyLanguageNode + + + + Contains a connection to a browser/client. + + + Remember to after you have hooked the event. + + TODO: Maybe this class should be broken up into HttpClientChannel and HttpClientContext? + + + + Initializes a new instance of the class. + + true if the connection is secured (SSL/TLS) + client that connected. + Stream used for communication + Used to create a . + Size of buffer to use when reading data. Must be at least 4096 bytes. + If fails + Stream must be writable and readable. + + + + Process incoming body bytes. + + + Bytes + + + + + + + + + + + Start reading content. + + + Make sure to call base.Start() if you override this method. + + + + + Clean up context. + + + Make sure to call base.Cleanup() if you override the method. + + + + + Disconnect from client + + error to report in the event. + + + BadRequestException. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + HTML body contents, can be null or empty. + A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty + If is invalid. + + + + Send a response. + + Either or + HTTP status code + reason for the status code. + + + + Send a response. + + + + + + send a whole buffer + + buffer to send + + + + + Send data using the stream + + Contains data to send + Start position in buffer + number of bytes to send + + + + + + This context have been cleaned, which means that it can be reused. + + + + + Context have been started (a new client have connected) + + + + + Overload to specify own type. + + + Must be specified before the context is being used. + + + + + Using SSL or other encryption method. + + + + + Using SSL or other encryption method. + + + + + Specify which logger to use. + + + + + Gets or sets the network stream. + + + + + Gets or sets IP address that the client connected from. + + + + + Gets or sets port that the client connected from. + + + + + The context have been disconnected. + + + Event can be used to clean up a context, or to reuse it. + + + + + A request have been received in the context. + + + + Class to handle loading of resource files + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + logger. + + + + Loads resources from a namespace in the given assembly to an URI + + The URI to map the resources to + The assembly in which the resources reside + The namespace from which to load the resources + + + resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); + + Will make the resource MyLib.Models.User.Views.list.Haml accessible via /user/list.haml or /user/list/ + + The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded + If a resource has already been mapped to an uri + + + + Retrieves a stream for the specified resource path if loaded otherwise null + + Path to the resource to retrieve a stream for + A stream or null if the resource couldn't be found + + + + Fetch all files from the resource that matches the specified arguments. + + The path to the resource to extract + + a list of files if found; or an empty array if no files are found. + + Search path must end with an asterisk for finding arbitrary files + + + + Fetch all files from the resource that matches the specified arguments. + + Where the file should reside. + Files to check + + a list of files if found; or an empty array if no files are found. + + + + + Returns whether or not the loader has an instance of the file requested + + The name of the template/file + True if the loader can provide the file + + + + Small design by contract implementation. + + + + + Check whether a parameter is empty. + + Parameter value + Parameter name, or error description. + value is empty. + + + + Checks whether a parameter is null. + + Parameter value + Parameter name, or error description. + value is null. + + + + Checks whether a parameter is null. + + + Parameter value + Parameter name, or error description. + value is null. + + + + cookie being sent back to the browser. + + + + + + Constructor. + + cookie identifier + cookie content + cookie expiration date. Use DateTime.MinValue for session cookie. + id or content is null + id is empty + + + + Create a new cookie + + name identifying the cookie + cookie value + when the cookie expires. Setting DateTime.MinValue will delete the cookie when the session is closed. + Path to where the cookie is valid + Domain that the cookie is valid for. + + + + Create a new cookie + + Name and value will be used + when the cookie expires. + + + + Gets the cookie HTML representation. + + cookie string + + + + When the cookie expires. + DateTime.MinValue means that the cookie expires when the session do so. + + + + + Cookie is only valid under this path. + + + + + Used when the request line have been successfully parsed. + + + + + Initializes a new instance of the class. + + The HTTP method. + The URI path. + The HTTP version. + + + + Initializes a new instance of the class. + + + + + Gets or sets http method. + + + Should be one of the methods declared in . + + + + + Gets or sets the version of the HTTP protocol that the client want to use. + + + + + Gets or sets requested URI path. + + + + + Delegate used to find a realm/domain. + + + + + Realms are used during HTTP Authentication + + + + + + + A complete HTTP server, you need to add a module to it to be able to handle incoming requests. + + + + // this small example will add two web site modules, thus handling + // two different sites. In reality you should add Controller modules or something + // two the website modules to be able to handle different requests. + HttpServer server = new HttpServer(); + server.Add(new WebSiteModule("www.gauffin.com", "Gauffin Telecom AB")); + server.Add(new WebSiteModule("www.vapadi.se", "Remote PBX")); + + // start regular http + server.Start(IPAddress.Any, 80); + + // start https + server.Start(IPAddress.Any, 443, myCertificate); + + + + + + + + + Initializes a new instance of the class. + + Used to get all components used in the server.. + + + + Initializes a new instance of the class. + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + + + + + + Initializes a new instance of the class. + + A session store is used to save and retrieve sessions + + + + + Initializes a new instance of the class. + + The log writer. + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + The log writer. + + + + + + + Initializes a new instance of the class. + + Form decoders are used to convert different types of posted data to the object types. + A session store is used to save and retrieve sessions + The log writer. + + + + + + + + Adds the specified rule. + + The rule. + + + + Add a to the server. + + mode to add + + + + Decodes the request body. + + The request. + Failed to decode form data. + + + + Generate a HTTP error page (that will be added to the response body). + response status code is also set. + + Response that the page will be generated in. + . + response body contents. + + + + Generate a HTTP error page (that will be added to the response body). + response status code is also set. + + Response that the page will be generated in. + exception. + + + + Realms are used by the s. + + HTTP request + domain/realm. + + + + Process an incoming request. + + connection to client + request information + response that should be filled + session information + + + + Can be overloaded to implement stuff when a client have been connected. + + + Default implementation does nothing. + + client that disconnected + disconnect reason + + + + Handle authentication + + + + + true if request can be handled; false if not. + Invalid authorization header + + + + Will request authentication. + + + Sends respond to client, nothing else can be done with the response after this. + + + + + + + + Received from a when a request have been parsed successfully. + + that received the request. + The request. + + + + To be able to track request count. + + + + + + + Start the web server using regular HTTP. + + IP Address to listen on, use IpAddress.Any to accept connections on all IP addresses/network cards. + Port to listen on. 80 can be a good idea =) + address is null. + Port must be a positive number. + + + + Accept secure connections. + + IP Address to listen on, use to accept connections on all IP Addresses / network cards. + Port to listen on. 80 can be a good idea =) + Certificate to use + address is null. + Port must be a positive number. + + + + shut down the server and listeners + + + + + write an entry to the log file + + importance of the message + log message + + + + write an entry to the log file + + object that wrote the message + importance of the message + log message + + + + Server that is handling the current request. + + + Will be set as soon as a request arrives to the object. + + + + + Modules used for authentication. The module that is is added first is used as + the default authentication module. + + Use the corresponding property + in the if you are using multiple websites. + + + + Form decoder providers are used to decode request body (which normally contains form data). + + + + + Server name sent in HTTP responses. + + + Do NOT include version in name, since it makes it + easier for hackers. + + + + + Name of cookie where session id is stored. + + + + + Specified where logging should go. + + + + + + + + Number of connections that can wait to be accepted by the server. + + Default is 10. + + + + Gets or sets maximum number of allowed simultaneous requests. + + + + This property is useful in busy systems. The HTTP server + will start queuing new requests if this limit is hit, instead + of trying to process all incoming requests directly. + + + The default number if allowed simultaneous requests are 10. + + + + + + Gets or sets maximum number of requests queuing to be handled. + + + + The WebServer will start turning requests away if response code + to indicate that the server + is too busy to be able to handle the request. + + + + + + Realms are used during HTTP authentication. + Default realm is same as server name. + + + + + Let's to receive unhandled exceptions from the threads. + + + Exceptions will be thrown during debug mode if this event is not used, + exceptions will be printed to console and suppressed during release mode. + + + + + Serves files that are stored in embedded resources. + + + + + Initializes a new instance of the class. + Runs to make sure the basic mime types are available, they can be cleared later + through the use of if desired. + + + + + Initializes a new instance of the class. + Runs to make sure the basic mime types are available, they can be cleared later + through the use of if desired. + + The log writer to use when logging events + + + + Mimtypes that this class can handle per default + + + + + Loads resources from a namespace in the given assembly to an uri + + The uri to map the resources to + The assembly in which the resources reside + The namespace from which to load the resources + + resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); + + will make ie the resource MyLib.Models.User.Views.stylesheet.css accessible via /user/stylesheet.css + + The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded + + + + Returns true if the module can handle the request + + + + + Method that process the url + + Information sent by the browser about the request + Information that is being sent back to the client. + Session used to + true if this module handled the request. + + + + List with all mime-type that are allowed. + + All other mime types will result in a Forbidden http status code. + + + + Container to bind resource names to assemblies + + + + + Instantiates an instance of + + The dot seperated uri the resource maps to + The full resource name + The assembly the resource exists in + + + + Retrieves a stream to the resource + + Null if the resource couldn't be located somehow + + + + Retrieves the assembly the resource resides in + + + + + Retrieves the full name/path of the assembly + + + + + Retrieves the extension of the resource + + + + Returns the Uri without extension + + + Retrieves the full path name to the resource file + Helpers making it easier to work with forms. @@ -1560,28 +4911,115 @@ - + - Arguments sent when a is cleared + Add a component instance + + Interface type + Instance to add + + + + Get a component. + + Interface type + Component if registered, otherwise null. + + Component will get created if needed. + + + + If instance cannot be created. + + + + Checks if the specified component interface have been added. + + + true if found; otherwise false. + + + + Add a component. + + Type being requested. + Type being created. + Type have already been mapped. + + + + Session store using memory for each session. - + - Instantiates the arguments for the event - - True if the session is cleared due to expiration - - - - Returns true if the session is cleared due to expiration + Initializes the class setting the expirationtimer to clean the session every minute - + - Delegate for when a IHttpSession is cleared + Delegate for the cleanup timer + + + + + Creates a new http session + + + + + + Creates a new http session with a specific id + + Id used to identify the new cookie.. + A object. + + Id should be generated by the store implementation if it's null or . + + + + + Load an existing session. + + + + + + + Save an updated session to the store. + + + + + + We use the flyweight pattern which reuses small objects + instead of creating new each time. + + EmptyLanguageNode (unused) session that should be reused next time Create is called. + + + + Remove expired sessions + + + + + Remove a session + + id of the session. + + + + Load a session from the store + + + null if session is not found. + + + + Number of minutes before a session expires. + Default is 20 minutes. - this is being cleared. - Arguments for the clearing @@ -1627,30 +5065,6 @@ Context that the request was received from. Request to process. - - - Creates request parsers when needed. - - - - - Creates request parsers when needed. - - - - - Create a new request parser. - - Used when logging should be enabled. - A new request parser. - - - - Create a new request parser. - - Used when logging should be enabled. - A new request parser. - Response that is sent back to the web browser / client. @@ -1687,175 +5101,6 @@ todo: add two examples, using SendHeaders/SendBody and just the Body stream. - - - Response that is sent back to the web browser / client. - - A response can be sent if different ways. The easiest one is - to just fill the Body stream with content, everything else - will then be taken care of by the framework. The default content-type - is text/html, you should change it if you send anything else. - - The second and slighty more complex way is to send the response - as parts. Start with sending the header using the SendHeaders method and - then you can send the body using SendBody method, but do not forget - to set ContentType and ContentLength before doing so. - - - public void MyHandler(IHttpRequest request, IHttpResponse response) - { - - } - - - - - Add another header to the document. - - Name of the header, case sensitive, use lower cases. - Header values can span over multiple lines as long as each line starts with a white space. New line chars should be \r\n - If headers already been sent. - If value conditions have not been met. - Adding any header will override the default ones and those specified by properties. - - - - Send headers and body to the browser. - - If content have already been sent. - - - - Make sure that you have specified ContentLength and sent the headers first. - - - If headers have not been sent. - - offest of first byte to send - number of bytes to send. - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Make sure that you have specified ContentLength and sent the headers first. - - - If headers have not been sent. - - - - This method can be used if you want to send body contents without caching them first. This - is recommended for larger files to keep the memory usage low. - - - - Send headers to the client. - - If headers already been sent. - - - - - - - Redirect client to somewhere else using the 302 status code. - - Destination of the redirect - If headers already been sent. - You can not do anything more with the request when a redirect have been done. This should be your last - action. - - - - redirect to somewhere - - where the redirect should go - - No body are allowed when doing redirects. - - - - - The body stream is used to cache the body contents - before sending everything to the client. It's the simplest - way to serve documents. - - - - - Defines the version of the HTTP Response for applications where it's required - for this to be forced. - - - - - The chunked encoding modifies the body of a message in order to - transfer it as a series of chunks, each with its own size indicator, - followed by an OPTIONAL trailer containing entity-header fields. This - allows dynamically produced content to be transferred along with the - information necessary for the recipient to verify that it has - received the full message. - - - - - Kind of connection - - - - - Encoding to use when sending stuff to the client. - - Default is UTF8 - - - - Number of seconds to keep connection alive - - Only used if Connection property is set to ConnectionType.KeepAlive - - - - Status code that is sent to the client. - - Default is HttpStatusCode.Ok - - - - Information about why a specific status code was used. - - - - - Size of the body. MUST be specified before sending the header, - unless property Chunked is set to true. - - - - - Kind of content in the body - - Default is text/html - - - - Headers have been sent to the client- - - You can not send any additional headers if they have already been sent. - - - - The whole response have been sent. - - - - - Cookies that should be created/changed. - - Initializes a new instance of the class. @@ -2207,3250 +5452,5 @@ true to release both managed and unmanaged resources; false to release only unmanaged resources. - - - The "basic" authentication scheme is based on the model that the - client must authenticate itself with a user-ID and a password for - each realm. The realm value should be considered an opaque string - which can only be compared for equality with other realms on that - server. The server will service the request only if it can validate - the user-ID and password for the protection space of the Request-URI. - There are no optional authentication parameters. - - - - - Authentication modules are used to implement different - kind of HTTP authentication. - - - - - Tag used for authentication. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Array with optional options. - A correct authentication request. - If realm is empty or null. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - options to specific implementations - Authentication object that is stored for the request. A user class or something like that. - if is invalid - If any of the parameters is empty or null. - - - - Used to invoke the authentication delegate that is used to lookup the user name/realm. - - Realm (domain) that user want to authenticate in - User name - Password used for validation. Some implementations got password in clear text, they are then sent to client. - object that will be stored in the request to help you identify the user if authentication was successful. - true if authentication was successful - - - - Determines if authentication is required. - - HTTP request from browser - true if user should be authenticated. - throw from your delegate if no more attempts are allowed. - If no more attempts are allowed - - - - name used in HTTP request. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - Not used in basic auth - A correct auth request. - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - Not used in basic auth - Authentication object that is stored for the request. A user class or something like that. - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - name used in http request. - - - - - Used to inform http server that - - - - - Eventarguments used when an exception is thrown by a module - - the exception - - - - Exception thrown in a module - - - - - PrototypeJS implementation of the javascript functions. - - - - - Purpose of this class is to create a javascript toolkit independent javascript helper. - - - - - Generates a list with JS options. - - StringBuilder that the options should be added to. - the javascript options. name, value pairs. each string value should be escaped by YOU! - true if we should start with a comma. - - - - Removes any javascript parameters from an array of parameters - - The array of parameters to remove javascript params from - An array of html parameters - - - - javascript action that should be added to the "onsubmit" event in the form tag. - - - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - Requests a url through ajax - - url to fetch - optional options in format "key, value, key, value", used in JS request object. - a link tag - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - Ajax requests that updates an element with - the fetched content - - Url to fetch content from - element to update - optional options in format "key, value, key, value", used in JS updater object. - A link tag. - All javascript option names should end with colon. - - - JSHelper.AjaxUpdater("/user/show/1", "userInfo", "onsuccess:", "alert('Successful!');"); - - - - - - A link that pop ups a Dialog (overlay div) - - url to contents of dialog - link title - A "a"-tag that popups a dialog when clicked - name/value of html attributes - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Creates a new modal dialog window - - url to open in window. - window title (may not be supported by all js implementations) - - - - - - Requests a url through ajax - - url to fetch. Url is NOT enclosed in quotes by the implementation. You need to do that yourself. - optional options in format "key, value, key, value", used in JS request object. All keys should end with colon. - a link tag - onclick attribute is used by this method. - - - // plain text - JSHelper.AjaxRequest("'/user/show/1'"); - - // ajax request using this.href - string link = "<a href=\"/user/call/1\" onclick=\"" + JSHelper.AjaxRequest("this.href") + "/<call user</a>"; - - - - - - Determins if a list of strings contains a specific value - - options to check in - value to find - true if value was found - case insensitive - - - - Ajax requests that updates an element with - the fetched content - - URL to fetch. URL is NOT enclosed in quotes by the implementation. You need to do that yourself. - element to update - options in format "key, value, key, value". All keys should end with colon. - A link tag. - - - JSHelper.AjaxUpdater("'/user/show/1'", "user", "onsuccess:", "alert('hello');", "asynchronous:", "true"); - - - - - - A link that pop ups a Dialog (overlay div) - - URL to contents of dialog - link title - name, value, name, value - - A "a"-tag that popups a dialog when clicked - - Requires Control.Modal found here: http://livepipe.net/projects/control_modal/ - And the following JavaScript (load it in application.js): - - Event.observe(window, 'load', - function() { - document.getElementsByClassName('modal').each(function(link){ new Control.Modal(link); }); - } - ); - - - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - create a modal dialog (usually using DIVs) - - url to fetch - dialog title - javascript/html attributes. javascript options ends with colon ':'. - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - javascript action that should be added to the "onsubmit" event in the form tag. - - remember to encapsulate strings in '' - - All javascript option names should end with colon. - - - JSHelper.AjaxRequest("/user/show/1", "onsuccess:", "$('userInfo').update(result);"); - - - - - - Lists content type mime types. - - - - - text/plain - - - - - text/haml - - - - - content type for javascript documents = application/javascript - - - - RFC 4329 states that text/javascript have been superseeded by - application/javascript. You might still want to check browser versions - since older ones do not support application/javascript. - - Browser support: http://krijnhoetmer.nl/stuff/javascript/mime-types/ - - - - - text/xml - - - - - A list of content types - - - - - - - Semicolon separated content types. - - - - Returns an enumerator that iterates through a collection. - - - An object that can be used to iterate through the collection. - - - - - Searches for the specified type - - Can also be a part of a type (searching for "xml" would return true for "application/xml"). - true if type was found. - - - - Get this first content type. - - - - - Fetch a content type - - Part of type ("xml" would return "application/xml") - - All content types are in lower case. - - - - Event arguments used when a new header have been parsed. - - - - - Initializes a new instance of the class. - - Name of header. - Header value. - - - - Initializes a new instance of the class. - - - - - Gets or sets header name. - - - - - Gets or sets header value. - - - - - A reverse proxy are used to act as a bridge between local (protected/hidden) websites - and public clients. - - A typical usage is to allow web servers on non standard ports to still be available - to the public clients, or allow web servers on private ips to be available. - - - - - - - Base url requested from browser - Base url on private web server - - // this will return contents from http://192.168.1.128/view/jonas when client requests http://www.gauffin.com/user/view/jonas - _server.Add(new ReverseProxyModule("http://www.gauffin.com/user/", "http://192.168.1.128/"); - - - - - Method that determines if an url should be handled or not by the module - - Url requested by the client. - true if module should handle the url. - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - - - - Contains a connection to a browser/client. - - - Remember to after you have hooked the event. - - TODO: Maybe this class should be broken up into HttpClientChannel and HttpClientContext? - - - - Contains a connection to a browser/client. - - - - - Disconnect from client - - error to report in the event. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - HTML body contents, can be null or empty. - A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty - If is invalid. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - - - - Send a response. - - - - - - send a whole buffer - - buffer to send - - - - - Send data using the stream - - Contains data to send - Start position in buffer - number of bytes to send - - - - - - Closes the streams and disposes of the unmanaged resources - - - - - Using SSL or other encryption method. - - - - - Using SSL or other encryption method. - - - - - The context have been disconnected. - - - Event can be used to clean up a context, or to reuse it. - - - - - A request have been received in the context. - - - - - Initializes a new instance of the class. - - true if the connection is secured (SSL/TLS) - client that connected. - Stream used for communication - Used to create a . - Size of buffer to use when reading data. Must be at least 4096 bytes. - If fails - Stream must be writable and readable. - - - - Process incoming body bytes. - - - Bytes - - - - - - - - - - - Start reading content. - - - Make sure to call base.Start() if you override this method. - - - - - Clean up context. - - - Make sure to call base.Cleanup() if you override the method. - - - - - Disconnect from client - - error to report in the event. - - - BadRequestException. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - HTML body contents, can be null or empty. - A content type to return the body as, i.e. 'text/html' or 'text/plain', defaults to 'text/html' if null or empty - If is invalid. - - - - Send a response. - - Either or - HTTP status code - reason for the status code. - - - - Send a response. - - - - - - send a whole buffer - - buffer to send - - - - - Send data using the stream - - Contains data to send - Start position in buffer - number of bytes to send - - - - - - This context have been cleaned, which means that it can be reused. - - - - - Context have been started (a new client have connected) - - - - - Overload to specify own type. - - - Must be specified before the context is being used. - - - - - Using SSL or other encryption method. - - - - - Using SSL or other encryption method. - - - - - Specify which logger to use. - - - - - Gets or sets the network stream. - - - - - Gets or sets IP address that the client connected from. - - - - - Gets or sets port that the client connected from. - - - - - The context have been disconnected. - - - Event can be used to clean up a context, or to reuse it. - - - - - A request have been received in the context. - - - - - Helpers to make XML handling easier - - - - - Serializes object to XML. - - object to serialize. - XML - - Removes name spaces and adds indentation - - - - - Create an object from a XML string - - Type of object - XML string - object - - - - Can handle application/x-www-form-urlencoded - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream encoding - - A HTTP form, or null if content could not be parsed. - - If contents in the stream is not valid input data. - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - The server understood the request, but is refusing to fulfill it. - Authorization will not help and the request SHOULD NOT be repeated. - If the request method was not HEAD and the server wishes to make public why the request has not been fulfilled, - it SHOULD describe the reason for the refusal in the entity. If the server does not wish to make this information - available to the client, the status code 404 (Not Found) can be used instead. - - Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php - - - - - Initializes a new instance of the class. - - error message - - - - Invoked when a client have been accepted by the - - - Can be used to revoke incoming connections - - - - - Initializes a new instance of the class. - - The socket. - - - - Client may not be handled. - - - - - Accepted socket. - - - - - Client should be revoked. - - - - Class to handle loading of resource files - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - logger. - - - - Loads resources from a namespace in the given assembly to an URI - - The URI to map the resources to - The assembly in which the resources reside - The namespace from which to load the resources - - - resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); - - Will make the resource MyLib.Models.User.Views.list.Haml accessible via /user/list.haml or /user/list/ - - The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded - If a resource has already been mapped to an uri - - - - Retrieves a stream for the specified resource path if loaded otherwise null - - Path to the resource to retrieve a stream for - A stream or null if the resource couldn't be found - - - - Fetch all files from the resource that matches the specified arguments. - - The path to the resource to extract - - a list of files if found; or an empty array if no files are found. - - Search path must end with an asterisk for finding arbitrary files - - - - Fetch all files from the resource that matches the specified arguments. - - Where the file should reside. - Files to check - - a list of files if found; or an empty array if no files are found. - - - - - Returns whether or not the loader has an instance of the file requested - - The name of the template/file - True if the loader can provide the file - - - - - - - - - - - Represents a field in a multipart form - - - - This provider is used to let us implement any type of form decoding we want without - having to rewrite anything else in the server. - - - - - - - Should contain boundary and type, as in: multipart/form-data; boundary=---------------------------230051238959 - Stream containing form data. - Encoding used when decoding the stream - if no parser was found. - If stream is null or not readable. - If stream contents cannot be decoded properly. - - - - Add a decoder. - - - - - - - Number of added decoders. - - - - - Use with care. - - - - - Decoder used for unknown content types. - - - - - Delegate used to find a realm/domain. - - - - - Realms are used during HTTP Authentication - - - - - - - A complete HTTP server, you need to add a module to it to be able to handle incoming requests. - - - - // this small example will add two web site modules, thus handling - // two different sites. In reality you should add Controller modules or something - // two the website modules to be able to handle different requests. - HttpServer server = new HttpServer(); - server.Add(new WebSiteModule("www.gauffin.com", "Gauffin Telecom AB")); - server.Add(new WebSiteModule("www.vapadi.se", "Remote PBX")); - - // start regular http - server.Start(IPAddress.Any, 80); - - // start https - server.Start(IPAddress.Any, 443, myCertificate); - - - - - - - - - Initializes a new instance of the class. - - Used to get all components used in the server.. - - - - Initializes a new instance of the class. - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - - - - - - Initializes a new instance of the class. - - A session store is used to save and retrieve sessions - - - - - Initializes a new instance of the class. - - The log writer. - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - The log writer. - - - - - - - Initializes a new instance of the class. - - Form decoders are used to convert different types of posted data to the object types. - A session store is used to save and retrieve sessions - The log writer. - - - - - - - - Adds the specified rule. - - The rule. - - - - Add a to the server. - - mode to add - - - - Decodes the request body. - - The request. - Failed to decode form data. - - - - Generate a HTTP error page (that will be added to the response body). - response status code is also set. - - Response that the page will be generated in. - . - response body contents. - - - - Generate a HTTP error page (that will be added to the response body). - response status code is also set. - - Response that the page will be generated in. - exception. - - - - Realms are used by the s. - - HTTP request - domain/realm. - - - - Process an incoming request. - - connection to client - request information - response that should be filled - session information - - - - Can be overloaded to implement stuff when a client have been connected. - - - Default implementation does nothing. - - client that disconnected - disconnect reason - - - - Handle authentication - - - - - true if request can be handled; false if not. - Invalid authorization header - - - - Will request authentication. - - - Sends respond to client, nothing else can be done with the response after this. - - - - - - - - Received from a when a request have been parsed successfully. - - that received the request. - The request. - - - - To be able to track request count. - - - - - - - Start the web server using regular HTTP. - - IP Address to listen on, use IpAddress.Any to accept connections on all IP addresses/network cards. - Port to listen on. 80 can be a good idea =) - address is null. - Port must be a positive number. - - - - Accept secure connections. - - IP Address to listen on, use to accept connections on all IP Addresses / network cards. - Port to listen on. 80 can be a good idea =) - Certificate to use - address is null. - Port must be a positive number. - - - - shut down the server and listeners - - - - - write an entry to the log file - - importance of the message - log message - - - - write an entry to the log file - - object that wrote the message - importance of the message - log message - - - - Server that is handling the current request. - - - Will be set as soon as a request arrives to the object. - - - - - Modules used for authentication. The module that is is added first is used as - the default authentication module. - - Use the corresponding property - in the if you are using multiple websites. - - - - Form decoder providers are used to decode request body (which normally contains form data). - - - - - Server name sent in HTTP responses. - - - Do NOT include version in name, since it makes it - easier for hackers. - - - - - Name of cookie where session id is stored. - - - - - Specified where logging should go. - - - - - - - - Number of connections that can wait to be accepted by the server. - - Default is 10. - - - - Gets or sets maximum number of allowed simultaneous requests. - - - - This property is useful in busy systems. The HTTP server - will start queuing new requests if this limit is hit, instead - of trying to process all incoming requests directly. - - - The default number if allowed simultaneous requests are 10. - - - - - - Gets or sets maximum number of requests queuing to be handled. - - - - The WebServer will start turning requests away if response code - to indicate that the server - is too busy to be able to handle the request. - - - - - - Realms are used during HTTP authentication. - Default realm is same as server name. - - - - - Let's to receive unhandled exceptions from the threads. - - - Exceptions will be thrown during debug mode if this event is not used, - exceptions will be printed to console and suppressed during release mode. - - - - - - - - http://www.faqs.org/rfcs/rfc1867.html - - - - - multipart/form-data - - - - - form-data - - - - - - - Stream containing the content - Content type (with any additional info like boundry). Content type is always supplied in lower case - Stream enconding - A http form, or null if content could not be parsed. - If contents in the stream is not valid input data. - If any parameter is null - - - - Checks if the decoder can handle the mime type - - Content type (with any additional info like boundry). Content type is always supplied in lower case. - True if the decoder can parse the specified content type - - - - Add a component instance - - Interface type - Instance to add - - - - Get a component. - - Interface type - Component if registered, otherwise null. - - Component will get created if needed. - - - - If instance cannot be created. - - - - Checks if the specified component interface have been added. - - - true if found; otherwise false. - - - - Add a component. - - Type being requested. - Type being created. - Type have already been mapped. - - - - The purpose of this module is to serve files. - - - - - Initializes a new instance of the class. - - Uri to serve, for instance "/files/" - Path on hard drive where we should start looking for files - If true a Last-Modifed header will be sent upon requests urging web browser to cache files - - - - Initializes a new instance of the class. - - Uri to serve, for instance "/files/" - Path on hard drive where we should start looking for files - - - - Mimtypes that this class can handle per default - - - - - Determines if the request should be handled by this module. - Invoked by the - - - true if this module should handle it. - - - Illegal path - - - - check if source contains any of the chars. - - - - - - - - Method that process the Uri. - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - Failed to find file extension - File type is forbidden. - - - - return a file extension from an absolute Uri path (or plain filename) - - - - - - - List with all mime-type that are allowed. - - All other mime types will result in a Forbidden http status code. - - - - characters that may not exist in a path. - - - fileMod.ForbiddenChars = new string[]{ "\\", "..", ":" }; - - - - - Contains a listener that doesn't do anything with the connections. - - - - - Listen for regular HTTP connections - - IP Address to accept connections on - TCP Port to listen on, default HTTP port is 80. - Factory used to create es. - address is null. - Port must be a positive number. - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTPS port is 443 - Factory used to create es. - Certificate to use - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTPS port is 443 - Factory used to create es. - Certificate to use - which HTTPS protocol to use, default is TLS. - - - Exception. - - - - Will try to accept connections one more time. - - If any exceptions is thrown. - - - - Can be used to create filtering of new connections. - - Accepted socket - true if connection can be accepted; otherwise false. - - - - Start listen for new connections - - Number of connections that can stand in a queue to be accepted. - Listener have already been started. - - - - Stop the listener - - - - - - Gives you a change to receive log entries for all internals of the HTTP library. - - - You may not switch log writer after starting the listener. - - - - - True if we should turn on trace logs. - - - - - Catch exceptions not handled by the listener. - - - Exceptions will be thrown during debug mode if this event is not used, - exceptions will be printed to console and suppressed during release mode. - - - - - A request have been received from a . - - - - - Container class for posted files - - - - - Creates a container for a posted file - - The identifier of the post field - The file path - The content type of the file - The name of the file uploaded - If any parameter is null or empty - - - - Creates a container for a posted file - - If any parameter is null or empty - - - Destructor disposing the file - - - - Deletes the temporary file - - True if manual dispose - - - - Disposing interface, cleans up managed resources (the temporary file) and suppresses finalization - - - - - The name/id of the file - - - - - The full file path - - - - - The name of the uploaded file - - - - - The type of file - - - - - Implements HTTP Digest authentication. It's more secure than Basic auth since password is - encrypted with a "key" from the server. - - - Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). - - - - Initializes a new instance of the class. - - Delegate used to provide information used during authentication. - - - - Used by test classes to be able to use hardcoded values - - - - - An authentication response have been received from the web browser. - Check if it's correct - - Contents from the Authorization header - Realm that should be authenticated - GET/POST/PUT/DELETE etc. - First option: true if username/password is correct but not cnonce - - Authentication object that is stored for the request. A user class or something like that. - - if authenticationHeader is invalid - If any of the paramters is empty or null. - - - - Encrypts parameters into a Digest string - - Realm that the user want to log into. - User logging in - Users password. - HTTP method. - Uri/domain that generated the login prompt. - Quality of Protection. - "Number used ONCE" - Hexadecimal request counter. - "Client Number used ONCE" - Digest encrypted string - - - - - - Md5 hex encoded "userName:realm:password", without the quotes. - Md5 hex encoded "method:uri", without the quotes - Quality of Protection - "Number used ONCE" - Hexadecimal request counter. - Client number used once - - - - - Create a response that can be sent in the WWW-Authenticate header. - - Realm that the user should authenticate in - First options specifies if true if username/password is correct but not cnonce. - A correct auth request. - If realm is empty or null. - - - - Decodes authorization header value - - header value - Encoding that the buffer is in - All headers and their values if successful; otherwise null - - NameValueCollection header = DigestAuthentication.Decode("response=\"6629fae49393a05397450978507c4ef1\",\r\nc=00001", Encoding.ASCII); - - Can handle lots of whitespaces and new lines without failing. - - - - Gets the current nonce. - - - - - - Gets the Md5 hash bin hex2. - - To be hashed. - - - - - determines if the nonce is valid or has expired. - - nonce value (check wikipedia for info) - true if the nonce has not expired. - - - - name used in http request. - - - - - Gets or sets whether the token supplied in is a - HA1 generated string. - - - - - Current state in the parsing. - - - - - Should parse the request line - - - - - Searching for a complete header name - - - - - Searching for colon after header name (ignoring white spaces) - - - - - Searching for start of header value (ignoring white spaces) - - - - - Searching for a complete header value (can span over multiple lines, as long as they are prefixed with one/more whitespaces) - - - - - Adding bytes to body - - - - - Class to make dynamic binding of redirects. Instead of having to specify a number of similar redirect rules - a regular expression can be used to identify redirect URLs and their targets. - - - [a-z0-9]+)", "/users/${target}?find=true", RegexOptions.IgnoreCase) - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - - [a-zA-Z0-9]+)", "/user/${first}")); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to use, can be null - - [a-zA-Z0-9]+)", "/user/{first}", RegexOptions.IgnoreCase)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - - - - Initializes a new instance of the class. - - Expression to match URL - Expression to generate URL - Regular expression options to apply - true if request should be redirected, false if the request URI should be replaced. - - [a-zA-Z0-9]+)", "/user/${first}", RegexOptions.None)); - Result of ie. /employee1 will then be /user/employee1 - ]]> - - Argument is null. - - - - - Process the incoming request. - - incoming HTTP request - outgoing HTTP response - true if response should be sent to the browser directly (no other rules or modules will be processed). - - returning true means that no modules will get the request. Returning true is typically being done - for redirects. - - If request or response is null - - - - This class is created as a wrapper, since there are two different cookie types in .Net (Cookie and HttpCookie). - The framework might switch class in the future and we dont want to have to replace all instances - - - - - Let's copy all the cookies. - - value from cookie header. - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Remove all cookies. - - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Remove a cookie from the collection. - - Name of cookie. - - - - Gets the count of cookies in the collection. - - - - - Gets the cookie of a given identifier (null if not existing). - - - - - Arguments used when more body bytes have come. - - - - - Initializes a new instance of the class. - - buffer that contains the received bytes. - offset in buffer where to start processing. - number of bytes from that should be parsed. - - - - Initializes a new instance of the class. - - - - - Gets or sets buffer that contains the received bytes. - - - - - Gets or sets number of bytes from that should be parsed. - - - - - Gets or sets offset in buffer where to start processing. - - - - - Returns item either from a form or a query string (checks them in that order) - - - - Representation of a non-initialized HttpParam - - - Initialises the class to hold a value either from a post request or a querystring request - - - - The add method is not availible for HttpParam - since HttpParam checks both Request.Form and Request.QueryString - - name identifying the value - value to add - - - - - Checks whether the form or querystring has the specified value - - Name, case sensitive - true if found; otherwise false. - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - 2 - - - - Fetch an item from the form or querystring (in that order). - - - Item if found; otherwise HttpInputItem.EmptyLanguageNode - - - - We dont want to let the server to die due to exceptions thrown in worker threads. - therefore we use this delegate to give you a change to handle uncaught exceptions. - - Class that the exception was thrown in. - Exception - - Server will throw a InternalServerException in release version if you dont - handle this delegate. - - - - - Delegate used to let authentication modules authenticate the user name and password. - - Realm that the user want to authenticate in - User name specified by client - Can either be user password or implementation specific token. - object that will be stored in a session variable called if authentication was successful. - throw forbidden exception if too many attempts have been made. - - - Use to specify that the token is a HA1 token. (MD5 generated - string from realm, user name and password); Md5String(userName + ":" + realm + ":" + password); - - - - - - Let's you decide on a system level if authentication is required. - - HTTP request from client - true if user should be authenticated. - throw if no more attempts are allowed. - If no more attempts are allowed - - - - New implementation of the HTTP listener. - - - Use the Create methods to create a default listener. - - - - - Initializes a new instance of the class. - - IP Address to accept connections on - TCP Port to listen on, default HTTP port is 80. - Factory used to create es. - address is null. - Port must be a positive number. - - - - Initializes a new instance of the class. - - The address. - The port. - The factory. - The certificate. - - - - Initializes a new instance of the class. - - The address. - The port. - The factory. - The certificate. - The protocol. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - Created HTTP listener. - - - - Creates a new instance with default factories. - - Address that the listener should accept connections on. - Port that listener should accept connections on. - Certificate to use - which HTTPS protocol to use, default is TLS. - Created HTTP listener. - - - - Can be used to create filtering of new connections. - - Accepted socket - - true if connection can be accepted; otherwise false. - - - - - A client have been accepted, but not handled, by the listener. - - - - - Webhelper provides helpers for common tasks in HTML. - - - - - Used to let the website use different javascript libraries. - Default is - - - - - Creates a link that invokes through ajax. - - url to fetch - link title - - optional options in format "key, value, key, value". - Javascript options starts with ':'. - - a link tag - - WebHelper.AjaxRequest("/users/add/", "Add user", "method:", "post", "onclick", "validate('this');"); - - - - - Builds a link that updates an element with the fetched ajax content. - - Url to fetch content from - link title - html element to update with the results of the ajax request. - optional options in format "key, value, key, value" - A link tag. - - - - A link that pop ups a Dialog (overlay div) - - url to contents of dialog - link title - name/value of html attributes. - A "a"-tag that popups a dialog when clicked - - WebHelper.DialogLink("/user/show/1", "show user", "onmouseover", "alert('booh!');"); - - - - - Create/Open a dialog box using ajax - - - - - - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Create a <form> tag. - - name of form - action to invoke on submit - form should be posted as ajax - html code - - WebHelper.FormStart("frmLogin", "/user/login", Request.IsAjax); - - - - - Create a link tag. - - url to go to - link title (text that is displayed) - html attributes, name, value, name, value - html code - - WebHelper.Link("/user/show/1", "Show user", "id", "showUser", "onclick", "return confirm('Are you shure?');"); - - - - - Build a link - - url to go to. - title of link (displayed text) - extra html attributes. - a complete link - - - - Build a link - - url to go to. - title of link (displayed text) - extra html attributes. - a complete link - more options - - - - Obsolete - - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - - - - Obsolete - - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - Obsolete - - - - Render errors into a UL with class "errors" - - class used by UL-tag. - items to list - an unordered html list. - - - - Render errors into a UL with class "errors" - - class used by UL-tag. - items to list - an unordered html list. - - - - Render errors into a UL with class "errors" - - - - - - - Generates a list with html attributes. - - StringBuilder that the options should be added to. - attributes set by user. - attributes set by any of the helper classes. - - - - Generates a list with html attributes. - - StringBuilder that the options should be added to. - - - - - cookie being sent back to the browser. - - - - - - Constructor. - - cookie identifier - cookie content - cookie expiration date. Use DateTime.MinValue for session cookie. - id or content is null - id is empty - - - - Create a new cookie - - name identifying the cookie - cookie value - when the cookie expires. Setting DateTime.MinValue will delete the cookie when the session is closed. - Path to where the cookie is valid - Domain that the cookie is valid for. - - - - Create a new cookie - - Name and value will be used - when the cookie expires. - - - - Gets the cookie HTML representation. - - cookie string - - - - When the cookie expires. - DateTime.MinValue means that the cookie expires when the session do so. - - - - - Cookie is only valid under this path. - - - - - Contains server side HTTP request information. - - - - - Called during parsing of a . - - Name of the header, should not be URL encoded - Value of the header, should not be URL encoded - If a header is incorrect. - - - - Add bytes to the body - - buffer to read bytes from - where to start read - number of bytes to read - Number of bytes actually read (same as length unless we got all body bytes). - If body is not writable - bytes is null. - offset is out of range. - - - - Clear everything in the request - - - - - Decode body into a form. - - A list with form decoders. - If body contents is not valid for the chosen decoder. - If body is still being transferred. - - - - Sets the cookies. - - The cookies. - - - - Create a response object. - - Context for the connected client. - A new . - - - - Gets kind of types accepted by the client. - - - - - Gets or sets body stream. - - - - - Gets whether the body is complete. - - - - - Gets or sets kind of connection used for the session. - - - - - Gets or sets number of bytes in the body. - - - - - Gets cookies that was sent with the request. - - - - - Gets form parameters. - - - - - Gets headers sent by the client. - - - - - Gets or sets version of HTTP protocol that's used. - - - Probably or . - - - - - - Gets whether the request was made by Ajax (Asynchronous JavaScript) - - - - - Gets or sets requested method. - - - Will always be in upper case. - - - - - - Gets parameter from or . - - - - - Gets variables sent in the query string - - - - - Gets or sets requested URI. - - - - - Gets URI absolute path divided into parts. - - - // URI is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny - - - If you're using controllers than the first part is controller name, - the second part is method name and the third part is Id property. - - - - - - Gets or sets path and query. - - - - Are only used during request parsing. Cannot be set after "Host" header have been - added. - - - - - Delegate used by to populate select options. - - current object (for instance a User). - Text that should be displayed in the value part of a <optiongt;-tag. - Text shown in the select list. - - // Class that is going to be used in a SELECT-tag. - public class User - { - private readonly string _realName; - private readonly int _id; - public User(int id, string realName) - { - _id = id; - _realName = realName; - } - public string RealName - { - get { return _realName; } - } - - public int Id - { - get { return _id; } - } - } - - // Using an inline delegate to generate the select list - public void UserInlineDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, delegate(object o, out object id, out object value) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - }, 2, true); - } - - // Using an method as delegate to generate the select list. - public void UseExternalDelegate() - { - List<User> items = new List<User>(); - items.Add(new User(1, "adam")); - items.Add(new User(2, "bertial")); - items.Add(new User(3, "david")); - string htmlSelect = Select("users", "users", items, UserOptions, 1, true); - } - - // delegate returning id and title - public static void UserOptions(object o, out object id, out object title) - { - User user = (User)o; - id = user.Id; - value = user.RealName; - } /// - - - - The request requires user authentication. The response MUST include a - WWW-Authenticate header field (section 14.47) containing a challenge - applicable to the requested resource. - - The client MAY repeat the request with a suitable Authorization header - field (section 14.8). If the request already included Authorization - credentials, then the 401 response indicates that authorization has been - refused for those credentials. If the 401 response contains the same challenge - as the prior response, and the user agent has already attempted authentication - at least once, then the user SHOULD be presented the entity that was given in the response, - since that entity might include relevant diagnostic information. - - HTTP access authentication is explained in rfc2617: - http://www.ietf.org/rfc/rfc2617.txt - - (description is taken from - http://www.submissionchamber.com/help-guides/error-codes.php#sec10.4.2) - - - - - Create a new unauhtorized exception. - - - - - - Create a new unauhtorized exception. - - reason to why the request was unauthorized. - inner exception - - - - Create a new unauhtorized exception. - - reason to why the request was unauthorized. - - - - The requested resource was not found in the web server. - - - - - Create a new exception - - message describing the error - inner exception - - - - Create a new exception - - message describing the error - - - - Type of HTTP connection - - - - - Connection is closed after each request-response - - - - - Connection is kept alive for X seconds (unless another request have been made) - - - - - A have been disconnected. - - - - - Initializes a new instance of the class. - - Reason to disconnection. - - - - Gets reason to why client disconnected. - - - - - - - - - - Initializes a new instance of the class. - - The request. - - - - Gets received request. - - - - - Contains server side HTTP request information. - - - - - Chars used to split an URL path into multiple parts. - - - - - Assign a form. - - - - - - Creates a new object that is a copy of the current instance. - - - - A new object that is a copy of this instance. - - 2 - - - - Decode body into a form. - - A list with form decoders. - If body contents is not valid for the chosen decoder. - If body is still being transferred. - - - - Cookies - - the cookies - - - - Create a response object. - - A new . - - - - Called during parsing of a . - - Name of the header, should not be URL encoded - Value of the header, should not be URL encoded - If a header is incorrect. - - - - Add bytes to the body - - buffer to read bytes from - where to start read - number of bytes to read - Number of bytes actually read (same as length unless we got all body bytes). - If body is not writable - bytes is null. - offset is out of range. - - - - Clear everything in the request - - - - - Gets or sets a value indicating whether this is secure. - - - - - Path and query (will be merged with the host header) and put in Uri - - - - - - Gets whether the body is complete. - - - - - Gets kind of types accepted by the client. - - - - - Gets or sets body stream. - - - - - Gets or sets kind of connection used for the session. - - - - - Gets or sets number of bytes in the body. - - - - - Gets headers sent by the client. - - - - - Gets or sets version of HTTP protocol that's used. - - - Probably or . - - - - - - Gets or sets requested method. - - - - Will always be in upper case. - - - - - - Gets variables sent in the query string - - - - - Gets or sets requested URI. - - - - - Uri absolute path splitted into parts. - - - // uri is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny - - - If you're using controllers than the first part is controller name, - the second part is method name and the third part is Id property. - - - - - - Gets parameter from or . - - - - - Gets form parameters. - - - - - Gets whether the request was made by Ajax (Asynchronous JavaScript) - - - - - Gets cookies that was sent with the request. - - - - - represents a HTTP input item. Each item can have multiple sub items, a sub item - is made in a HTML form by using square brackets - - - // becomes: - Console.WriteLine("Value: {0}", form["user"]["FirstName"].Value); - - - All names in a form SHOULD be in lowercase. - - - - Representation of a non-initialized . - - - - Initializes an input item setting its name/identifier and value - - Parameter name/id - Parameter value - - - Creates a deep copy of the item specified - The item to copy - The function makes a deep copy of quite a lot which can be slow - - - - Add another value to this item - - Value to add. - Cannot add stuff to . - - - - checks if a sub-item exists (and has a value). - - name in lower case - true if the sub-item exists and has a value; otherwise false. - - - Returns a formatted representation of the instance with the values of all contained parameters - - - - Outputs the string in a formatted manner - - A prefix to append, used internally - produce a query string - - - - Add a sub item. - - Can contain array formatting, the item is then parsed and added in multiple levels - Value to add. - Argument is null. - Cannot add stuff to . - - - - Returns an enumerator that iterates through the collection. - - - - A that can be used to iterate through the collection. - - 1 - - - - Returns an enumerator that iterates through a collection. - - - - An object that can be used to iterate through the collection. - - 2 - - - - Outputs the string in a formatted manner - - A prefix to append, used internally - - - - - Number of values - - - - - Get a sub item - - name in lower case. - if no item was found. - - - - Name of item (in lower case). - - - - - Returns the first value, or null if no value exist. - - - - - Returns the last value, or null if no value exist. - - - - - Returns the list with values. - - - - - - - name in lower case - - - - - Generic helper functions for HTTP - - - - - Version string for HTTP v1.0 - - - - - Version string for HTTP v1.1 - - - - - An empty URI - - - - - Parses a query string. - - Query string (URI encoded) - A object if successful; otherwise - queryString is null. - If string cannot be parsed. - - - - Used when the request line have been successfully parsed. - - - - - Initializes a new instance of the class. - - The HTTP method. - The URI path. - The HTTP version. - - - - Initializes a new instance of the class. - - - - - Gets or sets http method. - - - Should be one of the methods declared in . - - - - - Gets or sets the version of the HTTP protocol that the client want to use. - - - - - Gets or sets requested URI path. - - - - - Contains all HTTP Methods (according to the HTTP 1.1 specification) - - See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - - - - - - The DELETE method requests that the origin server delete the resource identified by the Request-URI. - - - - This method MAY be overridden by human intervention (or other means) on the origin server. - The client cannot be guaranteed that the operation has been carried out, even if the status code - returned from the origin server indicates that the action has been completed successfully. - - - However, the server SHOULD NOT indicate success unless, at the time the response is given, - it intends to delete the resource or move it to an inaccessible location. - - - A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, - 202 (Accepted) if the action has not yet been enacted, - or 204 (No Content) if the action has been enacted but the response does not include an entity. - - - If the request passes through a cache and the Request-URI identifies one or more currently cached entities, - those entries SHOULD be treated as stale. Responses to this method are not cacheable. - - - - - - The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. - - - - If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the - entity in the response and not the source text of the process, unless that text happens to be the output of the process. - - - The semantics of the GET method change to a "conditional GET" if the request message includes an - If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. - A conditional GET method requests that the entity be transferred only under the circumstances described - by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network - usage by allowing cached entities to be refreshed without requiring multiple requests or transferring - data already held by the client. - - - - - - The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. - - - The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the - information sent in response to a GET request. This method can be used for obtaining meta information about - the entity implied by the request without transferring the entity-body itself. - - This method is often used for testing hypertext links for validity, accessibility, and recent modification. - - - - - The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. - - - This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. - - - - - The POST method is used to request that the origin server accept the entity enclosed - in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. - - - POST is designed to allow a uniform method to cover the following functions: - - - Annotation of existing resources; - - Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; - - Providing a block of data, such as the result of submitting a form, to a data-handling process; - - Extending a database through an append operation. - - - - If a resource has been created on the origin server, the response SHOULD be 201 (Created) and - contain an entity which describes the status of the request and refers to the new resource, and a - Location header (see section 14.30). - - - The action performed by the POST method might not result in a resource that can be identified by a URI. - In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on - whether or not the response includes an entity that describes the result. - - Responses to this method are not cacheable, unless the response includes appropriate Cache-Control - or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent - to retrieve a cacheable resource. - - - - - - The PUT method requests that the enclosed entity be stored under the supplied Request-URI. - - - - - If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a - modified version of the one residing on the origin server. - - If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new - resource by the requesting user agent, the origin server can create the resource with that URI. - - If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. - - If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to - indicate successful completion of the request. - - If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be - given that reflects the nature of the problem. - - - - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not - understand or implement and MUST return a 501 (Not Implemented) response in such cases. - - - - - - The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - - - - - Contains all HTTP Methods (according to the HTTP 1.1 specification) - - See: http://www.w3.org/Protocols/rfc2616/rfc2616-sec9.html - - - - - - The DELETE method requests that the origin server delete the resource identified by the Request-URI. - - - - This method MAY be overridden by human intervention (or other means) on the origin server. - The client cannot be guaranteed that the operation has been carried out, even if the status code - returned from the origin server indicates that the action has been completed successfully. - - - However, the server SHOULD NOT indicate success unless, at the time the response is given, - it intends to delete the resource or move it to an inaccessible location. - - - A successful response SHOULD be 200 (OK) if the response includes an entity describing the status, - 202 (Accepted) if the action has not yet been enacted, - or 204 (No Content) if the action has been enacted but the response does not include an entity. - - - If the request passes through a cache and the Request-URI identifies one or more currently cached entities, - those entries SHOULD be treated as stale. Responses to this method are not cacheable. - - - - - - The GET method means retrieve whatever information (in the form of an entity) is identified by the Request-URI. - - - - If the Request-URI refers to a data-producing process, it is the produced data which shall be returned as the - entity in the response and not the source text of the process, unless that text happens to be the output of the process. - - - The semantics of the GET method change to a "conditional GET" if the request message includes an - If-Modified-Since, If-Unmodified-Since, If-Match, If-None-Match, or If-Range header field. - A conditional GET method requests that the entity be transferred only under the circumstances described - by the conditional header field(s). The conditional GET method is intended to reduce unnecessary network - usage by allowing cached entities to be refreshed without requiring multiple requests or transferring - data already held by the client. - - - - - - The HEAD method is identical to GET except that the server MUST NOT return a message-body in the response. - - - The meta information contained in the HTTP headers in response to a HEAD request SHOULD be identical to the - information sent in response to a GET request. This method can be used for obtaining meta information about - the entity implied by the request without transferring the entity-body itself. - - This method is often used for testing hypertext links for validity, accessibility, and recent modification. - - - - - The OPTIONS method represents a request for information about the communication options available on the request/response chain identified by the Request-URI. - - - This method allows the client to determine the options and/or requirements associated with a resource, or the capabilities of a server, without implying a resource action or initiating a resource retrieval. - - - - - The POST method is used to request that the origin server accept the entity enclosed - in the request as a new subordinate of the resource identified by the Request-URI in the Request-Line. - - - POST is designed to allow a uniform method to cover the following functions: - - - Annotation of existing resources; - - Posting a message to a bulletin board, newsgroup, mailing list, or similar group of articles; - - Providing a block of data, such as the result of submitting a form, to a data-handling process; - - Extending a database through an append operation. - - - - If a resource has been created on the origin server, the response SHOULD be 201 (Created) and - contain an entity which describes the status of the request and refers to the new resource, and a - Location header (see section 14.30). - - - The action performed by the POST method might not result in a resource that can be identified by a URI. - In this case, either 200 (OK) or 204 (No Content) is the appropriate response status, depending on - whether or not the response includes an entity that describes the result. - - Responses to this method are not cacheable, unless the response includes appropriate Cache-Control - or Expires header fields. However, the 303 (See Other) response can be used to direct the user agent - to retrieve a cacheable resource. - - - - - - The PUT method requests that the enclosed entity be stored under the supplied Request-URI. - - - - - If the Request-URI refers to an already existing resource, the enclosed entity SHOULD be considered as a - modified version of the one residing on the origin server. - - If the Request-URI does not point to an existing resource, and that URI is capable of being defined as a new - resource by the requesting user agent, the origin server can create the resource with that URI. - - If a new resource is created, the origin server MUST inform the user agent via the 201 (Created) response. - - If an existing resource is modified, either the 200 (OK) or 204 (No Content) response codes SHOULD be sent to - indicate successful completion of the request. - - If the resource could not be created or modified with the Request-URI, an appropriate error response SHOULD be - given that reflects the nature of the problem. - - - - The recipient of the entity MUST NOT ignore any Content-* (e.g. Content-Range) headers that it does not - understand or implement and MUST return a 501 (Not Implemented) response in such cases. - - - - - - The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - - - - - Serves files that are stored in embedded resources. - - - - - Initializes a new instance of the class. - Runs to make sure the basic mime types are available, they can be cleared later - through the use of if desired. - - - - - Initializes a new instance of the class. - Runs to make sure the basic mime types are available, they can be cleared later - through the use of if desired. - - The log writer to use when logging events - - - - Mimtypes that this class can handle per default - - - - - Loads resources from a namespace in the given assembly to an uri - - The uri to map the resources to - The assembly in which the resources reside - The namespace from which to load the resources - - resourceLoader.LoadResources("/user/", typeof(User).Assembly, "MyLib.Models.User.Views"); - - will make ie the resource MyLib.Models.User.Views.stylesheet.css accessible via /user/stylesheet.css - - The amount of loaded files, giving you the possibility of making sure the resources needed gets loaded - - - - Returns true if the module can handle the request - - - - - Method that process the url - - Information sent by the browser about the request - Information that is being sent back to the client. - Session used to - true if this module handled the request. - - - - List with all mime-type that are allowed. - - All other mime types will result in a Forbidden http status code. -