diff --git a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e index b223538a..2bb63746 100644 --- a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e +++ b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_connector.e @@ -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) diff --git a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_input_stream.e b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_input_stream.e index cdb4d1c3..ec757d63 100644 --- a/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_input_stream.e +++ b/library/server/ewsgi/connectors/libfcgi/src/wgi_libfcgi_input_stream.e @@ -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 diff --git a/library/server/libfcgi/implementation/linux/fcgi_c_api.e b/library/server/libfcgi/implementation/linux/fcgi_c_api.e index 49cf18cf..abd238df 100644 --- a/library/server/libfcgi/implementation/linux/fcgi_c_api.e +++ b/library/server/libfcgi/implementation/linux/fcgi_c_api.e @@ -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 diff --git a/library/server/libfcgi/implementation/linux/fcgi_imp.e b/library/server/libfcgi/implementation/linux/fcgi_imp.e index d5750f06..b680d527 100644 --- a/library/server/libfcgi/implementation/linux/fcgi_imp.e +++ b/library/server/libfcgi/implementation/linux/fcgi_imp.e @@ -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 diff --git a/library/server/libfcgi/implementation/mac/fcgi_c_api.e b/library/server/libfcgi/implementation/mac/fcgi_c_api.e index 144abb9e..9a2184d2 100644 --- a/library/server/libfcgi/implementation/mac/fcgi_c_api.e +++ b/library/server/libfcgi/implementation/mac/fcgi_c_api.e @@ -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 diff --git a/library/server/libfcgi/implementation/mac/fcgi_imp.e b/library/server/libfcgi/implementation/mac/fcgi_imp.e index 7f41b318..5038be36 100644 --- a/library/server/libfcgi/implementation/mac/fcgi_imp.e +++ b/library/server/libfcgi/implementation/mac/fcgi_imp.e @@ -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 diff --git a/library/server/libfcgi/implementation/windows/fcgi_c_api.e b/library/server/libfcgi/implementation/windows/fcgi_c_api.e index c136f142..85b7653f 100644 --- a/library/server/libfcgi/implementation/windows/fcgi_c_api.e +++ b/library/server/libfcgi/implementation/windows/fcgi_c_api.e @@ -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" diff --git a/library/server/libfcgi/implementation/windows/fcgi_imp.e b/library/server/libfcgi/implementation/windows/fcgi_imp.e index d8e13027..7e5ba492 100644 --- a/library/server/libfcgi/implementation/windows/fcgi_imp.e +++ b/library/server/libfcgi/implementation/windows/fcgi_imp.e @@ -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]