Files

237 lines
4.8 KiB
Plaintext

note
description: "Abstract interface to FCGI C library"
legal: "See notice at end of class."
status: "See notice at end of class."
date: "$Date$"
revision: "$Revision$"
deferred class FCGI_I
inherit
STRING_HANDLER
feature {NONE} -- Initialization
make
-- Initialize FCGI interface
deferred
end
feature -- Access
updated_environ_variables: STRING_TABLE [READABLE_STRING_8]
local
i: INTEGER
p, v, null: POINTER
do
p := fcgi_environ
create Result.make_equal (50)
if p /= null then
from
i := 0
v := fcgi_i_th_environ (i, p)
until
v = null
loop
if attached separated_variables (create {STRING_8}.make_from_c (v)) as t then
Result.force (t.value, t.key)
end
i := i + 1
v := fcgi_i_th_environ (i,p)
end
end
end
feature -- FCGI interface
fcgi_listen: INTEGER
-- Listen to the FCGI input stream
-- Return 0 for successful calls, -1 otherwise.
deferred
end
fcgi_environ: POINTER
-- Get the (char**) environ variable from the DLL.
deferred
end
fcgi_finish
-- Finish current request from HTTP server started from
-- the most recent call to `fcgi_accept'.
deferred
end
set_fcgi_exit_status (v: INTEGER)
deferred
end
feature -- Status
is_interactive: BOOLEAN
-- Is execution interactive? (for debugging)
do
end
feature -- Input
fill_string_from_stdin (s: STRING; n: INTEGER)
-- Read up to `n' bytes from stdin and store in string `s'
local
new_count: INTEGER
str_area: ANY
do
s.grow (n)
str_area := s.area
new_count := fill_pointer_from_stdin ($str_area, n)
s.set_count (new_count)
end
read_from_stdin (n: INTEGER)
-- Read up to n bytes from stdin and store in input buffer
require
small_enough: n <= buffer_capacity
local
l_c_str: C_STRING
l_count: INTEGER
do
last_read_is_empty_ref.set_item (False)
l_c_str := c_buffer
l_count := fill_pointer_from_stdin (l_c_str.item, n)
last_read_count_ref.set_item (l_count)
if l_count <= 0 then
last_read_is_empty_ref.set_item (True)
end
end
fill_pointer_from_stdin (p: POINTER; n: INTEGER): INTEGER
-- Read up to `n' bytes from stdin and store in pointer `p'
-- and return number of bytes read.
deferred
end
copy_from_stdin (n: INTEGER; f: FILE)
-- Read up to n bytes from stdin and write to given file
require
-- small_enough: n <= buffer_capacity
file_exists: f /= Void
file_open: f.is_open_write or f.is_open_append
deferred
end
feature -- Output
put_string (a_str: READABLE_STRING_8)
-- Put `a_str' on the FastCGI stdout.
require
a_str_not_void: a_str /= Void
deferred
end
feature -- Implementation
buffer_contents: STRING
local
n: like last_read_count
do
n := last_read_count
create Result.make (n)
Result.set_count (n)
c_buffer.read_substring_into (Result, 1, n)
end
buffer_capacity: INTEGER
do
Result := c_buffer.capacity
end
--RFO last_string: STRING
--RFO once
--RFO create Result.make (K_input_bufsize)
--RFO end
last_read_count: INTEGER
do
Result := last_read_count_ref.item
end
last_read_is_empty: BOOLEAN
do
Result := last_read_is_empty_ref.item
end
feature {NONE} -- Shared buffer
c_buffer: C_STRING
-- Buffer for Eiffel to C and C to Eiffel string conversions.
once
create Result.make_empty (K_input_bufsize)
ensure
c_buffer_not_void: Result /= Void
end
feature {NONE} -- Constants
last_read_count_ref: INTEGER_REF
once
create Result
end
last_read_is_empty_ref: BOOLEAN_REF
once
create Result
end
K_input_bufsize: INTEGER = 1024_000
feature {NONE} -- Implementation: Environment
fcgi_i_th_environ (i: INTEGER; p: POINTER): POINTER
-- Environment variable at `i'-th position of `p'.
require
i_valid: i >=0
external
"C inline use <string.h>"
alias
"return ((char **)$p)[$i];"
end
separated_variables (a_var: READABLE_STRING_8): detachable TUPLE [value: READABLE_STRING_8; key: READABLE_STRING_8]
-- Given an environment variable `a_var' in form of "key=value",
-- return separated key and value.
-- Return Void if `a_var' is in incorrect format.
require
a_var_attached: a_var /= Void
local
i, j: INTEGER
done: BOOLEAN
do
j := a_var.count
from
i := 1
until
i > j or done
loop
if a_var.item (i) = '=' then
done := True
else
i := i + 1
end
end
if i > 1 and then i < j then
Result := [a_var.substring (i + 1, j), a_var.substring (1, i - 1)]
end
end
note
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
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