Added remove_header_named (a_name)

This commit is contained in:
Jocelyn Fiat
2013-03-26 10:33:06 +01:00
parent 955272f505
commit 2eb9abeb37

View File

@@ -250,6 +250,85 @@ feature -- Header: merging
end end
end end
feature -- Status report
has, has_header_named (a_name: READABLE_STRING_8): BOOLEAN
-- Has header item for `n'?
do
Result := across headers as c some has_same_header_name (c.item, a_name) end
end
has_content_length: BOOLEAN
-- Has header "Content-Length"
do
Result := has_header_named ({HTTP_HEADER_NAMES}.header_content_length)
end
has_content_type: BOOLEAN
-- Has header "Content-Type"
do
Result := has_header_named ({HTTP_HEADER_NAMES}.header_content_type)
end
has_transfer_encoding_chunked: BOOLEAN
-- Has "Transfer-Encoding: chunked" header
do
if has_header_named ({HTTP_HEADER_NAMES}.header_transfer_encoding) then
Result := attached header_named_value ({HTTP_HEADER_NAMES}.header_transfer_encoding) as v and then v.same_string (str_chunked)
end
end
feature -- Access
header_named_value (a_name: READABLE_STRING_8): detachable STRING_8
-- First header item found for `a_name' if any
require
has_header: has_header_named (a_name)
local
c: like headers.new_cursor
n: INTEGER
l_line: READABLE_STRING_8
do
from
n := a_name.count
c := headers.new_cursor
until
c.after or Result /= Void
loop
l_line := c.item
if has_same_header_name (l_line, a_name) then
Result := l_line.substring (n + 2, l_line.count)
Result.left_adjust
Result.right_adjust
end
c.forth
end
end
feature -- Removal
remove_header_named (a_name: READABLE_STRING_8)
-- Remove any header line related to name `a_name'.
local
lst: like headers
do
from
lst := headers
lst.start
until
lst.after
loop
if has_same_header_name (lst.item, a_name) then
-- remove
lst.remove
else
lst.forth
end
end
ensure
removed: not has_header_named (a_name)
end
feature -- Header change: general feature -- Header change: general
add_header (h: READABLE_STRING_8) add_header (h: READABLE_STRING_8)
@@ -280,6 +359,8 @@ feature -- Header change: general
s.append (colon_space) s.append (colon_space)
s.append (v) s.append (v)
add_header (s) add_header (s)
ensure
added: has_header_named (k)
end end
put_header_key_value (k,v: READABLE_STRING_8) put_header_key_value (k,v: READABLE_STRING_8)
@@ -292,6 +373,8 @@ feature -- Header change: general
s.append (colon_space) s.append (colon_space)
s.append (v) s.append (v)
put_header (s) put_header (s)
ensure
added: has_header_named (k)
end end
put_header_key_values (k: READABLE_STRING_8; a_values: ITERABLE [READABLE_STRING_8]; a_separator: detachable READABLE_STRING_8) put_header_key_values (k: READABLE_STRING_8; a_values: ITERABLE [READABLE_STRING_8]; a_separator: detachable READABLE_STRING_8)
@@ -318,6 +401,8 @@ feature -- Header change: general
if not s.is_empty then if not s.is_empty then
put_header_key_value (k, s) put_header_key_value (k, s)
end end
ensure
added: has_header_named (k)
end end
feature -- Content related header feature -- Content related header
@@ -607,6 +692,12 @@ feature -- Others
feature -- Redirection feature -- Redirection
remove_location
-- Remove any location header line.
do
remove_header_named ({HTTP_HEADER_NAMES}.header_location)
end
put_location (a_location: READABLE_STRING_8) put_location (a_location: READABLE_STRING_8)
-- Tell the client the new location `a_location' -- Tell the client the new location `a_location'
require require
@@ -669,83 +760,18 @@ feature -- Cookie
put_cookie (key, value, date_to_rfc1123_http_date_format (expiration), path, domain, secure, http_only) put_cookie (key, value, date_to_rfc1123_http_date_format (expiration), path, domain, secure, http_only)
end end
feature -- Status report
header_named_value (a_name: READABLE_STRING_8): detachable STRING_8
-- Has header item for `n'?
require
has_header: has_header_named (a_name)
local
c: like headers.new_cursor
n: INTEGER
l_line: READABLE_STRING_8
do
from
n := a_name.count
c := headers.new_cursor
until
c.after or Result /= Void
loop
l_line := c.item
if l_line.starts_with (a_name) then
if l_line.valid_index (n + 1) then
if l_line [n + 1] = ':' then
Result := l_line.substring (n + 2, l_line.count)
Result.left_adjust
Result.right_adjust
end
end
end
c.forth
end
end
has_header_named (a_name: READABLE_STRING_8): BOOLEAN
-- Has header item for `n'?
local
c: like headers.new_cursor
n: INTEGER
l_line: READABLE_STRING_8
do
from
n := a_name.count
c := headers.new_cursor
until
c.after or Result
loop
l_line := c.item
if l_line.starts_with (a_name) then
if l_line.valid_index (n + 1) then
Result := l_line [n + 1] = ':'
end
end
c.forth
end
end
has_content_length: BOOLEAN
-- Has header "Content-Length"
do
Result := has_header_named ({HTTP_HEADER_NAMES}.header_content_length)
end
has_content_type: BOOLEAN
-- Has header "Content-Type"
do
Result := has_header_named ({HTTP_HEADER_NAMES}.header_content_type)
end
has_transfer_encoding_chunked: BOOLEAN
-- Has "Transfer-Encoding: chunked" header
do
if has_header_named ({HTTP_HEADER_NAMES}.header_transfer_encoding) then
Result := attached header_named_value ({HTTP_HEADER_NAMES}.header_transfer_encoding) as v and then v.same_string (str_chunked)
end
end
feature {NONE} -- Implementation: Header feature {NONE} -- Implementation: Header
has_same_header_name (h: READABLE_STRING_8; a_name: READABLE_STRING_8): BOOLEAN
-- Header line `h' has same name as `a_name' ?
do
if h.starts_with (a_name) then
if h.valid_index (a_name.count + 1) then
Result := h[a_name.count + 1] = ':'
end
end
end
force_header_by_name (n: detachable READABLE_STRING_8; h: READABLE_STRING_8) force_header_by_name (n: detachable READABLE_STRING_8; h: READABLE_STRING_8)
-- Add header `h' or replace existing header of same header name `n' -- Add header `h' or replace existing header of same header name `n'
require require