From e9ccf855b3340438903169d9517199bec5406222 Mon Sep 17 00:00:00 2001 From: Jocelyn Fiat Date: Thu, 25 Aug 2011 12:33:20 +0200 Subject: [PATCH] Merged REQUEST and ENVIRONMENT into REQUEST renamed ENVIRONMENT_NAMES into META_NAMES better usage of READABLE_STRING_GENERAL, and other strings for the implementation, inheriting from deferred specification (more to come later) --- .../src/hello_routed_world.e | 4 +- .../connectors/nino/src/gw_nino_connector.e | 10 +- library/server/ewsgi/ewsgi-safe.ecf | 1 + .../specification/request/ewsgi_environment.e | 616 ----------------- .../request/ewsgi_environment_names.e | 89 --- .../request/ewsgi_meta_names.e} | 4 +- .../specification/request/ewsgi_request.e | 612 ++++++++++++++++- .../request/{ => obsolete}/ewsgi_cookie.e | 0 .../request/{ => obsolete}/ewsgi_variables.e | 0 .../response/ewsgi_response_buffer.e | 4 +- .../src/application/ewsgi_agent_application.e | 4 +- .../ewsgi/src/application/ewsgi_application.e | 36 +- .../server/ewsgi/src/request/ewsgi_cookie.e | 76 --- .../ewsgi/src/request/ewsgi_environment.e | 617 ------------------ .../src/request/ewsgi_environment_variables.e | 292 --------- ...i_request.e => ewsgi_request_from_table.e} | 602 ++++++++++++----- .../src/request/ewsgi_request_variables.e | 147 ----- .../src/request/ewsgi_uploaded_file_data.e | 103 --- .../ewsgi/src/request/ewsgi_variables.e | 80 --- .../src/response/ewsgi_response_buffer.e | 2 +- .../src/context/request_handler_context.e | 10 +- .../src/context/request_uri_handler_context.e | 2 +- .../request_uri_template_handler_context.e | 4 +- .../router/src/handler/request_handler.e | 10 +- .../router/src/router/request_router.e | 4 +- .../src/router/request_uri_template_router.e | 4 +- .../src/utility/request_format_utility.e | 2 +- 27 files changed, 1055 insertions(+), 2280 deletions(-) delete mode 100644 library/server/ewsgi/specification/request/ewsgi_environment.e delete mode 100644 library/server/ewsgi/specification/request/ewsgi_environment_names.e rename library/server/ewsgi/{src/request/ewsgi_environment_names.e => specification/request/ewsgi_meta_names.e} (95%) rename library/server/ewsgi/specification/request/{ => obsolete}/ewsgi_cookie.e (100%) rename library/server/ewsgi/specification/request/{ => obsolete}/ewsgi_variables.e (100%) delete mode 100644 library/server/ewsgi/src/request/ewsgi_cookie.e delete mode 100644 library/server/ewsgi/src/request/ewsgi_environment.e delete mode 100644 library/server/ewsgi/src/request/ewsgi_environment_variables.e rename library/server/ewsgi/src/request/{ewsgi_request.e => ewsgi_request_from_table.e} (58%) delete mode 100644 library/server/ewsgi/src/request/ewsgi_request_variables.e delete mode 100644 library/server/ewsgi/src/request/ewsgi_uploaded_file_data.e delete mode 100644 library/server/ewsgi/src/request/ewsgi_variables.e diff --git a/examples/hello_routed_world/src/hello_routed_world.e b/examples/hello_routed_world/src/hello_routed_world.e index d065d3a8..227f487f 100644 --- a/examples/hello_routed_world/src/hello_routed_world.e +++ b/examples/hello_routed_world/src/hello_routed_world.e @@ -110,13 +110,13 @@ feature -- Execution res.write_string ("
  • /hello/Joce
  • %N") res.write_string ("%N") - if attached req.environment_variable ("REQUEST_COUNT") as rqc then + if attached req.parameter ("REQUEST_COUNT") as rqc then res.write_string ("request #"+ rqc + "%N") end res.write_string ("%N") end - execute_hello (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER; a_name: detachable STRING_32; ctx: REQUEST_HANDLER_CONTEXT) + execute_hello (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER; a_name: detachable READABLE_STRING_32; ctx: REQUEST_HANDLER_CONTEXT) local l_response_content_type: detachable STRING msg: STRING diff --git a/library/server/ewsgi/connectors/nino/src/gw_nino_connector.e b/library/server/ewsgi/connectors/nino/src/gw_nino_connector.e index 010ba4a2..c91aad22 100644 --- a/library/server/ewsgi/connectors/nino/src/gw_nino_connector.e +++ b/library/server/ewsgi/connectors/nino/src/gw_nino_connector.e @@ -73,11 +73,13 @@ feature -- Server process_request (env: HASH_TABLE [STRING, STRING]; a_headers_text: STRING; a_input: HTTP_INPUT_STREAM; a_output: HTTP_OUTPUT_STREAM) local - gw_env: EWSGI_ENVIRONMENT_VARIABLES + req: EWSGI_REQUEST_FROM_TABLE + res: EWSGI_RESPONSE_BUFFER do - create gw_env.make_with_variables (env) - gw_env.set_variable ("RAW_HEADER_DATA", a_headers_text) - application.process (gw_env, create {GW_NINO_INPUT_STREAM}.make (a_input), create {GW_NINO_OUTPUT_STREAM}.make (a_output)) + create req.make (env, create {GW_NINO_INPUT_STREAM}.make (a_input)) + create res.make (create {GW_NINO_OUTPUT_STREAM}.make (a_output)) + req.set_meta_parameter ("RAW_HEADER_DATA", a_headers_text) + application.execute (req, res) end note diff --git a/library/server/ewsgi/ewsgi-safe.ecf b/library/server/ewsgi/ewsgi-safe.ecf index c8014c95..88fd87fb 100644 --- a/library/server/ewsgi/ewsgi-safe.ecf +++ b/library/server/ewsgi/ewsgi-safe.ecf @@ -15,5 +15,6 @@ + diff --git a/library/server/ewsgi/specification/request/ewsgi_environment.e b/library/server/ewsgi/specification/request/ewsgi_environment.e deleted file mode 100644 index 07f6d11a..00000000 --- a/library/server/ewsgi/specification/request/ewsgi_environment.e +++ /dev/null @@ -1,616 +0,0 @@ -note - description: "[ - - Interface for a request environment - It includes CGI interface and a few extra values that are usually valuable - - See http://www.ietf.org/rfc/rfc3875 - - 2.2. Basic Rules - - The following rules are used throughout this specification to - describe basic parsing constructs. - - alpha = lowalpha | hialpha - lowalpha = a | b | c | d | e | f | g | h | - i | j | k | l | m | n | o | p | - q | r | s | t | u | v | w | x | - y | z - hialpha = A | B | C | D | E | F | G | H | - I | J | K | L | M | N | O | P | - Q | R | S | T | U | V | W | X | - Y | Z - digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | - 8 | 9 - alphanum = alpha | digit - OCTET = - CHAR = alpha | digit | separator | ! | # | $ | - %% | & | ' | * | + | - | . | ` | - ^ | _ | { | | | } | ~ | CTL - CTL = - SP = - HT = - NL = - LWSP = SP | HT | NL - separator = ( | ) | < | > | @ | , | ; | : | - \ | " | / | [ | ] | ? | = | { | - } | SP | HT - token = 1* - quoted-string = " *qdtext " - qdtext = - TEXT = - - 2.3. URL Encoding - - reserved = ; | / | ? | : | @ | & | = | + | $ | - , | [ | ] - - hex = digit | A | B | C | D | E | F | a | b - | c | d | e | f - escaped = "%%" hex hex - unreserved = alpha | digit | mark - mark = - | _ | . | ! | ~ | * | ' | ( | ) - - Note that newline (NL) need not be a single character, but can - be a character sequence. - - 3.2. The Script-URI - - script-URI = "://" ":" - "?" - - where is found from SERVER_PROTOCOL, , - and are the values of the respective - meta-variables. The SCRIPT_NAME and PATH_INFO values, URL-encoded - with ";", "=" and "?" reserved, give and . - - ]" - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -deferred -class - EWSGI_ENVIRONMENT - -inherit - EWSGI_VARIABLES [STRING_8] - - ITERABLE [STRING_8] - -feature -- Access - - table: HASH_TABLE [STRING, STRING] - -- These variables are specific to requests made with HTTP. - -- Interpretation of these variables may depend on the value of - -- SERVER_PROTOCOL. - -- - -- Environment variables with names beginning with "HTTP_" contain - -- header data read from the client, if the protocol used was HTTP. - -- The HTTP header name is converted to upper case, has all - -- occurrences of "-" replaced with "_" and has "HTTP_" prepended to - -- give the environment variable name. The header data may be - -- presented as sent by the client, or may be rewritten in ways which - -- do not change its semantics. If multiple headers with the same - -- field-name are received then they must be rewritten as a single - -- header having the same semantics. Similarly, a header that is - -- received on more than one line must be merged onto a single line. - -- The server must, if necessary, change the representation of the - -- data (for example, the character set) to be appropriate for a CGI - -- environment variable. - -- - -- The server is not required to create environment variables for all - -- the headers that it receives. In particular, it may remove any - -- headers carrying authentication information, such as - -- "Authorization"; it may remove headers whose value is available to - -- the script via other variables, such as "Content-Length" and - -- "Content-Type". - -- - -- For convenience it might also include the following CGI entries - deferred - end - -feature -- Access: table - - new_cursor: HASH_TABLE_ITERATION_CURSOR [STRING_8, STRING_8] - -- Fresh cursor associated with current structure - do - create Result.make (table) - end - -feature -- Common Gateway Interface - 1.1 8 January 1996 - - auth_type: detachable STRING - -- This variable is specific to requests made via the "http" - -- scheme. - -- - -- If the Script-URI required access authentication for external - -- access, then the server MUST set the value of this variable - -- from the 'auth-scheme' token in the request's "Authorization" - -- header field. Otherwise it is set to NULL. - -- - -- AUTH_TYPE = "" | auth-scheme - -- auth-scheme = "Basic" | "Digest" | token - -- - -- HTTP access authentication schemes are described in section 11 - -- of the HTTP/1.1 specification [8]. The auth-scheme is not - -- case-sensitive. - -- - -- Servers MUST provide this metavariable to scripts if the - -- request header included an "Authorization" field that was - -- authenticated. - deferred - end - - content_length: detachable STRING - -- This metavariable is set to the size of the message-body - -- entity attached to the request, if any, in decimal number of - -- octets. If no data are attached, then this metavariable is - -- either NULL or not defined. The syntax is the same as for the - -- HTTP "Content-Length" header field (section 14.14, HTTP/1.1 - -- specification [8]). - -- - -- CONTENT_LENGTH = "" | 1*digit - -- - -- Servers MUST provide this metavariable to scripts if the - -- request was accompanied by a message-body entity. - deferred - end - - content_length_value: INTEGER - -- Integer value related to `content_length" - deferred - end - - content_type: detachable STRING - -- If the request includes a message-body, CONTENT_TYPE is set to - -- the Internet Media Type [9] of the attached entity if the type - -- was provided via a "Content-type" field in the request header, - -- or if the server can determine it in the absence of a supplied - -- "Content-type" field. The syntax is the same as for the HTTP - -- "Content-Type" header field. - -- - -- CONTENT_TYPE = "" | media-type - -- media-type = type "/" subtype *( ";" parameter) - -- type = token - -- subtype = token - -- parameter = attribute "=" value - -- attribute = token - -- value = token | quoted-string - -- - -- The type, subtype, and parameter attribute names are not - -- case-sensitive. Parameter values MAY be case sensitive. Media - -- types and their use in HTTP are described in section 3.7 of - -- the HTTP/1.1 specification [8]. - -- - -- Example: - -- - -- application/x-www-form-urlencoded - -- - -- There is no default value for this variable. If and only if it - -- is unset, then the script MAY attempt to determine the media - -- type from the data received. If the type remains unknown, then - -- the script MAY choose to either assume a content-type of - -- application/octet-stream or reject the request with a 415 - -- ("Unsupported Media Type") error. See section 7.2.1.3 for more - -- information about returning error status values. - -- - -- Servers MUST provide this metavariable to scripts if a - -- "Content-Type" field was present in the original request - -- header. If the server receives a request with an attached - -- entity but no "Content-Type" header field, it MAY attempt to - -- determine the correct datatype, or it MAY omit this - -- metavariable when communicating the request information to the - -- script. - deferred - end - - gateway_interface: STRING - -- This metavariable is set to the dialect of CGI being used by - -- the server to communicate with the script. Syntax: - -- - -- GATEWAY_INTERFACE = "CGI" "/" major "." minor - -- major = 1*digit - -- minor = 1*digit - -- - -- Note that the major and minor numbers are treated as separate - -- integers and hence each may be more than a single digit. Thus - -- CGI/2.4 is a lower version than CGI/2.13 which in turn is - -- lower than CGI/12.3. Leading zeros in either the major or the - -- minor number MUST be ignored by scripts and SHOULD NOT be - -- generated by servers. - -- - -- This document defines the 1.1 version of the CGI interface - -- ("CGI/1.1"). - -- - -- Servers MUST provide this metavariable to scripts. - -- - -- The version of the CGI specification to which this server - -- complies. Syntax: - -- - -- GATEWAY_INTERFACE = "CGI" "/" 1*digit "." 1*digit - -- - -- Note that the major and minor numbers are treated as separate - -- integers and that each may be incremented higher than a single - -- digit. Thus CGI/2.4 is a lower version than CGI/2.13 which in - -- turn is lower than CGI/12.3. Leading zeros must be ignored by - -- scripts and should never be generated by servers. - deferred - end - - path_info: STRING assign update_path_info - -- The PATH_INFO metavariable specifies a path to be interpreted - -- by the CGI script. It identifies the resource or sub-resource - -- to be returned by the CGI script, and it is derived from the - -- portion of the URI path following the script name but - -- preceding any query data. The syntax and semantics are similar - -- to a decoded HTTP URL 'path' token (defined in RFC 2396 [4]), - -- with the exception that a PATH_INFO of "/" represents a single - -- void path segment. - -- - -- PATH_INFO = "" | ( "/" path ) - -- path = segment *( "/" segment ) - -- segment = *pchar - -- pchar = - -- - -- The PATH_INFO string is the trailing part of the - -- component of the Script-URI (see section 3.2) that follows the - -- SCRIPT_NAME portion of the path. - -- - -- Servers MAY impose their own restrictions and limitations on - -- what values they will accept for PATH_INFO, and MAY reject or - -- edit any values they consider objectionable before passing - -- them to the script. - -- - -- Servers MUST make this URI component available to CGI scripts. - -- The PATH_INFO value is case-sensitive, and the server MUST - -- preserve the case of the PATH_INFO element of the URI when - -- making it available to scripts. - deferred - end - - path_translated: detachable STRING - -- PATH_TRANSLATED is derived by taking any path-info component - -- of the request URI (see section 6.1.6), decoding it (see - -- section 3.1), parsing it as a URI in its own right, and - -- performing any virtual-to-physical translation appropriate to - -- map it onto the server's document repository structure. If the - -- request URI includes no path-info component, the - -- PATH_TRANSLATED metavariable SHOULD NOT be defined. - -- - -- - -- PATH_TRANSLATED = *CHAR - -- - -- For a request such as the following: - -- - -- http://somehost.com/cgi-bin/somescript/this%2eis%2epath%2einfo - -- - -- the PATH_INFO component would be decoded, and the result - -- parsed as though it were a request for the following: - -- - -- http://somehost.com/this.is.the.path.info - -- - -- This would then be translated to a location in the server's - -- document repository, perhaps a filesystem path something like - -- this: - -- - -- /usr/local/www/htdocs/this.is.the.path.info - -- - -- The result of the translation is the value of PATH_TRANSLATED. - -- - -- The value of PATH_TRANSLATED may or may not map to a valid - -- repository location. Servers MUST preserve the case of the - -- path-info segment if and only if the underlying repository - -- supports case-sensitive names. If the repository is only - -- case-aware, case-preserving, or case-blind with regard to - -- document names, servers are not required to preserve the case - -- of the original segment through the translation. - -- - -- The translation algorithm the server uses to derive - -- PATH_TRANSLATED is implementation defined; CGI scripts which - -- use this variable may suffer limited portability. - -- - -- Servers SHOULD provide this metavariable to scripts if and - -- only if the request URI includes a path-info component. - deferred - end - - query_string: STRING - -- A URL-encoded string; the part of the Script-URI. (See - -- section 3.2.) - -- - -- QUERY_STRING = query-string - -- query-string = *uric - - -- The URL syntax for a query string is described in section 3 of - -- RFC 2396 [4]. - -- - -- Servers MUST supply this value to scripts. The QUERY_STRING - -- value is case-sensitive. If the Script-URI does not include a - -- query component, the QUERY_STRING metavariable MUST be defined - -- as an empty string (""). - deferred - end - - remote_addr: STRING - -- The IP address of the client sending the request to the - -- server. This is not necessarily that of the user agent (such - -- as if the request came through a proxy). - -- - -- REMOTE_ADDR = hostnumber - -- hostnumber = ipv4-address | ipv6-address - - -- The definitions of ipv4-address and ipv6-address are provided - -- in Appendix B of RFC 2373 [13]. - -- - -- Servers MUST supply this value to scripts. - deferred - end - - remote_host: detachable STRING - -- The fully qualified domain name of the client sending the - -- request to the server, if available, otherwise NULL. (See - -- section 6.1.9.) Fully qualified domain names take the form as - -- described in section 3.5 of RFC 1034 [10] and section 2.1 of - -- RFC 1123 [5]. Domain names are not case sensitive. - -- - -- Servers SHOULD provide this information to scripts. - deferred - end - - remote_ident: detachable STRING - -- The identity information reported about the connection by a - -- RFC 1413 [11] request to the remote agent, if available. - -- Servers MAY choose not to support this feature, or not to - -- request the data for efficiency reasons. - -- - -- REMOTE_IDENT = *CHAR - -- - -- The data returned may be used for authentication purposes, but - -- the level of trust reposed in them should be minimal. - -- - -- Servers MAY supply this information to scripts if the RFC1413 - -- [11] lookup is performed. - deferred - end - - remote_user: detachable STRING - -- If the request required authentication using the "Basic" - -- mechanism (i.e., the AUTH_TYPE metavariable is set to - -- "Basic"), then the value of the REMOTE_USER metavariable is - -- set to the user-ID supplied. In all other cases the value of - -- this metavariable is undefined. - -- - -- REMOTE_USER = *OCTET - -- - -- This variable is specific to requests made via the HTTP - -- protocol. - -- - -- Servers SHOULD provide this metavariable to scripts. - deferred - end - - request_method: STRING - -- The REQUEST_METHOD metavariable is set to the method with - -- which the request was made, as described in section 5.1.1 of - -- the HTTP/1.0 specification [3] and section 5.1.1 of the - -- HTTP/1.1 specification [8]. - -- - -- REQUEST_METHOD = http-method - -- http-method = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" - -- | "OPTIONS" | "TRACE" | extension-method - -- extension-method = token - -- - -- The method is case sensitive. CGI/1.1 servers MAY choose to - -- process some methods directly rather than passing them to - -- scripts. - -- - -- This variable is specific to requests made with HTTP. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - script_name: STRING - -- The SCRIPT_NAME metavariable is set to a URL path that could - -- identify the CGI script (rather than the script's output). The - -- syntax and semantics are identical to a decoded HTTP URL - -- 'path' token (see RFC 2396 [4]). - -- - -- SCRIPT_NAME = "" | ( "/" [ path ] ) - -- - -- The SCRIPT_NAME string is some leading part of the - -- component of the Script-URI derived in some implementation - -- defined manner. No PATH_INFO or QUERY_STRING segments (see - -- sections 6.1.6 and 6.1.8) are included in the SCRIPT_NAME - -- value. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_name: STRING - -- The SERVER_NAME metavariable is set to the name of the server, - -- as derived from the part of the Script-URI (see section - -- 3.2). - -- - -- SERVER_NAME = hostname | hostnumber - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_port: INTEGER - -- The SERVER_PORT metavariable is set to the port on which the - -- request was received, as used in the part of the - -- Script-URI. - -- - -- SERVER_PORT = 1*digit - -- - -- If the portion of the script-URI is blank, the actual - -- port number upon which the request was received MUST be - -- supplied. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_protocol: STRING - -- The SERVER_PROTOCOL metavariable is set to the name and - -- revision of the information protocol with which the request - -- arrived. This is not necessarily the same as the protocol - -- version used by the server in its response to the client. - -- - -- SERVER_PROTOCOL = HTTP-Version | extension-version - -- | extension-token - -- HTTP-Version = "HTTP" "/" 1*digit "." 1*digit - -- extension-version = protocol "/" 1*digit "." 1*digit - -- protocol = 1*( alpha | digit | "+" | "-" | "." ) - -- extension-token = token - -- - -- 'protocol' is a version of the part of the - -- Script-URI, but is not identical to it. For example, the - -- scheme of a request may be "https" while the protocol remains - -- "http". The protocol is not case sensitive, but by convention, - -- 'protocol' is in upper case. - -- - -- A well-known extension token value is "INCLUDED", which - -- signals that the current document is being included as part of - -- a composite document, rather than being the direct target of - -- the client request. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_software: STRING - -- The SERVER_SOFTWARE metavariable is set to the name and - -- version of the information server software answering the - -- request (and running the gateway). - -- - -- SERVER_SOFTWARE = 1*product - -- product = token [ "/" product-version ] - -- product-version = token - - -- Servers MUST provide this metavariable to scripts. - deferred - end - -feature -- HTTP_* - - http_accept: detachable STRING - -- Contents of the Accept: header from the current request, if there is one. - -- Example: 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' - deferred - end - - http_accept_charset: detachable STRING - -- Contents of the Accept-Charset: header from the current request, if there is one. - -- Example: 'iso-8859-1,*,utf-8'. - deferred - end - - http_accept_encoding: detachable STRING - -- Contents of the Accept-Encoding: header from the current request, if there is one. - -- Example: 'gzip'. - deferred - end - - http_accept_language: detachable STRING - -- Contents of the Accept-Language: header from the current request, if there is one. - -- Example: 'en'. - deferred - end - - http_connection: detachable STRING - -- Contents of the Connection: header from the current request, if there is one. - -- Example: 'Keep-Alive'. - deferred - end - - http_host: detachable STRING - -- Contents of the Host: header from the current request, if there is one. - deferred - end - - http_referer: detachable STRING - -- The address of the page (if any) which referred the user agent to the current page. - -- This is set by the user agent. - -- Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. - -- In short, it cannot really be trusted. - deferred - end - - http_user_agent: detachable STRING - -- Contents of the User-Agent: header from the current request, if there is one. - -- This is a string denoting the user agent being which is accessing the page. - -- A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). - -- Among other things, you can use this value to tailor your page's - -- output to the capabilities of the user agent. - deferred - end - - http_authorization: detachable STRING - -- Contents of the Authorization: header from the current request, if there is one. - deferred - end - -feature -- Extra - - request_uri: STRING - -- The URI which was given in order to access this page; for instance, '/index.html'. - deferred - end - - orig_path_info: detachable STRING - -- Original version of `path_info' before processed by Current environment - deferred - end - -feature {EWSGI_REQUEST} -- Element change - - set_orig_path_info (s: STRING) - -- Set ORIG_PATH_INFO to `s' - require - s_attached: s /= Void - deferred - ensure - same_orig_path_info: orig_path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info) - end - - unset_orig_path_info - -- Unset ORIG_PATH_INFO - deferred - ensure - unset: not has_variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info) - end - - update_path_info (a_path_info: like path_info) - -- Updated PATH_INFO - deferred - ensure - same_path_info: path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.path_info) - end - -invariant - server_name_not_empty: not server_name.is_empty - server_port_set: server_port /= 0 - request_method_attached: request_method /= Void - path_info_attached: path_info /= Void - query_string_attached: query_string /= Void - remote_addr_attached: remote_addr /= Void - - path_info_identical: path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.path_info) - -;note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/specification/request/ewsgi_environment_names.e b/library/server/ewsgi/specification/request/ewsgi_environment_names.e deleted file mode 100644 index 46860b5d..00000000 --- a/library/server/ewsgi/specification/request/ewsgi_environment_names.e +++ /dev/null @@ -1,89 +0,0 @@ -note - description: "Summary description for {EWSGI_ENVIRONMENT_NAMES}." - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -class - EWSGI_ENVIRONMENT_NAMES - -feature -- Access - - request_uri: STRING = "REQUEST_URI" - - request_method: STRING = "REQUEST_METHOD" - - query_string: STRING = "QUERY_STRING" - - content_type: STRING = "CONTENT_TYPE" - - content_length: STRING = "CONTENT_LENGTH" - - path_info: STRING = "PATH_INFO" - - path_translated: STRING = "PATH_TRANSLATED" - - http_user_agent: STRING = "HTTP_USER_AGENT" - - http_authorization: STRING = "HTTP_AUTHORIZATION" - - http_host: STRING = "HTTP_HOST" - - http_cookie: STRING = "HTTP_COOKIE" - - http_from: STRING = "HTTP_FROM" - - http_accept: STRING = "HTTP_ACCEPT" - - http_accept_charset: STRING = "HTTP_ACCEPT_CHARSET" - - http_accept_encoding: STRING = "HTTP_ACCEPT_ENCODING" - - http_accept_language: STRING = "HTTP_ACCEPT_LANGUAGE" - - http_connection: STRING = "HTTP_CONNECTION" - - http_referer: STRING = "HTTP_REFERER" - - gateway_interface: STRING = "GATEWAY_INTERFACE" - - auth_type: STRING = "AUTH_TYPE" - - remote_host: STRING = "REMOTE_HOST" - - remote_addr: STRING = "REMOTE_ADDR" - - remote_ident: STRING = "REMOTE_IDENT" - - remote_user: STRING = "REMOTE_USER" - - script_name: STRING = "SCRIPT_NAME" - - server_name: STRING = "SERVER_NAME" - - server_port: STRING = "SERVER_PORT" - - server_protocol: STRING = "SERVER_PROTOCOL" - - server_software: STRING = "SERVER_SOFTWARE" - -feature -- Extra names - - request_time: STRING = "REQUEST_TIME" - - self: STRING = "SELF" - - orig_path_info: STRING = "ORIG_PATH_INFO" - -note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_environment_names.e b/library/server/ewsgi/specification/request/ewsgi_meta_names.e similarity index 95% rename from library/server/ewsgi/src/request/ewsgi_environment_names.e rename to library/server/ewsgi/specification/request/ewsgi_meta_names.e index 46860b5d..217e81bd 100644 --- a/library/server/ewsgi/src/request/ewsgi_environment_names.e +++ b/library/server/ewsgi/specification/request/ewsgi_meta_names.e @@ -1,12 +1,12 @@ note - description: "Summary description for {EWSGI_ENVIRONMENT_NAMES}." + description: "Summary description for {EWSGI_META_NAMES}." legal: "See notice at end of class." status: "See notice at end of class." date: "$Date$" revision: "$Revision$" class - EWSGI_ENVIRONMENT_NAMES + EWSGI_META_NAMES feature -- Access diff --git a/library/server/ewsgi/specification/request/ewsgi_request.e b/library/server/ewsgi/specification/request/ewsgi_request.e index d2190078..0cf3643a 100644 --- a/library/server/ewsgi/specification/request/ewsgi_request.e +++ b/library/server/ewsgi/specification/request/ewsgi_request.e @@ -1,10 +1,70 @@ note description: "[ - Server request context of the httpd request + Server request context of the httpd request - You can create your own descendant of this class to - add/remove specific value or processing - ]" + It includes CGI interface and a few extra values that are usually valuable + + See http://www.ietf.org/rfc/rfc3875 + + 2.2. Basic Rules + + The following rules are used throughout this specification to + describe basic parsing constructs. + + alpha = lowalpha | hialpha + lowalpha = a | b | c | d | e | f | g | h | + i | j | k | l | m | n | o | p | + q | r | s | t | u | v | w | x | + y | z + hialpha = A | B | C | D | E | F | G | H | + I | J | K | L | M | N | O | P | + Q | R | S | T | U | V | W | X | + Y | Z + digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | + 8 | 9 + alphanum = alpha | digit + OCTET = + CHAR = alpha | digit | separator | ! | # | $ | + %% | & | ' | * | + | - | . | ` | + ^ | _ | { | | | } | ~ | CTL + CTL = + SP = + HT = + NL = + LWSP = SP | HT | NL + separator = ( | ) | < | > | @ | , | ; | : | + \ | " | / | [ | ] | ? | = | { | + } | SP | HT + token = 1* + quoted-string = " *qdtext " + qdtext = + TEXT = + + 2.3. URL Encoding + + reserved = ; | / | ? | : | @ | & | = | + | $ | + , | [ | ] + + hex = digit | A | B | C | D | E | F | a | b + | c | d | e | f + escaped = "%%" hex hex + unreserved = alpha | digit | mark + mark = - | _ | . | ! | ~ | * | ' | ( | ) + + Note that newline (NL) need not be a single character, but can + be a character sequence. + + 3.2. The Script-URI + + script-URI = "://" ":" + "?" + + where is found from SERVER_PROTOCOL, , + and are the values of the respective + meta-variables. The SCRIPT_NAME and PATH_INFO values, URL-encoded + with ";", "=" and "?" reserved, give and . + + ]" legal: "See notice at end of class." status: "See notice at end of class." date: "$Date$" @@ -27,42 +87,516 @@ feature -- Access: extra values deferred end -feature -- Access: environment variables +feature -- Access: CGI environment variables - environment: EWSGI_ENVIRONMENT - -- Environment variables - deferred - end - - environment_variable (a_name: STRING): detachable STRING + meta_parameter (a_name: READABLE_STRING_GENERAL): detachable STRING -- Environment variable related to `a_name' require a_name_valid: a_name /= Void and then not a_name.is_empty deferred end -feature -- Access: execution variables - - execution_variables: EWSGI_VARIABLES [STRING_32] - -- Execution variables set by the application + meta_parameters: HASH_TABLE [STRING, READABLE_STRING_GENERAL] + -- These variables are specific to requests made with HTTP. + -- Interpretation of these variables may depend on the value of + -- SERVER_PROTOCOL. + -- + -- Environment variables with names beginning with "HTTP_" contain + -- header data read from the client, if the protocol used was HTTP. + -- The HTTP header name is converted to upper case, has all + -- occurrences of "-" replaced with "_" and has "HTTP_" prepended to + -- give the environment variable name. The header data may be + -- presented as sent by the client, or may be rewritten in ways which + -- do not change its semantics. If multiple headers with the same + -- field-name are received then they must be rewritten as a single + -- header having the same semantics. Similarly, a header that is + -- received on more than one line must be merged onto a single line. + -- The server must, if necessary, change the representation of the + -- data (for example, the character set) to be appropriate for a CGI + -- environment variable. + -- + -- The server is not required to create environment variables for all + -- the headers that it receives. In particular, it may remove any + -- headers carrying authentication information, such as + -- "Authorization"; it may remove headers whose value is available to + -- the script via other variables, such as "Content-Length" and + -- "Content-Type". + -- + -- For convenience it might also include the following CGI entries deferred end - execution_variable (a_name: STRING): detachable STRING_32 - -- Execution variable related to `a_name' - require - a_name_valid: a_name /= Void and then not a_name.is_empty +feature -- Common Gateway Interface - 1.1 8 January 1996 + + auth_type: detachable STRING + -- This variable is specific to requests made via the "http" + -- scheme. + -- + -- If the Script-URI required access authentication for external + -- access, then the server MUST set the value of this variable + -- from the 'auth-scheme' token in the request's "Authorization" + -- header field. Otherwise it is set to NULL. + -- + -- AUTH_TYPE = "" | auth-scheme + -- auth-scheme = "Basic" | "Digest" | token + -- + -- HTTP access authentication schemes are described in section 11 + -- of the HTTP/1.1 specification [8]. The auth-scheme is not + -- case-sensitive. + -- + -- Servers MUST provide this metavariable to scripts if the + -- request header included an "Authorization" field that was + -- authenticated. deferred end -feature -- URL Parameters + content_length: detachable STRING + -- This metavariable is set to the size of the message-body + -- entity attached to the request, if any, in decimal number of + -- octets. If no data are attached, then this metavariable is + -- either NULL or not defined. The syntax is the same as for the + -- HTTP "Content-Length" header field (section 14.14, HTTP/1.1 + -- specification [8]). + -- + -- CONTENT_LENGTH = "" | 1*digit + -- + -- Servers MUST provide this metavariable to scripts if the + -- request was accompanied by a message-body entity. + deferred + end - parameters: EWSGI_VARIABLES [STRING_32] + content_length_value: INTEGER + -- Integer value related to `content_length" + deferred + end + + content_type: detachable STRING + -- If the request includes a message-body, CONTENT_TYPE is set to + -- the Internet Media Type [9] of the attached entity if the type + -- was provided via a "Content-type" field in the request header, + -- or if the server can determine it in the absence of a supplied + -- "Content-type" field. The syntax is the same as for the HTTP + -- "Content-Type" header field. + -- + -- CONTENT_TYPE = "" | media-type + -- media-type = type "/" subtype *( ";" parameter) + -- type = token + -- subtype = token + -- parameter = attribute "=" value + -- attribute = token + -- value = token | quoted-string + -- + -- The type, subtype, and parameter attribute names are not + -- case-sensitive. Parameter values MAY be case sensitive. Media + -- types and their use in HTTP are described in section 3.7 of + -- the HTTP/1.1 specification [8]. + -- + -- Example: + -- + -- application/x-www-form-urlencoded + -- + -- There is no default value for this variable. If and only if it + -- is unset, then the script MAY attempt to determine the media + -- type from the data received. If the type remains unknown, then + -- the script MAY choose to either assume a content-type of + -- application/octet-stream or reject the request with a 415 + -- ("Unsupported Media Type") error. See section 7.2.1.3 for more + -- information about returning error status values. + -- + -- Servers MUST provide this metavariable to scripts if a + -- "Content-Type" field was present in the original request + -- header. If the server receives a request with an attached + -- entity but no "Content-Type" header field, it MAY attempt to + -- determine the correct datatype, or it MAY omit this + -- metavariable when communicating the request information to the + -- script. + deferred + end + + gateway_interface: STRING + -- This metavariable is set to the dialect of CGI being used by + -- the server to communicate with the script. Syntax: + -- + -- GATEWAY_INTERFACE = "CGI" "/" major "." minor + -- major = 1*digit + -- minor = 1*digit + -- + -- Note that the major and minor numbers are treated as separate + -- integers and hence each may be more than a single digit. Thus + -- CGI/2.4 is a lower version than CGI/2.13 which in turn is + -- lower than CGI/12.3. Leading zeros in either the major or the + -- minor number MUST be ignored by scripts and SHOULD NOT be + -- generated by servers. + -- + -- This document defines the 1.1 version of the CGI interface + -- ("CGI/1.1"). + -- + -- Servers MUST provide this metavariable to scripts. + -- + -- The version of the CGI specification to which this server + -- complies. Syntax: + -- + -- GATEWAY_INTERFACE = "CGI" "/" 1*digit "." 1*digit + -- + -- Note that the major and minor numbers are treated as separate + -- integers and that each may be incremented higher than a single + -- digit. Thus CGI/2.4 is a lower version than CGI/2.13 which in + -- turn is lower than CGI/12.3. Leading zeros must be ignored by + -- scripts and should never be generated by servers. + deferred + end + + path_info: STRING + -- The PATH_INFO metavariable specifies a path to be interpreted + -- by the CGI script. It identifies the resource or sub-resource + -- to be returned by the CGI script, and it is derived from the + -- portion of the URI path following the script name but + -- preceding any query data. The syntax and semantics are similar + -- to a decoded HTTP URL 'path' token (defined in RFC 2396 [4]), + -- with the exception that a PATH_INFO of "/" represents a single + -- void path segment. + -- + -- PATH_INFO = "" | ( "/" path ) + -- path = segment *( "/" segment ) + -- segment = *pchar + -- pchar = + -- + -- The PATH_INFO string is the trailing part of the + -- component of the Script-URI (see section 3.2) that follows the + -- SCRIPT_NAME portion of the path. + -- + -- Servers MAY impose their own restrictions and limitations on + -- what values they will accept for PATH_INFO, and MAY reject or + -- edit any values they consider objectionable before passing + -- them to the script. + -- + -- Servers MUST make this URI component available to CGI scripts. + -- The PATH_INFO value is case-sensitive, and the server MUST + -- preserve the case of the PATH_INFO element of the URI when + -- making it available to scripts. + deferred + end + + path_translated: detachable STRING + -- PATH_TRANSLATED is derived by taking any path-info component + -- of the request URI (see section 6.1.6), decoding it (see + -- section 3.1), parsing it as a URI in its own right, and + -- performing any virtual-to-physical translation appropriate to + -- map it onto the server's document repository structure. If the + -- request URI includes no path-info component, the + -- PATH_TRANSLATED metavariable SHOULD NOT be defined. + -- + -- + -- PATH_TRANSLATED = *CHAR + -- + -- For a request such as the following: + -- + -- http://somehost.com/cgi-bin/somescript/this%2eis%2epath%2einfo + -- + -- the PATH_INFO component would be decoded, and the result + -- parsed as though it were a request for the following: + -- + -- http://somehost.com/this.is.the.path.info + -- + -- This would then be translated to a location in the server's + -- document repository, perhaps a filesystem path something like + -- this: + -- + -- /usr/local/www/htdocs/this.is.the.path.info + -- + -- The result of the translation is the value of PATH_TRANSLATED. + -- + -- The value of PATH_TRANSLATED may or may not map to a valid + -- repository location. Servers MUST preserve the case of the + -- path-info segment if and only if the underlying repository + -- supports case-sensitive names. If the repository is only + -- case-aware, case-preserving, or case-blind with regard to + -- document names, servers are not required to preserve the case + -- of the original segment through the translation. + -- + -- The translation algorithm the server uses to derive + -- PATH_TRANSLATED is implementation defined; CGI scripts which + -- use this variable may suffer limited portability. + -- + -- Servers SHOULD provide this metavariable to scripts if and + -- only if the request URI includes a path-info component. + deferred + end + + query_string: STRING + -- A URL-encoded string; the part of the Script-URI. (See + -- section 3.2.) + -- + -- QUERY_STRING = query-string + -- query-string = *uric + + -- The URL syntax for a query string is described in section 3 of + -- RFC 2396 [4]. + -- + -- Servers MUST supply this value to scripts. The QUERY_STRING + -- value is case-sensitive. If the Script-URI does not include a + -- query component, the QUERY_STRING metavariable MUST be defined + -- as an empty string (""). + deferred + end + + remote_addr: STRING + -- The IP address of the client sending the request to the + -- server. This is not necessarily that of the user agent (such + -- as if the request came through a proxy). + -- + -- REMOTE_ADDR = hostnumber + -- hostnumber = ipv4-address | ipv6-address + + -- The definitions of ipv4-address and ipv6-address are provided + -- in Appendix B of RFC 2373 [13]. + -- + -- Servers MUST supply this value to scripts. + deferred + end + + remote_host: detachable STRING + -- The fully qualified domain name of the client sending the + -- request to the server, if available, otherwise NULL. (See + -- section 6.1.9.) Fully qualified domain names take the form as + -- described in section 3.5 of RFC 1034 [10] and section 2.1 of + -- RFC 1123 [5]. Domain names are not case sensitive. + -- + -- Servers SHOULD provide this information to scripts. + deferred + end + + remote_ident: detachable STRING + -- The identity information reported about the connection by a + -- RFC 1413 [11] request to the remote agent, if available. + -- Servers MAY choose not to support this feature, or not to + -- request the data for efficiency reasons. + -- + -- REMOTE_IDENT = *CHAR + -- + -- The data returned may be used for authentication purposes, but + -- the level of trust reposed in them should be minimal. + -- + -- Servers MAY supply this information to scripts if the RFC1413 + -- [11] lookup is performed. + deferred + end + + remote_user: detachable STRING + -- If the request required authentication using the "Basic" + -- mechanism (i.e., the AUTH_TYPE metavariable is set to + -- "Basic"), then the value of the REMOTE_USER metavariable is + -- set to the user-ID supplied. In all other cases the value of + -- this metavariable is undefined. + -- + -- REMOTE_USER = *OCTET + -- + -- This variable is specific to requests made via the HTTP + -- protocol. + -- + -- Servers SHOULD provide this metavariable to scripts. + deferred + end + + request_method: STRING + -- The REQUEST_METHOD metavariable is set to the method with + -- which the request was made, as described in section 5.1.1 of + -- the HTTP/1.0 specification [3] and section 5.1.1 of the + -- HTTP/1.1 specification [8]. + -- + -- REQUEST_METHOD = http-method + -- http-method = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" + -- | "OPTIONS" | "TRACE" | extension-method + -- extension-method = token + -- + -- The method is case sensitive. CGI/1.1 servers MAY choose to + -- process some methods directly rather than passing them to + -- scripts. + -- + -- This variable is specific to requests made with HTTP. + -- + -- Servers MUST provide this metavariable to scripts. + deferred + end + + script_name: STRING + -- The SCRIPT_NAME metavariable is set to a URL path that could + -- identify the CGI script (rather than the script's output). The + -- syntax and semantics are identical to a decoded HTTP URL + -- 'path' token (see RFC 2396 [4]). + -- + -- SCRIPT_NAME = "" | ( "/" [ path ] ) + -- + -- The SCRIPT_NAME string is some leading part of the + -- component of the Script-URI derived in some implementation + -- defined manner. No PATH_INFO or QUERY_STRING segments (see + -- sections 6.1.6 and 6.1.8) are included in the SCRIPT_NAME + -- value. + -- + -- Servers MUST provide this metavariable to scripts. + deferred + end + + server_name: STRING + -- The SERVER_NAME metavariable is set to the name of the server, + -- as derived from the part of the Script-URI (see section + -- 3.2). + -- + -- SERVER_NAME = hostname | hostnumber + -- + -- Servers MUST provide this metavariable to scripts. + deferred + end + + server_port: INTEGER + -- The SERVER_PORT metavariable is set to the port on which the + -- request was received, as used in the part of the + -- Script-URI. + -- + -- SERVER_PORT = 1*digit + -- + -- If the portion of the script-URI is blank, the actual + -- port number upon which the request was received MUST be + -- supplied. + -- + -- Servers MUST provide this metavariable to scripts. + deferred + end + + server_protocol: STRING + -- The SERVER_PROTOCOL metavariable is set to the name and + -- revision of the information protocol with which the request + -- arrived. This is not necessarily the same as the protocol + -- version used by the server in its response to the client. + -- + -- SERVER_PROTOCOL = HTTP-Version | extension-version + -- | extension-token + -- HTTP-Version = "HTTP" "/" 1*digit "." 1*digit + -- extension-version = protocol "/" 1*digit "." 1*digit + -- protocol = 1*( alpha | digit | "+" | "-" | "." ) + -- extension-token = token + -- + -- 'protocol' is a version of the part of the + -- Script-URI, but is not identical to it. For example, the + -- scheme of a request may be "https" while the protocol remains + -- "http". The protocol is not case sensitive, but by convention, + -- 'protocol' is in upper case. + -- + -- A well-known extension token value is "INCLUDED", which + -- signals that the current document is being included as part of + -- a composite document, rather than being the direct target of + -- the client request. + -- + -- Servers MUST provide this metavariable to scripts. + deferred + end + + server_software: STRING + -- The SERVER_SOFTWARE metavariable is set to the name and + -- version of the information server software answering the + -- request (and running the gateway). + -- + -- SERVER_SOFTWARE = 1*product + -- product = token [ "/" product-version ] + -- product-version = token + + -- Servers MUST provide this metavariable to scripts. + deferred + end + +feature -- HTTP_* + + http_accept: detachable STRING + -- Contents of the Accept: header from the current request, if there is one. + -- Example: 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' + deferred + end + + http_accept_charset: detachable STRING + -- Contents of the Accept-Charset: header from the current request, if there is one. + -- Example: 'iso-8859-1,*,utf-8'. + deferred + end + + http_accept_encoding: detachable STRING + -- Contents of the Accept-Encoding: header from the current request, if there is one. + -- Example: 'gzip'. + deferred + end + + http_accept_language: detachable STRING + -- Contents of the Accept-Language: header from the current request, if there is one. + -- Example: 'en'. + deferred + end + + http_connection: detachable STRING + -- Contents of the Connection: header from the current request, if there is one. + -- Example: 'Keep-Alive'. + deferred + end + + http_host: detachable STRING + -- Contents of the Host: header from the current request, if there is one. + deferred + end + + http_referer: detachable STRING + -- The address of the page (if any) which referred the user agent to the current page. + -- This is set by the user agent. + -- Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. + -- In short, it cannot really be trusted. + deferred + end + + http_user_agent: detachable STRING + -- Contents of the User-Agent: header from the current request, if there is one. + -- This is a string denoting the user agent being which is accessing the page. + -- A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). + -- Among other things, you can use this value to tailor your page's + -- output to the capabilities of the user agent. + deferred + end + + http_authorization: detachable STRING + -- Contents of the Authorization: header from the current request, if there is one. + deferred + end + +feature -- Extra CGI environment variables + + request_uri: STRING + -- The URI which was given in order to access this page; for instance, '/index.html'. + deferred + end + + orig_path_info: detachable STRING + -- Original version of `path_info' before processed by Current environment + deferred + end + +--feature -- Access: execution variables + +-- execution_variables: EWSGI_VARIABLES [STRING_32] +-- -- Execution variables set by the application +-- deferred +-- end + +-- execution_variable (a_name: STRING): detachable STRING_32 +-- -- Execution variable related to `a_name' +-- require +-- a_name_valid: a_name /= Void and then not a_name.is_empty +-- deferred +-- end + +feature -- Query string Parameters + + query_parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Variables extracted from QUERY_STRING deferred end - parameter (a_name: STRING): detachable STRING_32 + query_parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Parameter for name `n'. require a_name_valid: a_name /= Void and then not a_name.is_empty @@ -71,19 +605,19 @@ feature -- URL Parameters feature -- Form fields and related - form_fields: EWSGI_VARIABLES [STRING_32] + form_data_parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Variables sent by POST request deferred end - form_field (a_name: STRING): detachable STRING_32 + form_data_parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Field for name `a_name'. require a_name_valid: a_name /= Void and then not a_name.is_empty deferred end - uploaded_files: HASH_TABLE [EWSGI_UPLOADED_FILE_DATA, STRING] + uploaded_files: HASH_TABLE [EWSGI_UPLOADED_FILE_DATA, READABLE_STRING_GENERAL] -- Table of uploaded files information --| name: original path from the user --| type: content type @@ -96,33 +630,28 @@ feature -- Form fields and related feature -- Cookies - cookies_variables: HASH_TABLE [STRING, STRING] + cookies: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Expanded cookies variable deferred end - cookies_variable (a_name: STRING): detachable STRING + cookie (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Field for name `a_name'. require a_name_valid: a_name /= Void and then not a_name.is_empty deferred end - cookies: HASH_TABLE [EWSGI_COOKIE, STRING] - -- Cookies Information - deferred - end - feature -- Access: global variable - variables: HASH_TABLE [STRING_32, STRING_32] + parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Table containing all the various variables -- Warning: this is computed each time, if you change the content of other containers -- this won't update this Result's content, unless you query it again deferred end - variable (a_name: STRING_8): detachable STRING_32 + parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Variable named `a_name' from any of the variables container -- and following a specific order -- execution, environment, get, post, cookies @@ -133,7 +662,7 @@ feature -- Access: global variable feature -- Uploaded File Handling - is_uploaded_file (a_filename: STRING): BOOLEAN + is_uploaded_file (a_filename: READABLE_STRING_GENERAL): BOOLEAN -- Is `a_filename' a file uploaded via HTTP POST deferred end @@ -152,6 +681,19 @@ feature -- URL Utility deferred end +invariant + server_name_not_empty: not server_name.is_empty + server_port_set: server_port /= 0 + request_method_attached: request_method /= Void + path_info_attached: path_info /= Void + query_string_attached: query_string /= Void + remote_addr_attached: remote_addr /= Void + + same_orig_path_info: orig_path_info ~ meta_parameter ({EWSGI_META_NAMES}.orig_path_info) + same_path_info: path_info ~ meta_parameter ({EWSGI_META_NAMES}.path_info) + + path_info_identical: path_info ~ meta_parameter ({EWSGI_META_NAMES}.path_info) + note copyright: "2011-2011, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/library/server/ewsgi/specification/request/ewsgi_cookie.e b/library/server/ewsgi/specification/request/obsolete/ewsgi_cookie.e similarity index 100% rename from library/server/ewsgi/specification/request/ewsgi_cookie.e rename to library/server/ewsgi/specification/request/obsolete/ewsgi_cookie.e diff --git a/library/server/ewsgi/specification/request/ewsgi_variables.e b/library/server/ewsgi/specification/request/obsolete/ewsgi_variables.e similarity index 100% rename from library/server/ewsgi/specification/request/ewsgi_variables.e rename to library/server/ewsgi/specification/request/obsolete/ewsgi_variables.e diff --git a/library/server/ewsgi/specification/response/ewsgi_response_buffer.e b/library/server/ewsgi/specification/response/ewsgi_response_buffer.e index e4a1bb5e..006496b3 100644 --- a/library/server/ewsgi/specification/response/ewsgi_response_buffer.e +++ b/library/server/ewsgi/specification/response/ewsgi_response_buffer.e @@ -77,6 +77,7 @@ feature -- Header output operation ensure status_set: status_is_set header_committed: header_committed + message_writable: message_writable end write_header (a_status_code: INTEGER; a_headers: detachable ARRAY [TUPLE [key: STRING; value: STRING]]) @@ -88,6 +89,7 @@ feature -- Header output operation ensure header_committed: header_committed status_set: status_is_set + message_writable: message_writable end feature -- Output operation @@ -117,7 +119,7 @@ feature -- Output operation -- Flush if it makes sense deferred end - + note copyright: "2011-2011, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/library/server/ewsgi/src/application/ewsgi_agent_application.e b/library/server/ewsgi/src/application/ewsgi_agent_application.e index 5b1a1deb..2f3c1c1b 100644 --- a/library/server/ewsgi/src/application/ewsgi_agent_application.e +++ b/library/server/ewsgi/src/application/ewsgi_agent_application.e @@ -23,10 +23,10 @@ feature {NONE} -- Implementation feature {NONE} -- Implementation - callback: PROCEDURE [ANY, TUPLE [req: like new_request; res: like new_response]] + callback: PROCEDURE [ANY, TUPLE [req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER]] -- Procedure called on `execute' - execute (req: like new_request; res: like new_response) + execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER) -- Execute the request do callback.call ([req, res]) diff --git a/library/server/ewsgi/src/application/ewsgi_application.e b/library/server/ewsgi/src/application/ewsgi_application.e index 17044646..5ec1ad7b 100644 --- a/library/server/ewsgi/src/application/ewsgi_application.e +++ b/library/server/ewsgi/src/application/ewsgi_application.e @@ -11,7 +11,7 @@ note deferred class EWSGI_APPLICATION -feature {NONE} -- Execution +feature -- Execution execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER) -- Execute the request @@ -23,23 +23,19 @@ feature {NONE} -- Execution deferred ensure res_status_set: res.status_is_set - res_committed: res.message_committed +-- res_committed: res.message_committed end feature -- Process request - process (env: EWSGI_ENVIRONMENT; a_input: EWSGI_INPUT_STREAM; a_output: EWSGI_OUTPUT_STREAM) + process (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER) -- Process request with environment `env', and i/o streams `a_input' and `a_output' local rescued: BOOLEAN - req: detachable like new_request - res: detachable like new_response do if not rescued then request_count := request_count + 1 - pre_execute (env) - req := new_request (env, a_input) - res := new_response (req, a_output) + pre_execute (req) execute (req, res) post_execute (req, res) else @@ -57,24 +53,21 @@ feature -- Access feature {NONE} -- Execution - pre_execute (env: EWSGI_ENVIRONMENT) + pre_execute (req: EWSGI_REQUEST) -- Operation processed before `execute' - require - env_attached: env /= Void do end - post_execute (req: detachable EWSGI_REQUEST; res: detachable EWSGI_RESPONSE_BUFFER) + post_execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER) -- Operation processed after `execute', or after `rescue_execute' do end - rescue_execute (req: detachable EWSGI_REQUEST; res: detachable EWSGI_RESPONSE_BUFFER; a_exception: detachable EXCEPTION) + rescue_execute (req: EWSGI_REQUEST; res: EWSGI_RESPONSE_BUFFER; a_exception: detachable EXCEPTION) -- Operation processed on rescue of `execute' do if - req /= Void and res /= Void - and a_exception /= Void and then attached a_exception.exception_trace as l_trace + a_exception /= Void and then attached a_exception.exception_trace as l_trace then res.write_header ({HTTP_STATUS_CODE}.internal_server_error, Void) res.write_string ("
    " + l_trace + "
    ") @@ -82,19 +75,6 @@ feature {NONE} -- Execution post_execute (req, res) end -feature {NONE} -- Factory - - new_request (env: EWSGI_ENVIRONMENT; a_input: EWSGI_INPUT_STREAM): EWSGI_REQUEST - do - create {EWSGI_REQUEST} Result.make (env, a_input) - Result.environment.set_variable (request_count.out, "REQUEST_COUNT") - end - - new_response (req: EWSGI_REQUEST; a_output: EWSGI_OUTPUT_STREAM): EWSGI_RESPONSE_BUFFER - do - create {EWSGI_RESPONSE_BUFFER} Result.make (a_output) - end - ;note copyright: "2011-2011, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/library/server/ewsgi/src/request/ewsgi_cookie.e b/library/server/ewsgi/src/request/ewsgi_cookie.e deleted file mode 100644 index 262ef4b6..00000000 --- a/library/server/ewsgi/src/request/ewsgi_cookie.e +++ /dev/null @@ -1,76 +0,0 @@ -note - description: "[ - Contains all information of a rfc2109 cookie that was read from the request header - ]" - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -class - EWSGI_COOKIE - -create - make - -convert - value: {READABLE_STRING_8, STRING_8, READABLE_STRING_GENERAL, STRING_GENERAL} - -feature {NONE} -- Initialization - - make (a_name: STRING; a_value: STRING) - -- Creates current. - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - a_value_not_empty: a_value /= Void and then not a_value.is_empty - do - name := a_name - value := a_value - ensure - a_name_set: name = a_name - a_value_set: value = a_value - end - -feature -- Access - - name: STRING - -- Required. The name of the state information ("cookie") is NAME, - -- and its value is VALUE. NAMEs that begin with $ are reserved for - -- other uses and must not be used by applications. - - value: STRING - -- The VALUE is opaque to the user agent and may be anything the - -- origin server chooses to send, possibly in a server-selected - -- printable ASCII encoding. "Opaque" implies that the content is of - -- interest and relevance only to the origin server. The content - -- may, in fact, be readable by anyone that examines the Set-Cookie - -- header. - -feature -- Query - - variables: detachable HASH_TABLE [STRING, STRING] - -- Potential variable contained in the encoded cookie's value. - -feature -- Status report - - value_is_string (s: READABLE_STRING_GENERAL): BOOLEAN - -- Is `value' same string as `s' - do - Result := s.same_string (value) - end - -invariant - name_attached: name /= Void - value_attached: value /= Void - -note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_environment.e b/library/server/ewsgi/src/request/ewsgi_environment.e deleted file mode 100644 index cb19ebe2..00000000 --- a/library/server/ewsgi/src/request/ewsgi_environment.e +++ /dev/null @@ -1,617 +0,0 @@ -note - description: "[ - - Interface for a request environment - It includes CGI interface and a few extra values that are usually valuable - - See http://www.ietf.org/rfc/rfc3875 - - 2.2. Basic Rules - - The following rules are used throughout this specification to - describe basic parsing constructs. - - alpha = lowalpha | hialpha - lowalpha = a | b | c | d | e | f | g | h | - i | j | k | l | m | n | o | p | - q | r | s | t | u | v | w | x | - y | z - hialpha = A | B | C | D | E | F | G | H | - I | J | K | L | M | N | O | P | - Q | R | S | T | U | V | W | X | - Y | Z - digit = 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | - 8 | 9 - alphanum = alpha | digit - OCTET = - CHAR = alpha | digit | separator | ! | # | $ | - %% | & | ' | * | + | - | . | ` | - ^ | _ | { | | | } | ~ | CTL - CTL = - SP = - HT = - NL = - LWSP = SP | HT | NL - separator = ( | ) | < | > | @ | , | ; | : | - \ | " | / | [ | ] | ? | = | { | - } | SP | HT - token = 1* - quoted-string = " *qdtext " - qdtext = - TEXT = - - 2.3. URL Encoding - - reserved = ; | / | ? | : | @ | & | = | + | $ | - , | [ | ] - - hex = digit | A | B | C | D | E | F | a | b - | c | d | e | f - escaped = "%%" hex hex - unreserved = alpha | digit | mark - mark = - | _ | . | ! | ~ | * | ' | ( | ) - - Note that newline (NL) need not be a single character, but can - be a character sequence. - - 3.2. The Script-URI - - script-URI = "://" ":" - "?" - - where is found from SERVER_PROTOCOL, , - and are the values of the respective - meta-variables. The SCRIPT_NAME and PATH_INFO values, URL-encoded - with ";", "=" and "?" reserved, give and . - - ]" - specification: "EWSGI specification https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki/EWSGI-specification" - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -deferred -class - EWSGI_ENVIRONMENT - -inherit - EWSGI_VARIABLES [STRING_8] - - ITERABLE [STRING_8] - -feature -- Access - - table: HASH_TABLE [STRING, STRING] - -- These variables are specific to requests made with HTTP. - -- Interpretation of these variables may depend on the value of - -- SERVER_PROTOCOL. - -- - -- Environment variables with names beginning with "HTTP_" contain - -- header data read from the client, if the protocol used was HTTP. - -- The HTTP header name is converted to upper case, has all - -- occurrences of "-" replaced with "_" and has "HTTP_" prepended to - -- give the environment variable name. The header data may be - -- presented as sent by the client, or may be rewritten in ways which - -- do not change its semantics. If multiple headers with the same - -- field-name are received then they must be rewritten as a single - -- header having the same semantics. Similarly, a header that is - -- received on more than one line must be merged onto a single line. - -- The server must, if necessary, change the representation of the - -- data (for example, the character set) to be appropriate for a CGI - -- environment variable. - -- - -- The server is not required to create environment variables for all - -- the headers that it receives. In particular, it may remove any - -- headers carrying authentication information, such as - -- "Authorization"; it may remove headers whose value is available to - -- the script via other variables, such as "Content-Length" and - -- "Content-Type". - -- - -- For convenience it might also include the following CGI entries - deferred - end - -feature -- Access: table - - new_cursor: HASH_TABLE_ITERATION_CURSOR [STRING_8, STRING_8] - -- Fresh cursor associated with current structure - do - create Result.make (table) - end - -feature -- Common Gateway Interface - 1.1 8 January 1996 - - auth_type: detachable STRING - -- This variable is specific to requests made via the "http" - -- scheme. - -- - -- If the Script-URI required access authentication for external - -- access, then the server MUST set the value of this variable - -- from the 'auth-scheme' token in the request's "Authorization" - -- header field. Otherwise it is set to NULL. - -- - -- AUTH_TYPE = "" | auth-scheme - -- auth-scheme = "Basic" | "Digest" | token - -- - -- HTTP access authentication schemes are described in section 11 - -- of the HTTP/1.1 specification [8]. The auth-scheme is not - -- case-sensitive. - -- - -- Servers MUST provide this metavariable to scripts if the - -- request header included an "Authorization" field that was - -- authenticated. - deferred - end - - content_length: detachable STRING - -- This metavariable is set to the size of the message-body - -- entity attached to the request, if any, in decimal number of - -- octets. If no data are attached, then this metavariable is - -- either NULL or not defined. The syntax is the same as for the - -- HTTP "Content-Length" header field (section 14.14, HTTP/1.1 - -- specification [8]). - -- - -- CONTENT_LENGTH = "" | 1*digit - -- - -- Servers MUST provide this metavariable to scripts if the - -- request was accompanied by a message-body entity. - deferred - end - - content_length_value: INTEGER - -- Integer value related to `content_length" - deferred - end - - content_type: detachable STRING - -- If the request includes a message-body, CONTENT_TYPE is set to - -- the Internet Media Type [9] of the attached entity if the type - -- was provided via a "Content-type" field in the request header, - -- or if the server can determine it in the absence of a supplied - -- "Content-type" field. The syntax is the same as for the HTTP - -- "Content-Type" header field. - -- - -- CONTENT_TYPE = "" | media-type - -- media-type = type "/" subtype *( ";" parameter) - -- type = token - -- subtype = token - -- parameter = attribute "=" value - -- attribute = token - -- value = token | quoted-string - -- - -- The type, subtype, and parameter attribute names are not - -- case-sensitive. Parameter values MAY be case sensitive. Media - -- types and their use in HTTP are described in section 3.7 of - -- the HTTP/1.1 specification [8]. - -- - -- Example: - -- - -- application/x-www-form-urlencoded - -- - -- There is no default value for this variable. If and only if it - -- is unset, then the script MAY attempt to determine the media - -- type from the data received. If the type remains unknown, then - -- the script MAY choose to either assume a content-type of - -- application/octet-stream or reject the request with a 415 - -- ("Unsupported Media Type") error. See section 7.2.1.3 for more - -- information about returning error status values. - -- - -- Servers MUST provide this metavariable to scripts if a - -- "Content-Type" field was present in the original request - -- header. If the server receives a request with an attached - -- entity but no "Content-Type" header field, it MAY attempt to - -- determine the correct datatype, or it MAY omit this - -- metavariable when communicating the request information to the - -- script. - deferred - end - - gateway_interface: STRING - -- This metavariable is set to the dialect of CGI being used by - -- the server to communicate with the script. Syntax: - -- - -- GATEWAY_INTERFACE = "CGI" "/" major "." minor - -- major = 1*digit - -- minor = 1*digit - -- - -- Note that the major and minor numbers are treated as separate - -- integers and hence each may be more than a single digit. Thus - -- CGI/2.4 is a lower version than CGI/2.13 which in turn is - -- lower than CGI/12.3. Leading zeros in either the major or the - -- minor number MUST be ignored by scripts and SHOULD NOT be - -- generated by servers. - -- - -- This document defines the 1.1 version of the CGI interface - -- ("CGI/1.1"). - -- - -- Servers MUST provide this metavariable to scripts. - -- - -- The version of the CGI specification to which this server - -- complies. Syntax: - -- - -- GATEWAY_INTERFACE = "CGI" "/" 1*digit "." 1*digit - -- - -- Note that the major and minor numbers are treated as separate - -- integers and that each may be incremented higher than a single - -- digit. Thus CGI/2.4 is a lower version than CGI/2.13 which in - -- turn is lower than CGI/12.3. Leading zeros must be ignored by - -- scripts and should never be generated by servers. - deferred - end - - path_info: STRING assign update_path_info - -- The PATH_INFO metavariable specifies a path to be interpreted - -- by the CGI script. It identifies the resource or sub-resource - -- to be returned by the CGI script, and it is derived from the - -- portion of the URI path following the script name but - -- preceding any query data. The syntax and semantics are similar - -- to a decoded HTTP URL 'path' token (defined in RFC 2396 [4]), - -- with the exception that a PATH_INFO of "/" represents a single - -- void path segment. - -- - -- PATH_INFO = "" | ( "/" path ) - -- path = segment *( "/" segment ) - -- segment = *pchar - -- pchar = - -- - -- The PATH_INFO string is the trailing part of the - -- component of the Script-URI (see section 3.2) that follows the - -- SCRIPT_NAME portion of the path. - -- - -- Servers MAY impose their own restrictions and limitations on - -- what values they will accept for PATH_INFO, and MAY reject or - -- edit any values they consider objectionable before passing - -- them to the script. - -- - -- Servers MUST make this URI component available to CGI scripts. - -- The PATH_INFO value is case-sensitive, and the server MUST - -- preserve the case of the PATH_INFO element of the URI when - -- making it available to scripts. - deferred - end - - path_translated: detachable STRING - -- PATH_TRANSLATED is derived by taking any path-info component - -- of the request URI (see section 6.1.6), decoding it (see - -- section 3.1), parsing it as a URI in its own right, and - -- performing any virtual-to-physical translation appropriate to - -- map it onto the server's document repository structure. If the - -- request URI includes no path-info component, the - -- PATH_TRANSLATED metavariable SHOULD NOT be defined. - -- - -- - -- PATH_TRANSLATED = *CHAR - -- - -- For a request such as the following: - -- - -- http://somehost.com/cgi-bin/somescript/this%2eis%2epath%2einfo - -- - -- the PATH_INFO component would be decoded, and the result - -- parsed as though it were a request for the following: - -- - -- http://somehost.com/this.is.the.path.info - -- - -- This would then be translated to a location in the server's - -- document repository, perhaps a filesystem path something like - -- this: - -- - -- /usr/local/www/htdocs/this.is.the.path.info - -- - -- The result of the translation is the value of PATH_TRANSLATED. - -- - -- The value of PATH_TRANSLATED may or may not map to a valid - -- repository location. Servers MUST preserve the case of the - -- path-info segment if and only if the underlying repository - -- supports case-sensitive names. If the repository is only - -- case-aware, case-preserving, or case-blind with regard to - -- document names, servers are not required to preserve the case - -- of the original segment through the translation. - -- - -- The translation algorithm the server uses to derive - -- PATH_TRANSLATED is implementation defined; CGI scripts which - -- use this variable may suffer limited portability. - -- - -- Servers SHOULD provide this metavariable to scripts if and - -- only if the request URI includes a path-info component. - deferred - end - - query_string: STRING - -- A URL-encoded string; the part of the Script-URI. (See - -- section 3.2.) - -- - -- QUERY_STRING = query-string - -- query-string = *uric - - -- The URL syntax for a query string is described in section 3 of - -- RFC 2396 [4]. - -- - -- Servers MUST supply this value to scripts. The QUERY_STRING - -- value is case-sensitive. If the Script-URI does not include a - -- query component, the QUERY_STRING metavariable MUST be defined - -- as an empty string (""). - deferred - end - - remote_addr: STRING - -- The IP address of the client sending the request to the - -- server. This is not necessarily that of the user agent (such - -- as if the request came through a proxy). - -- - -- REMOTE_ADDR = hostnumber - -- hostnumber = ipv4-address | ipv6-address - - -- The definitions of ipv4-address and ipv6-address are provided - -- in Appendix B of RFC 2373 [13]. - -- - -- Servers MUST supply this value to scripts. - deferred - end - - remote_host: detachable STRING - -- The fully qualified domain name of the client sending the - -- request to the server, if available, otherwise NULL. (See - -- section 6.1.9.) Fully qualified domain names take the form as - -- described in section 3.5 of RFC 1034 [10] and section 2.1 of - -- RFC 1123 [5]. Domain names are not case sensitive. - -- - -- Servers SHOULD provide this information to scripts. - deferred - end - - remote_ident: detachable STRING - -- The identity information reported about the connection by a - -- RFC 1413 [11] request to the remote agent, if available. - -- Servers MAY choose not to support this feature, or not to - -- request the data for efficiency reasons. - -- - -- REMOTE_IDENT = *CHAR - -- - -- The data returned may be used for authentication purposes, but - -- the level of trust reposed in them should be minimal. - -- - -- Servers MAY supply this information to scripts if the RFC1413 - -- [11] lookup is performed. - deferred - end - - remote_user: detachable STRING - -- If the request required authentication using the "Basic" - -- mechanism (i.e., the AUTH_TYPE metavariable is set to - -- "Basic"), then the value of the REMOTE_USER metavariable is - -- set to the user-ID supplied. In all other cases the value of - -- this metavariable is undefined. - -- - -- REMOTE_USER = *OCTET - -- - -- This variable is specific to requests made via the HTTP - -- protocol. - -- - -- Servers SHOULD provide this metavariable to scripts. - deferred - end - - request_method: STRING - -- The REQUEST_METHOD metavariable is set to the method with - -- which the request was made, as described in section 5.1.1 of - -- the HTTP/1.0 specification [3] and section 5.1.1 of the - -- HTTP/1.1 specification [8]. - -- - -- REQUEST_METHOD = http-method - -- http-method = "GET" | "HEAD" | "POST" | "PUT" | "DELETE" - -- | "OPTIONS" | "TRACE" | extension-method - -- extension-method = token - -- - -- The method is case sensitive. CGI/1.1 servers MAY choose to - -- process some methods directly rather than passing them to - -- scripts. - -- - -- This variable is specific to requests made with HTTP. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - script_name: STRING - -- The SCRIPT_NAME metavariable is set to a URL path that could - -- identify the CGI script (rather than the script's output). The - -- syntax and semantics are identical to a decoded HTTP URL - -- 'path' token (see RFC 2396 [4]). - -- - -- SCRIPT_NAME = "" | ( "/" [ path ] ) - -- - -- The SCRIPT_NAME string is some leading part of the - -- component of the Script-URI derived in some implementation - -- defined manner. No PATH_INFO or QUERY_STRING segments (see - -- sections 6.1.6 and 6.1.8) are included in the SCRIPT_NAME - -- value. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_name: STRING - -- The SERVER_NAME metavariable is set to the name of the server, - -- as derived from the part of the Script-URI (see section - -- 3.2). - -- - -- SERVER_NAME = hostname | hostnumber - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_port: INTEGER - -- The SERVER_PORT metavariable is set to the port on which the - -- request was received, as used in the part of the - -- Script-URI. - -- - -- SERVER_PORT = 1*digit - -- - -- If the portion of the script-URI is blank, the actual - -- port number upon which the request was received MUST be - -- supplied. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_protocol: STRING - -- The SERVER_PROTOCOL metavariable is set to the name and - -- revision of the information protocol with which the request - -- arrived. This is not necessarily the same as the protocol - -- version used by the server in its response to the client. - -- - -- SERVER_PROTOCOL = HTTP-Version | extension-version - -- | extension-token - -- HTTP-Version = "HTTP" "/" 1*digit "." 1*digit - -- extension-version = protocol "/" 1*digit "." 1*digit - -- protocol = 1*( alpha | digit | "+" | "-" | "." ) - -- extension-token = token - -- - -- 'protocol' is a version of the part of the - -- Script-URI, but is not identical to it. For example, the - -- scheme of a request may be "https" while the protocol remains - -- "http". The protocol is not case sensitive, but by convention, - -- 'protocol' is in upper case. - -- - -- A well-known extension token value is "INCLUDED", which - -- signals that the current document is being included as part of - -- a composite document, rather than being the direct target of - -- the client request. - -- - -- Servers MUST provide this metavariable to scripts. - deferred - end - - server_software: STRING - -- The SERVER_SOFTWARE metavariable is set to the name and - -- version of the information server software answering the - -- request (and running the gateway). - -- - -- SERVER_SOFTWARE = 1*product - -- product = token [ "/" product-version ] - -- product-version = token - - -- Servers MUST provide this metavariable to scripts. - deferred - end - -feature -- HTTP_* - - http_accept: detachable STRING - -- Contents of the Accept: header from the current request, if there is one. - -- Example: 'Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8' - deferred - end - - http_accept_charset: detachable STRING - -- Contents of the Accept-Charset: header from the current request, if there is one. - -- Example: 'iso-8859-1,*,utf-8'. - deferred - end - - http_accept_encoding: detachable STRING - -- Contents of the Accept-Encoding: header from the current request, if there is one. - -- Example: 'gzip'. - deferred - end - - http_accept_language: detachable STRING - -- Contents of the Accept-Language: header from the current request, if there is one. - -- Example: 'en'. - deferred - end - - http_connection: detachable STRING - -- Contents of the Connection: header from the current request, if there is one. - -- Example: 'Keep-Alive'. - deferred - end - - http_host: detachable STRING - -- Contents of the Host: header from the current request, if there is one. - deferred - end - - http_referer: detachable STRING - -- The address of the page (if any) which referred the user agent to the current page. - -- This is set by the user agent. - -- Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. - -- In short, it cannot really be trusted. - deferred - end - - http_user_agent: detachable STRING - -- Contents of the User-Agent: header from the current request, if there is one. - -- This is a string denoting the user agent being which is accessing the page. - -- A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). - -- Among other things, you can use this value to tailor your page's - -- output to the capabilities of the user agent. - deferred - end - - http_authorization: detachable STRING - -- Contents of the Authorization: header from the current request, if there is one. - deferred - end - -feature -- Extra - - request_uri: STRING - -- The URI which was given in order to access this page; for instance, '/index.html'. - deferred - end - - orig_path_info: detachable STRING - -- Original version of `path_info' before processed by Current environment - deferred - end - -feature {EWSGI_REQUEST} -- Element change - - set_orig_path_info (s: STRING) - -- Set ORIG_PATH_INFO to `s' - require - s_attached: s /= Void - deferred - ensure - same_orig_path_info: orig_path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info) - end - - unset_orig_path_info - -- Unset ORIG_PATH_INFO - deferred - ensure - unset: not has_variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info) - end - - update_path_info (a_path_info: like path_info) - -- Updated PATH_INFO - deferred - ensure - same_path_info: path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.path_info) - end - -invariant - server_name_not_empty: not server_name.is_empty - server_port_set: server_port /= 0 - request_method_attached: request_method /= Void - path_info_attached: path_info /= Void - query_string_attached: query_string /= Void - remote_addr_attached: remote_addr /= Void - - path_info_identical: path_info ~ variable ({EWSGI_ENVIRONMENT_NAMES}.path_info) - -;note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_environment_variables.e b/library/server/ewsgi/src/request/ewsgi_environment_variables.e deleted file mode 100644 index bdb7cdf1..00000000 --- a/library/server/ewsgi/src/request/ewsgi_environment_variables.e +++ /dev/null @@ -1,292 +0,0 @@ -note - description: "Summary description for {EWSGI_ENVIRONMENT_VARIABLES}." - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -class - EWSGI_ENVIRONMENT_VARIABLES - -inherit - EWSGI_ENVIRONMENT - redefine - update_path_info - end - -create - make_with_variables - -feature {NONE} -- Initialization - - make_with_variables (a_vars: HASH_TABLE [STRING, STRING]) - -- Fill with variable from `a_vars' - local - s: detachable STRING - do - create empty_string.make_empty - - create table.make (a_vars.count) - from - a_vars.start - until - a_vars.after - loop - table.force (a_vars.item_for_iteration, a_vars.key_for_iteration) - a_vars.forth - end - - --| QUERY_STRING - query_string := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.query_string, empty_string, False) - - --| REQUEST_METHOD - request_method := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.request_method, empty_string, False) - - --| CONTENT_TYPE - s := variable ({EWSGI_ENVIRONMENT_NAMES}.content_type) - if s /= Void and then not s.is_empty then - content_type := s - else - content_type := Void - end - - --| CONTENT_LENGTH - s := variable ({EWSGI_ENVIRONMENT_NAMES}.content_length) - content_length := s - if s /= Void and then s.is_integer then - content_length_value := s.to_integer - else - --| content_length := 0 - end - - --| PATH_INFO - path_info := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.path_info, empty_string, False) - - --| SERVER_NAME - server_name := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.server_name, empty_string, False) - - --| SERVER_PORT - s := variable ({EWSGI_ENVIRONMENT_NAMES}.server_port) - if s /= Void and then s.is_integer then - server_port := s.to_integer - else - server_port := 80 - end - - --| SCRIPT_NAME - script_name := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.script_name, empty_string, False) - - --| REMOTE_ADDR - remote_addr := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.remote_addr, empty_string, False) - - --| REMOTE_HOST - remote_host := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.remote_host, empty_string, False) - - --| REQUEST_URI - request_uri := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.request_uri, empty_string, False) - end - -feature -- Access - - table: HASH_TABLE [STRING, STRING] - -feature -- Access - - variable (a_name: STRING): detachable STRING - do - Result := table.item (a_name) - end - - has_variable (a_name: STRING): BOOLEAN - do - Result := table.has_key (a_name) - end - -feature {EWSGI_REQUEST, EWSGI_APPLICATION, EWSGI_CONNECTOR} -- Element change - - set_variable (a_name: STRING; a_value: STRING) - do - table.force (a_value, a_name) - end - - unset_variable (a_name: STRING) - do - table.remove (a_name) - end - -feature -- Common Gateway Interface - 1.1 8 January 1996 - - auth_type: detachable STRING - - content_length: detachable STRING - - content_length_value: INTEGER - - content_type: detachable STRING - - gateway_interface: STRING - do - Result := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.gateway_interface, "", False) - end - - path_info: STRING - -- - -- - --| For instance, if the current script was accessed via the URL - --| http://www.example.com/eiffel/path_info.exe/some/stuff?foo=bar, then $_SERVER['PATH_INFO'] would contain /some/stuff. - --| - --| Note that is the PATH_INFO variable does not exists, the `path_info' value will be empty - - path_translated: detachable STRING - do - Result := variable ({EWSGI_ENVIRONMENT_NAMES}.path_translated) - end - - query_string: STRING - - remote_addr: STRING - - remote_host: STRING - - remote_ident: detachable STRING - do - Result := variable ({EWSGI_ENVIRONMENT_NAMES}.remote_ident) - end - - remote_user: detachable STRING - do - Result := variable ({EWSGI_ENVIRONMENT_NAMES}.remote_user) - end - - request_method: STRING - - script_name: STRING - - server_name: STRING - - server_port: INTEGER - - server_protocol: STRING - do - Result := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.server_protocol, "HTTP/1.0", True) - end - - server_software: STRING - do - Result := variable_or_default ({EWSGI_ENVIRONMENT_NAMES}.server_software, "Unknown Server", True) - end - -feature -- HTTP_* - - http_accept: detachable STRING - -- Contents of the Accept: header from the current request, if there is one. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_accept) - end - - http_accept_charset: detachable STRING - -- Contents of the Accept-Charset: header from the current request, if there is one. - -- Example: 'iso-8859-1,*,utf-8'. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_accept_charset) - end - - http_accept_encoding: detachable STRING - -- Contents of the Accept-Encoding: header from the current request, if there is one. - -- Example: 'gzip'. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_accept_encoding) - end - - http_accept_language: detachable STRING - -- Contents of the Accept-Language: header from the current request, if there is one. - -- Example: 'en'. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_accept_language) - end - - http_connection: detachable STRING - -- Contents of the Connection: header from the current request, if there is one. - -- Example: 'Keep-Alive'. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_connection) - end - - http_host: detachable STRING - -- Contents of the Host: header from the current request, if there is one. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_host) - end - - http_referer: detachable STRING - -- The address of the page (if any) which referred the user agent to the current page. - -- This is set by the user agent. - -- Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. - -- In short, it cannot really be trusted. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_referer) - end - - http_user_agent: detachable STRING - -- Contents of the User-Agent: header from the current request, if there is one. - -- This is a string denoting the user agent being which is accessing the page. - -- A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). - -- Among other things, you can use this value to tailor your page's - -- output to the capabilities of the user agent. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_user_agent) - end - - http_authorization: detachable STRING - -- Contents of the Authorization: header from the current request, if there is one. - do - Result := table.item ({EWSGI_ENVIRONMENT_NAMES}.http_authorization) - end - -feature -- Extra - - request_uri: STRING - -- The URI which was given in order to access this page; for instance, '/index.html'. - - orig_path_info: detachable STRING - -- Original version of `path_info' before processed by Current environment - -feature {EWSGI_REQUEST} -- Update - - set_orig_path_info (s: STRING) - do - orig_path_info := s - set_variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info, s) - end - - unset_orig_path_info - do - orig_path_info := Void - unset_variable ({EWSGI_ENVIRONMENT_NAMES}.orig_path_info) - end - - update_path_info (a_path_info: like path_info) - do - path_info := a_path_info - set_variable ({EWSGI_ENVIRONMENT_NAMES}.path_info, a_path_info) - end - -feature {NONE} -- Implementation - - empty_string: STRING - -- Reusable empty string - -invariant - empty_string_unchanged: empty_string.is_empty - -;note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_request.e b/library/server/ewsgi/src/request/ewsgi_request_from_table.e similarity index 58% rename from library/server/ewsgi/src/request/ewsgi_request.e rename to library/server/ewsgi/src/request/ewsgi_request_from_table.e index 3cecdcc7..cb9cf973 100644 --- a/library/server/ewsgi/src/request/ewsgi_request.e +++ b/library/server/ewsgi/src/request/ewsgi_request_from_table.e @@ -1,7 +1,6 @@ note description: "[ - EWSGI interface to represent the Request - + Request instanciated from a hash_table of meta variables ]" specification: "EWSGI specification https://github.com/Eiffel-World/Eiffel-Web-Framework/wiki/EWSGI-specification" legal: "See notice at end of class." @@ -10,6 +9,9 @@ note revision: "$Revision$" class + EWSGI_REQUEST_FROM_TABLE + +inherit EWSGI_REQUEST create @@ -17,14 +19,13 @@ create feature {NONE} -- Initialization - make (env: EWSGI_ENVIRONMENT; a_input: like input) + make (a_vars: HASH_TABLE [STRING, STRING]; a_input: like input) require - env_attached: env /= Void + vars_attached: a_vars /= Void do create error_handler.make input := a_input - environment := env - content_length := env.content_length_value + set_meta_parameters (a_vars) create uploaded_files.make (0) raw_post_data_recorded := True @@ -33,26 +34,93 @@ feature {NONE} -- Initialization analyze end + set_meta_parameters (a_vars: HASH_TABLE [STRING, STRING]) + -- Fill with variable from `a_vars' + local + s: detachable STRING + table: HASH_TABLE [STRING, STRING] + do + create empty_string.make_empty + + create table.make (a_vars.count) + meta_parameters := table + from + a_vars.start + until + a_vars.after + loop + table.force (a_vars.item_for_iteration, a_vars.key_for_iteration) + a_vars.forth + end + + --| QUERY_STRING + query_string := meta_parameter_or_default ({EWSGI_META_NAMES}.query_string, empty_string, False) + + --| REQUEST_METHOD + request_method := meta_parameter_or_default ({EWSGI_META_NAMES}.request_method, empty_string, False) + + --| CONTENT_TYPE + s := meta_parameter ({EWSGI_META_NAMES}.content_type) + if s /= Void and then not s.is_empty then + content_type := s + else + content_type := Void + end + + --| CONTENT_LENGTH + s := meta_parameter ({EWSGI_META_NAMES}.content_length) + content_length := s + if s /= Void and then s.is_integer then + content_length_value := s.to_integer + else + --| content_length := 0 + end + + --| PATH_INFO + path_info := meta_parameter_or_default ({EWSGI_META_NAMES}.path_info, empty_string, False) + + --| SERVER_NAME + server_name := meta_parameter_or_default ({EWSGI_META_NAMES}.server_name, empty_string, False) + + --| SERVER_PORT + s := meta_parameter ({EWSGI_META_NAMES}.server_port) + if s /= Void and then s.is_integer then + server_port := s.to_integer + else + server_port := 80 + end + + --| SCRIPT_NAME + script_name := meta_parameter_or_default ({EWSGI_META_NAMES}.script_name, empty_string, False) + + --| REMOTE_ADDR + remote_addr := meta_parameter_or_default ({EWSGI_META_NAMES}.remote_addr, empty_string, False) + + --| REMOTE_HOST + remote_host := meta_parameter_or_default ({EWSGI_META_NAMES}.remote_host, empty_string, False) + + --| REQUEST_URI + request_uri := meta_parameter_or_default ({EWSGI_META_NAMES}.request_uri, empty_string, False) + end + initialize -- Specific initialization local p: INTEGER - env: like environment do - env := environment --| Here one can set its own environment entries if needed --| do not use `force', to avoid overwriting existing variable - if attached env.request_uri as rq_uri then + if attached request_uri as rq_uri then p := rq_uri.index_of ('?', 1) if p > 0 then - env.set_variable (rq_uri.substring (1, p-1), {EWSGI_ENVIRONMENT_NAMES}.self) + set_meta_parameter (rq_uri.substring (1, p-1), {EWSGI_META_NAMES}.self) else - env.set_variable (rq_uri, {EWSGI_ENVIRONMENT_NAMES}.self) + set_meta_parameter (rq_uri, {EWSGI_META_NAMES}.self) end end - if env.variable ({EWSGI_ENVIRONMENT_NAMES}.request_time) = Void then - env.set_variable (date_time_utilities.unix_time_stamp (Void).out, {EWSGI_ENVIRONMENT_NAMES}.request_time) + if meta_parameter ({EWSGI_META_NAMES}.request_time) = Void then + set_meta_parameter (date_time_utilities.unix_time_stamp (Void).out, {EWSGI_META_NAMES}.request_time) end end @@ -62,15 +130,10 @@ feature {NONE} -- Initialization extract_variables end -feature -- Access: Input - - input: EWSGI_INPUT_STREAM - -- Server input channel - feature -- Status raw_post_data_recorded: BOOLEAN assign set_raw_post_data_recorded - -- Record RAW POST DATA in environment variables + -- Record RAW POST DATA in meta parameters -- otherwise just forget about it -- Default: true --| warning: you might keep in memory big amount of memory ... @@ -86,37 +149,261 @@ feature -- Error handling -- Error handler -- By default initialized to new handler -feature -- Access: environment variables +feature -- Access: Input - environment: EWSGI_ENVIRONMENT - -- Environment variables + input: EWSGI_INPUT_STREAM + -- Server input channel - environment_variable (a_name: STRING): detachable STRING - -- Environment variable related to `a_name' - require - a_name_valid: a_name /= Void and then not a_name.is_empty +feature -- Access extra information + + request_time: detachable DATE_TIME + -- Request time (UTC) do - Result := environment.variable (a_name) + if + attached meta_parameter ({EWSGI_META_NAMES}.request_time) as t and then + t.is_integer_64 + then + Result := date_time_utilities.unix_time_stamp_to_date_time (t.to_integer_64) + end end - content_length: INTEGER - -- Extracted Content-Length value +feature -- Access: CGI meta parameters -feature -- URL parameters + meta_parameters: HASH_TABLE [STRING, READABLE_STRING_GENERAL] + -- CGI Environment parameters - parameters: EWSGI_REQUEST_VARIABLES + meta_parameter (a_name: READABLE_STRING_GENERAL): detachable STRING + -- CGI meta variable related to `a_name' + do + Result := meta_parameters.item (a_name) + end + + meta_parameter_or_default (a_name: READABLE_STRING_GENERAL; a_default: STRING; use_default_when_empty: BOOLEAN): STRING + -- Value for meta parameter `a_name' + -- If not found, return `a_default' + require + a_name_not_empty: a_name /= Void and then not a_name.is_empty + do + if attached meta_parameter (a_name) as s then + if use_default_when_empty and then s.is_empty then + Result := a_default + else + Result := s + end + else + Result := a_default + end + end + + set_meta_parameter (a_name: READABLE_STRING_GENERAL; a_value: STRING) + do + meta_parameters.force (a_value, a_name) + ensure + param_set: meta_parameter (a_name) ~ a_value + end + + unset_meta_parameter (a_name: READABLE_STRING_GENERAL) + do + meta_parameters.remove (a_name) + ensure + param_unset: meta_parameter (a_name) = Void + end + +feature -- Access: CGI meta parameters - 1.1 + + auth_type: detachable STRING + + content_length: detachable STRING + + content_length_value: INTEGER + + content_type: detachable STRING + + gateway_interface: STRING + do + Result := meta_parameter_or_default ({EWSGI_META_NAMES}.gateway_interface, "", False) + end + + path_info: STRING + -- + -- + --| For instance, if the current script was accessed via the URL + --| http://www.example.com/eiffel/path_info.exe/some/stuff?foo=bar, then $_SERVER['PATH_INFO'] would contain /some/stuff. + --| + --| Note that is the PATH_INFO variable does not exists, the `path_info' value will be empty + + path_translated: detachable STRING + do + Result := meta_parameter ({EWSGI_META_NAMES}.path_translated) + end + + query_string: STRING + + remote_addr: STRING + + remote_host: STRING + + remote_ident: detachable STRING + do + Result := meta_parameter ({EWSGI_META_NAMES}.remote_ident) + end + + remote_user: detachable STRING + do + Result := meta_parameter ({EWSGI_META_NAMES}.remote_user) + end + + request_method: STRING + + script_name: STRING + + server_name: STRING + + server_port: INTEGER + + server_protocol: STRING + do + Result := meta_parameter_or_default ({EWSGI_META_NAMES}.server_protocol, "HTTP/1.0", True) + end + + server_software: STRING + do + Result := meta_parameter_or_default ({EWSGI_META_NAMES}.server_software, "Unknown Server", True) + end + +feature -- Access: HTTP_* CGI meta parameters - 1.1 + + http_accept: detachable STRING + -- Contents of the Accept: header from the current request, if there is one. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_accept) + end + + http_accept_charset: detachable STRING + -- Contents of the Accept-Charset: header from the current request, if there is one. + -- Example: 'iso-8859-1,*,utf-8'. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_accept_charset) + end + + http_accept_encoding: detachable STRING + -- Contents of the Accept-Encoding: header from the current request, if there is one. + -- Example: 'gzip'. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_accept_encoding) + end + + http_accept_language: detachable STRING + -- Contents of the Accept-Language: header from the current request, if there is one. + -- Example: 'en'. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_accept_language) + end + + http_connection: detachable STRING + -- Contents of the Connection: header from the current request, if there is one. + -- Example: 'Keep-Alive'. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_connection) + end + + http_host: detachable STRING + -- Contents of the Host: header from the current request, if there is one. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_host) + end + + http_referer: detachable STRING + -- The address of the page (if any) which referred the user agent to the current page. + -- This is set by the user agent. + -- Not all user agents will set this, and some provide the ability to modify HTTP_REFERER as a feature. + -- In short, it cannot really be trusted. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_referer) + end + + http_user_agent: detachable STRING + -- Contents of the User-Agent: header from the current request, if there is one. + -- This is a string denoting the user agent being which is accessing the page. + -- A typical example is: Mozilla/4.5 [en] (X11; U; Linux 2.2.9 i586). + -- Among other things, you can use this value to tailor your page's + -- output to the capabilities of the user agent. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_user_agent) + end + + http_authorization: detachable STRING + -- Contents of the Authorization: header from the current request, if there is one. + do + Result := meta_parameter ({EWSGI_META_NAMES}.http_authorization) + end + +feature -- Access: Extension to CGI meta parameters - 1.1 + + request_uri: STRING + -- The URI which was given in order to access this page; for instance, '/index.html'. + + orig_path_info: detachable STRING + -- Original version of `path_info' before processed by Current environment + +feature {NONE} -- Element change: CGI meta parameter related to PATH_INFO + + set_orig_path_info (s: STRING) + -- Set ORIG_PATH_INFO to `s' + require + s_attached: s /= Void + do + orig_path_info := s + set_meta_parameter ({EWSGI_META_NAMES}.orig_path_info, s) + end + + unset_orig_path_info + -- Unset ORIG_PATH_INFO + do + orig_path_info := Void + unset_meta_parameter ({EWSGI_META_NAMES}.orig_path_info) + ensure + unset: attached meta_parameter ({EWSGI_META_NAMES}.orig_path_info) + end + + update_path_info + -- Fix and update PATH_INFO value if needed + local + l_path_info: STRING + do + l_path_info := path_info + --| Warning + --| on IIS: we might have PATH_INFO = /sample.exe/foo/bar + --| on apache: PATH_INFO = /foo/bar + --| So, we might need to check with SCRIPT_NAME and remove it on IIS + --| store original PATH_INFO in ORIG_PATH_INFO + if l_path_info.is_empty then + unset_orig_path_info + else + set_orig_path_info (l_path_info) + if attached script_name as l_script_name then + if l_path_info.starts_with (l_script_name) then + path_info := l_path_info.substring (l_script_name.count + 1 , l_path_info.count) + end + end + end + end + +feature -- Query parameters + + query_parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Variables extracted from QUERY_STRING local - vars: like internal_parameters + vars: like internal_query_parameters p,e: INTEGER - rq_uri: like environment.request_uri + rq_uri: like request_uri s: detachable STRING do - vars := internal_parameters + vars := internal_query_parameters if vars = Void then - s := environment.query_string + s := query_string if s = Void then - rq_uri := environment.request_uri + rq_uri := request_uri p := rq_uri.index_of ('?', 1) if p > 0 then e := rq_uri.index_of ('#', p + 1) @@ -128,39 +415,80 @@ feature -- URL parameters s := rq_uri.substring (p+1, e) end end - if s /= Void and then not s.is_empty then - create vars.make_from_urlencoded (s, True) - else - create vars.make (0) - end - internal_parameters := vars + vars := urlencoded_parameters (s, True) + internal_query_parameters := vars end Result := vars end - parameter (a_name: STRING): detachable STRING_32 + query_parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Parameter for name `n'. - require - a_name_valid: a_name /= Void and then not a_name.is_empty do - Result := parameters.variable (a_name) + Result := query_parameters.item (a_name) + end + +feature {NONE} -- Query parameters: implementation + + urlencoded_parameters (a_content: detachable READABLE_STRING_8; decoding: BOOLEAN): HASH_TABLE [READABLE_STRING_32, STRING] + -- Import `a_content' + local + n, p, i, j: INTEGER + s: STRING + l_name,l_value: STRING_32 + do + if a_content = Void then + create Result.make (0) + else + n := a_content.count + if n = 0 then + create Result.make (0) + else + create Result.make (3) + from + p := 1 + until + p = 0 + loop + i := a_content.index_of ('&', p) + if i = 0 then + s := a_content.substring (p, n) + p := 0 + else + s := a_content.substring (p, i - 1) + p := i + 1 + end + if not s.is_empty then + j := s.index_of ('=', 1) + if j > 0 then + l_name := s.substring (1, j - 1) + l_value := s.substring (j + 1, s.count) + if decoding then + l_name := url_encoder.decoded_string (l_name) + l_value := url_encoder.decoded_string (l_value) + end + Result.force (l_value, l_name) + end + end + end + end + end end feature -- Form fields and related - form_fields: EWSGI_REQUEST_VARIABLES + form_data_parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Variables sent by POST request local - vars: like internal_form_fields + vars: like internal_form_data_parameters s: STRING n: INTEGER l_type: detachable STRING do - vars := internal_form_fields + vars := internal_form_data_parameters if vars = Void then - n := content_length + n := content_length_value if n > 0 then - l_type := environment.content_type + l_type := content_type if l_type /= Void and then l_type.starts_with ({HTTP_CONSTANTS}.multipart_form) @@ -171,25 +499,23 @@ feature -- Form fields and related analyze_multipart_form (l_type, s, vars) else s := form_input_data (n) - create vars.make_from_urlencoded (s, True) + vars := urlencoded_parameters (s, True) end if raw_post_data_recorded then - vars.add_variable (s, "RAW_POST_DATA") + vars.force (s, "RAW_POST_DATA") end else create vars.make (0) end - internal_form_fields := vars + internal_form_data_parameters := vars end Result := vars end - form_field (a_name: STRING): detachable STRING_32 + form_data_parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Field for name `a_name'. - require - a_name_valid: a_name /= Void and then not a_name.is_empty do - Result := form_fields.variable (a_name) + Result := form_data_parameters.item (a_name) end uploaded_files: HASH_TABLE [EWSGI_UPLOADED_FILE_DATA, STRING] @@ -203,45 +529,8 @@ feature -- Form fields and related feature -- Cookies - cookies_variables: HASH_TABLE [STRING, STRING] + cookies: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Expanded cookies variable - local - l_cookies: like cookies - do - l_cookies := cookies - create Result.make (l_cookies.count) - from - l_cookies.start - until - l_cookies.after - loop - if attached l_cookies.item_for_iteration.variables as vars then - from - vars.start - until - vars.after - loop - Result.force (vars.item_for_iteration, vars.key_for_iteration) - vars.forth - end - else - check same_name: l_cookies.key_for_iteration.same_string (l_cookies.item_for_iteration.name) end - Result.force (l_cookies.item_for_iteration.value, l_cookies.key_for_iteration) - end - l_cookies.forth - end - end - - cookies_variable (a_name: STRING): detachable STRING - -- Field for name `a_name'. - require - a_name_valid: a_name /= Void and then not a_name.is_empty - do - Result := cookies_variables.item (a_name) - end - - cookies: HASH_TABLE [EWSGI_COOKIE, STRING] - -- Cookies Information local i,j,p,n: INTEGER l_cookies: like internal_cookies @@ -249,7 +538,7 @@ feature -- Cookies do l_cookies := internal_cookies if l_cookies = Void then - if attached environment_variable ({EWSGI_ENVIRONMENT_NAMES}.http_cookie) as s then + if attached meta_parameter ({EWSGI_META_NAMES}.http_cookie) as s then create l_cookies.make (5) from n := s.count @@ -272,7 +561,7 @@ feature -- Cookies v := s.substring (i + 1, j - 1) p := j + 1 end - l_cookies.put (create {EWSGI_COOKIE}.make (k,v), k) + l_cookies.force (v, k) end end else @@ -283,72 +572,78 @@ feature -- Cookies Result := l_cookies end + cookie (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 + -- Field for name `a_name'. + do + Result := cookies.item (a_name) + end + feature -- Access: global variable - variables: HASH_TABLE [STRING_32, STRING_32] + parameters: HASH_TABLE [READABLE_STRING_32, READABLE_STRING_GENERAL] -- Table containing all the various variables -- Warning: this is computed each time, if you change the content of other containers -- this won't update this Result's content, unless you query it again local - vars: HASH_TABLE [STRING_GENERAL, STRING_GENERAL] + vars: HASH_TABLE [READABLE_STRING_GENERAL, READABLE_STRING_GENERAL] do create Result.make (100) - vars := environment.table + vars := meta_parameters from vars.start until vars.after loop - Result.put (vars.item_for_iteration, vars.key_for_iteration) + Result.force (vars.item_for_iteration.as_string_32, vars.key_for_iteration) vars.forth end - vars := parameters.table + vars := query_parameters from vars.start until vars.after loop - Result.put (vars.item_for_iteration, vars.key_for_iteration) + Result.force (vars.item_for_iteration.as_string_32, vars.key_for_iteration) vars.forth end - vars := form_fields.table + vars := form_data_parameters from vars.start until vars.after loop - Result.put (vars.item_for_iteration, vars.key_for_iteration) + Result.force (vars.item_for_iteration.as_string_32, vars.key_for_iteration) vars.forth end - vars := cookies_variables + vars := cookies from vars.start until vars.after loop - Result.put (vars.item_for_iteration, vars.key_for_iteration) + Result.force (vars.item_for_iteration.as_string_32, vars.key_for_iteration) vars.forth end end - variable (a_name: STRING_8): detachable STRING_32 + parameter (a_name: READABLE_STRING_GENERAL): detachable READABLE_STRING_32 -- Variable named `a_name' from any of the variables container -- and following a specific order -- execution, environment, get, post, cookies local - s: detachable STRING_GENERAL + s: detachable READABLE_STRING_GENERAL do - s := environment_variable (a_name) + s := meta_parameter (a_name) if s = Void then - s := parameter (a_name) + s := query_parameter (a_name) if s = Void then - s := form_field (a_name) + s := form_data_parameter (a_name) if s = Void then - s := cookies_variable (a_name) + s := cookie (a_name) end end end @@ -357,19 +652,6 @@ feature -- Access: global variable end end -feature -- Access extra information - - request_time: detachable DATE_TIME - -- Request time (UTC) - do - if - attached environment.variable ({EWSGI_ENVIRONMENT_NAMES}.request_time) as t and then - t.is_integer_64 - then - Result := date_time_utilities.unix_time_stamp_to_date_time (t.to_integer_64) - end - end - feature -- Uploaded File Handling is_uploaded_file (a_filename: STRING): BOOLEAN @@ -398,7 +680,7 @@ feature -- URL Utility -- Absolute Url for the script if any, extended by `a_path' do Result := script_url (a_path) - if attached environment.http_host as h then + if attached http_host as h then Result.prepend (h) else --| Issue ?? @@ -410,14 +692,12 @@ feature -- URL Utility local l_base_url: like internal_url_base i,m,n: INTEGER - l_rq_uri: like environment.request_uri - env: like environment + l_rq_uri: like request_uri do l_base_url := internal_url_base if l_base_url = Void then - env := environment - if attached env.script_name as l_script_name then - l_rq_uri := env.request_uri + if attached script_name as l_script_name then + l_rq_uri := request_uri if l_rq_uri.starts_with (l_script_name) then l_base_url := l_script_name else @@ -466,29 +746,6 @@ feature -- Element change error_handler := ehdl end - update_path_info (env: EWSGI_ENVIRONMENT) - -- Fix and update PATH_INFO value if needed - local - l_path_info: STRING - do - l_path_info := env.path_info - --| Warning - --| on IIS: we might have PATH_INFO = /sample.exe/foo/bar - --| on apache: PATH_INFO = /foo/bar - --| So, we might need to check with SCRIPT_NAME and remove it on IIS - --| store original PATH_INFO in ORIG_PATH_INFO - if l_path_info.is_empty then - env.unset_orig_path_info - else - env.set_orig_path_info (l_path_info) - if attached env.script_name as l_script_name then - if l_path_info.starts_with (l_script_name) then - env.path_info := l_path_info.substring (l_script_name.count + 1 , l_path_info.count) - end - end - end - end - feature {NONE} -- Temporary File handling delete_uploaded_file (uf: EWSGI_UPLOADED_FILE_DATA) @@ -605,7 +862,7 @@ feature {NONE} -- Temporary File handling feature {NONE} -- Implementation: Form analyzer - analyze_multipart_form (t: STRING; s: STRING; vars: like form_fields) + analyze_multipart_form (t: STRING; s: STRING; vars: like form_data_parameters) -- Analyze multipart form content --| FIXME[2011-06-21]: integrate eMIME parser library require @@ -671,7 +928,7 @@ feature {NONE} -- Implementation: Form analyzer end end - analyze_multipart_form_input (s: STRING; vars_post: like form_fields) + analyze_multipart_form_input (s: STRING; vars_post: like form_data_parameters) -- Analyze multipart entry require s_not_empty: s /= Void and then not s.is_empty @@ -778,7 +1035,7 @@ feature {NONE} -- Implementation: Form analyzer save_uploaded_file (l_content, l_up_file_info) uploaded_files.force (l_up_file_info, l_name) else - vars_post.add_variable (l_content, l_name) + vars_post.force (l_content, l_name) end else error_handler.add_custom_error (0, "unamed multipart entry", Void) @@ -818,10 +1075,10 @@ feature {NONE} -- Internal value end end - internal_parameters: detachable like parameters - -- cached value for `parameters' + internal_query_parameters: detachable like query_parameters + -- cached value for `query_parameters' - internal_form_fields: detachable like form_fields + internal_form_data_parameters: detachable like form_data_parameters -- cached value for `form_fields' internal_cookies: detachable like cookies @@ -856,39 +1113,50 @@ feature {NONE} -- Implementation end extract_variables - -- Extract relevant environment variables + -- Extract relevant meta parameters local s: detachable STRING do - s := environment.request_uri + s := request_uri if s.is_empty then report_bad_request_error ("Missing URI") end if not has_error then - s := environment.request_method + s := request_method if s.is_empty then report_bad_request_error ("Missing request method") end end if not has_error then - s := environment.http_host + s := http_host if s = Void or else s.is_empty then report_bad_request_error ("Missing host header") end end if not has_error then - update_path_info (environment) + update_path_info end end feature {NONE} -- Implementation: utilities + empty_string: STRING + -- Reusable empty string + + url_encoder: URL_ENCODER + once + create Result + end + date_time_utilities: HTTP_DATE_TIME_UTILITIES -- Utilities classes related to date and time. once create Result end +invariant + empty_string_unchanged: empty_string.is_empty + note copyright: "2011-2011, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" diff --git a/library/server/ewsgi/src/request/ewsgi_request_variables.e b/library/server/ewsgi/src/request/ewsgi_request_variables.e deleted file mode 100644 index 236dc135..00000000 --- a/library/server/ewsgi/src/request/ewsgi_request_variables.e +++ /dev/null @@ -1,147 +0,0 @@ -note - description: "[ - Variables/field related to the current request. - ]" - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -class - EWSGI_REQUEST_VARIABLES - -inherit - EWSGI_VARIABLES [STRING_32] - -create - make, - make_from_urlencoded - -feature -- Initialization - - make (n: INTEGER) - do - create table.make (n) - table.compare_objects - end - - make_from_urlencoded (a_content: STRING; decoding: BOOLEAN) - do - make (a_content.occurrences ('&') + 1) - import_urlencoded (a_content, decoding) - end - -feature -- Status report - - count: INTEGER - -- Variables count - do - Result := table.count - end - - variable (a_name: STRING): detachable STRING_32 - do - Result := table.item (a_name) - end - - has_variable (a_name: STRING): BOOLEAN - do - Result := table.has (a_name) - end - -feature {EWSGI_REQUEST, EWSGI_APPLICATION, EWSGI_CONNECTOR} -- Element change - - set_variable (a_name: STRING; a_value: STRING_32) - do - table.force (a_value, a_name) - end - - unset_variable (a_name: STRING) - do - table.remove (a_name) - end - -feature -- Import urlencoded - - import_urlencoded (a_content: STRING; decoding: BOOLEAN) - -- Import `a_content' - local - n, p, i, j: INTEGER - s: STRING - l_name,l_value: STRING_32 - do - n := a_content.count - if n > 0 then - from - p := 1 - until - p = 0 - loop - i := a_content.index_of ('&', p) - if i = 0 then - s := a_content.substring (p, n) - p := 0 - else - s := a_content.substring (p, i - 1) - p := i + 1 - end - if not s.is_empty then - j := s.index_of ('=', 1) - if j > 0 then - l_name := s.substring (1, j - 1) - l_value := s.substring (j + 1, s.count) - if decoding then - l_name := url_encoder.decoded_string (l_name) - l_value := url_encoder.decoded_string (l_value) - end - add_variable (l_value, l_name) - end - end - end - end - end - -feature -- Access: table - - new_cursor: HASH_TABLE_ITERATION_CURSOR [STRING_32, STRING_32] - -- Fresh cursor associated with current structure - do - create Result.make (table) - end - -feature {EWSGI_REQUEST} -- Element change - - add_variable (v: STRING_32; k: STRING_32) - -- Added `k,v' to variables table - -- Not exported to common client - -- Simulate Read Only Access - require - k_attached: k /= Void - v_attached: v /= Void - do - table.force (v, k) - end - -feature {EWSGI_REQUEST} -- Element change - - table: HASH_TABLE [STRING_32, STRING_32] - -- Variables table - -feature {NONE} -- Implementation - - url_encoder: URL_ENCODER - once - create Result - end - -note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_uploaded_file_data.e b/library/server/ewsgi/src/request/ewsgi_uploaded_file_data.e deleted file mode 100644 index a8f2ea36..00000000 --- a/library/server/ewsgi/src/request/ewsgi_uploaded_file_data.e +++ /dev/null @@ -1,103 +0,0 @@ -note - description: "Summary description for {GW_UPLOADED_FILE}." - author: "" - date: "$Date$" - revision: "$Revision$" - -class - EWSGI_UPLOADED_FILE_DATA - -create - make - -feature {NONE} -- Initialization - - make (n: like name; t: like content_type; s: like size) - do - name := n - content_type := t - size := s - end - -feature -- Access - - name: STRING - -- original filename - - content_type: STRING - -- Content type - - size: INTEGER - -- Size of uploaded file - - tmp_name: detachable STRING - -- Filename of tmp file - - tmp_basename: detachable STRING - -- Basename of tmp file - -feature -- Basic operation - - move_to (a_destination: STRING): BOOLEAN - -- Move current uploaded file to `a_destination' - require - has_no_error: not has_error - local - f: RAW_FILE - do - if attached tmp_name as n then - create f.make (n) - if f.exists then - f.change_name (a_destination) - Result := True - end - end - end - -feature -- Status - - has_error: BOOLEAN - -- Has error during uploading - do - Result := error /= 0 - end - - error: INTEGER - -- Eventual error code - --| no error => 0 - -feature -- Element change - - set_error (e: like error) - -- Set `error' to `e' - do - error := e - end - - set_tmp_name (n: like tmp_name) - -- Set `tmp_name' to `n' - do - tmp_name := n - end - - set_tmp_basename (n: like tmp_basename) - -- Set `tmp_basename' to `n' - do - tmp_basename := n - end - -invariant - - valid_tmp_name: not has_error implies attached tmp_name as n and then not n.is_empty - -note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/request/ewsgi_variables.e b/library/server/ewsgi/src/request/ewsgi_variables.e deleted file mode 100644 index 048270e7..00000000 --- a/library/server/ewsgi/src/request/ewsgi_variables.e +++ /dev/null @@ -1,80 +0,0 @@ -note - description : "[ - Interface to access the variable stored in a container - ]" - legal: "See notice at end of class." - status: "See notice at end of class." - date: "$Date$" - revision: "$Revision$" - -deferred class - EWSGI_VARIABLES [G -> STRING_GENERAL] - -inherit - ITERABLE [G] - -feature -- Status report - - has_variable (a_name: STRING): BOOLEAN - -- Has variable associated with `a_name' - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - deferred - end - -feature -- Access - - variable (a_name: STRING): detachable G - -- Value for variable associated with `a_name' - -- If not found, return Void - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - deferred - end - - variable_or_default (a_name: STRING; a_default: G; use_default_when_empty: BOOLEAN): G - -- Value for variable `a_name' - -- If not found, return `a_default' - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - do - if attached variable (a_name) as s then - if use_default_when_empty and then s.is_empty then - Result := a_default - else - Result := s - end - else - Result := a_default - end - end - -feature {EWSGI_REQUEST, EWSGI_APPLICATION, EWSGI_CONNECTOR} -- Element change - - set_variable (a_name: STRING; a_value: G) - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - deferred - ensure - variable_set: has_variable (a_name) and then variable (a_name) ~ a_value - end - - unset_variable (a_name: STRING) - require - a_name_not_empty: a_name /= Void and then not a_name.is_empty - deferred - ensure - variable_unset: not has_variable (a_name) - end - -note - copyright: "2011-2011, Eiffel Software and others" - license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" - source: "[ - Eiffel Software - 5949 Hollister Ave., Goleta, CA 93117 USA - Telephone 805-685-1006, Fax 805-685-6869 - Website http://www.eiffel.com - Customer support http://support.eiffel.com - ]" -end diff --git a/library/server/ewsgi/src/response/ewsgi_response_buffer.e b/library/server/ewsgi/src/response/ewsgi_response_buffer.e index 1ee7f5a0..f0b7140a 100644 --- a/library/server/ewsgi/src/response/ewsgi_response_buffer.e +++ b/library/server/ewsgi/src/response/ewsgi_response_buffer.e @@ -10,7 +10,7 @@ note class EWSGI_RESPONSE_BUFFER -create {EWSGI_APPLICATION} +create make feature {NONE} -- Initialization diff --git a/library/server/request/router/src/context/request_handler_context.e b/library/server/request/router/src/context/request_handler_context.e index ca92756f..4791b690 100644 --- a/library/server/request/router/src/context/request_handler_context.e +++ b/library/server/request/router/src/context/request_handler_context.e @@ -28,9 +28,9 @@ feature -- Access s: detachable STRING i,n: INTEGER do - Result := request.environment.content_type + Result := request.content_type if Result = Void then - s := request.environment.http_accept + s := request.http_accept if s /= Void then if attached accepted_content_types (request) as l_accept_lst then from @@ -61,18 +61,18 @@ feature -- Access feature -- Query - path_parameter (a_name: STRING): detachable STRING_32 + path_parameter (a_name: STRING): detachable READABLE_STRING_32 -- Parameter value for path variable `a_name' deferred end - query_parameter (a_name: STRING): detachable STRING_32 + query_parameter (a_name: STRING): detachable READABLE_STRING_32 -- Parameter value for query variable `a_name' --| i.e after the ? character deferred end - parameter (a_name: STRING): detachable STRING_32 + parameter (a_name: STRING): detachable READABLE_STRING_32 -- Any parameter value for variable `a_name' -- URI template parameter and query parameters do diff --git a/library/server/request/router/src/context/request_uri_handler_context.e b/library/server/request/router/src/context/request_uri_handler_context.e index 1cbecbce..cd3611d9 100644 --- a/library/server/request/router/src/context/request_uri_handler_context.e +++ b/library/server/request/router/src/context/request_uri_handler_context.e @@ -27,7 +27,7 @@ feature -- Query do end - query_parameter (a_name: STRING): detachable STRING_32 + query_parameter (a_name: STRING): detachable READABLE_STRING_32 do Result := request.parameter (a_name) end diff --git a/library/server/request/router/src/context/request_uri_template_handler_context.e b/library/server/request/router/src/context/request_uri_template_handler_context.e index 678e35b8..57c4a855 100644 --- a/library/server/request/router/src/context/request_uri_template_handler_context.e +++ b/library/server/request/router/src/context/request_uri_template_handler_context.e @@ -31,12 +31,12 @@ feature -- Access feature -- Query - path_parameter (a_name: STRING): detachable STRING_32 + path_parameter (a_name: STRING): detachable READABLE_STRING_32 do Result := uri_template_match.url_decoded_path_variable (a_name) end - query_parameter (a_name: STRING): detachable STRING_32 + query_parameter (a_name: STRING): detachable READABLE_STRING_32 do Result := uri_template_match.url_decoded_query_variable (a_name) if Result = Void then diff --git a/library/server/request/router/src/handler/request_handler.e b/library/server/request/router/src/handler/request_handler.e index 7a72c8c5..9174d004 100644 --- a/library/server/request/router/src/handler/request_handler.e +++ b/library/server/request/router/src/handler/request_handler.e @@ -24,7 +24,7 @@ feature -- Status report is_valid_context (req: EWSGI_REQUEST): BOOLEAN -- Is `req' valid context for current handler? do - Result := request_method_name_supported (req.environment.request_method) + Result := request_method_name_supported (req.request_method) end feature -- Execution @@ -37,7 +37,7 @@ feature -- Execution rescued: BOOLEAN do if not rescued then - if request_method_name_supported (req.environment.request_method) then + if request_method_name_supported (req.request_method) then pre_execute (req) execute_application (a_hdl_context, req, res) post_execute (req, res) @@ -165,12 +165,12 @@ feature -- Execution: report s := args if s /= Void and then s.count > 0 then if s[1] /= '/' then - s := req.environment.request_uri + "/" + s + s := req.request_uri + "/" + s else - s := req.environment.request_uri + s + s := req.request_uri + s end else - s := req.environment.request_uri + s := req.request_uri end if abs then Result := req.absolute_script_url (s) diff --git a/library/server/request/router/src/router/request_router.e b/library/server/request/router/src/router/request_router.e index acb22f4c..4f7f8c45 100644 --- a/library/server/request/router/src/router/request_router.e +++ b/library/server/request/router/src/router/request_router.e @@ -63,10 +63,10 @@ feature {NONE} -- Access: Implementation handler (req: EWSGI_REQUEST): detachable TUPLE [handler: REQUEST_HANDLER; context: REQUEST_HANDLER_CONTEXT] -- Handler whose map matched with `req' require - req_valid: req /= Void and then req.environment.path_info /= Void + req_valid: req /= Void and then req.path_info /= Void deferred ensure - req_path_info_unchanged: req.environment.path_info.same_string (old req.environment.path_info) + req_path_info_unchanged: req.path_info.same_string (old req.path_info) end feature {NONE} -- Implementation diff --git a/library/server/request/router/src/router/request_uri_template_router.e b/library/server/request/router/src/router/request_uri_template_router.e index d5a43d33..94d9ba45 100644 --- a/library/server/request/router/src/router/request_uri_template_router.e +++ b/library/server/request/router/src/router/request_uri_template_router.e @@ -52,7 +52,7 @@ feature {NONE} -- Access: Implementation t: STRING p: STRING do - p := req.environment.request_uri + p := req.request_uri from l_handlers := handlers l_handlers.start @@ -77,7 +77,7 @@ feature -- Context factory if p /= Void then create Result.make (req, tpl, tpl_res, p) else - create Result.make (req, tpl, tpl_res, req.environment.path_info) + create Result.make (req, tpl, tpl_res, req.path_info) end end diff --git a/library/server/request/router/src/utility/request_format_utility.e b/library/server/request/router/src/utility/request_format_utility.e index 225d24f0..780c9b14 100644 --- a/library/server/request/router/src/utility/request_format_utility.e +++ b/library/server/request/router/src/utility/request_format_utility.e @@ -17,7 +17,7 @@ feature -- Access lst: LIST [STRING] qs: QUICK_SORTER [STRING] do - l_accept := req.environment.http_accept + l_accept := req.http_accept --TEST l_accept := "text/html,application/xhtml+xml;q=0.6,application/xml;q=0.2,text/plain;q=0.5,*/*;q=0.8" if l_accept /= Void then