Fixed various issues with libfcgi on Linux, mainly related to stdout,stderr,stdin, feof and related.

Added `reset' to the libfcgi input stream so that it is possible to reset previous errors.
This commit is contained in:
2013-12-03 10:45:52 +01:00
parent 4f15745647
commit 07ec0d001f
8 changed files with 116 additions and 28 deletions

View File

@@ -62,6 +62,7 @@ feature -- Execution
rescued: BOOLEAN
do
if not rescued then
a_input.reset
create req.make (vars, a_input, Current)
create res.make (a_output, a_output)
service.execute (req, res)

View File

@@ -32,6 +32,21 @@ feature {NONE} -- Initialization
create last_string.make_empty
end
feature -- Reset
reset
-- Reset current input stream
-- especially any previous error if any.
do
debug ("wsf")
io.error.put_string (generator + " : reset %N")
end
last_string.wipe_out
last_character := '%U'
internal_end_of_input := False
fcgi.fcgi_clearerr
end
feature -- Status report
is_open_read: BOOLEAN
@@ -43,9 +58,11 @@ feature -- Status report
end_of_input: BOOLEAN
-- Has the end of input stream been reached?
do
Result := fcgi.fcgi_end_of_input
Result := fcgi.fcgi_end_of_input or internal_end_of_input
end
internal_end_of_input: BOOLEAN
feature -- Input
read_character
@@ -59,6 +76,7 @@ feature -- Input
if s.count >= 1 then
last_character := s.item (1)
else
internal_end_of_input := True
last_character := '%U'
end
end
@@ -69,6 +87,7 @@ feature -- Input
-- Make result available in `last_string'.
do
fcgi.fill_string_from_stdin (last_string, nb_char)
internal_end_of_input := last_string.count < nb_char
end
feature -- Access
@@ -86,7 +105,7 @@ feature {NONE} -- Implementation
-- Bridge to FCGI world
note
copyright: "2011-2011, Eiffel Software and others"
copyright: "2011-2013, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software

View File

@@ -68,10 +68,28 @@ feature {FCGI_IMP} -- Internal
feof (v: POINTER): INTEGER
-- FCGI_feof()
-- 0 means EOF not detected.
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_feof"
"return FCGI_feof($v);"
end
ferror (v: POINTER): INTEGER
-- FCGI_ferror()
-- 0 means no error.
external
"C inline use %"fcgi_stdio.h%""
alias
"return FCGI_ferror($v);"
end
clearerr (v: POINTER)
-- FCGI_clearerr().
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_clearerr($v)"
end
feature {NONE} -- Input
@@ -108,27 +126,27 @@ feature -- Error
feature -- Access
stdout: POINTER
-- FCGI_stdout() return pointer on output FCGI_FILE
-- FCGI_stdout return pointer on output FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdout"
"return FCGI_stdout;"
end
stdin: POINTER
-- FCGI_stdin() return pointer on input FCGI_FILE
-- FCGI_stdin return pointer on input FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdin"
"return FCGI_stdin;"
end
stderr: POINTER
-- FCGI_stderr() return pointer on error FCGI_FILE
-- FCGI_stderr return pointer on error FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stderr"
"return FCGI_stderr;"
end
note

View File

@@ -32,7 +32,12 @@ feature -- Access
fcgi_end_of_input: BOOLEAN
do
Result := fcgi.feof (fcgi.stdin) = 0
Result := fcgi.feof (fcgi.stdin) /= 0 --| in fact, True if feof (..) = EOF
end
fcgi_clearerr
do
fcgi.clearerr (fcgi.stdin)
end
feature -- FCGI Connection
@@ -52,7 +57,7 @@ feature -- FCGI Connection
eif_environ = (char**) environ;
]"
end
fcgi_finish
-- Finish current request from HTTP server started from
-- the most recent call to `fcgi_accept'.
@@ -175,7 +180,7 @@ feature -- I/O Routines
--RFO end
note
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"
copyright: "Copyright (c) 1984-2013, Eiffel Software and others"
license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)"
source: "[
Eiffel Software

View File

@@ -68,10 +68,28 @@ feature {FCGI_IMP} -- Internal
feof (v: POINTER): INTEGER
-- FCGI_feof()
-- 0 means EOF not detected.
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_feof"
"return FCGI_feof($v);"
end
ferror (v: POINTER): INTEGER
-- FCGI_ferror()
-- 0 means no error.
external
"C inline use %"fcgi_stdio.h%""
alias
"return FCGI_ferror($v);"
end
clearerr (v: POINTER)
-- FCGI_clearerr().
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_clearerr($v)"
end
feature {NONE} -- Input
@@ -108,27 +126,27 @@ feature -- Error
feature -- Access
stdout: POINTER
-- FCGI_stdout() return pointer on output FCGI_FILE
-- FCGI_stdout return pointer on output FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdout"
"return FCGI_stdout;"
end
stdin: POINTER
-- FCGI_stdin() return pointer on input FCGI_FILE
-- FCGI_stdin return pointer on input FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdin"
"return FCGI_stdin;"
end
stderr: POINTER
-- FCGI_stderr() return pointer on error FCGI_FILE
-- FCGI_stderr return pointer on error FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stderr"
"return FCGI_stderr;"
end
note

View File

@@ -32,7 +32,12 @@ feature -- Access
fcgi_end_of_input: BOOLEAN
do
Result := fcgi.feof (fcgi.stdin) = 0
Result := fcgi.feof (fcgi.stdin) /= 0 --| in fact, True if feof (..) = EOF
end
fcgi_clearerr
do
fcgi.clearerr (fcgi.stdin)
end
feature -- FCGI Connection

View File

@@ -65,12 +65,30 @@ feature {FCGI_IMP} -- Internal
feof (v: POINTER): INTEGER
-- FCGI_feof()
-- 0 means EOF not detected.
external
"dll libfcgi.dll signature (EIF_POINTER): EIF_INTEGER use fcgi_stdio.h "
alias
"FCGI_feof"
end
ferror (v: POINTER): INTEGER
-- FCGI_ferror()
-- 0 means no error.
external
"dll libfcgi.dll signature (EIF_POINTER): EIF_INTEGER use fcgi_stdio.h "
alias
"FCGI_ferror"
end
clearerr (v: POINTER)
-- FCGI_clearerr().
external
"dll libfcgi.dll signature (EIF_POINTER) use fcgi_stdio.h "
alias
"FCGI_clearerr"
end
feature {NONE} -- Input
fread (v: POINTER; a_size: INTEGER; n: INTEGER; fp: POINTER): INTEGER
@@ -123,29 +141,28 @@ feature {NONE} -- Output
feature -- Access
stdout: POINTER
-- FCGI_stdout() return pointer on output FCGI_FILE
-- FCGI_stdout return pointer on output FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdout"
"return FCGI_stdout;"
end
stdin: POINTER
-- FCGI_stdin() return pointer on input FCGI_FILE
-- FCGI_stdin return pointer on input FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stdin"
"return FCGI_stdin;"
end
stderr: POINTER
-- FCGI_stderr() return pointer on error FCGI_FILE
-- FCGI_stderr return pointer on error FCGI_FILE
external
"C inline use %"fcgi_stdio.h%""
alias
"FCGI_stderr"
"return FCGI_stderr;"
end
note
copyright: "Copyright (c) 1984-2011, Eiffel Software and others"

View File

@@ -30,7 +30,12 @@ feature -- Access
fcgi_end_of_input: BOOLEAN
do
Result := fcgi.feof (fcgi.stdin) = 0
Result := fcgi.feof (fcgi.stdin) /= 0 --| in fact, True if feof (..) = EOF
end
fcgi_clearerr
do
fcgi.clearerr (fcgi.stdin)
end
-- updated_environ_variables: HASH_TABLE [STRING, STRING]