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