This commit is contained in:
2013-05-14 15:58:17 +02:00
8 changed files with 173 additions and 0 deletions

1
.gitignore vendored
View File

@@ -3,3 +3,4 @@ tests/temp/
.svn/ .svn/
*.swp *.swp
*~ *~
*#

View File

@@ -52,6 +52,8 @@ feature -- Access
http_access_control_request_headers: STRING = "HTTP_ACCESS_CONTROL_REQUEST_HEADERS" http_access_control_request_headers: STRING = "HTTP_ACCESS_CONTROL_REQUEST_HEADERS"
http_if_match: STRING = "HTTP_IF_MATCH"
gateway_interface: STRING = "GATEWAY_INTERFACE" gateway_interface: STRING = "GATEWAY_INTERFACE"
auth_type: STRING = "AUTH_TYPE" auth_type: STRING = "AUTH_TYPE"

View File

@@ -604,6 +604,11 @@ feature -- HTTP_*
deferred deferred
end end
http_if_match: detachable READABLE_STRING_8
-- Existence check on resource
deferred
end
feature -- Extra CGI environment variables feature -- Extra CGI environment variables
request_uri: READABLE_STRING_8 request_uri: READABLE_STRING_8

View File

@@ -248,6 +248,12 @@ feature -- Access: HTTP_* CGI meta parameters - 1.1
Result := meta_string_variable ({WGI_META_NAMES}.http_access_control_request_headers) Result := meta_string_variable ({WGI_META_NAMES}.http_access_control_request_headers)
end end
http_if_match: detachable READABLE_STRING_8
-- Existence check on resource
do
Result := meta_string_variable ({WGI_META_NAMES}.http_if_match)
end
feature -- Access: Extension to CGI meta parameters - 1.1 feature -- Access: Extension to CGI meta parameters - 1.1
request_uri: READABLE_STRING_8 request_uri: READABLE_STRING_8

View File

@@ -256,6 +256,7 @@ feature {NONE} -- Implementation
h.put_current_date h.put_current_date
h.put_location (proxy_server (req).string) h.put_location (proxy_server (req).string)
h.put_content_length (0) h.put_content_length (0)
res.put_header_lines (h)
res.set_status_code ({HTTP_STATUS_CODE}.use_proxy) res.set_status_code ({HTTP_STATUS_CODE}.use_proxy)
ensure ensure
response_status_is_set: res.status_is_set response_status_is_set: res.status_is_set

View File

@@ -58,8 +58,20 @@ feature {WSF_RESPONSE} -- Output
if req.is_request_method ({HTTP_REQUEST_METHODS}.method_trace) then if req.is_request_method ({HTTP_REQUEST_METHODS}.method_trace) then
msg := trace_message (req) msg := trace_message (req)
elseif attached method_not_allowed_message (req) as not_allowed then elseif attached method_not_allowed_message (req) as not_allowed then
--| We give this precedence over 412 Precondition Failed or 404 Not Found,
--| as we assume the existence of a handler for at least one method
--| indicates existence of the resource. This is obviously not the
--| case if the only method allowed is POST, but the handler ought
--| to handle the 404 Not Found and 412 Precondition Failed cases in that case.
--| Ditto for template URI handlers where not all template variable
--| values map to existing resources.
msg := not_allowed msg := not_allowed
elseif attached req.http_if_match as l_match and then l_match.same_string ("*") then
msg := precondition_failed_message (req)
else else
--| Other response codes are possible, such as 301 Moved permananently,
--| 302 Found and 410 Gone. But these require handlers to implement,
--| so no other code can be given at this point.
msg := not_found_message (req) msg := not_found_message (req)
end end
res.send (msg) res.send (msg)
@@ -67,7 +79,17 @@ feature {WSF_RESPONSE} -- Output
feature {NONE} -- Implementation feature {NONE} -- Implementation
precondition_failed_message (req: WSF_REQUEST): WSF_PRECONDITION_FAILED_MESSAGE
-- Automatically generated response for 412 Precondition Failed response
require
req_attached: req /= Void
do
create Result.make (req)
end
method_not_allowed_message (req: WSF_REQUEST): detachable WSF_METHOD_NOT_ALLOWED_RESPONSE method_not_allowed_message (req: WSF_REQUEST): detachable WSF_METHOD_NOT_ALLOWED_RESPONSE
require
req_attached: req /= Void
local local
vis: WSF_ROUTER_AGENT_ITERATOR vis: WSF_ROUTER_AGENT_ITERATOR
do do

View File

@@ -0,0 +1,130 @@
note
description: "[
This class is used to report a 412 Precondition Failed page
]"
date: "$Date$"
revision: "$Revision$"
class WSF_PRECONDITION_FAILED_MESSAGE
inherit
WSF_RESPONSE_MESSAGE
SHARED_HTML_ENCODER
create
make
feature {NONE} -- Initialization
make (req: WSF_REQUEST)
-- Initialize setting `request' from `req'.
do
request := req
create header.make
ensure
req_aliased: request = req
end
feature -- Header
header: HTTP_HEADER
-- Response' header
request: WSF_REQUEST
-- Associated request.
body: detachable READABLE_STRING_8
-- Optional body
-- Displayed as extra content
feature -- Element change
set_body (b: like body)
-- Set `body' to `b'
do
body := b
end
feature {WSF_RESPONSE} -- Output
send_to (res: WSF_RESPONSE)
local
s: STRING
l_text: detachable READABLE_STRING_GENERAL
l_loc: detachable READABLE_STRING_8
h: like header
do
h := header
res.set_status_code ({HTTP_STATUS_CODE}.precondition_failed)
if request.is_content_type_accepted ({HTTP_MIME_TYPES}.text_html) then
s := "<html lang=%"en%"><head>"
s.append ("<title>")
s.append (html_encoder.encoded_string (request.request_uri))
s.append ("Error 412 (Precondition Failed)")
s.append ("</title>%N")
s.append ("[
<style type="text/css">
div#header {color: #fff; background-color: #000; padding: 20px; width: 100%; text-align: center; font-size: 2em; font-weight: bold;}
div#message { margin: 40px; width: 100%; text-align: center; font-size: 1.5em; }
div#footer {color: #999; background-color: #eee; padding: 10px; width: 100%; text-align: center; }
div#logo { float: right; margin: 20px; width: 60px height: auto; font-size: 0.8em; text-align: center; }
div#logo div.outter { padding: 6px; width: 60px; border: solid 3px #500; background-color: #b00;}
div#logo div.outter div.inner1 { display: block; margin: 10px 15px; width: 30px; height: 50px; color: #fff; background-color: #fff; border: solid 2px #900; }
div#logo div.outter div.inner2 { margin: 10px 15px; width: 30px; height: 15px; color: #fff; background-color: #fff; border: solid 2px #900; }
</style>
</head>
<body>
<div id="header">Error 412 (Precondition Failed)</div>
]")
s.append ("<div id=%"logo%">")
s.append ("<div class=%"outter%"> ")
s.append ("<div class=%"inner1%"></div>")
s.append ("<div class=%"inner2%"></div>")
s.append ("</div>")
s.append ("Error 412 (Precondition Failed)</div>")
s.append ("<div id=%"message%">Error 412 (Precondition Failed): <code>" + html_encoder.encoded_string (request.request_uri) + "</code></div>")
if attached body as b then
s.append ("<div>")
s.append (b)
s.append ("</div>%N")
end
s.append ("<div id=%"footer%"></div>")
s.append ("</body>%N")
s.append ("</html>%N")
h.put_content_type_text_html
else
s := "Error 412 (Precondition Failed): "
s.append (request.request_uri)
s.append_character ('%N')
if attached body as b then
s.append ("%N")
s.append (b)
s.append ("%N")
end
h.put_content_type_text_plain
end
h.put_content_length (s.count)
res.put_header_text (h.string)
res.put_string (s)
res.flush
end
note
copyright: "2013, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software
5949 Hollister Ave., Goleta, CA 93117 USA
Telephone 805-685-1006, Fax 805-685-6869
Website http://www.eiffel.com
Customer support http://support.eiffel.com
]"
end

View File

@@ -1042,6 +1042,12 @@ feature -- HTTP_*
Result := wgi_request.http_access_control_request_headers Result := wgi_request.http_access_control_request_headers
end end
http_if_match: detachable READABLE_STRING_8
-- Existence check on resource
do
Result := wgi_request.http_if_match
end
feature -- Extra CGI environment variables feature -- Extra CGI environment variables
request_uri: READABLE_STRING_8 request_uri: READABLE_STRING_8