217 lines
7.8 KiB
Plaintext
217 lines
7.8 KiB
Plaintext
note
|
|
description: "Summary description for {CONNEG_SERVER_SIDE}. Utility class to support Server Side Content Negotiation "
|
|
author: ""
|
|
date: "$Date$"
|
|
revision: "$Revision$"
|
|
description: "[
|
|
Reference : http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12.1
|
|
Server-driven Negotiation : If the selection of the best representation for a response is made by an algorithm located at the server,
|
|
it is called server-driven negotiation. Selection is based on the available representations of the response (the dimensions over which it can vary; e.g. language, content-coding, etc.)
|
|
and the contents of particular header fields in the request message or on other information pertaining to the request (such as the network address of the client).
|
|
Server-driven negotiation is advantageous when the algorithm for selecting from among the available representations is difficult to describe to the user agent,
|
|
or when the server desires to send its "best guess" to the client along with the first response (hoping to avoid the round-trip delay of a subsequent request if the "best guess" is good enough for the user).
|
|
In order to improve the server's guess, the user agent MAY include request header fields (Accept, Accept-Language, Accept-Encoding, etc.) which describe its preferences for such a response.
|
|
]"
|
|
class
|
|
CONNEG_SERVER_SIDE
|
|
|
|
inherit
|
|
SHARED_CONNEG
|
|
REFACTORING_HELPER
|
|
create
|
|
make
|
|
|
|
feature -- Initialization
|
|
make ( a_mime: STRING; a_language : STRING; a_charset :STRING; an_encoding: STRING)
|
|
do
|
|
set_mime_default (a_mime)
|
|
set_language_default (a_language)
|
|
set_charset_default (a_charset)
|
|
set_encoding_defautl (an_encoding)
|
|
end
|
|
feature -- Server Side Defaults Formats
|
|
mime_default : STRING
|
|
|
|
set_mime_default ( a_mime: STRING)
|
|
-- set the mime_default with `a_mime'
|
|
do
|
|
mime_default := a_mime
|
|
ensure
|
|
set_mime_default: a_mime ~ mime_default
|
|
end
|
|
|
|
|
|
language_default : STRING
|
|
|
|
set_language_default (a_language : STRING)
|
|
-- set the language_default with `a_language'
|
|
do
|
|
language_default := a_language
|
|
ensure
|
|
set_language : a_language ~ language_default
|
|
end
|
|
|
|
|
|
charset_default : STRING
|
|
|
|
set_charset_default (a_charset : STRING)
|
|
-- set the charset_default with `a_charset'
|
|
do
|
|
charset_default := a_charset
|
|
ensure
|
|
set_charset : a_charset ~ charset_default
|
|
end
|
|
|
|
|
|
encoding_default : STRING
|
|
|
|
set_encoding_defautl (an_encoding : STRING)
|
|
do
|
|
encoding_default := an_encoding
|
|
ensure
|
|
set_encoding : an_encoding ~ encoding_default
|
|
end
|
|
|
|
|
|
|
|
feature -- Media Type Negotiation
|
|
|
|
media_type_preference ( mime_types_supported : LIST[STRING]; header : STRING) : MEDIA_TYPE_VARIANT_RESULTS
|
|
-- mime_types_supported represent media types supported by the server.
|
|
-- header represent the Accept header, ie, the client preferences.
|
|
-- Return which media type to use for representaion in a response, if the server support
|
|
-- one media type, or empty in other case.
|
|
-- Reference : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1
|
|
local
|
|
mime_match: STRING
|
|
do
|
|
create Result
|
|
if header.is_empty then
|
|
-- 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_media_type (mime_default)
|
|
else
|
|
-- select the best match, server support, client preferences
|
|
mime_match := mime.best_match (mime_types_supported, header)
|
|
if mime_match.is_empty then
|
|
-- The server does not support any of the media types prefered by the client
|
|
Result.set_acceptable (False)
|
|
Result.set_supported_variants (mime_types_supported)
|
|
else
|
|
-- Set the best match
|
|
Result.set_media_type(mime_match)
|
|
Result.set_acceptable (True)
|
|
Result.set_variant_header
|
|
end
|
|
end
|
|
end
|
|
|
|
|
|
feature -- Encoding Negotiation
|
|
|
|
charset_preference (server_charset_supported : LIST[STRING]; header: STRING) : CHARACTER_ENCODING_VARIANT_RESULTS
|
|
-- server_charset_supported represent a list of charset supported by the server.
|
|
-- header represent the Accept-Charset header, ie, the client preferences.
|
|
-- Return which Charset to use in a response, if the server support
|
|
-- one Charset, or empty in other case.
|
|
-- Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
|
|
local
|
|
charset_match : STRING
|
|
do
|
|
create Result
|
|
if header.is_empty then
|
|
-- 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_character_type (charset_default)
|
|
else
|
|
-- select the best match, server support, client preferences
|
|
charset_match := common.best_match (server_charset_supported, header)
|
|
if charset_match.is_empty then
|
|
-- The server does not support any of the compression types prefered by the client
|
|
Result.set_acceptable (False)
|
|
Result.set_supported_variants (server_charset_supported)
|
|
else
|
|
-- Set the best match
|
|
Result.set_character_type(charset_match)
|
|
Result.set_acceptable (True)
|
|
Result.set_variant_header
|
|
end
|
|
end
|
|
end
|
|
|
|
feature -- Compression Negotiation
|
|
|
|
encoding_preference (server_encoding_supported : LIST[STRING]; header: STRING) : COMPRESSION_VARIANT_RESULTS
|
|
-- server_encoding_supported represent a list of encoding supported by the server.
|
|
-- header represent the Accept-Encoding header, ie, the client preferences.
|
|
-- Return which Encoding to use in a response, if the server support
|
|
-- one Encoding, or empty in other case.
|
|
-- Representation: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
|
|
local
|
|
compression_match : STRING
|
|
do
|
|
create Result
|
|
if header.is_empty then
|
|
-- 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_compression_type (encoding_default)
|
|
else
|
|
-- select the best match, server support, client preferences
|
|
compression_match := common.best_match (server_encoding_supported, header)
|
|
if compression_match.is_empty then
|
|
-- The server does not support any of the compression types prefered by the client
|
|
Result.set_acceptable (False)
|
|
Result.set_supported_variants (server_encoding_supported)
|
|
else
|
|
-- Set the best match
|
|
Result.set_compression_type(compression_match)
|
|
Result.set_acceptable (True)
|
|
Result.set_variant_header
|
|
end
|
|
end
|
|
|
|
end
|
|
|
|
|
|
feature -- Language Negotiation
|
|
|
|
language_preference (server_language_supported : LIST[STRING]; header: STRING) : LANGUAGE_VARIANT_RESULTS
|
|
-- server_language_supported represent a list of languages supported by the server.
|
|
-- header represent the Accept-Language header, ie, the client preferences.
|
|
-- Return which Language to use in a response, if the server support
|
|
-- one Language, or empty in other case.
|
|
-- Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4
|
|
local
|
|
language_match: STRING
|
|
do
|
|
create Result
|
|
if header.is_empty then
|
|
-- 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_language_type (language_default)
|
|
else
|
|
-- select the best match, server support, client preferences
|
|
language_match := language.best_match (server_language_supported, header)
|
|
if language_match.is_empty then
|
|
-- The server does not support any of the media types prefered by the client
|
|
Result.set_acceptable (False)
|
|
Result.set_supported_variants (server_language_supported)
|
|
else
|
|
-- Set the best match
|
|
Result.set_language_type(language_match)
|
|
Result.set_acceptable (True)
|
|
Result.set_variant_header
|
|
end
|
|
end
|
|
end
|
|
|
|
feature -- Apache Conneg Algorithm
|
|
|
|
note
|
|
copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
|
|
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
|
|
end
|
|
|
|
|