From 1065a4c1e4f7ee4ba9122b6fefcca460545d944d Mon Sep 17 00:00:00 2001 From: Diva Canto Date: Thu, 23 Jun 2016 07:55:50 -0700 Subject: [PATCH] Replace the http server dll with the right pair dll + xml --- bin/HttpServer_OpenSim.dll | Bin 131072 -> 117760 bytes bin/HttpServer_OpenSim.xml | 8748 ++++++++++++++++++------------------ 2 files changed, 4374 insertions(+), 4374 deletions(-) diff --git a/bin/HttpServer_OpenSim.dll b/bin/HttpServer_OpenSim.dll index 405a6e11bb2618c527f7ef4e35a05c94cce90498..7da219b1c83492a988d584f2cc276ddf6582902a 100755 GIT binary patch literal 117760 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≦AhLi{joYhwHnYm0HuR{N}`lWdL-)~^WG(9R=%aE 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 literal 131072 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 diff --git a/bin/HttpServer_OpenSim.xml b/bin/HttpServer_OpenSim.xml index 61c3ad8b4e..7b6912ec5a 100644 --- a/bin/HttpServer_OpenSim.xml +++ b/bin/HttpServer_OpenSim.xml @@ -4,562 +4,522 @@ HttpServer_OpenSim - + - 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. + 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. - 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. + Use to specify that the token is a HA1 token. (MD5 generated + string from realm, user name and password); Md5String(userName + ":" + realm + ":" + password); - + - Gets or sets maximum number of requests queuing to be handled. + 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 + + + + Authentication modules are used to implement different + kind of HTTP 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. + + + + name used in HTTP request. + + + + + Tag used for 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 + + + + 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. + + + + + Implements HTTP Digest authentication. It's more secure than Basic auth since password is + encrypted with a "key" from the server. - - 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. - + Keep in mind that the password is encrypted with MD5. Use a combination of SSL and digest auth to be secure. - + - Realms are used during HTTP authentication. - Default realm is same as server name. + 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 - + - 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. + name used in http request. - + - 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. + An authentication response have been received from the web browser. + Check if it's correct - - 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. - - - - - 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. - - - - Contains some kind of input from the browser/client. - can be QueryString, form data or any other request body content. - - - - - Base class for request data containers - - - - - Adds a parameter mapped to the presented name - - The name to map the parameter to - The parameter value - - - - Returns true if the container contains the requested parameter - - Parameter id - True if parameter exists - - - - Returns a request parameter - - The name associated with the parameter - - - - Representation of a non-initialized class instance - - - Variable telling the class that it is non-initialized - - - - Initializes a new instance of the class. - - form name. - - - - Initializes a new instance of the class. - - form name. - if set to true all changes will be ignored. - this constructor should only be used by Empty - - - Creates a deep copy of the HttpInput class - The object to copy - The function makes a deep copy of quite a lot which can be slow - - - - Add a new element. Form array elements are parsed - and added in a correct hierarchy. - - Name is converted to lower case. - - name is null. - Cannot add stuff to . - - - - Returns true if the class contains a with the corresponding name. - - The field/query string name - True if the value exists - - - - Parses an item and returns it. - This function is primarily used to parse array items as in user[name]. - - - - - - - Outputs the instance representing all its values joined together - - - - Returns all items as an unescaped query string. - - - - - Extracts one parameter from an array - - Containing the string array - All but the first value - - string test1 = ExtractOne("system[user][extension][id]"); - string test2 = ExtractOne(test1); - string test3 = ExtractOne(test2); - // test1 = user[extension][id] - // test2 = extension[id] - // test3 = id - - - - Resets all data contained by class - - - - Returns an enumerator that iterates through the collection. - - + 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 - A that can be used to iterate through the collection. + Authentication object that is stored for the request. A user class or something like that. - 1 + if authenticationHeader is invalid + If any of the paramters is empty or null. - + + + Gets or sets whether the token supplied in is a + HA1 generated string. + + + + + 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. + + + + 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. + + + + 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. + + + + Accepted socket. + + + + + Client should be revoked. + + + + + Client may not be handled. + + + + + 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. + + + + 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. + + + + Get this first content type. + + + + + Fetch a content type + + Part of type ("xml" would return "application/xml") + + All content types are in lower case. + + Returns an enumerator that iterates through a collection. - - An object that can be used to iterate through the collection. + An object that can be used to iterate through the collection. - 2 - + - Form name as lower case + 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. + + + + Timeout Manager. Checks for dead clients. Clients with open connections that are not doing anything. Closes sessions opened with keepalive. - + - Get a form item. + Use a Thread or a Timer to monitor the ugly - - Returns if item was not found. + + + + Causes the watcher to immediately check the connections. + + + + + Environment.TickCount is an int but it counts all 32 bits so it goes positive + and negative every 24.9 days. This trims down TickCount so it doesn't wrap + for the callers. + This trims it to a 12 day interval so don't let your frame time get too long. + + + + + + Environment.TickCount is an int but it counts all 32 bits so it goes positive + and negative every 24.9 days. Subtracts the passed value (previously fetched by + 'EnvironmentTickCount()') and accounts for any wrapping. + + + + subtraction of passed prevValue from current Environment.TickCount + + + + Environment.TickCount is an int but it counts all 32 bits so it goes positive + and negative every 24.9 days. Subtracts the passed value (previously fetched by + 'EnvironmentTickCount()') and accounts for any wrapping. + + + + subtraction of passed prevValue from current Environment.TickCount + + + + Environment.TickCount is an int but it counts all 32 bits so it goes positive + and negative every 24.9 days. Subtracts the passed value (previously fetched by + 'EnvironmentTickCount()') and accounts for any wrapping. + + subtraction of passed prevValue from current Environment.TickCount + + + + 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. + + + + + 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 + + + + + Create a new bad request exception. + + reason to why the request was bad. + + + + Create a new bad request exception. + + reason to why the request was bad. + inner exception @@ -572,6 +532,12 @@ Text taken from: http://www.submissionchamber.com/help-guides/error-codes.php + + + Initializes a new instance of the class. + + error message + All HTTP based exceptions will derive this class. @@ -597,306 +563,136 @@ status code to use in the response. - + - Initializes a new instance of the class. - - error message - - - - 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 + The server encountered an unexpected condition which prevented it from fulfilling the request. - + - 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. + Initializes a new instance of the class. - + - Returns an enumerator that iterates through the collection. + Initializes a new instance of the class. + error message. + + + + Initializes a new instance of the class. + + error message. + inner exception. + + + + 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 + + + + 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. - - 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. + 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) - + - Gets the cookie of a given identifier (null if not existing). + 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. + + + + This provider is used to let us implement any type of form decoding we want without + having to rewrite anything else in the server. - + - Contains a connection to a browser/client. + + 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. - + - 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. + Add a decoder. + - + - send a whole buffer + Number of added decoders. - buffer to send - - + - Send data using the stream + Use with care. - Contains data to send - Start position in buffer - number of bytes to send - + + + + Decoder used for unknown content types. + + + + Represents a field in a multipart form + + + + + + - - - - 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. - - - - - 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 - - - - 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 - - - - - 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. - + @@ -920,149 +716,6 @@ 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 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 - @@ -1099,978 +752,71 @@ 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 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 + Can handle application/x-www-form-urlencoded - + - Create a new bad request exception. - reason to why the request was bad. - - - - Create a new bad request exception. - - reason to why the request was bad. - inner exception - - - - Cookies that should be set. - - - - - Adds a cookie in the collection. - - cookie to add - cookie is null - - - - Copy a request cookie - - - When the cookie should expire - - - - Gets a collection enumerator on the cookie list. - - collection enumerator - - - - Remove all cookies - - - - - Returns an enumerator that iterates through the collection. - - + Stream containing the content + Content type (with any additional info like boundry). Content type is always supplied in lower case + Stream encoding - A that can be used to iterate through the collection. + A HTTP form, or null if content could not be parsed. - 1 + If contents in the stream is not valid input data. - + - Gets the count of cookies in the collection. + 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 - + - Gets the cookie of a given identifier (null if not existing). - - - - - cookie being sent back to the browser. - - - - - - 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. - - - - - 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. - - - - - 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 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 . - - - - - 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. - - - - - 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. - - - - - Parses a HTTP request directly from a stream - - - - - Event driven parser used to parse incoming HTTP requests. - - - The parser supports partial messages and keeps the states between - each parsed buffer. It's therefore important that the parser gets - ed if a client disconnects. - - - - - Parse partial or complete message. - - buffer containing incoming bytes - where in buffer that parsing should start - number of bytes to parse - Unparsed bytes left in buffer. - BadRequestException. - - - - Clear parser state. - - - - - Current state in parser. - - - - - A request have been successfully parsed. - - - - - More body bytes have been received. - - - - - Request line have been received. - - - - - A header have been received. - - - - - Gets or sets the log writer. - - - - - Create a new request parser - - delegate receiving log entries. - - - - Add a number of bytes to the body - - buffer containing more body bytes. - starting offset in buffer - number of bytes, from offset, to read. - offset to continue from. - - - - Remove all state information for the request. - - - - - Parse request line - - - If line is incorrect - Expects the following format: "Method SP Request-URI SP HTTP-Version CRLF" - - - - We've parsed a new header. - - Name in lower case - Value, unmodified. - If content length cannot be parsed. - - - - Parse a message - - bytes to parse. - where in buffer that parsing should start - number of bytes to parse, starting on . - offset (where to start parsing next). - BadRequestException. - - - - Gets or sets the log writer. - - - - - Current state in parser. - - - - - A request have been successfully parsed. - - - - - More body bytes have been received. - - - - - Request line have been received. - - - - - A header have been received. - - - - - A thread-safe lockless queue that supports multiple readers and - multiple writers - - - - Queue head - - - Queue tail - - - Queue item count - - - - Constructor - - - - - Enqueue an item - - Item to enqeue - - - - Try to dequeue an item - - Dequeued item if the dequeue was successful - True if an item was successfully deqeued, otherwise false - - - Gets the current number of items in the queue. Since this - is a lockless collection this value should be treated as a close - estimate - - - - Provides a node container for data in a singly linked list - - - - Pointer to the next node in list - - - The data contained by the node - - - - Constructor - - - - - Constructor - - - - - 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. + This decoder converts XML documents to form items. + Each element becomes a subitem in the form, and each attribute becomes an item. - // URI is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny + // xml: somethingdata + // result: + // form["hello"].Value = "something" + // form["hello"]["id"].Value = 1 + // form["hello"]["world]["id"].Value = 1 + // form["hello"]["world"].Value = "data" - 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. + The original xml document is stored in form["__xml__"].Value. - + - 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 + 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. + - + - Ajax requests that updates an element with - the fetched content + Recursive function that will go through an xml element and store it's content + to the form item. - 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"); - - + (parent) Item in form that content should be added to. + Node that should be parsed. - + - A link that pop ups a Dialog (overlay div) + Checks if the decoder can handle the mime type - 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);"); - - + 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 @@ -2290,209 +1036,1185 @@ - + - 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. + Delegate used by to populate select options. - Class that the exception was thrown in. - Exception - - Server will throw a InternalServerException in release version if you dont - handle this delegate. - + 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; + } /// - + - 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. - - - - - Authentication modules are used to implement different - kind of HTTP authentication. + PrototypeJS implementation of the javascript functions. - + - Tag used for authentication. + 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>"; + + - + - Initializes a new instance of the class. + Determins if a list of strings contains a specific value - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). + options to check in + value to find + true if value was found + case insensitive - + - Initializes a new instance of the class. + Ajax requests that updates an element with + the fetched content - Delegate used to provide information used during authentication. + 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"); + + - + - Create a response that can be sent in the WWW-Authenticate header. + A link that pop ups a Dialog (overlay div) - 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. - - - - 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 + URL to contents of dialog + link title + name, value, name, value - Authentication object that is stored for the request. A user class or something like that. + A "a"-tag that popups a dialog when clicked - if authenticationHeader is invalid - If any of the paramters is empty or null. + 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!');"); + - + - Encrypts parameters into a Digest string + create a modal dialog (usually using DIVs) - 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 + 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);"); + + + + + + Will contain helper functions for javascript. + + + + + 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>"; + + + + + + 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"); + + + + + + Opens contents in a dialog window. + + url to contents of dialog + link title + name, value, name, value, all parameter names should end with colon. + + + + Close a javascript dialog window/div. + + javascript for closing a dialog. + + + + + 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 + + + + 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 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 + + + + Retrieves a stream to the resource + + Null if the resource couldn't be located somehow + + + 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 + + + + 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) + + + + + + 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 + + + + 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? + + + + This context have been cleaned, which means that it can be reused. + + + + + Context have been started (a new client have connected) + + + + + 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 + + - 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. + Overload to specify own type. - 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. + + Must be specified before the context is being used. + - + - Decodes authorization header value + Start reading content. - 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. + + Make sure to call base.Start() if you override this method. + - + - Gets the current nonce. + Clean up context. - + + Make sure to call base.Cleanup() if you override the method. + - + - 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. + Using SSL or other encryption method. - + - Gets or sets whether the token supplied in is a - HA1 generated string. + 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. + + + + + 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 + + + + + + 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. + + + + + Used to create and reuse contexts. + + + + + Initializes a new instance of the class. + + The writer. + Amount of bytes to read from the incoming socket stream. + Used to create a request parser. + + + + True if detailed trace logs should be written. + + + + + Create a new context. + + true if socket is running HTTPS. + Client that connected + Network/SSL stream. + A context. + + + + Create a new context. + + true if HTTPS is used. + Remote client + Network stream, uses . + A new context (always). + + + + Create a secure . + + Client socket (accepted by the ). + HTTPS certificate to use. + Kind of HTTPS protocol. Usually TLS or SSL. + + A created . + + + + + A request have been received from one of the contexts. + + + + + Creates a that handles a connected client. + + Client socket (accepted by the ). + + A creates . + + + + + Server is shutting down so shut down the factory + + + + + Custom network stream to mark sockets as reusable when disposing the stream. + + + + + Creates a new instance of the class for the specified . + + + The that the will use to send and receive data. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Initializes a new instance of the class for the specified with the specified ownership. + + + The that the will use to send and receive data. + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + the value of the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specify the type of access given to the over the provided . + + + The parameter is null. + + + The parameter is not connected. + -or- + the property of the parameter is not . + -or- + the parameter is in a nonblocking state. + + + + + Creates a new instance of the class for the specified with the specified access rights and the specified ownership. + + + The that the will use to send and receive data. + + + A bitwise combination of the values that specifies the type of access given to the over the provided . + + + Set to true to indicate that the will take ownership of the ; otherwise, false. + + + The parameter is null. + + + The parameter is not connected. + -or- + The property of the parameter is not . + -or- + The parameter is in a nonblocking state. + + + + + Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. + + + + + Releases the unmanaged resources used by the and optionally releases the managed resources. + + true to release both managed and unmanaged resources; false to release only unmanaged resources. + + + + Used to create es. + + + + + Creates a that handles a connected client. + + Client socket (accepted by the ). + A creates . + + + + Create a secure . + + Client socket (accepted by the ). + HTTPS certificate to use. + Kind of HTTPS protocol. Usually TLS or SSL. + A created . + + + + A request have been received from one of the contexts. + + + + + Server is shutting down so shut down the factory + + + + + 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 + + + + The name/id of the file + + + + + The full file path + + + + + The name of the uploaded file + + + + + The type of file + + + + + Deletes the temporary file + + True if manual dispose + + + + Disposing interface, cleans up managed resources (the temporary file) and suppresses finalization + + + + Container for posted form data + + + Instance to help mark a non-initialized form + + + Initializes a form container with the specified name + + + + Makes a deep copy of the input + + The input to copy + + + + Adds a file to the collection of posted files + + The file to add + If the file is already added + If file is null + If the instance is HttpForm.EmptyForm which cannot be modified + + + + Checks if the form contains a specified file + + Field name of the file parameter + True if the file exists + If the instance is HttpForm.EmptyForm which cannot be modified + + + + Retrieves a file held by by the form + + The identifier of the file + The requested file or null if the file was not found + If name is null or empty + If the instance is HttpForm.EmptyForm which cannot be modified + + + + Retrieves the number of files added to the + + 0 if no files are added + + + Disposes all held HttpFile's and resets values + Generic helper functions for HTTP @@ -2522,64 +2244,2195 @@ queryString is null. If string cannot be parsed. - + - Delegate used to let authentication modules authenticate the user name and password. + Contains some kind of input from the browser/client. + can be QueryString, form data or any other request body content. + + + + Representation of a non-initialized class instance + + + Variable telling the class that it is non-initialized + + + + Initializes a new instance of the class. + + form name. + + + + Initializes a new instance of the class. + + form name. + if set to true all changes will be ignored. + this constructor should only be used by Empty + + + Creates a deep copy of the HttpInput class + The object to copy + The function makes a deep copy of quite a lot which can be slow + + + + Form name as lower case + + + + + Add a new element. Form array elements are parsed + and added in a correct hierarchy. + + Name is converted to lower case. + + name is null. + Cannot add stuff to . + + + + Get a form item. + + + Returns if item was not found. + + + + Returns true if the class contains a with the corresponding name. + + The field/query string name + True if the value exists + + + + Parses an item and returns it. + This function is primarily used to parse array items as in user[name]. + + + + + + + Outputs the instance representing all its values joined together + + + + Returns all items as an unescaped query string. + + + + + Extracts one parameter from an array + + Containing the string array + All but the first value + + string test1 = ExtractOne("system[user][extension][id]"); + string test2 = ExtractOne(test1); + string test3 = ExtractOne(test2); + // test1 = user[extension][id] + // test2 = extension[id] + // test3 = id + + + + Resets all data contained by class + + + + 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 + + + + Base class for request data containers + + + + + Adds a parameter mapped to the presented name + + The name to map the parameter to + The parameter value + + + + Returns a request parameter + + The name associated with the parameter + + + + + Returns true if the container contains the requested parameter + + Parameter id + True if parameter exists + + + + 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 + + + + 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. + + + + + 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 + + + + + + name in lower case + + + + + 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 + + + + + New implementation of the HTTP listener. + + + Use the Create methods to create a default listener. + + + + + A client have been accepted, but not handled, by the 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. + + + + + 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. + + + + 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. + + + + 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 + + + + + + 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 . + + + + + 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 + + + + 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[]{ "\\", "..", ":" }; + + + + + 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) + + + + + + + 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. + + + + + Used to inform http server that + + + + + Eventarguments used when an exception is thrown by a module + + the exception + + + + Exception thrown in a module + + + + + 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 + + + + List with all mime-type that are allowed. + + All other mime types will result in a Forbidden http status code. + + + + 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. + + + + 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 + + + + 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. + + + + + Name of site. + + + + + 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 + + + + 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. + + + + Fetch an item from the form or querystring (in that order). + + + Item if found; otherwise HttpInputItem.EmptyLanguageNode + + + + 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 + + + + Contains server side HTTP request information. + + + + + Chars used to split an URL path into multiple parts. + + + + + Gets or sets a value indicating whether this is secure. + + + + + Path and query (will be merged with the host header) and put in Uri + + + + + + Assign a form. + + + + + + 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. + + + + + 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 + + + + + Response that is sent back to the web browser / client. - 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); + 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 slightly 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 and before doing so. + + + + + // Example using response body. + class MyModule : HttpModule + { + public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session) + { + StreamWriter writer = new StreamWriter(response.Body); + writer.WriteLine("Hello dear World!"); + writer.Flush(); + + // return true to tell webserver that we've handled the url + return true; + } + } + + + todo: add two examples, using SendHeaders/SendBody and just the Body stream. + + + + Initializes a new instance of the class. + + Client that send the . + Contains information of what the client want to receive. + cannot be empty. + + + + Initializes a new instance of the class. + + Client that send the . + Version of HTTP protocol that the client uses. + Type of HTTP connection used. + + + + The body stream is used to cache the body contents + before sending everything to the client. It's the simplest + way to serve documents. + + + + + 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. + + + + + Defines the version of the HTTP Response for applications where it's required + for this to be forced. + + + + + 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 . + + + + Status code that is sent to the client. + + Default is + + + + 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 type 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. + + + + + 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 and sent the headers first. + + + If headers have not been sent. + + offset 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 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. + + + + + 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); + + + + + + + + + Server that is handling the current request. + + + Will be set as soon as a request arrives to the object. + + + + + 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. + + + + + + + + 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. - + - Let's you decide on a system level if authentication is required. + Gets or sets maximum number of requests queuing to be handled. - HTTP request from client - true if user should be authenticated. - throw if no more attempts are allowed. - If no more attempts are allowed + + + 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. + + - + - Arguments used when more body bytes have come. + 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 - + - Initializes a new instance of the class. + write an entry to the log file - buffer that contains the received bytes. - offset in buffer where to start processing. - number of bytes from that should be parsed. + importance of the message + log message - + - Initializes a new instance of the class. + write an entry to the log file + + object that wrote the message + importance of the message + log message + + + + Realms are used during HTTP authentication. + Default realm is same as server name. - + - Gets or sets buffer that contains the received bytes. + 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. + + + + + Inversion of control interface. - + - Gets or sets number of bytes from that should be parsed. + 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 a connection to a browser/client. - + - Gets or sets offset in buffer where to start processing. + Using SSL or other encryption method. + + + Using SSL or other encryption method. + + + + + 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 + + + + + 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. + + + + + Gets reason to why client disconnected. + + + + + Initializes a new instance of the class. + + Reason to disconnection. + + + + + + + + + Gets received request. + + + + + Initializes a new instance of the class. + + The request. + + + + 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. + + + + + Contains server side HTTP request information. + + + + + 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. + + + + + 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 . + + + + Event driven parser used to parse incoming HTTP requests. + + + The parser supports partial messages and keeps the states between + each parsed buffer. It's therefore important that the parser gets + ed if a client disconnects. + + + + + Current state in parser. + + + + + Parse partial or complete message. + + buffer containing incoming bytes + where in buffer that parsing should start + number of bytes to parse + Unparsed bytes left in buffer. + BadRequestException. + + + + A request have been successfully parsed. + + + + + More body bytes have been received. + + + + + Request line have been received. + + + + + A header have been received. + + + + + Clear parser state. + + + + + Gets or sets the log writer. + + + + + 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 + + + + + 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) + { + + } + + + + + 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. + + + + + 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. + + + + + Type of HTTP connection + + + + + Connection is closed after each request-response + + + + + Connection is kept alive for X seconds (unless another request have been made) + + + + + Priority for log entries + + + + + + Very detailed logs to be able to follow the flow of the program. + + + + + Logs to help debug errors in the application + + + + + Information to be able to keep track of state changes etc. + + + + + Something did not go as we expected, but it's no problem. + + + + + Something that should not fail failed, but we can still keep + on going. + + + + + Something failed, and we cannot handle it properly. + + + + + Interface used to write to log files. + + + + + Write an entry to the log file. + + object that is writing to the log + importance of the log message + the message + + + + This class writes to the console. It colors the output depending on the logprio and includes a 3-level stacktrace (in debug mode) + + + + + + The actual instance of this class. + + + + + Logwriters the specified source. + + object that wrote the logentry. + Importance of the log message + The message. + + + + Get color for the specified logprio + + prio for the log entry + A for the prio + + + + Default log writer, writes everything to null (nowhere). + + + + + + The logging instance. + + + + + Writes everything to null + + object that wrote the log entry. + Importance of the log message + The message. + + + + A thread-safe lockless queue that supports multiple readers and + multiple writers + + + + + Provides a node container for data in a singly linked list + + + + Pointer to the next node in list + + + The data contained by the node + + + + Constructor + + + + + Constructor + + + + Queue head + + + Queue tail + + + Queue item count + + + Gets the current number of items in the queue. Since this + is a lockless collection this value should be treated as a close + estimate + + + + Constructor + + + + + Enqueue an item + + Item to enqeue + + + + Try to dequeue an item + + Dequeued item if the dequeue was successful + True if an item was successfully deqeued, otherwise false + Contains all HTTP Methods (according to the HTTP 1.1 specification) @@ -2858,888 +4711,147 @@ The TRACE method is used to invoke a remote, application-layer loop- back of the request message. - + - Used to create and reuse contexts. + Arguments used when more body bytes have come. - + - Used to create es. + 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. - + - Creates a that handles a connected client. + Initializes a new instance of the class. - Client socket (accepted by the ). - A creates . - + - Create a secure . + Gets or sets buffer that contains the received bytes. - Client socket (accepted by the ). - HTTPS certificate to use. - Kind of HTTPS protocol. Usually TLS or SSL. - A created . - + - Server is shutting down so shut down the factory + Gets or sets number of bytes from that should be parsed. - + - A request have been received from one of the contexts. + Gets or sets offset in buffer where to start processing. - + - Initializes a new instance of the class. + Event arguments used when a new header have been parsed. - The writer. - Amount of bytes to read from the incoming socket stream. - Used to create a request parser. - + - Create a new context. + Initializes a new instance of the class. - true if socket is running HTTPS. - Client that connected - Network/SSL stream. - A context. + Name of header. + Header value. - + - Create a new context. + Initializes a new instance of the class. - true if HTTPS is used. - Remote client - Network stream, uses . - A new context (always). - + - Create a secure . + Gets or sets header name. - Client socket (accepted by the ). - HTTPS certificate to use. - Kind of HTTPS protocol. Usually TLS or SSL. - - A created . - - + - Creates a that handles a connected client. + Gets or sets header value. - Client socket (accepted by the ). - - A creates . - - + - Server is shutting down so shut down the factory + Parses a HTTP request directly from a stream - + - True if detailed trace logs should be written. + Create a new request parser + delegate receiving log entries. - + - A request have been received from one of the contexts. + Add a number of bytes to the body + buffer containing more body bytes. + starting offset in buffer + number of bytes, from offset, to read. + offset to continue from. - + - Custom network stream to mark sockets as reusable when disposing the stream. + Remove all state information for the request. - + - Creates a new instance of the class for the specified . + Gets or sets the log writer. - - The that the will use to send and receive data. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - + - Initializes a new instance of the class for the specified with the specified ownership. + Parse request line - - The that the will use to send and receive data. - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - the value of the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - + + If line is incorrect + Expects the following format: "Method SP Request-URI SP HTTP-Version CRLF" - + - Creates a new instance of the class for the specified with the specified access rights. + We've parsed a new header. - - The that the will use to send and receive data. - - - A bitwise combination of the values that specify the type of access given to the over the provided . - - - The parameter is null. - - - The parameter is not connected. - -or- - the property of the parameter is not . - -or- - the parameter is in a nonblocking state. - + Name in lower case + Value, unmodified. + If content length cannot be parsed. - + - Creates a new instance of the class for the specified with the specified access rights and the specified ownership. + Current state in parser. - - The that the will use to send and receive data. - - - A bitwise combination of the values that specifies the type of access given to the over the provided . - - - Set to true to indicate that the will take ownership of the ; otherwise, false. - - - The parameter is null. - - - The parameter is not connected. - -or- - The property of the parameter is not . - -or- - The parameter is in a nonblocking state. - - + - Closes the current stream and releases any resources (such as sockets and file handles) associated with the current stream. + Parse a message + bytes to parse. + where in buffer that parsing should start + number of bytes to parse, starting on . + offset (where to start parsing next). + BadRequestException. - + - Releases the unmanaged resources used by the and optionally releases the managed resources. + A request have been successfully parsed. - true to release both managed and unmanaged resources; false to release only unmanaged resources. - + - Invoked when a client have been accepted by the + More body bytes have been received. - - Can be used to revoke incoming connections - - + - Initializes a new instance of the class. + Request line have been received. - The socket. - + - Client may not be handled. + A header have been received. - - - Accepted socket. - - - - - Client should be revoked. - - - - - 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 - - - - - - - A unique id used by the sessions store to identify the session - - - - Id - - - - - - Remove everything from the session - - - - - Clears the specified expire. - - True if the session is cleared due to expiration - - - - Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - - 2 - - - - Session id - - - - - Should - - Name of the session variable - null if it's not set - - - - when the session was last accessed. - - - Used to determine when the session should be removed. - - - - - Number of values in the session - - - - - Flag to indicate that the session have been changed - and should be saved into the session store. - - - - - Event triggered upon clearing the session - - - - - 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 - - - - 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 - - - - 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. - - - - - 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. - - - - 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) - - - - - 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. - - - - - Used to inform http server that - - - - - Eventarguments used when an exception is thrown by a module - - the exception - - - - Exception thrown in a module - - - - - 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 - - - - 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 - Used when the request line have been successfully parsed. @@ -3776,830 +4888,116 @@ Gets or sets requested URI path. - + - Class that receives Requests from a . + Creates request parsers when needed. - + - Client have been disconnected. + Create a new request parser. - Client that was disconnected. - Reason - + Used when logging should be enabled. + A new request parser. - + - Invoked when a client context have received a new HTTP request + Creates request parsers when needed. - Client that received the request. - Request that was received. - - - Container for posted form data - - - Instance to help mark a non-initialized form - - - Initializes a form container with the specified name - - + - Makes a deep copy of the input + Create a new request parser. - The input to copy + Used when logging should be enabled. + A new request parser. - + - Adds a file to the collection of posted files + cookie sent by the client/browser - The file to add - If the file is already added - If file is null - If the instance is HttpForm.EmptyForm which cannot be modified + - + - Checks if the form contains a specified file + Constructor. - Field name of the file parameter - True if the file exists - If the instance is HttpForm.EmptyForm which cannot be modified + cookie identifier + cookie content + id or content is null + id is empty - + - Retrieves a file held by by the form + Gets the cookie HTML representation. - The identifier of the file - The requested file or null if the file was not found - If name is null or empty - If the instance is HttpForm.EmptyForm which cannot be modified + cookie string - - Disposes all held HttpFile's and resets values - - + - Retrieves the number of files added to the + Gets the cookie identifier. - 0 if no files are added - + - Contains a connection to a browser/client. + Cookie value. Set to null to remove cookie. - - 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. + 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 - 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. + Let's copy all the cookies. - - Bytes + value from cookie header. - + + Adds a cookie in the collection. + + cookie to add + cookie is null + + + + Gets the count of cookies in the collection. + + + + + Gets the cookie of a given identifier (null if not existing). + + + + + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Remove all cookies. + + + + + Returns an enumerator that iterates through the collection. + - - - - - - - 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. - - - - 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 - - - - - - - - - - - Represents a field in a multipart form - - - - 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. - - - - Priority for log entries - - - - - - Very detailed logs to be able to follow the flow of the program. - - - - - Logs to help debug errors in the application - - - - - Information to be able to keep track of state changes etc. - - - - - Something did not go as we expected, but it's no problem. - - - - - Something that should not fail failed, but we can still keep - on going. - - - - - Something failed, and we cannot handle it properly. - - - - - Interface used to write to log files. - - - - - Write an entry to the log file. - - object that is writing to the log - importance of the log message - the message - - - - This class writes to the console. It colors the output depending on the logprio and includes a 3-level stacktrace (in debug mode) - - - - - - The actual instance of this class. - - - - - Logwriters the specified source. - - object that wrote the logentry. - Importance of the log message - The message. - - - - Get color for the specified logprio - - prio for the log entry - A for the prio - - - - Default log writer, writes everything to null (nowhere). - - - - - - The logging instance. - - - - - Writes everything to null - - object that wrote the log entry. - Importance of the log message - The message. - - - - 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 slightly 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 and before doing so. - - - - - // Example using response body. - class MyModule : HttpModule - { - public override bool Process(IHttpRequest request, IHttpResponse response, IHttpSession session) - { - StreamWriter writer = new StreamWriter(response.Body); - writer.WriteLine("Hello dear World!"); - writer.Flush(); - - // return true to tell webserver that we've handled the url - return true; - } - } - - - todo: add two examples, using SendHeaders/SendBody and just the Body stream. - - - - Initializes a new instance of the class. - - Client that send the . - Contains information of what the client want to receive. - cannot be empty. - - - - Initializes a new instance of the class. - - Client that send the . - Version of HTTP protocol that the client uses. - Type of HTTP connection used. - - - - 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 and sent the headers first. - - - If headers have not been sent. - - offset 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 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. - - - - - 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. - - - - - Defines the version of the HTTP Response for applications where it's required - for this to be forced. - - - - - 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 . - - - - Status code that is sent to the client. - - Default is - - - - 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 type 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. - - - - - 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 - - - - Timeout Manager. Checks for dead clients. Clients with open connections that are not doing anything. Closes sessions opened with keepalive. - - - - - Causes the watcher to immediately check the connections. - - - - - Environment.TickCount is an int but it counts all 32 bits so it goes positive - and negative every 24.9 days. This trims down TickCount so it doesn't wrap - for the callers. - This trims it to a 12 day interval so don't let your frame time get too long. - - - - - - Environment.TickCount is an int but it counts all 32 bits so it goes positive - and negative every 24.9 days. Subtracts the passed value (previously fetched by - 'EnvironmentTickCount()') and accounts for any wrapping. - - - - subtraction of passed prevValue from current Environment.TickCount - - - - Environment.TickCount is an int but it counts all 32 bits so it goes positive - and negative every 24.9 days. Subtracts the passed value (previously fetched by - 'EnvironmentTickCount()') and accounts for any wrapping. - - - - subtraction of passed prevValue from current Environment.TickCount - - - - Environment.TickCount is an int but it counts all 32 bits so it goes positive - and negative every 24.9 days. Subtracts the passed value (previously fetched by - 'EnvironmentTickCount()') and accounts for any wrapping. - - subtraction of passed prevValue from current Environment.TickCount - - - - Use a Thread or a Timer to monitor the ugly - - - - - 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 . - - - - - 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. - - - - Initializes the class setting the expirationtimer to clean the session every minute - - - - - 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. - - - - - 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 - + + A that can be used to iterate through the collection. + + 1 - + - Delegate for when a IHttpSession is cleared + Remove a cookie from the collection. - this is being cleared. - Arguments for the clearing + Name of cookie. @@ -4612,9 +5010,10 @@ Called when a request should be processed. - + - Used to process queued requests. + Used two queue incoming requests to avoid + thread starvation. @@ -4632,10 +5031,9 @@ Specifies how many requests the HTTP server is currently processing. - + - Used two queue incoming requests to avoid - thread starvation. + Used to process queued requests. @@ -4645,243 +5043,183 @@ Context that the request was received from. Request to process. - + - Event arguments used when a new header have been parsed. + 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. - + - Initializes a new instance of the class. - - Name of header. - Header value. - - - - Initializes a new instance of the class. + Cookie is only valid under this path. - + - Gets or sets header name. + Cookies that should be set. - + - Gets or sets header value. + Adds a cookie in the collection. + + cookie to add + cookie is null + + + + Copy a request cookie + + + When the cookie should expire + + + + Gets the count of cookies in the collection. - + - Contains server side HTTP request information. + Gets the cookie of a given identifier (null if not existing). - + - Chars used to split an URL path into multiple parts. + Gets a collection enumerator on the cookie list. + + collection enumerator + + + + Remove all cookies - + - Assign a form. - - - - - - Creates a new object that is a copy of the current instance. + Returns an enumerator that iterates through the collection. - A new object that is a copy of this instance. + A that can be used to iterate through the collection. - 2 + 1 - + - 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 + Rules are used to perform operations before a request is being handled. + Rules can be used to create routing etc. - + - 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. + 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). - Probably or . + returning true means that no modules will get the request. Returning true is typically being done + for redirects. - + If request or response is null. - + - Gets or sets requested method. - - - - Will always be in upper case. - - - - - - Gets variables sent in the query string + redirects from one URL to another. - + - Gets or sets requested URI. - - - - - Uri absolute path splitted into parts. + Initializes a new instance of the class. + Absolute path (no server name) + Absolute path (no server name) - // uri is: http://gauffin.com/code/tiny/ - Console.WriteLine(request.UriParts[0]); // result: code - Console.WriteLine(request.UriParts[1]); // result: tiny + 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")); + + + + + Gets string to match request URI with. + + Is compared to request.Uri.AbsolutePath + + + + Gets where to redirect. + + + + + Gets whether server should redirect client. + - 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. - - - - - 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. + 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. - - If instance cannot be created. - - + - Checks if the specified component interface have been added. + Process the incoming request. - - true if found; otherwise false. - - - - Add a component. - - Type being requested. - Type being created. - Type have already been mapped. + 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. + @@ -4951,624 +5289,286 @@ If request or response is null - + - Container to bind resource names to assemblies + Interface for sessions - + - 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 + Session id - + - Retrieves the full name/path of the assembly + 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. - + - Retrieves the extension of the resource + Number of session variables. - - Returns the Uri without extension - - - Retrieves the full path name to the resource file - - + - 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. + Remove everything from the session - + - Initializes a new instance of the class. + Remove everything from the session - Delegate used to provide information used during authentication. - Delegate used to determine if authentication is required (may be null). + True if the session is cleared due to expiration - + - 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. + Event triggered upon clearing the session - + - Current state in the parsing. + Arguments sent when a is cleared - + - Should parse the request line + 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 - + - Searching for a complete header name + Delegate for when a IHttpSession is cleared + + this is being cleared. + Arguments for the clearing + + + + A session store is used to store and load sessions on a media. + The default implementation () saves/retrieves sessions from memory. - + - Searching for colon after header name (ignoring white spaces) + Load a session from the store + + null if session is not found. - + - Searching for start of header value (ignoring white spaces) + Number of minutes before a session expires. + Default time is 20 minutes. - + - Searching for a complete header value (can span over multiple lines, as long as they are prefixed with one/more whitespaces) + Creates a new http session with a generated id. + A object - + - Adding bytes to body - - - - - Will contain helper functions for javascript. - - - - - 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>"; - - - - - - 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"); - - - - - - Opens contents in a dialog window. - - url to contents of dialog - link title - name, value, name, value, all parameter names should end with colon. - - - - Close a javascript dialog window/div. - - javascript for closing a dialog. - - - - - Lists content type mime types. - - - - - text/plain - - - - - text/haml - - - - - content type for javascript documents = application/javascript + Creates a new http session with a specific id + Id used to identify the new cookie.. + A object. - - 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/ + Id should be generated by the store implementation if it's null or . - + - text/xml + 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 - + - A list of content types + Remove a session + + id of the session. + + + + A session stored in memory. - + - Semicolon separated content types. + A unique id used by the sessions store to identify the session - + - Returns an enumerator that iterates through a collection. + Id - - 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. + Session id - + - Fetch a content type + Should - Part of type ("xml" would return "application/xml") - - All content types are in lower case. + Name of the session variable + null if it's not set - + - Creates request parsers when needed. + when the session was last accessed. + + + Used to determine when the session should be removed. + + + + + Number of values in the session - + - Creates request parsers when needed. + Flag to indicate that the session have been changed + and should be saved into the session store. - + - 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. - - - - 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) + Remove everything from the session - + - Create a new unauhtorized exception. + Clears the specified expire. - + True if the session is cleared due to expiration - + - Create a new unauhtorized exception. + Performs application-defined tasks associated with freeing, releasing, or resetting unmanaged resources. - reason to why the request was unauthorized. - inner exception + 2 - + - Create a new unauhtorized exception. - - reason to why the request was unauthorized. - - - - The purpose of this module is to serve files. + Event triggered upon clearing the session - + - 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 + Session store using memory for each session. - + - Determines if the request should be handled by this module. - Invoked by the + Initializes the class setting the expirationtimer to clean the session every minute - - true if this module should handle it. - - Illegal path - - + - check if source contains any of the chars. + Delegate for the cleanup timer + + + + + Load a session from the store + + + null if session is not found. + + + + Creates a new http session - - - + - Method that process the Uri. + Creates a new http session with a specific id - 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. + Id used to identify the new cookie.. + A object. + + Id should be generated by the store implementation if it's null or . + - + - return a file extension from an absolute Uri path (or plain filename) + Load an existing session. - + - + - List with all mime-type that are allowed. + Save an updated session to the store. - All other mime types will result in a Forbidden http status code. + - + - characters that may not exist in a path. + We use the flyweight pattern which reuses small objects + instead of creating new each time. - - fileMod.ForbiddenChars = new string[]{ "\\", "..", ":" }; - + EmptyLanguageNode (unused) session that should be reused next time Create is called. - + - Webhelper provides helpers for common tasks in HTML. + Remove expired sessions - + - Used to let the website use different javascript libraries. - Default is + Remove a session + id of the session. - + - Creates a link that invokes through ajax. + Number of minutes before a session expires. + Default is 20 minutes. - 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. - - - - - 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; - } ///