Better CGI handler

- improvement related to current directory for the execution of the CGI script,
- and updated SCRIPT_NAME, to the path info is correctly computed.
This commit is contained in:
2020-02-26 22:47:25 +01:00
parent 8760152441
commit 135d65c68e

View File

@@ -16,35 +16,79 @@ feature {NONE} -- Creation
make (a_dir: PATH)
do
working_direction := a_dir
working_directory := a_dir
end
feature -- Settings
buffer_size: INTEGER = 1_024
working_direction: PATH
working_directory: PATH
feature -- Status report
cgi_file_path (req: WSF_REQUEST): PATH
cgi_request_data (req: WSF_REQUEST): TUPLE [location: PATH; script_name: READABLE_STRING_8; path_info: READABLE_STRING_8]
local
l_path_info: READABLE_STRING_32
l_path_info, l_scriptname: STRING_32
fut: FILE_UTILITIES
r,p,pp: PATH
enc: PERCENT_ENCODER
wc: INTEGER
do
-- Path to CGI executable.
l_path_info := req.path_info
if l_path_info.starts_with_general ("/") then
l_path_info := l_path_info.substring (2, l_path_info.count)
r := working_directory.extended (l_path_info.substring (2, l_path_info.count))
else
r := working_directory.extended (l_path_info)
end
-- Process
Result := working_direction.extended (l_path_info)
from
p := r
until
p = Void or else fut.file_path_exists (p)
loop
pp := p.parent
if not p.same_as (pp) then
p := pp
else
p := Void
end
end
create enc
wc := working_directory.name.count
if p = Void then
p := r
l_path_info := ""
else
l_path_info := r.name
l_path_info.remove_head (wc + 1)
end
l_scriptname := p.name
l_scriptname.remove_head (wc + 1)
l_path_info.remove_head (l_scriptname.count + 1)
Result := [p, to_percent_encoded_uri (l_scriptname), to_percent_encoded_uri (l_path_info)]
end
exists (req: WSF_REQUEST): BOOLEAN
-- CGI file exists?
to_percent_encoded_uri (s: READABLE_STRING_32): STRING_8
local
enc: PERCENT_ENCODER
p: PATH
do
Result := (create {FILE_UTILITIES}).file_path_exists (cgi_file_path (req))
if s.is_empty then
Result := ""
else
create p.make_from_string (s)
create Result.make (s.count)
create enc
across
p.components as ic
loop
Result.append_character ('/')
enc.append_percent_encoded_string_to (ic.item.name, Result)
end
end
end
feature -- Execution
@@ -53,7 +97,6 @@ feature -- Execution
-- Execute `req' responding in `res'.
local
fut: FILE_UTILITIES
l_exec_path: PATH
proc: BASE_PROCESS
l_input_env: STRING_TABLE [READABLE_STRING_GENERAL]
l_input_header: detachable STRING
@@ -85,11 +128,15 @@ feature -- Execution
end
-- No need to import `l_input_header` in environment
-- As current connector already did the job.
if
attached cgi_request_data (req) as d and then
fut.file_path_exists (d.location)
then
l_input_env.force (d.script_name, "SCRIPT_NAME")
l_input_env.force (d.path_info, "PATH_INFO")
-- Process
l_exec_path := cgi_file_path (req)
if fut.file_path_exists (l_exec_path) then
proc := (create {BASE_PROCESS_FACTORY}).process_launcher (l_exec_path.name, Void, working_direction.name)
proc := (create {BASE_PROCESS_FACTORY}).process_launcher (d.location.name, Void, working_directory.name)
proc.set_hidden (True)
proc.set_environment_variable_table (l_input_env)
proc.set_separate_console (False)
@@ -225,7 +272,7 @@ feature -- Execution
end
note
copyright: "2011-2017, Jocelyn Fiat, Javier Velilla, Olivier Ligot, Colin Adams, Eiffel Software and others"
copyright: "2011-2019, 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