Removed http classes related to http expectations.
Updated code based on the code review. Still work in progress
This commit is contained in:
@@ -1,51 +0,0 @@
|
|||||||
note
|
|
||||||
description: "Summary description for {HTTP_CLIENT_HEADER_EXPECTATION}."
|
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
|
||||||
revision: "$Revision$"
|
|
||||||
|
|
||||||
class
|
|
||||||
HTTP_CLIENT_HEADER_EXPECTATION
|
|
||||||
inherit
|
|
||||||
HTTP_CLIENT_RESPONSE_EXPECTATION
|
|
||||||
create
|
|
||||||
make
|
|
||||||
|
|
||||||
feature {NONE} -- Initializtion
|
|
||||||
make (a_header: STRING_32; a_value : STRING)
|
|
||||||
-- Create and Initialize a header expectation
|
|
||||||
do
|
|
||||||
header := a_header
|
|
||||||
value := a_value
|
|
||||||
ensure
|
|
||||||
header_set : header ~ a_header
|
|
||||||
value_set : value ~ a_value
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Result expected
|
|
||||||
expected (resp: HTTP_CLIENT_RESPONSE): BOOLEAN
|
|
||||||
-- is `header name and value expected' equals to resp.header(name)?
|
|
||||||
do
|
|
||||||
if attached {READABLE_STRING_8} resp.header (header) as l_value then
|
|
||||||
if l_value.same_string (l_value) then
|
|
||||||
Result := true
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
header : STRING
|
|
||||||
-- header name
|
|
||||||
value : STRING
|
|
||||||
-- header value
|
|
||||||
;note
|
|
||||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, 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
|
|
||||||
@@ -1,48 +0,0 @@
|
|||||||
note
|
|
||||||
description: "Summary description for {HTTP_CLIENT_RESPONSE_BODY_EXPECTATION}."
|
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
|
||||||
revision: "$Revision$"
|
|
||||||
|
|
||||||
class
|
|
||||||
HTTP_CLIENT_RESPONSE_BODY_EXPECTATION
|
|
||||||
inherit
|
|
||||||
HTTP_CLIENT_RESPONSE_EXPECTATION
|
|
||||||
create
|
|
||||||
make
|
|
||||||
|
|
||||||
feature {NONE} -- Initializtion
|
|
||||||
make (a_body : detachable STRING_32)
|
|
||||||
-- Create and Initialize a body expectation
|
|
||||||
do
|
|
||||||
body := a_body
|
|
||||||
ensure
|
|
||||||
body_set : body ~ a_body
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Result expected
|
|
||||||
expected (resp: HTTP_CLIENT_RESPONSE): BOOLEAN
|
|
||||||
-- is `body expected' equals to resp.body?
|
|
||||||
do
|
|
||||||
if body = Void and then resp.body = Void then
|
|
||||||
Result := True
|
|
||||||
elseif attached resp.body as l_body and then attached body as c_body then
|
|
||||||
Result := l_body.is_case_insensitive_equal (c_body)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
body : detachable STRING_32
|
|
||||||
-- expected body
|
|
||||||
|
|
||||||
;note
|
|
||||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, 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
|
|
||||||
@@ -1,27 +0,0 @@
|
|||||||
note
|
|
||||||
description: "Summary description for {HTTP_CLIENT_RESPONSE_EXPECTATION}."
|
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
|
||||||
revision: "$Revision$"
|
|
||||||
|
|
||||||
deferred class
|
|
||||||
HTTP_CLIENT_RESPONSE_EXPECTATION
|
|
||||||
|
|
||||||
feature
|
|
||||||
|
|
||||||
expected (resp: HTTP_CLIENT_RESPONSE): BOOLEAN
|
|
||||||
deferred
|
|
||||||
end
|
|
||||||
|
|
||||||
note
|
|
||||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, 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
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
note
|
|
||||||
description: "Summary description for {HTTP_CLIENT_RESPONSE_STATUS_CODE_EXPECTATION}."
|
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
|
||||||
revision: "$Revision$"
|
|
||||||
|
|
||||||
class
|
|
||||||
HTTP_CLIENT_RESPONSE_STATUS_CODE_EXPECTATION
|
|
||||||
inherit
|
|
||||||
HTTP_CLIENT_RESPONSE_EXPECTATION
|
|
||||||
|
|
||||||
create make
|
|
||||||
|
|
||||||
feature {NONE} -- Initialization
|
|
||||||
make (a_status : INTEGER_32)
|
|
||||||
do
|
|
||||||
status := a_status
|
|
||||||
ensure
|
|
||||||
status_set : status = a_status
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Result Expected
|
|
||||||
expected (resp: HTTP_CLIENT_RESPONSE): BOOLEAN
|
|
||||||
-- is `status' expected equals to resp.status?
|
|
||||||
do
|
|
||||||
Result := status = resp.status
|
|
||||||
end
|
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
status : INTEGER_32
|
|
||||||
-- status expected
|
|
||||||
;note
|
|
||||||
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, 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
|
|
||||||
@@ -1,121 +0,0 @@
|
|||||||
note
|
|
||||||
description: "Summary description for {TEST_HTTP_CLIENT_WITH_HTTPBIN}."
|
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
|
||||||
revision: "$Revision$"
|
|
||||||
EIS: "name=HTTP TESTING", "protocol=uri", "src=http://httpbin.org/"
|
|
||||||
|
|
||||||
class
|
|
||||||
TEST_HTTP_CLIENT_WITH_HTTPBIN
|
|
||||||
|
|
||||||
inherit
|
|
||||||
EQA_TEST_SET
|
|
||||||
|
|
||||||
feature
|
|
||||||
test_origin_ip
|
|
||||||
local
|
|
||||||
h: LIBCURL_HTTP_CLIENT
|
|
||||||
sess: HTTP_CLIENT_SESSION
|
|
||||||
resp : detachable HTTP_CLIENT_RESPONSE
|
|
||||||
l_location : detachable READABLE_STRING_8
|
|
||||||
body : STRING
|
|
||||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
|
||||||
s: READABLE_STRING_8
|
|
||||||
do
|
|
||||||
create h.make
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
resp := sess.get ("",void)
|
|
||||||
assert ("Expected Status 200 ok", resp.status = 200)
|
|
||||||
end
|
|
||||||
|
|
||||||
test_status_code
|
|
||||||
local
|
|
||||||
h: LIBCURL_HTTP_CLIENT
|
|
||||||
sess: HTTP_CLIENT_SESSION
|
|
||||||
resp : detachable HTTP_CLIENT_RESPONSE
|
|
||||||
l_location : detachable READABLE_STRING_8
|
|
||||||
body : STRING
|
|
||||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
|
||||||
s: READABLE_STRING_8
|
|
||||||
do
|
|
||||||
create h.make
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
assert ("Expected Status 200 ok", (create {HTTP_CLIENT_RESPONSE_STATUS_CODE_EXPECTATION}.make(200)).expected(sess.get ("",void)) )
|
|
||||||
end
|
|
||||||
|
|
||||||
test_body
|
|
||||||
local
|
|
||||||
h: LIBCURL_HTTP_CLIENT
|
|
||||||
sess: HTTP_CLIENT_SESSION
|
|
||||||
resp : detachable HTTP_CLIENT_RESPONSE
|
|
||||||
l_location : detachable READABLE_STRING_8
|
|
||||||
body : STRING
|
|
||||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
|
||||||
s: READABLE_STRING_8
|
|
||||||
do
|
|
||||||
create h.make
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
assert ("Expected no body", (create {HTTP_CLIENT_RESPONSE_BODY_EXPECTATION}.make(expected_body_get)).expected(sess.get ("get",void)) )
|
|
||||||
end
|
|
||||||
|
|
||||||
test_body_status
|
|
||||||
local
|
|
||||||
h: LIBCURL_HTTP_CLIENT
|
|
||||||
sess: HTTP_CLIENT_SESSION
|
|
||||||
resp : detachable HTTP_CLIENT_RESPONSE
|
|
||||||
l_location : detachable READABLE_STRING_8
|
|
||||||
body : STRING
|
|
||||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
|
||||||
s: READABLE_STRING_8
|
|
||||||
do
|
|
||||||
create h.make
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
--assert ("Expected no body", (create {HTTP_CLIENT_RESPONSE_STATUS_CODE_EXPECTATION}.make(200) + create {HTTP_CLIENT_RESPONSE_BODY_EXPECTATION}.make(expected_body_get)).expected(sess.get ("get",void)) )
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
test_after_post_should_continue_working
|
|
||||||
local
|
|
||||||
h: LIBCURL_HTTP_CLIENT
|
|
||||||
sess: HTTP_CLIENT_SESSION
|
|
||||||
resp : detachable HTTP_CLIENT_RESPONSE
|
|
||||||
l_location : detachable READABLE_STRING_8
|
|
||||||
body : STRING
|
|
||||||
context : HTTP_CLIENT_REQUEST_CONTEXT
|
|
||||||
s: READABLE_STRING_8
|
|
||||||
do
|
|
||||||
create h.make
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
resp := sess.get ("",void)
|
|
||||||
assert ("Expected Status 200 ok", resp.status = 200)
|
|
||||||
|
|
||||||
create context.make
|
|
||||||
context.headers.put ("text/plain;charset=UTF-8", "Content-Type")
|
|
||||||
resp := sess.post ("post", context, "testing post")
|
|
||||||
assert ("Expected Status 200 ok", resp.status = 200)
|
|
||||||
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
resp := sess.get ("",void)
|
|
||||||
assert ("Expected Status 200 ok", resp.status = 200)
|
|
||||||
|
|
||||||
sess := h.new_session ("http://httpbin.org/")
|
|
||||||
resp := sess.get ("redirect/1",void)
|
|
||||||
assert ("Expected Status 200 ok", resp.status = 200)
|
|
||||||
|
|
||||||
end
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
expected_body_get : STRING_32 = "[
|
|
||||||
{
|
|
||||||
"url": "http://httpbin.org/get",
|
|
||||||
"args": {},
|
|
||||||
"headers": {
|
|
||||||
"Host": "httpbin.org",
|
|
||||||
"Connection": "close",
|
|
||||||
"Accept": "*/*"
|
|
||||||
},
|
|
||||||
"origin": "190.177.106.187"
|
|
||||||
}
|
|
||||||
]"
|
|
||||||
end
|
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {CONNEG_SERVER_SIDE}. Utility class to support Server Side Content Negotiation "
|
description: "Summary description for {CONNEG_SERVER_SIDE}. Utility class to support Server Side Content Negotiation "
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
description: "[
|
description: "[
|
||||||
@@ -44,48 +43,48 @@ feature -- Initialization
|
|||||||
feature -- AccessServer Side Defaults Formats
|
feature -- AccessServer Side Defaults Formats
|
||||||
|
|
||||||
mime_default: READABLE_STRING_8
|
mime_default: READABLE_STRING_8
|
||||||
-- Media types which are acceptable for the response
|
-- Media type which is acceptable for the response.
|
||||||
|
|
||||||
language_default: READABLE_STRING_8
|
language_default: READABLE_STRING_8
|
||||||
-- Set of natural languages that are preferred as a response to the request
|
-- Natural language that is preferred as a response to the request.
|
||||||
|
|
||||||
charset_default: READABLE_STRING_8
|
charset_default: READABLE_STRING_8
|
||||||
-- Character sets are acceptable for the response.
|
-- Character set that is acceptable for the response.
|
||||||
|
|
||||||
encoding_default: READABLE_STRING_8
|
encoding_default: READABLE_STRING_8
|
||||||
-- Content-codings that are acceptable in the response.
|
-- Content-coding that is acceptable in the response.
|
||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
set_mime_default (a_mime: READABLE_STRING_8)
|
set_mime_default (a_mime: READABLE_STRING_8)
|
||||||
-- set the mime_default with `a_mime'
|
-- Set the mime_default with `a_mime'
|
||||||
do
|
do
|
||||||
mime_default := a_mime
|
mime_default := a_mime
|
||||||
ensure
|
ensure
|
||||||
set_mime_default: a_mime = mime_default
|
mime_default_set: a_mime = mime_default
|
||||||
end
|
end
|
||||||
|
|
||||||
set_language_default (a_language: READABLE_STRING_8)
|
set_language_default (a_language: READABLE_STRING_8)
|
||||||
-- set the language_default with `a_language'
|
-- Set the language_default with `a_language'
|
||||||
do
|
do
|
||||||
language_default := a_language
|
language_default := a_language
|
||||||
ensure
|
ensure
|
||||||
set_language: a_language = language_default
|
language_default_set: a_language = language_default
|
||||||
end
|
end
|
||||||
|
|
||||||
set_charset_default (a_charset: READABLE_STRING_8)
|
set_charset_default (a_charset: READABLE_STRING_8)
|
||||||
-- set the charset_default with `a_charset'
|
-- Set the charset_default with `a_charset'
|
||||||
do
|
do
|
||||||
charset_default := a_charset
|
charset_default := a_charset
|
||||||
ensure
|
ensure
|
||||||
set_charset: a_charset = charset_default
|
charset_default_set: a_charset = charset_default
|
||||||
end
|
end
|
||||||
|
|
||||||
set_encoding_default (a_encoding: READABLE_STRING_8)
|
set_encoding_default (a_encoding: READABLE_STRING_8)
|
||||||
do
|
do
|
||||||
encoding_default := a_encoding
|
encoding_default := a_encoding
|
||||||
ensure
|
ensure
|
||||||
set_encoding: a_encoding = encoding_default
|
encoding_default_set: a_encoding = encoding_default
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -95,8 +94,8 @@ feature -- Media Type Negotiation
|
|||||||
media_type_preference (a_mime_types_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): MEDIA_TYPE_VARIANT_RESULTS
|
media_type_preference (a_mime_types_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): MEDIA_TYPE_VARIANT_RESULTS
|
||||||
-- `a_mime_types_supported' represent media types supported by the server.
|
-- `a_mime_types_supported' represent media types supported by the server.
|
||||||
-- `a_header represent' the Accept header, ie, the client preferences.
|
-- `a_header represent' the Accept header, ie, the client preferences.
|
||||||
-- Return which media type to use for representaion in a response, if the server support
|
-- Return which media type to use for representation in a response, if the server supports
|
||||||
-- one media type, or empty in other case.
|
-- the requested media type, or empty in other case.
|
||||||
note
|
note
|
||||||
EIS: "name=media type", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
|
EIS: "name=media type", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
|
||||||
local
|
local
|
||||||
@@ -106,17 +105,17 @@ feature -- Media Type Negotiation
|
|||||||
if a_header = Void or else a_header.is_empty then
|
if a_header = Void or else a_header.is_empty then
|
||||||
-- the request has no Accept header, ie the header is empty, in this case we use the default format
|
-- the request has no Accept header, ie the header is empty, in this case we use the default format
|
||||||
Result.set_acceptable (TRUE)
|
Result.set_acceptable (TRUE)
|
||||||
Result.set_media_type (mime_default)
|
Result.set_type (mime_default)
|
||||||
else
|
else
|
||||||
-- select the best match, server support, client preferences
|
-- select the best match, server support, client preferences
|
||||||
l_mime_match := mime.best_match (a_mime_types_supported, a_header)
|
l_mime_match := mime.best_match (a_mime_types_supported, a_header)
|
||||||
if l_mime_match.is_empty then
|
if l_mime_match.is_empty then
|
||||||
-- The server does not support any of the media types prefered by the client
|
-- The server does not support any of the media types preferred by the client
|
||||||
Result.set_acceptable (False)
|
Result.set_acceptable (False)
|
||||||
Result.set_supported_variants (a_mime_types_supported)
|
Result.set_supported_variants (a_mime_types_supported)
|
||||||
else
|
else
|
||||||
-- Set the best match
|
-- Set the best match
|
||||||
Result.set_media_type (l_mime_match)
|
Result.set_type (l_mime_match)
|
||||||
Result.set_acceptable (True)
|
Result.set_acceptable (True)
|
||||||
Result.set_variant_header
|
Result.set_variant_header
|
||||||
end
|
end
|
||||||
@@ -126,10 +125,10 @@ feature -- Media Type Negotiation
|
|||||||
feature -- Encoding Negotiation
|
feature -- Encoding Negotiation
|
||||||
|
|
||||||
charset_preference (a_server_charset_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): CHARACTER_ENCODING_VARIANT_RESULTS
|
charset_preference (a_server_charset_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): CHARACTER_ENCODING_VARIANT_RESULTS
|
||||||
-- `a_server_charset_supported' represent a list of charset supported by the server.
|
-- `a_server_charset_supported' represent a list of character sets supported by the server.
|
||||||
-- `a_header' represent the Accept-Charset header, ie, the client preferences.
|
-- `a_header' represents the Accept-Charset header, ie, the client preferences.
|
||||||
-- Return which Charset to use in a response, if the server support
|
-- Return which Charset to use in a response, if the server supports
|
||||||
-- one Charset, or empty in other case.
|
-- the requested Charset, or empty in other case.
|
||||||
note
|
note
|
||||||
EIS: "name=charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
|
EIS: "name=charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
|
||||||
local
|
local
|
||||||
@@ -138,9 +137,8 @@ feature -- Encoding Negotiation
|
|||||||
create Result
|
create Result
|
||||||
if a_header = Void or else a_header.is_empty then
|
if a_header = Void or else a_header.is_empty then
|
||||||
-- the request has no Accept-Charset header, ie the header is empty, in this case use default charset encoding
|
-- the request has no Accept-Charset header, ie the header is empty, in this case use default charset encoding
|
||||||
-- (UTF-8)
|
|
||||||
Result.set_acceptable (TRUE)
|
Result.set_acceptable (TRUE)
|
||||||
Result.set_character_type (charset_default)
|
Result.set_type (charset_default)
|
||||||
else
|
else
|
||||||
-- select the best match, server support, client preferences
|
-- select the best match, server support, client preferences
|
||||||
l_charset_match := common.best_match (a_server_charset_supported, a_header)
|
l_charset_match := common.best_match (a_server_charset_supported, a_header)
|
||||||
@@ -150,7 +148,7 @@ feature -- Encoding Negotiation
|
|||||||
Result.set_supported_variants (a_server_charset_supported)
|
Result.set_supported_variants (a_server_charset_supported)
|
||||||
else
|
else
|
||||||
-- Set the best match
|
-- Set the best match
|
||||||
Result.set_character_type (l_charset_match)
|
Result.set_type (l_charset_match)
|
||||||
Result.set_acceptable (True)
|
Result.set_acceptable (True)
|
||||||
Result.set_variant_header
|
Result.set_variant_header
|
||||||
end
|
end
|
||||||
@@ -162,8 +160,8 @@ feature -- Compression Negotiation
|
|||||||
encoding_preference (a_server_encoding_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): COMPRESSION_VARIANT_RESULTS
|
encoding_preference (a_server_encoding_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): COMPRESSION_VARIANT_RESULTS
|
||||||
-- `a_server_encoding_supported' represent a list of encoding supported by the server.
|
-- `a_server_encoding_supported' represent a list of encoding supported by the server.
|
||||||
-- `a_header' represent the Accept-Encoding header, ie, the client preferences.
|
-- `a_header' represent the Accept-Encoding header, ie, the client preferences.
|
||||||
-- Return which Encoding to use in a response, if the server support
|
-- Return which Encoding to use in a response, if the server supports
|
||||||
-- one Encoding, or empty in other case.
|
-- the requested Encoding, or empty in other case.
|
||||||
note
|
note
|
||||||
EIS: "name=encoding", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
|
EIS: "name=encoding", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
|
||||||
local
|
local
|
||||||
@@ -173,7 +171,7 @@ feature -- Compression Negotiation
|
|||||||
if a_header = Void or else a_header.is_empty then
|
if a_header = Void or else a_header.is_empty then
|
||||||
-- the request has no Accept-Encoding header, ie the header is empty, in this case do not compress representations
|
-- the request has no Accept-Encoding header, ie the header is empty, in this case do not compress representations
|
||||||
Result.set_acceptable (TRUE)
|
Result.set_acceptable (TRUE)
|
||||||
Result.set_compression_type (encoding_default)
|
Result.set_type (encoding_default)
|
||||||
else
|
else
|
||||||
-- select the best match, server support, client preferences
|
-- select the best match, server support, client preferences
|
||||||
l_compression_match := common.best_match (a_server_encoding_supported, a_header)
|
l_compression_match := common.best_match (a_server_encoding_supported, a_header)
|
||||||
@@ -183,7 +181,7 @@ feature -- Compression Negotiation
|
|||||||
Result.set_supported_variants (a_server_encoding_supported)
|
Result.set_supported_variants (a_server_encoding_supported)
|
||||||
else
|
else
|
||||||
-- Set the best match
|
-- Set the best match
|
||||||
Result.set_compression_type (l_compression_match)
|
Result.set_type (l_compression_match)
|
||||||
Result.set_acceptable (True)
|
Result.set_acceptable (True)
|
||||||
Result.set_variant_header
|
Result.set_variant_header
|
||||||
end
|
end
|
||||||
@@ -195,8 +193,8 @@ feature -- Language Negotiation
|
|||||||
language_preference (a_server_language_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): LANGUAGE_VARIANT_RESULTS
|
language_preference (a_server_language_supported: LIST [READABLE_STRING_8]; a_header: detachable READABLE_STRING_8): LANGUAGE_VARIANT_RESULTS
|
||||||
-- `a_server_language_supported' represent a list of languages supported by the server.
|
-- `a_server_language_supported' represent a list of languages supported by the server.
|
||||||
-- `a_header' represent the Accept-Language header, ie, the client preferences.
|
-- `a_header' represent the Accept-Language header, ie, the client preferences.
|
||||||
-- Return which Language to use in a response, if the server support
|
-- Return which Language to use in a response, if the server supports
|
||||||
-- one Language, or empty in other case.
|
-- the requested Language, or empty in other case.
|
||||||
note
|
note
|
||||||
EIS: "name=language", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4", "protocol=uri"
|
EIS: "name=language", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4", "protocol=uri"
|
||||||
|
|
||||||
@@ -207,7 +205,7 @@ feature -- Language Negotiation
|
|||||||
if a_header = Void or else a_header.is_empty then
|
if a_header = Void or else a_header.is_empty then
|
||||||
-- the request has no Accept header, ie the header is empty, in this case we use the default format
|
-- the request has no Accept header, ie the header is empty, in this case we use the default format
|
||||||
Result.set_acceptable (TRUE)
|
Result.set_acceptable (TRUE)
|
||||||
Result.set_language_type (language_default)
|
Result.set_type (language_default)
|
||||||
else
|
else
|
||||||
-- select the best match, server support, client preferences
|
-- select the best match, server support, client preferences
|
||||||
l_language_match := language.best_match (a_server_language_supported, a_header)
|
l_language_match := language.best_match (a_server_language_supported, a_header)
|
||||||
@@ -217,7 +215,7 @@ feature -- Language Negotiation
|
|||||||
Result.set_supported_variants (a_server_language_supported)
|
Result.set_supported_variants (a_server_language_supported)
|
||||||
else
|
else
|
||||||
-- Set the best match
|
-- Set the best match
|
||||||
Result.set_language_type (l_language_match)
|
Result.set_type (l_language_match)
|
||||||
Result.set_acceptable (True)
|
Result.set_acceptable (True)
|
||||||
Result.set_variant_header
|
Result.set_variant_header
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -1,6 +1,8 @@
|
|||||||
note
|
note
|
||||||
description: "COMMON_ACCEPT_HEADER_PARSER, this class allows to parse Accept-Charset and Accept-Encoding headers"
|
description: "[
|
||||||
author: ""
|
COMMON_ACCEPT_HEADER_PARSER, this class allows to parse Accept-Charset and Accept-Encoding headers
|
||||||
|
|
||||||
|
]"
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
EIS: "name=Charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
|
EIS: "name=Charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
|
||||||
@@ -11,7 +13,7 @@ class
|
|||||||
|
|
||||||
inherit {NONE}
|
inherit {NONE}
|
||||||
|
|
||||||
STRING_UTILS
|
MIME_TYPE_PARSER_UTILITIES
|
||||||
|
|
||||||
|
|
||||||
feature -- Parser
|
feature -- Parser
|
||||||
|
|||||||
@@ -1,26 +1,35 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {LANGUAGE_PARSE}."
|
description: "[
|
||||||
author: ""
|
{LANGUAGE_PARSE} is encharge to parse language tags defined as follow:
|
||||||
|
|
||||||
|
Accept-Language = "Accept-Language" ":"
|
||||||
|
1#( language-range [ ";" "q" "=" qvalue ] )
|
||||||
|
language-range = ( ( 1*8ALPHA *( "-" 1*8ALPHA ) ) | "*" )
|
||||||
|
|
||||||
|
Example:
|
||||||
|
Accept-Language: da, en-gb;q=0.8, en;q=0.7
|
||||||
|
|
||||||
|
]"
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
description: "Language Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4"
|
EIS: "name=Accept-Language", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4", "protocol=uri"
|
||||||
|
|
||||||
class
|
class
|
||||||
LANGUAGE_PARSE
|
LANGUAGE_PARSE
|
||||||
|
|
||||||
inherit {NONE}
|
inherit {NONE}
|
||||||
|
|
||||||
STRING_UTILS
|
MIME_TYPE_PARSER_UTILITIES
|
||||||
|
|
||||||
REFACTORING_HELPER
|
REFACTORING_HELPER
|
||||||
|
|
||||||
feature -- Parser
|
feature -- Parser
|
||||||
|
|
||||||
parse_mime_type (a_mime_type: READABLE_STRING_8): LANGUAGE_RESULTS
|
parse_language (a_accept_language: READABLE_STRING_8): LANGUAGE_RESULTS
|
||||||
-- Parses a mime-type into its component parts.
|
-- Parses `a_accept_language' request-header field into its component parts.
|
||||||
-- For example, the media range 'application/xhtml;q=0.5' would get parsed
|
-- For example, the language range 'en-gb;q=0.8' would get parsed
|
||||||
-- into:
|
-- into:
|
||||||
-- ('application', 'xhtml', {'q', '0.5'})
|
-- ('en-gb', {'q':'0.8',})
|
||||||
local
|
local
|
||||||
l_parts: LIST [READABLE_STRING_8]
|
l_parts: LIST [READABLE_STRING_8]
|
||||||
p: READABLE_STRING_8
|
p: READABLE_STRING_8
|
||||||
@@ -31,7 +40,7 @@ feature -- Parser
|
|||||||
do
|
do
|
||||||
fixme ("Improve code!!!")
|
fixme ("Improve code!!!")
|
||||||
create Result.make
|
create Result.make
|
||||||
l_parts := a_mime_type.split (';')
|
l_parts := a_accept_language.split (';')
|
||||||
from
|
from
|
||||||
i := 1
|
i := 1
|
||||||
until
|
until
|
||||||
@@ -44,8 +53,6 @@ feature -- Parser
|
|||||||
end
|
end
|
||||||
i := i + 1
|
i := i + 1
|
||||||
end
|
end
|
||||||
--Java URLConnection class sends an Accept header that includes a
|
|
||||||
--single "*" - Turn it into a legal wildcard.
|
|
||||||
|
|
||||||
l_full_type := trim (l_parts [1])
|
l_full_type := trim (l_parts [1])
|
||||||
if l_full_type.same_string ("*") then
|
if l_full_type.same_string ("*") then
|
||||||
@@ -60,16 +67,16 @@ feature -- Parser
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
parse_media_range (a_range: READABLE_STRING_8): LANGUAGE_RESULTS
|
parse_language_range (a_language_range: READABLE_STRING_8): LANGUAGE_RESULTS
|
||||||
-- Media-ranges are mime-types with wild-cards and a 'q' quality parameter.
|
-- Languages-ranges are languages with wild-cards and a 'q' quality parameter.
|
||||||
-- For example, the media range 'application/*;q=0.5' would get parsed into:
|
-- For example, the language range ('en-* ;q=0.5') would get parsed into:
|
||||||
-- ('application', '*', {'q', '0.5'})
|
-- ('en', '*', {'q', '0.5'})
|
||||||
-- In addition this function also guarantees that there is a value for 'q'
|
-- In addition this function also guarantees that there is a value for 'q'
|
||||||
-- in the params dictionary, filling it in with a proper default if
|
-- in the params dictionary, filling it in with a proper default if
|
||||||
-- necessary.
|
-- necessary.
|
||||||
do
|
do
|
||||||
fixme ("Improve the code!!!")
|
fixme ("Improve the code!!!")
|
||||||
Result := parse_mime_type (a_range)
|
Result := parse_language (a_language_range)
|
||||||
if attached Result.item ("q") as q then
|
if attached Result.item ("q") as q then
|
||||||
if q.is_double and then attached {REAL_64} q.to_double as r and then (r >= 0.0 and r <= 1.0) then
|
if q.is_double and then attached {REAL_64} q.to_double as r and then (r >= 0.0 and r <= 1.0) then
|
||||||
--| Keep current value
|
--| Keep current value
|
||||||
@@ -85,12 +92,9 @@ feature -- Parser
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
fitness_and_quality_parsed (a_mime_type: READABLE_STRING_8; parsed_ranges: LIST [LANGUAGE_RESULTS]): FITNESS_AND_QUALITY
|
fitness_and_quality_parsed (a_language: READABLE_STRING_8; a_parsed_ranges: LIST [LANGUAGE_RESULTS]): FITNESS_AND_QUALITY
|
||||||
-- Find the best match for a given mimeType against a list of media_ranges
|
-- Find the best match for a given `a_language' against a list of language ranges `a_parsed_ranges'
|
||||||
-- that have already been parsed by parse_media_range. Returns a
|
-- that have already been parsed by parse_language_range.
|
||||||
-- tuple of the fitness value and the value of the 'q' quality parameter of
|
|
||||||
-- the best match, or (-1, 0) if no match was found. Just as for
|
|
||||||
-- quality_parsed(), 'parsed_ranges' must be a list of parsed media ranges.
|
|
||||||
local
|
local
|
||||||
best_fitness: INTEGER
|
best_fitness: INTEGER
|
||||||
target_q: REAL_64
|
target_q: REAL_64
|
||||||
@@ -104,7 +108,7 @@ feature -- Parser
|
|||||||
do
|
do
|
||||||
best_fitness := -1
|
best_fitness := -1
|
||||||
best_fit_q := 0.0
|
best_fit_q := 0.0
|
||||||
target := parse_media_range (a_mime_type)
|
target := parse_language_range (a_language)
|
||||||
if attached target.item ("q") as q and then q.is_double then
|
if attached target.item ("q") as q and then q.is_double then
|
||||||
target_q := q.to_double
|
target_q := q.to_double
|
||||||
if target_q < 0.0 then
|
if target_q < 0.0 then
|
||||||
@@ -117,11 +121,11 @@ feature -- Parser
|
|||||||
end
|
end
|
||||||
if attached target.type as l_target_type then
|
if attached target.type as l_target_type then
|
||||||
from
|
from
|
||||||
parsed_ranges.start
|
a_parsed_ranges.start
|
||||||
until
|
until
|
||||||
parsed_ranges.after
|
a_parsed_ranges.after
|
||||||
loop
|
loop
|
||||||
range := parsed_ranges.item_for_iteration
|
range := a_parsed_ranges.item_for_iteration
|
||||||
if (attached range.type as l_range_type and then (l_target_type.same_string (l_range_type) or l_range_type.same_string ("*") or l_target_type.same_string ("*"))) then
|
if (attached range.type as l_range_type and then (l_target_type.same_string (l_range_type) or l_range_type.same_string ("*") or l_target_type.same_string ("*"))) then
|
||||||
from
|
from
|
||||||
param_matches := 0
|
param_matches := 0
|
||||||
@@ -157,46 +161,46 @@ feature -- Parser
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
parsed_ranges.forth
|
a_parsed_ranges.forth
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
create Result.make (best_fitness, best_fit_q)
|
create Result.make (best_fitness, best_fit_q)
|
||||||
end
|
end
|
||||||
|
|
||||||
quality_parsed (a_mime_type: READABLE_STRING_8; parsed_ranges: LIST [LANGUAGE_RESULTS]): REAL_64
|
quality_parsed (a_language: READABLE_STRING_8; a_parsed_ranges: LIST [LANGUAGE_RESULTS]): REAL_64
|
||||||
-- Find the best match for a given mime-type against a list of ranges that
|
-- Find the best match for a given `a_language' against a list of ranges `parsed_ranges' that
|
||||||
-- have already been parsed by parseMediaRange(). Returns the 'q' quality
|
-- have already been parsed by parse_language_range. Returns the 'q' quality
|
||||||
-- parameter of the best match, 0 if no match was found. This function
|
-- parameter of the best match, 0 if no match was found. This function
|
||||||
-- bahaves the same as quality() except that 'parsed_ranges' must be a list
|
-- bahaves the same as quality except that 'a_parsed_ranges' must be a list
|
||||||
-- of parsed media ranges.
|
-- of parsed language ranges.
|
||||||
do
|
do
|
||||||
Result := fitness_and_quality_parsed (a_mime_type, parsed_ranges).quality
|
Result := fitness_and_quality_parsed (a_language, a_parsed_ranges).quality
|
||||||
end
|
end
|
||||||
|
|
||||||
quality (a_mime_type: READABLE_STRING_8; ranges: READABLE_STRING_8): REAL_64
|
quality (a_language: READABLE_STRING_8; a_ranges: READABLE_STRING_8): REAL_64
|
||||||
-- Returns the quality 'q' of a mime-type when compared against the
|
-- Returns the quality 'q' of a `a_language' when compared against the
|
||||||
-- mediaRanges in ranges.
|
-- language range in `a_ranges'.
|
||||||
local
|
local
|
||||||
l_ranges: LIST [READABLE_STRING_8]
|
l_ranges: LIST [READABLE_STRING_8]
|
||||||
res: ARRAYED_LIST [LANGUAGE_RESULTS]
|
res: ARRAYED_LIST [LANGUAGE_RESULTS]
|
||||||
p_res: LANGUAGE_RESULTS
|
p_res: LANGUAGE_RESULTS
|
||||||
do
|
do
|
||||||
l_ranges := ranges.split (',')
|
l_ranges := a_ranges.split (',')
|
||||||
from
|
from
|
||||||
create res.make (10);
|
create res.make (10);
|
||||||
l_ranges.start
|
l_ranges.start
|
||||||
until
|
until
|
||||||
l_ranges.after
|
l_ranges.after
|
||||||
loop
|
loop
|
||||||
p_res := parse_media_range (l_ranges.item_for_iteration)
|
p_res := parse_language_range (l_ranges.item_for_iteration)
|
||||||
res.put_left (p_res)
|
res.put_left (p_res)
|
||||||
l_ranges.forth
|
l_ranges.forth
|
||||||
end
|
end
|
||||||
Result := quality_parsed (a_mime_type, res)
|
Result := quality_parsed (a_language, res)
|
||||||
end
|
end
|
||||||
|
|
||||||
best_match (supported: LIST [READABLE_STRING_8]; header: READABLE_STRING_8): READABLE_STRING_8
|
best_match (a_supported: LIST [READABLE_STRING_8]; a_header: READABLE_STRING_8): READABLE_STRING_8
|
||||||
-- Choose the mime-type with the highest fitness score and quality ('q') from a list of candidates.
|
-- Choose the `language' with the highest fitness score and quality ('q') from a list of candidates.
|
||||||
local
|
local
|
||||||
l_header_results: LIST [LANGUAGE_RESULTS]
|
l_header_results: LIST [LANGUAGE_RESULTS]
|
||||||
weighted_matches: LIST [FITNESS_AND_QUALITY]
|
weighted_matches: LIST [FITNESS_AND_QUALITY]
|
||||||
@@ -205,7 +209,7 @@ feature -- Parser
|
|||||||
fitness_and_quality, first_one: detachable FITNESS_AND_QUALITY
|
fitness_and_quality, first_one: detachable FITNESS_AND_QUALITY
|
||||||
s: READABLE_STRING_8
|
s: READABLE_STRING_8
|
||||||
do
|
do
|
||||||
l_res := header.split (',')
|
l_res := a_header.split (',')
|
||||||
create {ARRAYED_LIST [LANGUAGE_RESULTS]} l_header_results.make (l_res.count)
|
create {ARRAYED_LIST [LANGUAGE_RESULTS]} l_header_results.make (l_res.count)
|
||||||
fixme ("Extract method!!!")
|
fixme ("Extract method!!!")
|
||||||
from
|
from
|
||||||
@@ -213,20 +217,20 @@ feature -- Parser
|
|||||||
until
|
until
|
||||||
l_res.after
|
l_res.after
|
||||||
loop
|
loop
|
||||||
p_res := parse_media_range (l_res.item_for_iteration)
|
p_res := parse_language_range (l_res.item_for_iteration)
|
||||||
l_header_results.force (p_res)
|
l_header_results.force (p_res)
|
||||||
l_res.forth
|
l_res.forth
|
||||||
end
|
end
|
||||||
create {ARRAYED_LIST [FITNESS_AND_QUALITY]} weighted_matches.make (supported.count)
|
create {ARRAYED_LIST [FITNESS_AND_QUALITY]} weighted_matches.make (a_supported.count)
|
||||||
from
|
from
|
||||||
supported.start
|
a_supported.start
|
||||||
until
|
until
|
||||||
supported.after
|
a_supported.after
|
||||||
loop
|
loop
|
||||||
fitness_and_quality := fitness_and_quality_parsed (supported.item_for_iteration, l_header_results)
|
fitness_and_quality := fitness_and_quality_parsed (a_supported.item_for_iteration, l_header_results)
|
||||||
fitness_and_quality.set_mime_type (mime_type (supported.item_for_iteration))
|
fitness_and_quality.set_mime_type (mime_type (a_supported.item_for_iteration))
|
||||||
weighted_matches.force (fitness_and_quality)
|
weighted_matches.force (fitness_and_quality)
|
||||||
supported.forth
|
a_supported.forth
|
||||||
end
|
end
|
||||||
|
|
||||||
--| Keep only top quality+fitness types
|
--| Keep only top quality+fitness types
|
||||||
|
|||||||
@@ -1,15 +1,15 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {MIME_PARSE}."
|
description: "Summary description for {MIME_PARSE}."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
EIS: "name=Accept", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
|
EIS: "name=Accept", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
|
||||||
|
|
||||||
class
|
class
|
||||||
MIME_PARSE
|
MIME_PARSE
|
||||||
|
|
||||||
inherit {NONE}
|
inherit {NONE}
|
||||||
|
|
||||||
STRING_UTILS
|
MIME_TYPE_PARSER_UTILITIES
|
||||||
|
|
||||||
REFACTORING_HELPER
|
REFACTORING_HELPER
|
||||||
|
|
||||||
|
|||||||
@@ -1,28 +1,29 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {STRING_UTILS}."
|
description: "{MIME_TYPE_PARSER_UTILITIES}."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
class
|
class
|
||||||
STRING_UTILS
|
MIME_TYPE_PARSER_UTILITIES
|
||||||
|
|
||||||
feature {NONE} -- Implementation
|
feature {NONE} -- Implementation
|
||||||
|
|
||||||
mime_type (s: READABLE_STRING_8): READABLE_STRING_8
|
mime_type (a_str: READABLE_STRING_8): READABLE_STRING_8
|
||||||
|
-- `s' with any trailing parameters stripped
|
||||||
local
|
local
|
||||||
p: INTEGER
|
p: INTEGER
|
||||||
do
|
do
|
||||||
p := s.index_of (';', 1)
|
p := a_str.index_of (';', 1)
|
||||||
if p > 0 then
|
if p > 0 then
|
||||||
Result := trim (s.substring (1, p - 1))
|
Result := trim (a_str.substring (1, p - 1))
|
||||||
else
|
else
|
||||||
Result := trim (s.string)
|
Result := trim (a_str.string)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
trim (a_string: READABLE_STRING_8): READABLE_STRING_8
|
trim (a_string: READABLE_STRING_8): READABLE_STRING_8
|
||||||
-- trim whitespace from the beginning and end of a string
|
-- trim whitespace from the beginning and end of a string
|
||||||
|
-- `a_string'
|
||||||
require
|
require
|
||||||
valid_argument : a_string /= Void
|
valid_argument : a_string /= Void
|
||||||
local
|
local
|
||||||
@@ -1,6 +1,5 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {COMMON_RESULTS}."
|
description: "Summary description for {COMMON_RESULTS}."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
@@ -62,7 +61,7 @@ feature -- Element change
|
|||||||
do
|
do
|
||||||
field := a_field
|
field := a_field
|
||||||
ensure
|
ensure
|
||||||
field_assigned: field /= Void implies field = a_field
|
field_set: attached field as l_field implies l_field = a_field
|
||||||
end
|
end
|
||||||
|
|
||||||
put (new: STRING; key: STRING)
|
put (new: STRING; key: STRING)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {LANGUAGE_RESULTS}."
|
description: "Summary description for {LANGUAGE_RESULTS}."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {PARSE_RESULTS}."
|
description: "Summary description for {PARSE_RESULTS}."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,11 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {CHARACTER_ENCODING_VARIANT_RESULTS}."
|
description: "[
|
||||||
author: ""
|
{CHARACTER_ENCODING_VARIANT_RESULTS}
|
||||||
|
Represent the character sets results between client preferences and character sets variants supported by the server.
|
||||||
|
If the server is unable to supports the requested Accept-Charset values, the server can build
|
||||||
|
a response with the list of supported character sets.
|
||||||
|
]"
|
||||||
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
@@ -11,20 +16,9 @@ inherit
|
|||||||
|
|
||||||
VARIANT_RESULTS
|
VARIANT_RESULTS
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
|
|
||||||
character_type: detachable READABLE_STRING_8
|
|
||||||
|
|
||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
set_character_type (a_character_type: READABLE_STRING_8)
|
|
||||||
-- Set `character_type' with `a_character_type'
|
|
||||||
do
|
|
||||||
character_type := a_character_type
|
|
||||||
ensure
|
|
||||||
character_type_set: character_type /= Void implies a_character_type = character_type
|
|
||||||
end
|
|
||||||
|
|
||||||
set_variant_header
|
set_variant_header
|
||||||
-- Set variant header as `Accept-Charset'
|
-- Set variant header as `Accept-Charset'
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {COMPRESSION_VARIANT_RESULTS}."
|
description: "[
|
||||||
author: ""
|
{COMPRESSION_VARIANT_RESULTS}
|
||||||
|
Represent the compression results between client preferences and ccompression variants supported by the server.
|
||||||
|
If the server is unable to supports the requested Accept-Encoding values, the server can build
|
||||||
|
a response with the list of supported encodings/compressions
|
||||||
|
]"
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
EIS: "name= Compression", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
|
EIS: "name= Compression", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
|
||||||
@@ -12,22 +16,9 @@ inherit
|
|||||||
|
|
||||||
VARIANT_RESULTS
|
VARIANT_RESULTS
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
|
|
||||||
compression_type: detachable READABLE_STRING_8
|
|
||||||
-- Compression variant for the response
|
|
||||||
|
|
||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
set_compression_type (a_compression_type: READABLE_STRING_8)
|
|
||||||
-- Set `compression_type' with `a_compression_type'
|
|
||||||
do
|
|
||||||
compression_type := a_compression_type
|
|
||||||
ensure
|
|
||||||
compression_type_set: attached compression_type as l_compression_type implies l_compression_type = a_compression_type
|
|
||||||
end
|
|
||||||
|
|
||||||
set_variant_header
|
set_variant_header
|
||||||
-- Set variant_header as `Accept-Encoding'
|
-- Set variant_header as `Accept-Encoding'
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {LANGUAGE_VARIANT_RESULTS}."
|
description: "[
|
||||||
author: ""
|
{LANGUAGE_VARIANT_RESULTS}.
|
||||||
|
Represent the language results between client preferences and language variants supported by the server.
|
||||||
|
If the server is unable to supports the requested Accept-Language values, the server can build
|
||||||
|
a response with the list of supported languages
|
||||||
|
]"
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
@@ -11,22 +15,10 @@ inherit
|
|||||||
|
|
||||||
VARIANT_RESULTS
|
VARIANT_RESULTS
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
|
|
||||||
language_type: detachable READABLE_STRING_8
|
|
||||||
-- language variant for the response
|
|
||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
|
|
||||||
set_language_type (a_language_type: READABLE_STRING_8)
|
|
||||||
-- Set `language_type' with `a_language_type'
|
|
||||||
do
|
|
||||||
language_type := a_language_type
|
|
||||||
ensure
|
|
||||||
language_type_set: attached language_type as l_language_type implies l_language_type = a_language_type
|
|
||||||
end
|
|
||||||
|
|
||||||
set_variant_header
|
set_variant_header
|
||||||
-- Set variant header as 'Accept-Language'
|
-- Set variant header as 'Accept-Language'
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -1,6 +1,10 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {MEDIA_TYPE_VARIANT_RESULTS}."
|
description: "[
|
||||||
author: ""
|
{MEDIA_TYPE_VARIANT_RESULTS}.
|
||||||
|
Represent the media type results between client preferences and media type variants supported by the server..
|
||||||
|
If the server is unable to supports the requested Accept values, the server can build
|
||||||
|
a response with the list of supported representations
|
||||||
|
]"
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
@@ -11,20 +15,9 @@ inherit
|
|||||||
|
|
||||||
VARIANT_RESULTS
|
VARIANT_RESULTS
|
||||||
|
|
||||||
feature -- Access
|
|
||||||
|
|
||||||
media_type: detachable READABLE_STRING_8
|
|
||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
set_media_type (a_media_type: READABLE_STRING_8)
|
|
||||||
-- Set `media_type' as `a_media_type'
|
|
||||||
do
|
|
||||||
media_type := a_media_type
|
|
||||||
ensure
|
|
||||||
media_type_set: attached media_type as l_media_type implies l_media_type = a_media_type
|
|
||||||
end
|
|
||||||
|
|
||||||
set_variant_header
|
set_variant_header
|
||||||
-- Set variant header as `Accept'
|
-- Set variant header as `Accept'
|
||||||
do
|
do
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
note
|
note
|
||||||
description: "Summary description for {VARIANT_RESULTS}."
|
description: "Generic {VARIANT_RESULTS}.with common functionality to most header variants.."
|
||||||
author: ""
|
|
||||||
date: "$Date$"
|
date: "$Date$"
|
||||||
revision: "$Revision$"
|
revision: "$Revision$"
|
||||||
|
|
||||||
@@ -10,7 +9,7 @@ deferred class
|
|||||||
feature -- Access
|
feature -- Access
|
||||||
|
|
||||||
variant_header: detachable READABLE_STRING_8
|
variant_header: detachable READABLE_STRING_8
|
||||||
-- variant header for the response
|
-- Name of variant header to be added to the Vary header of the response
|
||||||
|
|
||||||
supported_variants: detachable LIST [READABLE_STRING_8]
|
supported_variants: detachable LIST [READABLE_STRING_8]
|
||||||
-- Set of supported variants for the response
|
-- Set of supported variants for the response
|
||||||
@@ -18,6 +17,11 @@ feature -- Access
|
|||||||
is_acceptable: BOOLEAN
|
is_acceptable: BOOLEAN
|
||||||
-- is the current variant accepted?
|
-- is the current variant accepted?
|
||||||
|
|
||||||
|
type: detachable READABLE_STRING_8
|
||||||
|
-- the type could be: media type, language, chracter_sets and encoding.
|
||||||
|
|
||||||
|
feature {NONE} -- Implementation
|
||||||
|
|
||||||
accept_headers_set: ARRAY[READABLE_STRING_8]
|
accept_headers_set: ARRAY[READABLE_STRING_8]
|
||||||
-- Set of valid accept headers headers
|
-- Set of valid accept headers headers
|
||||||
note
|
note
|
||||||
@@ -40,6 +44,15 @@ feature -- Status_Report
|
|||||||
|
|
||||||
feature -- Change Element
|
feature -- Change Element
|
||||||
|
|
||||||
|
|
||||||
|
set_type (a_type: READABLE_STRING_8)
|
||||||
|
-- Set `type' as `a_type'
|
||||||
|
do
|
||||||
|
type := a_type
|
||||||
|
ensure
|
||||||
|
type_set: attached type as l_type implies l_type = a_type
|
||||||
|
end
|
||||||
|
|
||||||
set_acceptable (acceptable: BOOLEAN)
|
set_acceptable (acceptable: BOOLEAN)
|
||||||
-- Set `is_acceptable' with `acceptable'
|
-- Set `is_acceptable' with `acceptable'
|
||||||
do
|
do
|
||||||
@@ -48,7 +61,6 @@ feature -- Change Element
|
|||||||
is_acceptable_set: is_acceptable = acceptable
|
is_acceptable_set: is_acceptable = acceptable
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
set_variant_header
|
set_variant_header
|
||||||
-- Set variant header
|
-- Set variant header
|
||||||
deferred
|
deferred
|
||||||
@@ -57,7 +69,7 @@ feature -- Change Element
|
|||||||
end
|
end
|
||||||
|
|
||||||
set_supported_variants (a_supported: LIST [READABLE_STRING_8])
|
set_supported_variants (a_supported: LIST [READABLE_STRING_8])
|
||||||
-- Set `supported vairants' with `a_supported'
|
-- Set `supported variants' with `a_supported'
|
||||||
do
|
do
|
||||||
supported_variants := a_supported
|
supported_variants := a_supported
|
||||||
ensure
|
ensure
|
||||||
|
|||||||
@@ -78,10 +78,10 @@ feature {NONE} -- Initialization
|
|||||||
print (language.best_match (accept.split (','), "da"))
|
print (language.best_match (accept.split (','), "da"))
|
||||||
print (language.best_match (accept.split (','), "en-*"))
|
print (language.best_match (accept.split (','), "en-*"))
|
||||||
|
|
||||||
print ("%N"+language.parse_media_range ("da").out)
|
print ("%N"+language.parse_language_range ("da").out)
|
||||||
print ("%N"+language.parse_media_range ("en-gb;q=0.8").out)
|
print ("%N"+language.parse_language_range ("en-gb;q=0.8").out)
|
||||||
print ("%N"+language.parse_media_range ("en;q=0.7").out)
|
print ("%N"+language.parse_language_range ("en;q=0.7").out)
|
||||||
print ("%N"+language.parse_media_range ("en-*").out)
|
print ("%N"+language.parse_language_range ("en-*").out)
|
||||||
end
|
end
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -36,13 +36,13 @@ feature -- Test routines
|
|||||||
assert ("Same Value at 1",mime_types_supported.at (1).is_equal (media_variants.supported_variants.at (1)))
|
assert ("Same Value at 1",mime_types_supported.at (1).is_equal (media_variants.supported_variants.at (1)))
|
||||||
assert ("Same count",mime_types_supported.count = media_variants.supported_variants.count)
|
assert ("Same count",mime_types_supported.count = media_variants.supported_variants.count)
|
||||||
assert ("Variant header is void",media_variants.variant_header = Void)
|
assert ("Variant header is void",media_variants.variant_header = Void)
|
||||||
assert ("Media type is void",media_variants.media_type = Void)
|
assert ("Media type is void",media_variants.type = Void)
|
||||||
|
|
||||||
-- Scenario 2, the client doesnt send values in the header, Accept:
|
-- Scenario 2, the client doesnt send values in the header, Accept:
|
||||||
media_variants := conneg.media_type_preference (mime_types_supported, "")
|
media_variants := conneg.media_type_preference (mime_types_supported, "")
|
||||||
assert ("Expected Acceptable", media_variants.is_acceptable)
|
assert ("Expected Acceptable", media_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",media_variants.supported_variants = Void)
|
assert ("Variants is dettached",media_variants.supported_variants = Void)
|
||||||
assert ("Mime is defaul", conneg.mime_default.is_equal (media_variants.media_type))
|
assert ("Mime is defaul", conneg.mime_default.is_equal (media_variants.type))
|
||||||
assert ("Variant header", media_variants.variant_header = Void)
|
assert ("Variant header", media_variants.variant_header = Void)
|
||||||
|
|
||||||
--Scenario 3, the server select the best match, and set the vary header
|
--Scenario 3, the server select the best match, and set the vary header
|
||||||
@@ -50,7 +50,7 @@ feature -- Test routines
|
|||||||
assert ("Expected Acceptable", media_variants.is_acceptable)
|
assert ("Expected Acceptable", media_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",media_variants.supported_variants = Void)
|
assert ("Variants is dettached",media_variants.supported_variants = Void)
|
||||||
assert ("Variant Header", media_variants.variant_header.is_equal ("Accept"))
|
assert ("Variant Header", media_variants.variant_header.is_equal ("Accept"))
|
||||||
assert ("Media Type is application/json", media_variants.media_type.is_equal ("application/json"))
|
assert ("Media Type is application/json", media_variants.type.is_equal ("application/json"))
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|
||||||
@@ -70,14 +70,14 @@ feature -- Test routines
|
|||||||
assert ("Same Value at 1",charset_supported.at (1).is_equal (charset_variants.supported_variants.at (1)))
|
assert ("Same Value at 1",charset_supported.at (1).is_equal (charset_variants.supported_variants.at (1)))
|
||||||
assert ("Same count",charset_supported.count = charset_variants.supported_variants.count)
|
assert ("Same count",charset_supported.count = charset_variants.supported_variants.count)
|
||||||
assert ("Variant header is void",charset_variants.variant_header = Void)
|
assert ("Variant header is void",charset_variants.variant_header = Void)
|
||||||
assert ("Character type is void",charset_variants.character_type = Void)
|
assert ("Character type is void",charset_variants.type = Void)
|
||||||
|
|
||||||
|
|
||||||
-- Scenario 2, the client doesnt send values in the header, Accept-Charset:
|
-- Scenario 2, the client doesnt send values in the header, Accept-Charset:
|
||||||
charset_variants := conneg.charset_preference (charset_supported, "")
|
charset_variants := conneg.charset_preference (charset_supported, "")
|
||||||
assert ("Expected Acceptable", charset_variants.is_acceptable)
|
assert ("Expected Acceptable", charset_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",charset_variants.supported_variants = Void)
|
assert ("Variants is dettached",charset_variants.supported_variants = Void)
|
||||||
assert ("Charset is defaul", conneg.charset_default.is_equal (charset_variants.character_type))
|
assert ("Charset is defaul", conneg.charset_default.is_equal (charset_variants.type))
|
||||||
assert ("Variant header", charset_variants.variant_header = Void)
|
assert ("Variant header", charset_variants.variant_header = Void)
|
||||||
|
|
||||||
|
|
||||||
@@ -86,7 +86,7 @@ feature -- Test routines
|
|||||||
assert ("Expected Acceptable", charset_variants.is_acceptable)
|
assert ("Expected Acceptable", charset_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",charset_variants.supported_variants = Void)
|
assert ("Variants is dettached",charset_variants.supported_variants = Void)
|
||||||
assert ("Variant Header", charset_variants.variant_header.is_equal ("Accept-Charset"))
|
assert ("Variant Header", charset_variants.variant_header.is_equal ("Accept-Charset"))
|
||||||
assert ("Character Type is iso-8859-5", charset_variants.character_type.is_equal ("iso-8859-5"))
|
assert ("Character Type is iso-8859-5", charset_variants.type.is_equal ("iso-8859-5"))
|
||||||
end
|
end
|
||||||
|
|
||||||
test_compression_negotiation
|
test_compression_negotiation
|
||||||
@@ -103,14 +103,14 @@ feature -- Test routines
|
|||||||
assert ("Same Value at 1",compression_supported.at (1).is_equal (compression_variants.supported_variants.at (1)))
|
assert ("Same Value at 1",compression_supported.at (1).is_equal (compression_variants.supported_variants.at (1)))
|
||||||
assert ("Same count",compression_supported.count = compression_variants.supported_variants.count)
|
assert ("Same count",compression_supported.count = compression_variants.supported_variants.count)
|
||||||
assert ("Variant header is void",compression_variants.variant_header = Void)
|
assert ("Variant header is void",compression_variants.variant_header = Void)
|
||||||
assert ("Compression type is void",compression_variants.compression_type = Void)
|
assert ("Compression type is void",compression_variants.type = Void)
|
||||||
|
|
||||||
|
|
||||||
-- Scenario 2, the client doesnt send values in the header, Accept-Encoding
|
-- Scenario 2, the client doesnt send values in the header, Accept-Encoding
|
||||||
compression_variants := conneg.encoding_preference (compression_supported, "")
|
compression_variants := conneg.encoding_preference (compression_supported, "")
|
||||||
assert ("Expected Acceptable", compression_variants.is_acceptable)
|
assert ("Expected Acceptable", compression_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",compression_variants.supported_variants = Void)
|
assert ("Variants is dettached",compression_variants.supported_variants = Void)
|
||||||
assert ("Compression is defaul", conneg.encoding_default.is_equal (compression_variants.compression_type))
|
assert ("Compression is defaul", conneg.encoding_default.is_equal (compression_variants.type))
|
||||||
assert ("Variant header", compression_variants.variant_header = Void)
|
assert ("Variant header", compression_variants.variant_header = Void)
|
||||||
|
|
||||||
|
|
||||||
@@ -122,7 +122,7 @@ feature -- Test routines
|
|||||||
assert ("Expected Acceptable", compression_variants.is_acceptable)
|
assert ("Expected Acceptable", compression_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",compression_variants.supported_variants = Void)
|
assert ("Variants is dettached",compression_variants.supported_variants = Void)
|
||||||
assert ("Variant Header", compression_variants.variant_header.is_equal ("Accept-Encoding"))
|
assert ("Variant Header", compression_variants.variant_header.is_equal ("Accept-Encoding"))
|
||||||
assert ("Encoding Type is gzip", compression_variants.compression_type.is_equal ("gzip"))
|
assert ("Encoding Type is gzip", compression_variants.type.is_equal ("gzip"))
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
@@ -141,14 +141,14 @@ feature -- Test routines
|
|||||||
assert ("Same Value at 1",languages_supported.at (1).is_equal (language_variants.supported_variants.at (1)))
|
assert ("Same Value at 1",languages_supported.at (1).is_equal (language_variants.supported_variants.at (1)))
|
||||||
assert ("Same count",languages_supported.count = language_variants.supported_variants.count)
|
assert ("Same count",languages_supported.count = language_variants.supported_variants.count)
|
||||||
assert ("Variant header is void",language_variants.variant_header = Void)
|
assert ("Variant header is void",language_variants.variant_header = Void)
|
||||||
assert ("Language type is void",language_variants.language_type = Void)
|
assert ("Language type is void",language_variants.type = Void)
|
||||||
|
|
||||||
|
|
||||||
-- Scenario 2, the client doesnt send values in the header, Accept-Language:
|
-- Scenario 2, the client doesnt send values in the header, Accept-Language:
|
||||||
language_variants := conneg.language_preference (languages_supported, "")
|
language_variants := conneg.language_preference (languages_supported, "")
|
||||||
assert ("Expected Acceptable", language_variants.is_acceptable)
|
assert ("Expected Acceptable", language_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",language_variants.supported_variants = Void)
|
assert ("Variants is dettached",language_variants.supported_variants = Void)
|
||||||
assert ("Language is defaul", conneg.language_default.is_equal (language_variants.language_type))
|
assert ("Language is defaul", conneg.language_default.is_equal (language_variants.type))
|
||||||
assert ("Variant header", language_variants.variant_header = Void)
|
assert ("Variant header", language_variants.variant_header = Void)
|
||||||
|
|
||||||
|
|
||||||
@@ -157,7 +157,7 @@ feature -- Test routines
|
|||||||
assert ("Expected Acceptable", language_variants.is_acceptable)
|
assert ("Expected Acceptable", language_variants.is_acceptable)
|
||||||
assert ("Variants is dettached",language_variants.supported_variants = Void)
|
assert ("Variants is dettached",language_variants.supported_variants = Void)
|
||||||
assert ("Variant Header", language_variants.variant_header.is_equal ("Accept-Language"))
|
assert ("Variant Header", language_variants.variant_header.is_equal ("Accept-Language"))
|
||||||
assert ("Language Type is fr", language_variants.language_type.is_equal ("fr"))
|
assert ("Language Type is fr", language_variants.type.is_equal ("fr"))
|
||||||
|
|
||||||
|
|
||||||
end
|
end
|
||||||
|
|||||||
@@ -25,10 +25,10 @@ feature -- Test routines
|
|||||||
|
|
||||||
test_parse_media_range
|
test_parse_media_range
|
||||||
do
|
do
|
||||||
assert ("Expected ('da', {'q':'1.0',})", parser.parse_media_range ("da").out.same_string ("('da', {'q':'1.0',})"));
|
assert ("Expected ('da', {'q':'1.0',})", parser.parse_language_range ("da").out.same_string ("('da', {'q':'1.0',})"));
|
||||||
assert ("Expected ('en', 'gb', {'q':'0.8',})", parser.parse_media_range ("en-gb;q=0.8").out.same_string ("('en', 'gb', {'q':'0.8',})"));
|
assert ("Expected ('en', 'gb', {'q':'0.8',})", parser.parse_language_range ("en-gb;q=0.8").out.same_string ("('en', 'gb', {'q':'0.8',})"));
|
||||||
assert ("Expected ('en', {'q':'0.7',})", parser.parse_media_range ("en;q=0.7").out.same_string ("('en', {'q':'0.7',})"));
|
assert ("Expected ('en', {'q':'0.7',})", parser.parse_language_range ("en;q=0.7").out.same_string ("('en', {'q':'0.7',})"));
|
||||||
assert ("Expected ('en', '*', {'q':'1.0',})", parser.parse_media_range ("en-*").out.same_string ("('en', '*', {'q':'1.0',})"));
|
assert ("Expected ('en', '*', {'q':'1.0',})", parser.parse_language_range ("en-*").out.same_string ("('en', '*', {'q':'1.0',})"));
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user