diff --git a/library/network/protocol/CONNEG/run_test.rb b/library/network/protocol/CONNEG/run_test.rb
deleted file mode 100644
index 4ee95c80..00000000
--- a/library/network/protocol/CONNEG/run_test.rb
+++ /dev/null
@@ -1,79 +0,0 @@
-#!/usr/bin/env ruby
-# Niklaus Giger, 15.01.2011
-# Small ruby-script run all tests using ec (the Eiffel compiler)
-# we assumen that ec outputs everything in english!
-
-# For the command line options look at
-# http://docs.eiffel.com/book/eiffelstudio/eiffelstudio-command-line-options
-# we use often the -batch open.
-#
-# TODO: Fix problems when compiling takes too long and/or there
-# are ec process lingering around from a previous failed build
-
-require 'tempfile'
-require 'fileutils'
-
-# Override system command.
-# run command. if not successful, complain and exit with error
-def system(cmd)
- puts cmd
- res = Kernel.system(cmd)
- if !res
- puts "Failed running: #{cmd}"
- exit 2
- end
-end
-
-
-def runTestForProject(where)
- if !File.directory?(where)
- puts "Directory #{where} does not exist"
- exit 2
- end
-
- # create a temporary file with input for the
- # interactive mode of ec
- commands2run=<
-
+
diff --git a/library/network/protocol/CONNEG/conneg.ecf b/library/network/protocol/content_negotation/conneg.ecf
similarity index 100%
rename from library/network/protocol/CONNEG/conneg.ecf
rename to library/network/protocol/content_negotation/conneg.ecf
diff --git a/library/network/protocol/CONNEG/license.lic b/library/network/protocol/content_negotation/license.lic
similarity index 100%
rename from library/network/protocol/CONNEG/license.lic
rename to library/network/protocol/content_negotation/license.lic
diff --git a/library/network/protocol/CONNEG/src/.gitignore b/library/network/protocol/content_negotation/src/.gitignore
similarity index 100%
rename from library/network/protocol/CONNEG/src/.gitignore
rename to library/network/protocol/content_negotation/src/.gitignore
diff --git a/library/network/protocol/content_negotation/src/character_encoding_variant_results.e b/library/network/protocol/content_negotation/src/character_encoding_variant_results.e
new file mode 100644
index 00000000..5fd5ab24
--- /dev/null
+++ b/library/network/protocol/content_negotation/src/character_encoding_variant_results.e
@@ -0,0 +1,58 @@
+note
+ description: "Summary description for {CHARACTER_ENCODING_VARIANT_RESULTS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ CHARACTER_ENCODING_VARIANT_RESULTS
+
+feature -- Access
+
+ character_type: detachable STRING
+
+ variant_header: detachable STRING
+
+ supported_variants: detachable LIST [STRING]
+
+ is_acceptable: BOOLEAN
+
+feature -- Change Element
+
+ set_character_type (a_character_type: STRING)
+ -- 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 as `Accept-Charset'
+ do
+ variant_header := "Accept-Charset"
+ ensure
+ variant_header_set: attached variant_header as l_variant_header implies l_variant_header.same_string ("Accept-Charset")
+ end
+
+ set_supported_variants (a_supported: LIST [STRING])
+ -- Set `supported_variants' with `a_supported'
+ do
+ supported_variants := a_supported
+ ensure
+ supported_variants_set: supported_variants /= Void implies supported_variants = a_supported
+ end
+
+ set_acceptable (acceptable: BOOLEAN)
+ -- Set `is_acceptable' with `acceptabe'
+ do
+ is_acceptable := acceptable
+ ensure
+ is_acceptable_set: is_acceptable = acceptable
+ end
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
+ license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
+end
diff --git a/library/network/protocol/CONNEG/src/common_accept_header_parser.e b/library/network/protocol/content_negotation/src/common_accept_header_parser.e
similarity index 86%
rename from library/network/protocol/CONNEG/src/common_accept_header_parser.e
rename to library/network/protocol/content_negotation/src/common_accept_header_parser.e
index f95e6751..75aefb55 100644
--- a/library/network/protocol/CONNEG/src/common_accept_header_parser.e
+++ b/library/network/protocol/content_negotation/src/common_accept_header_parser.e
@@ -3,17 +3,15 @@ note
author: ""
date: "$Date$"
revision: "$Revision$"
- description : "[
- Charset Reference : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2
- Encoding Reference : http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3
- ]"
+ EIS: "name=Charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
+ EIS: "name=Encoding", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
class
COMMON_ACCEPT_HEADER_PARSER
-
feature -- Parser
- parse_common (header: STRING): COMMON_RESULTS
+
+ parse_common (header: STRING): COMMON_RESULTS
-- Parses `header' charset/encoding into its component parts.
-- For example, the charset 'iso-8889-5' would get parsed
-- into:
@@ -28,7 +26,7 @@ feature -- Parser
create Result.make
l_parts := header.split (';')
if l_parts.count = 1 then
- Result.put ("1.0", "q")
+ Result.put ("1.0", "q")
else
from
i := 1
@@ -38,16 +36,15 @@ feature -- Parser
p := l_parts.at (i)
sub_parts := p.split ('=')
if sub_parts.count = 2 then
- Result.put (trim (sub_parts[2]), trim (sub_parts[1]))
+ Result.put (trim (sub_parts [2]), trim (sub_parts [1]))
end
i := i + 1
end
end
- l_header := trim (l_parts[1])
+ l_header := trim (l_parts [1])
Result.set_field (trim (l_header))
end
-
fitness_and_quality_parsed (a_field: STRING; parsed_charsets: LIST [COMMON_RESULTS]): FITNESS_AND_QUALITY
-- Find the best match for a given charset/encoding against a list of charsets/encodings
-- that have already been parsed by parse_common. Returns a
@@ -65,7 +62,7 @@ feature -- Parser
do
best_fitness := -1
best_fit_q := 0.0
- target := parse_common(a_field)
+ target := parse_common (a_field)
if attached target.item ("q") as q and then q.is_double then
target_q := q.to_double
if target_q < 0.0 then
@@ -76,9 +73,7 @@ feature -- Parser
else
target_q := 1.0
end
-
- if attached target.field as l_target_field
- then
+ if attached target.field as l_target_field then
from
parsed_charsets.start
until
@@ -86,7 +81,7 @@ feature -- Parser
loop
range := parsed_charsets.item_for_iteration
if attached range.field as l_range_common then
- if l_target_field.same_string (l_range_common) or l_target_field.same_string ("*") or l_range_common.same_string ("*") then
+ if l_target_field.same_string (l_range_common) or l_target_field.same_string ("*") or l_range_common.same_string ("*") then
if l_range_common.same_string (l_target_field) then
l_fitness := 100
else
@@ -109,7 +104,6 @@ feature -- Parser
create Result.make (best_fitness, best_fit_q)
end
-
quality_parsed (a_field: STRING; parsed_common: LIST [COMMON_RESULTS]): REAL_64
-- Find the best match for a given charset/encoding against a list of charsets/encodings that
-- have already been parsed by parse_charsets(). Returns the 'q' quality
@@ -119,14 +113,13 @@ feature -- Parser
Result := fitness_and_quality_parsed (a_field, parsed_common).quality
end
-
quality (a_field: STRING; commons: STRING): REAL_64
-- Returns the quality 'q' of a charset/encoding when compared against the
-- a list of charsets/encodings/
local
- l_commons : LIST [STRING]
- res : ARRAYED_LIST [COMMON_RESULTS]
- p_res : COMMON_RESULTS
+ l_commons: LIST [STRING]
+ res: ARRAYED_LIST [COMMON_RESULTS]
+ p_res: COMMON_RESULTS
do
l_commons := commons.split (',')
from
@@ -153,8 +146,6 @@ feature -- Parser
do
l_res := header.split (',')
create {ARRAYED_LIST [COMMON_RESULTS]} l_header_results.make (l_res.count)
-
-
from
l_res.start
until
@@ -164,9 +155,7 @@ feature -- Parser
l_header_results.force (p_res)
l_res.forth
end
-
create {ARRAYED_LIST [FITNESS_AND_QUALITY]} weighted_matches.make (supported.count)
-
from
supported.start
until
@@ -201,12 +190,16 @@ feature -- Parser
end
weighted_matches.forth
end
- check weighted_matches.item = fitness_and_quality end
+ check
+ weighted_matches.item = fitness_and_quality
+ end
weighted_matches.forth
elseif first_one.is_equal (fitness_and_quality) then
weighted_matches.forth
else
- check first_one > fitness_and_quality end
+ check
+ first_one > fitness_and_quality
+ end
weighted_matches.remove
end
end
@@ -228,14 +221,16 @@ feature -- Parser
loop
fitness_and_quality := weighted_matches.item
if fitness_and_quality.mime_type.same_string (l_field) then
- --| Found
+ --| Found
else
fitness_and_quality := Void
weighted_matches.forth
end
end
else
- check has_field: False end
+ check
+ has_field: False
+ end
end
l_header_results.forth
end
@@ -267,7 +262,7 @@ feature -- Util
trim (a_string: STRING): STRING
-- trim whitespace from the beginning and end of a string
require
- valid_argument : a_string /= Void
+ valid_argument: a_string /= Void
do
a_string.left_adjust
a_string.right_justify
@@ -277,6 +272,7 @@ feature -- Util
end
note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/CONNEG/src/common_results.e b/library/network/protocol/content_negotation/src/common_results.e
similarity index 90%
rename from library/network/protocol/CONNEG/src/common_results.e
rename to library/network/protocol/content_negotation/src/common_results.e
index 5d71a733..89429e46 100644
--- a/library/network/protocol/CONNEG/src/common_results.e
+++ b/library/network/protocol/content_negotation/src/common_results.e
@@ -6,7 +6,9 @@ note
class
COMMON_RESULTS
+
inherit
+
ANY
redefine
out
@@ -31,7 +33,6 @@ feature -- Access
field: detachable STRING
-
item (a_key: STRING): detachable STRING
-- Item associated with `a_key', if present
-- otherwise default value of type `STRING'
@@ -57,15 +58,14 @@ feature -- Access
feature -- Element change
set_field (a_field: STRING)
- -- Set type with `a_charset'
+ -- Set type with `a_charset'
do
field := a_field
ensure
- field_assigned: field ~ field
+ field_assigned: field /= Void implies field = a_field
end
-
- put (new: STRING; key: STRING)
+ put (new: STRING; key: STRING)
-- Insert `new' with `key' if there is no other item
-- associated with the same key. If present, replace
-- the old value with `new'
@@ -90,7 +90,6 @@ feature -- Status Report
Result.append_string ("'" + t + "',")
end
Result.append_string (" {")
-
from
params.start
until
@@ -113,7 +112,10 @@ feature {NONE} -- Implementation
params: HASH_TABLE [STRING, STRING]
--dictionary of all the parameters for the media range
-;note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ ;
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/content_negotation/src/compression_variant_results.e b/library/network/protocol/content_negotation/src/compression_variant_results.e
new file mode 100644
index 00000000..8309c19e
--- /dev/null
+++ b/library/network/protocol/content_negotation/src/compression_variant_results.e
@@ -0,0 +1,59 @@
+note
+ description: "Summary description for {COMPRESSION_VARIANT_RESULTS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+ EIS: "name= Compression", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
+
+class
+ COMPRESSION_VARIANT_RESULTS
+
+feature -- Access
+
+ compression_type: detachable STRING
+
+ variant_header: detachable STRING
+
+ supported_variants: detachable LIST [STRING]
+
+ is_acceptable: BOOLEAN
+
+feature -- Change Element
+
+ set_compression_type (a_compression_type: STRING)
+ -- Set `compression_type' with `a_compression_type'
+ do
+ compression_type := a_compression_type
+ ensure
+ compression_type_set: compression_type /= Void implies a_compression_type = compression_type
+ end
+
+ set_variant_header
+ -- Set variant_header as `Accept-Encoding'
+ do
+ variant_header := "Accept-Encoding"
+ ensure
+ variant_header_set: attached variant_header as l_variant_header implies l_variant_header.same_string ("Accept-Encoding")
+ end
+
+ set_supported_variants (a_supported: LIST [STRING])
+ -- Set `supported_variants' with `a_supported'
+ do
+ supported_variants := a_supported
+ ensure
+ supported_variants_set: supported_variants /= Void implies supported_variants = a_supported
+ end
+
+ set_acceptable (acceptable: BOOLEAN)
+ -- Set `is_acceptable' with `acceptable'
+ do
+ is_acceptable := acceptable
+ ensure
+ is_acceptable_set: is_acceptable = acceptable
+ end
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
+ license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
+end
diff --git a/library/network/protocol/CONNEG/src/conneg_server_side.e b/library/network/protocol/content_negotation/src/conneg_server_side.e
similarity index 58%
rename from library/network/protocol/CONNEG/src/conneg_server_side.e
rename to library/network/protocol/content_negotation/src/conneg_server_side.e
index 1d08c7a4..f13513c8 100644
--- a/library/network/protocol/CONNEG/src/conneg_server_side.e
+++ b/library/network/protocol/content_negotation/src/conneg_server_side.e
@@ -11,129 +11,154 @@ note
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.
-]"
+ ]"
+ EIS: "name=server driven negotiation", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html#sec12.", "protocol=uri"
+
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)
+
+ make (a_mime: STRING; a_language: STRING; a_charset: STRING; a_encoding: STRING)
do
set_mime_default (a_mime)
set_language_default (a_language)
set_charset_default (a_charset)
- set_encoding_defautl (an_encoding)
+ set_encoding_default (a_encoding)
+ ensure
+ mime_default_set: mime = a_mime
+ language_default_set: language_default = a_language
+ charset_default_set: charset_default = a_charset
+ encoding_default_set: encoding_default = a_encoding
end
-feature -- Server Side Defaults Formats
- mime_default : STRING
- set_mime_default ( a_mime: STRING)
- -- set the mime_default with `a_mime'
+feature -- AccessServer Side Defaults Formats
+
+ mime_default: STRING
+
+
+
+ language_default: STRING
+
+
+
+ charset_default: STRING
+
+
+ encoding_default: STRING
+
+ set_encoding_defautl (an_encoding: STRING)
+ do
+ encoding_default := an_encoding
+ ensure
+ set_encoding: an_encoding ~ encoding_default
+ end
+
+feature -- Change Element
+
+ 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
+ set_mime_default: a_mime = mime_default
end
-
- language_default : STRING
-
- set_language_default (a_language : 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
+ set_language: a_language = language_default
end
-
- charset_default : STRING
-
- set_charset_default (a_charset : 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
+ set_charset: a_charset = charset_default
end
-
- encoding_default : STRING
-
- set_encoding_defautl (an_encoding : STRING)
+ set_encoding_default (a_encoding: STRING)
do
- encoding_default := an_encoding
+ encoding_default := a_encoding
ensure
- set_encoding : an_encoding ~ encoding_default
+ set_encoding: a_encoding = encoding_default
end
feature -- Media Type Negotiation
- media_type_preference ( mime_types_supported : LIST[STRING]; header: detachable READABLE_STRING_8) : MEDIA_TYPE_VARIANT_RESULTS
+ media_type_preference (mime_types_supported: LIST [STRING]; header: detachable READABLE_STRING_8): 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
+ note
+ EIS: "name=media type", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
local
mime_match: STRING
do
create Result
if header = Void or else 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_media_type (mime_default)
else
- -- select the best match, server support, client preferences
+ -- 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
+ -- 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)
+ -- 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: detachable READABLE_STRING_8) : CHARACTER_ENCODING_VARIANT_RESULTS
+ charset_preference (server_charset_supported: LIST [STRING]; header: detachable READABLE_STRING_8): 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
+ note
+ EIS: "name=charset", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.2", "protocol=uri"
local
- charset_match : STRING
+ charset_match: STRING
do
create Result
if header = Void or else 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)
+ -- 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
+ -- 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
+ -- 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)
+ -- Set the best match
+ Result.set_character_type (charset_match)
Result.set_acceptable (True)
Result.set_variant_header
end
@@ -142,75 +167,74 @@ feature -- Encoding Negotiation
feature -- Compression Negotiation
- encoding_preference (server_encoding_supported : LIST[STRING]; header: detachable READABLE_STRING_8) : COMPRESSION_VARIANT_RESULTS
+ encoding_preference (server_encoding_supported: LIST [STRING]; header: detachable READABLE_STRING_8): 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
+ note
+ EIS: "name=encoding", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.3", "protocol=uri"
local
- compression_match : STRING
+ compression_match: STRING
do
create Result
if header = Void or else 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_compression_type (encoding_default)
else
- -- select the best match, server support, client preferences
+ -- 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
+ -- 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)
+ -- 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: detachable READABLE_STRING_8) : LANGUAGE_VARIANT_RESULTS
+ language_preference (server_language_supported: LIST [STRING]; header: detachable READABLE_STRING_8): 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
+ note
+ EIS: "name=language", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4", "protocol=uri"
+
local
language_match: STRING
do
create Result
if header = Void or else 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_language_type (language_default)
else
- -- select the best match, server support, client preferences
+ -- 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
+ -- 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)
+ -- 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"
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
-
-
diff --git a/library/network/protocol/CONNEG/src/fitness_and_quality.e b/library/network/protocol/content_negotation/src/fitness_and_quality.e
similarity index 100%
rename from library/network/protocol/CONNEG/src/fitness_and_quality.e
rename to library/network/protocol/content_negotation/src/fitness_and_quality.e
diff --git a/library/network/protocol/CONNEG/src/language_parse.e b/library/network/protocol/content_negotation/src/language_parse.e
similarity index 82%
rename from library/network/protocol/CONNEG/src/language_parse.e
rename to library/network/protocol/content_negotation/src/language_parse.e
index 4373a65a..476400c7 100644
--- a/library/network/protocol/CONNEG/src/language_parse.e
+++ b/library/network/protocol/content_negotation/src/language_parse.e
@@ -3,11 +3,13 @@ note
author: ""
date: "$Date$"
revision: "$Revision$"
- description : "Language Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4"
+ description: "Language Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.4"
class
LANGUAGE_PARSE
+
inherit
+
REFACTORING_HELPER
feature -- Parser
@@ -36,23 +38,23 @@ feature -- Parser
p := l_parts.at (i)
sub_parts := p.split ('=')
if sub_parts.count = 2 then
- Result.put (trim (sub_parts[2]), trim (sub_parts[1]))
+ Result.put (trim (sub_parts [2]), trim (sub_parts [1]))
end
i := i + 1
end
- --Java URLConnection class sends an Accept header that includes a
- --single "*" - Turn it into a legal wildcard.
+ --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
l_full_type := "*"
end
l_types := l_full_type.split ('-')
if l_types.count = 1 then
- Result.set_type (trim (l_types[1]))
+ Result.set_type (trim (l_types [1]))
else
- Result.set_type (trim (l_types[1]))
- Result.set_sub_type (trim (l_types[2]))
+ Result.set_type (trim (l_types [1]))
+ Result.set_sub_type (trim (l_types [2]))
end
end
@@ -67,12 +69,8 @@ feature -- Parser
fixme ("Improve the code!!!")
Result := parse_mime_type (a_range)
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
- --| Keep current value
+ 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
if q.same_string ("1") then
--| Use 1.0 formatting
Result.put ("1.0", "q")
@@ -85,7 +83,6 @@ feature -- Parser
end
end
-
fitness_and_quality_parsed (a_mime_type: STRING; parsed_ranges: LIST [LANGUAGE_RESULTS]): FITNESS_AND_QUALITY
-- Find the best match for a given mimeType against a list of media_ranges
-- that have already been parsed by parse_media_range. Returns a
@@ -116,22 +113,14 @@ feature -- Parser
else
target_q := 1.0
end
-
- if
- attached target.type as l_target_type
- then
+ if attached target.type as l_target_type then
from
parsed_ranges.start
until
parsed_ranges.after
loop
range := 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
param_matches := 0
keys := target.keys
@@ -140,33 +129,22 @@ feature -- Parser
keys.after
loop
element := keys.item_for_iteration
- if
- not element.same_string ("q") and then
- range.has_key (element) and then
- (attached target.item (element) as t_item and attached range.item (element) as r_item) and then
- t_item.same_string (r_item)
- then
+ if not element.same_string ("q") and then range.has_key (element) and then (attached target.item (element) as t_item and attached range.item (element) as r_item) and then t_item.same_string (r_item) then
param_matches := param_matches + 1
end
keys.forth
end
-
if l_range_type.same_string (l_target_type) then
l_fitness := 100
else
l_fitness := 0
end
- if (
- attached range.sub_type as l_range_sub_type and then attached target.sub_type as l_target_sub_type and then
- (l_target_sub_type.same_string (l_range_sub_type) or l_range_sub_type.same_string ("*") or l_target_sub_type.same_string ("*"))
- ) then
+ if (attached range.sub_type as l_range_sub_type and then attached target.sub_type as l_target_sub_type and then (l_target_sub_type.same_string (l_range_sub_type) or l_range_sub_type.same_string ("*") or l_target_sub_type.same_string ("*"))) then
if l_range_sub_type.same_string (l_target_sub_type) then
l_fitness := l_fitness + 10
end
end
-
l_fitness := l_fitness + param_matches
-
if l_fitness > best_fitness then
best_fitness := l_fitness
element := range.item ("q")
@@ -197,9 +175,9 @@ feature -- Parser
-- Returns the quality 'q' of a mime-type when compared against the
-- mediaRanges in ranges.
local
- l_ranges : LIST [STRING]
- res : ARRAYED_LIST [LANGUAGE_RESULTS]
- p_res : LANGUAGE_RESULTS
+ l_ranges: LIST [STRING]
+ res: ARRAYED_LIST [LANGUAGE_RESULTS]
+ p_res: LANGUAGE_RESULTS
do
l_ranges := ranges.split (',')
from
@@ -227,8 +205,7 @@ feature -- Parser
do
l_res := header.split (',')
create {ARRAYED_LIST [LANGUAGE_RESULTS]} l_header_results.make (l_res.count)
-
- fixme("Extract method!!!")
+ fixme ("Extract method!!!")
from
l_res.start
until
@@ -238,9 +215,7 @@ feature -- Parser
l_header_results.force (p_res)
l_res.forth
end
-
create {ARRAYED_LIST [FITNESS_AND_QUALITY]} weighted_matches.make (supported.count)
-
from
supported.start
until
@@ -274,12 +249,16 @@ feature -- Parser
end
weighted_matches.forth
end
- check weighted_matches.item = fitness_and_quality end
+ check
+ weighted_matches.item = fitness_and_quality
+ end
weighted_matches.forth
elseif first_one.is_equal (fitness_and_quality) then
weighted_matches.forth
else
- check first_one > fitness_and_quality end
+ check
+ first_one > fitness_and_quality
+ end
weighted_matches.remove
end
end
@@ -301,7 +280,7 @@ feature -- Parser
loop
fitness_and_quality := weighted_matches.item
if fitness_and_quality.mime_type.same_string (s) then
- --| Found
+ --| Found
else
fitness_and_quality := Void
weighted_matches.forth
@@ -337,7 +316,7 @@ feature {NONE} -- Implementation
trim (a_string: STRING): STRING
-- trim whitespace from the beginning and end of a string
require
- valid_argument : a_string /= Void
+ valid_argument: a_string /= Void
do
a_string.left_adjust
a_string.right_justify
@@ -347,6 +326,7 @@ feature {NONE} -- Implementation
end
note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/CONNEG/src/language_results.e b/library/network/protocol/content_negotation/src/language_results.e
similarity index 93%
rename from library/network/protocol/CONNEG/src/language_results.e
rename to library/network/protocol/content_negotation/src/language_results.e
index fe8d0aa0..926ec7a3 100644
--- a/library/network/protocol/CONNEG/src/language_results.e
+++ b/library/network/protocol/content_negotation/src/language_results.e
@@ -6,7 +6,9 @@ note
class
LANGUAGE_RESULTS
+
inherit
+
ANY
redefine
out
@@ -61,7 +63,7 @@ feature -- Access
feature -- Element change
set_type (a_type: STRING)
- -- Set type with `a_type'
+ -- Set type with `a_type'
do
type := a_type
if attached sub_type as st then
@@ -74,7 +76,7 @@ feature -- Element change
end
set_sub_type (a_sub_type: STRING)
- -- Set sub_type with `a_sub_type
+ -- Set sub_type with `a_sub_type
do
sub_type := a_sub_type
if attached type as t then
@@ -86,7 +88,7 @@ feature -- Element change
sub_type_assigned: sub_type ~ a_sub_type
end
- put (new: STRING; key: STRING)
+ put (new: STRING; key: STRING)
-- Insert `new' with `key' if there is no other item
-- associated with the same key. If present, replace
-- the old value with `new'
@@ -114,7 +116,6 @@ feature -- Status Report
Result.append_string (" '" + st + "',")
end
Result.append_string (" {")
-
from
params.start
until
@@ -137,7 +138,10 @@ feature {NONE} -- Implementation
params: HASH_TABLE [STRING, STRING]
--dictionary of all the parameters for the media range
-;note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ ;
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/content_negotation/src/language_variant_results.e b/library/network/protocol/content_negotation/src/language_variant_results.e
new file mode 100644
index 00000000..c904402a
--- /dev/null
+++ b/library/network/protocol/content_negotation/src/language_variant_results.e
@@ -0,0 +1,63 @@
+note
+ description: "Summary description for {LANGUAGE_VARIANT_RESULTS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ LANGUAGE_VARIANT_RESULTS
+
+feature -- Access
+
+ language_type: detachable STRING
+
+
+ variant_header: detachable STRING
+
+
+ supported_variants: detachable LIST [STRING]
+
+
+ is_acceptable: BOOLEAN
+
+
+feature -- Change Element
+
+ set_acceptable (acceptable: BOOLEAN)
+ -- Set `is_acceptable' with `acceptable'
+ do
+ is_acceptable := acceptable
+ ensure
+ is_acceptable_set: is_acceptable = acceptable
+ end
+
+ set_language_type (a_language_type: STRING)
+ -- Set `language_type' with `a_language_type'
+ do
+ language_type := a_language_type
+ ensure
+ language_type_set: language_type/= Void implies a_language_type = language_type
+ end
+
+ set_variant_header
+ -- Set variant header as 'Accept-Language'
+ do
+ variant_header := "Accept-Language"
+ ensure
+ variant_header_set: attached variant_header as l_variant_header implies l_variant_header.same_string ("Accept-Language")
+ end
+
+ set_supported_variants (a_supported: LIST [STRING])
+ -- Set `supported vairants' with `a_supported'
+ do
+ supported_variants := a_supported
+ ensure
+ set_supported_variants: supported_variants /= Void implies supported_variants = a_supported
+ end
+
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
+ license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
+end
diff --git a/library/network/protocol/content_negotation/src/media_type_variant_results.e b/library/network/protocol/content_negotation/src/media_type_variant_results.e
new file mode 100644
index 00000000..a73ace00
--- /dev/null
+++ b/library/network/protocol/content_negotation/src/media_type_variant_results.e
@@ -0,0 +1,62 @@
+note
+ description: "Summary description for {MEDIA_TYPE_VARIANT_RESULTS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ MEDIA_TYPE_VARIANT_RESULTS
+
+feature -- Access
+
+ media_type: detachable STRING
+
+ variant_header: detachable STRING
+
+ supported_variants: detachable LIST [STRING]
+
+ is_acceptable: BOOLEAN
+
+
+feature -- Change Element
+
+ set_media_type (a_media_type: STRING)
+ -- Set `media_type' as `a_media_type'
+ do
+ media_type := a_media_type
+ ensure
+ media_type_set: media_type /= Void implies media_type = a_media_type
+ end
+
+
+ set_variant_header
+ -- Set variant header as `Accept'
+ do
+ variant_header := "Accept"
+ ensure
+ variant_header_set: attached variant_header as l_variant_header implies l_variant_header.same_string ("Accept")
+ end
+
+
+ set_supported_variants (a_supported: LIST [STRING])
+ -- Set `supported_variants' with `a_supported'
+ do
+ supported_variants := a_supported
+ ensure
+ supported_variants_variants: supported_variants /= Void implies supported_variants = a_supported
+ end
+
+
+ set_acceptable (acceptable: BOOLEAN)
+ -- Set `is_acceptable' with `acceptable'
+ do
+ is_acceptable := acceptable
+ ensure
+ is_acceptable_set: is_acceptable = acceptable
+ end
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
+ license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
+end
diff --git a/library/network/protocol/CONNEG/src/mime_parse.e b/library/network/protocol/content_negotation/src/mime_parse.e
similarity index 75%
rename from library/network/protocol/CONNEG/src/mime_parse.e
rename to library/network/protocol/content_negotation/src/mime_parse.e
index 9d92ba36..823fe36a 100644
--- a/library/network/protocol/CONNEG/src/mime_parse.e
+++ b/library/network/protocol/content_negotation/src/mime_parse.e
@@ -3,7 +3,7 @@
author: ""
date: "$Date$"
revision: "$Revision$"
- description : "Accept Reference: http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1"
+ EIS: "name=Accept", "src=http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.1", "protocol=uri"
class
MIME_PARSE
@@ -12,47 +12,16 @@ inherit
feature -- Parser
- parse_mime_type (a_mime_type: STRING): PARSE_RESULTS
+ parse_mime_type (a_mime_type: STRING): HTTP_MEDIA_TYPE
-- Parses a mime-type into its component parts.
-- For example, the media range 'application/xhtml;q=0.5' would get parsed
-- into:
-- ('application', 'xhtml', {'q', '0.5'})
- local
- l_parts: LIST [STRING]
- p: STRING
- sub_parts: LIST [STRING]
- i: INTEGER
- l_full_type: STRING
- l_types: LIST [STRING]
do
- fixme ("Improve code!!!")
- create Result.make
- l_parts := a_mime_type.split (';')
- from
- i := 1
- until
- i > l_parts.count
- loop
- p := l_parts.at (i)
- sub_parts := p.split ('=')
- if sub_parts.count = 2 then
- Result.put (trim (sub_parts[2]), trim (sub_parts[1]))
- end
- i := i + 1
- 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])
- if l_full_type.same_string ("*") then
- l_full_type := "*/*"
- end
- l_types := l_full_type.split ('/')
- Result.set_type (trim (l_types[1]))
- Result.set_sub_type (trim (l_types[2]))
+ create Result.make_from_string (a_mime_type)
end
- parse_media_range (a_range: STRING): PARSE_RESULTS
+ parse_media_range (a_range: STRING): HTTP_MEDIA_TYPE
-- Media-ranges are mime-types with wild-cards and a 'q' quality parameter.
-- For example, the media range 'application/*;q=0.5' would get parsed into:
-- ('application', '*', {'q', '0.5'})
@@ -62,7 +31,7 @@ feature -- Parser
do
fixme ("Improve the code!!!")
Result := parse_mime_type (a_range)
- if attached Result.item ("q") as q then
+ if attached Result.parameter ("q") as q then
if
q.is_double and then
attached {REAL_64} q.to_double as r and then
@@ -71,18 +40,18 @@ feature -- Parser
--| Keep current value
if q.same_string ("1") then
--| Use 1.0 formatting
- Result.put ("1.0", "q")
+ Result.add_parameter ("q", "1.0")
end
else
- Result.put ("1.0", "q")
+ Result.add_parameter ("q", "1.0")
end
else
- Result.put ("1.0", "q")
+ Result.add_parameter ("q", "1.0")
end
end
- fitness_and_quality_parsed (a_mime_type: STRING; parsed_ranges: LIST [PARSE_RESULTS]): FITNESS_AND_QUALITY
+ fitness_and_quality_parsed (a_mime_type: STRING; parsed_ranges: LIST [HTTP_MEDIA_TYPE]): FITNESS_AND_QUALITY
-- Find the best match for a given mimeType against a list of media_ranges
-- that have already been parsed by parse_media_range. Returns a
-- tuple of the fitness value and the value of the 'q' quality parameter of
@@ -92,17 +61,16 @@ feature -- Parser
best_fitness: INTEGER
target_q: REAL_64
best_fit_q: REAL_64
- target: PARSE_RESULTS
- range: PARSE_RESULTS
- keys: LIST [STRING]
+ target: HTTP_MEDIA_TYPE
+ range: HTTP_MEDIA_TYPE
param_matches: INTEGER
- element: detachable STRING
+ element: detachable READABLE_STRING_8
l_fitness: INTEGER
do
best_fitness := -1
best_fit_q := 0.0
target := parse_media_range (a_mime_type)
- if attached target.item ("q") as q and then q.is_double then
+ if attached target.parameter ("q") as q and then q.is_double then
target_q := q.to_double
if target_q < 0.0 then
target_q := 0.0
@@ -115,7 +83,7 @@ feature -- Parser
if
attached target.type as l_target_type and
- attached target.sub_type as l_target_sub_type
+ attached target.subtype as l_target_sub_type
then
from
parsed_ranges.start
@@ -129,29 +97,29 @@ feature -- Parser
(l_target_type.same_string (l_range_type) or l_range_type.same_string ("*") or l_target_type.same_string ("*"))
) and
(
- attached range.sub_type as l_range_sub_type and then
+ attached range.subtype as l_range_sub_type and then
(l_target_sub_type.same_string (l_range_sub_type) or l_range_sub_type.same_string ("*") or l_target_sub_type.same_string ("*"))
)
then
- from
- param_matches := 0
- keys := target.keys
- keys.start
- until
- keys.after
- loop
- element := keys.item_for_iteration
- if
- not element.same_string ("q") and then
- range.has_key (element) and then
- (attached target.item (element) as t_item and attached range.item (element) as r_item) and then
- t_item.same_string (r_item)
- then
- param_matches := param_matches + 1
+ if attached target.parameters as l_keys then
+ from
+ param_matches := 0
+ l_keys.start
+ until
+ l_keys.after
+ loop
+ element := l_keys.key_for_iteration
+ if
+ not element.same_string ("q") and then
+ range.has_parameter (element) and then
+ (attached target.parameter (element) as t_item and attached range.parameter (element) as r_item) and then
+ t_item.same_string (r_item)
+ then
+ param_matches := param_matches + 1
+ end
+ l_keys.forth
end
- keys.forth
end
-
if l_range_type.same_string (l_target_type) then
l_fitness := 100
else
@@ -166,7 +134,7 @@ feature -- Parser
if l_fitness > best_fitness then
best_fitness := l_fitness
- element := range.item ("q")
+ element := range.parameter ("q")
if element /= Void then
best_fit_q := element.to_double.min (target_q)
else
@@ -180,7 +148,7 @@ feature -- Parser
create Result.make (best_fitness, best_fit_q)
end
- quality_parsed (a_mime_type: STRING; parsed_ranges: LIST [PARSE_RESULTS]): REAL_64
+ quality_parsed (a_mime_type: STRING; parsed_ranges: LIST [HTTP_MEDIA_TYPE]): REAL_64
-- Find the best match for a given mime-type against a list of ranges that
-- have already been parsed by parseMediaRange(). Returns the 'q' quality
-- parameter of the best match, 0 if no match was found. This function
@@ -195,8 +163,8 @@ feature -- Parser
-- mediaRanges in ranges.
local
l_ranges : LIST [STRING]
- res : ARRAYED_LIST [PARSE_RESULTS]
- p_res : PARSE_RESULTS
+ res : ARRAYED_LIST [HTTP_MEDIA_TYPE]
+ p_res : HTTP_MEDIA_TYPE
do
l_ranges := ranges.split (',')
from
@@ -215,15 +183,15 @@ feature -- Parser
best_match (supported: LIST [STRING]; header: STRING): STRING
-- Choose the mime-type with the highest fitness score and quality ('q') from a list of candidates.
local
- l_header_results: LIST [PARSE_RESULTS]
+ l_header_results: LIST [HTTP_MEDIA_TYPE]
weighted_matches: LIST [FITNESS_AND_QUALITY]
l_res: LIST [STRING]
- p_res: PARSE_RESULTS
+ p_res: HTTP_MEDIA_TYPE
fitness_and_quality, first_one: detachable FITNESS_AND_QUALITY
s: STRING
do
l_res := header.split (',')
- create {ARRAYED_LIST [PARSE_RESULTS]} l_header_results.make (l_res.count)
+ create {ARRAYED_LIST [HTTP_MEDIA_TYPE]} l_header_results.make (l_res.count)
fixme("Extract method!!!")
from
@@ -290,7 +258,7 @@ feature -- Parser
until
l_header_results.after or fitness_and_quality /= Void
loop
- s := l_header_results.item.mime_type
+ s := l_header_results.item.simple_type
from
weighted_matches.start
until
@@ -344,6 +312,6 @@ feature {NONE} -- Implementation
end
note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
end
diff --git a/library/network/protocol/CONNEG/src/parse_results.e b/library/network/protocol/content_negotation/src/parse_results.e
similarity index 93%
rename from library/network/protocol/CONNEG/src/parse_results.e
rename to library/network/protocol/content_negotation/src/parse_results.e
index 185995ea..c57158e5 100644
--- a/library/network/protocol/CONNEG/src/parse_results.e
+++ b/library/network/protocol/content_negotation/src/parse_results.e
@@ -8,6 +8,7 @@ class
PARSE_RESULTS
inherit
+
ANY
redefine
out
@@ -62,7 +63,7 @@ feature -- Access
feature -- Element change
set_type (a_type: STRING)
- -- Set type with `a_type'
+ -- Set type with `a_type'
do
type := a_type
if attached sub_type as st then
@@ -75,7 +76,7 @@ feature -- Element change
end
set_sub_type (a_sub_type: STRING)
- -- Set sub_type with `a_sub_type
+ -- Set sub_type with `a_sub_type
do
sub_type := a_sub_type
if attached type as t then
@@ -87,7 +88,7 @@ feature -- Element change
sub_type_assigned: sub_type ~ a_sub_type
end
- put (new: STRING; key: STRING)
+ put (new: STRING; key: STRING)
-- Insert `new' with `key' if there is no other item
-- associated with the same key. If present, replace
-- the old value with `new'
@@ -115,7 +116,6 @@ feature -- Status Report
Result.append_string (" '" + st + "',")
end
Result.append_string (" {")
-
from
params.start
until
@@ -138,7 +138,10 @@ feature {NONE} -- Implementation
params: HASH_TABLE [STRING, STRING]
--dictionary of all the parameters for the media range
-;note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ ;
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/CONNEG/src/shared_conneg.e b/library/network/protocol/content_negotation/src/shared_conneg.e
similarity index 51%
rename from library/network/protocol/CONNEG/src/shared_conneg.e
rename to library/network/protocol/content_negotation/src/shared_conneg.e
index ffa6a47f..08c8d174 100644
--- a/library/network/protocol/CONNEG/src/shared_conneg.e
+++ b/library/network/protocol/content_negotation/src/shared_conneg.e
@@ -1,5 +1,5 @@
note
- description: "Summary description for {SHARED_MIME}."
+ description: "Summary description for {SHARED_CONNEG}."
date: "$Date$"
revision: "$Revision$"
@@ -8,23 +8,24 @@ class
feature
- mime: MIME_PARSE
+ Mime: MIME_PARSE
once
create Result
end
- common: COMMON_ACCEPT_HEADER_PARSER
- -- Charset and Encoding
+ Common: COMMON_ACCEPT_HEADER_PARSER
+ -- Charset and Encoding
once
create Result
end
- language: LANGUAGE_PARSE
+ Language: LANGUAGE_PARSE
once
create Result
end
note
- copyright: "2011-2011, Javier Velilla, Jocelyn Fiat and others"
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
end
diff --git a/library/network/protocol/content_negotation/src/variant_results.e b/library/network/protocol/content_negotation/src/variant_results.e
new file mode 100644
index 00000000..e14f133a
--- /dev/null
+++ b/library/network/protocol/content_negotation/src/variant_results.e
@@ -0,0 +1,55 @@
+note
+ description: "Summary description for {VARIANT_RESULTS}."
+ author: ""
+ date: "$Date$"
+ revision: "$Revision$"
+
+class
+ VARIANT_RESULTS
+
+feature -- Mime, Language, Charset and Encoding Results
+
+ mime_result: detachable STRING
+
+ set_mime_result (a_mime: STRING)
+ -- set the mime_result with `a_mime'
+ do
+ mime_result := a_mime
+ ensure
+ set_mime_result: a_mime = mime_result
+ end
+
+ language_result: detachable STRING
+
+ set_language_result (a_language: STRING)
+ -- set the language_result with `a_language'
+ do
+ language_result := a_language
+ ensure
+ set_language: a_language = language_result
+ end
+
+ charset_result: detachable STRING
+
+ set_charset_result (a_charset: STRING)
+ -- set the charset_result with `a_charset'
+ do
+ charset_result := a_charset
+ ensure
+ set_charset: a_charset = charset_result
+ end
+
+ encoding_result: detachable STRING
+
+ set_encoding_default (an_encoding: STRING)
+ do
+ encoding_result := an_encoding
+ ensure
+ set_encoding: an_encoding = encoding_result
+ end
+
+note
+ copyright: "2011-2013, Javier Velilla, Jocelyn Fiat, Eiffel Software and others"
+ license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
+
+end
diff --git a/library/network/protocol/CONNEG/test/.gitignore b/library/network/protocol/content_negotation/test/.gitignore
similarity index 100%
rename from library/network/protocol/CONNEG/test/.gitignore
rename to library/network/protocol/content_negotation/test/.gitignore
diff --git a/library/network/protocol/CONNEG/test/application.e b/library/network/protocol/content_negotation/test/application.e
similarity index 100%
rename from library/network/protocol/CONNEG/test/application.e
rename to library/network/protocol/content_negotation/test/application.e
diff --git a/library/network/protocol/CONNEG/test/common_accept_header_parser_test.e b/library/network/protocol/content_negotation/test/common_accept_header_parser_test.e
similarity index 100%
rename from library/network/protocol/CONNEG/test/common_accept_header_parser_test.e
rename to library/network/protocol/content_negotation/test/common_accept_header_parser_test.e
diff --git a/library/network/protocol/CONNEG/test/conneg_server_side_test.e b/library/network/protocol/content_negotation/test/conneg_server_side_test.e
similarity index 100%
rename from library/network/protocol/CONNEG/test/conneg_server_side_test.e
rename to library/network/protocol/content_negotation/test/conneg_server_side_test.e
diff --git a/library/network/protocol/CONNEG/test/language_parser_test.e b/library/network/protocol/content_negotation/test/language_parser_test.e
similarity index 100%
rename from library/network/protocol/CONNEG/test/language_parser_test.e
rename to library/network/protocol/content_negotation/test/language_parser_test.e
diff --git a/library/network/protocol/CONNEG/test/mime_parser_test.e b/library/network/protocol/content_negotation/test/mime_parser_test.e
similarity index 90%
rename from library/network/protocol/CONNEG/test/mime_parser_test.e
rename to library/network/protocol/content_negotation/test/mime_parser_test.e
index ef6de97f..05f98fb1 100644
--- a/library/network/protocol/CONNEG/test/mime_parser_test.e
+++ b/library/network/protocol/content_negotation/test/mime_parser_test.e
@@ -28,15 +28,15 @@ feature -- Test routines
test_parse_media_range
do
- assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml;q=1").out.same_string("('application', 'xml', {'q':'1.0',})") )
+ assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml;q=1").format.same_string("('application', 'xml', {'q':'1.0',})") )
- assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml").out.same_string("('application', 'xml', {'q':'1.0',})") )
- assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml;q=").out.same_string("('application', 'xml', {'q':'1.0',})") )
- assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml ; q=").out.same_string("('application', 'xml', {'q':'1.0',})") )
- assert ("Expected ('application', 'xml', {'q':'1','b':'other',})", parser.parse_media_range("application/xml ; q=1;b=other").out.same_string("('application', 'xml', {'q':'1.0','b':'other',})") )
- assert ("Expected ('application', 'xml', {'q':'1','b':'other',})", parser.parse_media_range("application/xml ; q=2;b=other").out.same_string("('application', 'xml', {'q':'1.0','b':'other',})") )
+ assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml").format.same_string("('application', 'xml', {'q':'1.0',})") )
+ assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml;q=").format.same_string("('application', 'xml', {'q':'1.0',})") )
+ assert ("Expected ('application', 'xml', {'q':'1',})", parser.parse_media_range("application/xml ; q=").format.same_string("('application', 'xml', {'q':'1.0',})") )
+ assert ("Expected ('application', 'xml', {'q':'1','b':'other',})", parser.parse_media_range("application/xml ; q=1;b=other").format.same_string("('application', 'xml', {'q':'1.0','b':'other',})") )
+ assert ("Expected ('application', 'xml', {'q':'1','b':'other',})", parser.parse_media_range("application/xml ; q=2;b=other").format.same_string("('application', 'xml', {'q':'1.0','b':'other',})") )
-- Accept header that includes *
- assert ("Expected ('*', '*', {'q':'.2',})", parser.parse_media_range(" *; q=.2").out.same_string("('*', '*', {'q':'.2',})"))
+ assert ("Expected ('*', '*', {'q':'.2',})", parser.parse_media_range(" *; q=.2").format.same_string("('*', '*', {'q':'.2',})"))
end
diff --git a/library/network/protocol/CONNEG/test/test-safe.ecf b/library/network/protocol/content_negotation/test/test-safe.ecf
similarity index 100%
rename from library/network/protocol/CONNEG/test/test-safe.ecf
rename to library/network/protocol/content_negotation/test/test-safe.ecf
diff --git a/library/network/protocol/CONNEG/test/test.ecf b/library/network/protocol/content_negotation/test/test.ecf
similarity index 100%
rename from library/network/protocol/CONNEG/test/test.ecf
rename to library/network/protocol/content_negotation/test/test.ecf
diff --git a/library/network/protocol/CONNEG/test/test.rc b/library/network/protocol/content_negotation/test/test.rc
similarity index 100%
rename from library/network/protocol/CONNEG/test/test.rc
rename to library/network/protocol/content_negotation/test/test.rc
diff --git a/library/network/protocol/http/src/http_media_type.e b/library/network/protocol/http/src/http_media_type.e
index 940f3d84..fea3b2a5 100644
--- a/library/network/protocol/http/src/http_media_type.e
+++ b/library/network/protocol/http/src/http_media_type.e
@@ -97,9 +97,9 @@ feature {NONE} -- Initialization
-- Extract type and subtype
p := t.index_of ('/', 1)
if p = 0 then
- has_error := True
+ --| Accept *; should be */*
type := t
- subtype := ""
+ subtype := "*"
else
subtype := t.substring (p + 1, t.count)
type := t
@@ -368,6 +368,30 @@ feature -- Status report
end
end
+ format : STRING
+ -- Representation of the current object
+ do
+ create Result.make_from_string ("(")
+ if attached type as t then
+ Result.append_string ("'" + t + "',")
+ end
+ if attached subtype as st then
+ Result.append_string (" '" + st + "',")
+ end
+ Result.append_string (" {")
+ if attached parameters as l_params then
+ from
+ l_params.start
+ until
+ l_params.after
+ loop
+ Result.append ("'" + l_params.key_for_iteration + "':'" + l_params.item_for_iteration + "',");
+ l_params.forth
+ end
+ end
+ Result.append ("})")
+ end
+
invariant
type_and_subtype_not_empty: not has_error implies not type.is_empty and not subtype.is_empty