Handle Precondition Failed for If-Match: * where there is no handler for the resource
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -3,3 +3,4 @@ tests/temp/
|
||||
.svn/
|
||||
*.swp
|
||||
*~
|
||||
*#
|
||||
|
||||
@@ -52,6 +52,8 @@ feature -- Access
|
||||
|
||||
http_access_control_request_headers: STRING = "HTTP_ACCESS_CONTROL_REQUEST_HEADERS"
|
||||
|
||||
http_if_match: STRING = "HTTP_IF_MATCH"
|
||||
|
||||
gateway_interface: STRING = "GATEWAY_INTERFACE"
|
||||
|
||||
auth_type: STRING = "AUTH_TYPE"
|
||||
|
||||
@@ -58,8 +58,20 @@ feature {WSF_RESPONSE} -- Output
|
||||
if req.is_request_method ({HTTP_REQUEST_METHODS}.method_trace) then
|
||||
msg := trace_message (req)
|
||||
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
|
||||
elseif attached req.http_if_match as l_match and then l_match.same_string ("*") then
|
||||
msg := precondition_failed_message (req)
|
||||
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)
|
||||
end
|
||||
res.send (msg)
|
||||
@@ -67,7 +79,17 @@ feature {WSF_RESPONSE} -- Output
|
||||
|
||||
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
|
||||
require
|
||||
req_attached: req /= Void
|
||||
local
|
||||
vis: WSF_ROUTER_AGENT_ITERATOR
|
||||
do
|
||||
@@ -114,6 +136,8 @@ feature {NONE} -- Implementation
|
||||
end
|
||||
|
||||
not_found_message (req: WSF_REQUEST): WSF_NOT_FOUND_RESPONSE
|
||||
require
|
||||
req_attached: req /= Void
|
||||
local
|
||||
vis: WSF_ROUTER_AGENT_ITERATOR
|
||||
do
|
||||
|
||||
@@ -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
|
||||
@@ -1042,6 +1042,12 @@ feature -- HTTP_*
|
||||
Result := wgi_request.http_access_control_request_headers
|
||||
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 -- Extra CGI environment variables
|
||||
|
||||
request_uri: READABLE_STRING_8
|
||||
|
||||
Reference in New Issue
Block a user