Fixed various issues related to unicode and CGI variables (assuming that CGI variables are utf-8 encoded, and sometime percent encoded).

Delayed computation of `value' and `name' from WSF_STRING.
Fixed computation of REQUEST_URI when the server does not provide it (this is rare, but possible).
   compute it as SERVER_NAME + encoded-PATH_INFO + {? + QUERY_STRING}
This commit is contained in:
2014-07-01 19:57:14 +02:00
parent 0b1697f20d
commit 7dfc6ea67a
3 changed files with 140 additions and 19 deletions

View File

@@ -25,11 +25,8 @@ feature {NONE} -- Initialization
make (a_name: READABLE_STRING_8; a_string: READABLE_STRING_8)
do
name := url_decoded_string (a_name)
value := url_decoded_string (a_string)
url_encoded_name := a_name
url_encoded_value := a_string
url_encoded_name := utf_8_percent_encoded_string (a_name)
url_encoded_value := utf_8_percent_encoded_string (a_string)
end
feature -- Access
@@ -38,11 +35,31 @@ feature -- Access
-- <Precursor>
--| Note that the value might be html encoded as well
--| this is the application responsibility to html decode it
local
v: like internal_name
do
v := internal_name
if v = Void then
v := url_decoded_string (url_encoded_name)
internal_name := v
end
Result := v
end
value: READABLE_STRING_32
-- <Precursor>
--| Note that the value might be html encoded as well
--| this is the application responsibility to html decode it
local
v: like internal_value
do
v := internal_value
if v = Void then
v := url_decoded_string (url_encoded_value)
internal_value := v
end
Result := v
end
url_encoded_name: READABLE_STRING_8
-- URL encoded string of `name'.
@@ -50,6 +67,14 @@ feature -- Access
url_encoded_value: READABLE_STRING_8
-- URL encoded string of `value'.
feature {NONE} -- Access: internals
internal_name: detachable like name
-- Cached value of `name'.
internal_value: detachable like value
-- Cached value of `value'.
feature -- Conversion
integer_value: INTEGER
@@ -81,7 +106,7 @@ feature -- Element change
change_name (a_name: like name)
do
name := url_decoded_string (a_name)
internal_name := Void
url_encoded_name := a_name
ensure then
a_name.same_string (url_encoded_name)
@@ -122,8 +147,89 @@ feature -- Visitor
vis.process_string (Current)
end
feature {NONE} -- Implementation
utf_8_percent_encoded_string (s: READABLE_STRING_8): READABLE_STRING_8
-- Percent-encode the UTF-8 sequence characters from UTF-8 encoded `s' and
-- return the Result.
local
s8: STRING_8
i, n, nb: INTEGER
do
-- First check if there are such UTF-8 character
-- If it has, convert them and return a new object as Result
-- otherwise return `s' directly to avoid creating a new object
from
i := 1
n := s.count
nb := 0
until
i > n
loop
if s.code (i) > 0x7F then -- >= 128
nb := nb + 1
end
i := i + 1
end
if nb > 0 then
create s8.make (s.count + nb * 3)
utf_8_string_8_into_percent_encoded_string_8 (s, s8)
Result := s8
else
Result := s
end
end
utf_8_string_8_into_percent_encoded_string_8 (s: READABLE_STRING_8; a_result: STRING_8)
-- Copy STRING_32 corresponding to UTF-8 sequence `s' appended into `a_result'.
local
i: INTEGER
n: INTEGER
c: NATURAL_32
do
from
n := s.count
a_result.grow (a_result.count + n)
until
i >= n
loop
i := i + 1
c := s.code (i)
if c <= 0x7F then
-- 0xxxxxxx
a_result.append_code (c)
elseif c <= 0xDF then
-- 110xxxxx 10xxxxxx
url_encoder.append_percent_encoded_character_code_to (c, a_result)
i := i + 1
if i <= n then
url_encoder.append_percent_encoded_character_code_to (s.code (i), a_result)
end
elseif c <= 0xEF then
-- 1110xxxx 10xxxxxx 10xxxxxx
url_encoder.append_percent_encoded_character_code_to (s.code (i), a_result)
i := i + 2
if i <= n then
url_encoder.append_percent_encoded_character_code_to (s.code (i - 1), a_result)
url_encoder.append_percent_encoded_character_code_to (s.code (i), a_result)
end
elseif c <= 0xF7 then
-- 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
url_encoder.append_percent_encoded_character_code_to (s.code (i), a_result)
i := i + 3
if i <= n then
url_encoder.append_percent_encoded_character_code_to (s.code (i - 2), a_result)
url_encoder.append_percent_encoded_character_code_to (s.code (i - 1), a_result)
url_encoder.append_percent_encoded_character_code_to (s.code (i), a_result)
end
else
a_result.append_code (c)
end
end
end
note
copyright: "2011-2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
copyright: "2011-2014, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software