diff --git a/examples/simple/application_execution.e b/examples/simple/application_execution.e index 179f215c..d823a16e 100644 --- a/examples/simple/application_execution.e +++ b/examples/simple/application_execution.e @@ -24,6 +24,8 @@ feature -- Basic operations s := "Hello World!" create dt.make_now_utc s.append (" (UTC time is " + dt.rfc850_string + ").") + s.append ("%N") + s.append ("Your request: " + request.request_uri + " %N") response.put_header ({HTTP_STATUS_CODE}.ok, <<["Content-Type", "text/html"], ["Content-Length", s.count.out]>>) response.set_status_code ({HTTP_STATUS_CODE}.ok) response.header.put_content_type_text_html diff --git a/library/server/ewsgi/connectors/standalone/lib/httpd/httpd_request_handler_i.e b/library/server/ewsgi/connectors/standalone/lib/httpd/httpd_request_handler_i.e index d401aa4a..38481237 100644 --- a/library/server/ewsgi/connectors/standalone/lib/httpd/httpd_request_handler_i.e +++ b/library/server/ewsgi/connectors/standalone/lib/httpd/httpd_request_handler_i.e @@ -33,7 +33,7 @@ feature {NONE} -- Initialization do reset_request - has_error := False + reset_error if attached internal_client_socket as l_sock then l_sock.cleanup end @@ -156,6 +156,20 @@ feature -- Status report has_error: BOOLEAN -- Error occurred during `analyze_request_message' +feature -- Status change + + report_error (m: detachable READABLE_STRING_GENERAL) + -- Report error occurred, with optional message `m'. + do + has_error := True + end + + reset_error + -- Reset previous error for current request handler. + do + has_error := False + end + feature -- Change set_is_verbose (b: BOOLEAN) @@ -236,11 +250,18 @@ feature -- Execution require is_connected: is_connected reuse_connection_when_possible: a_is_reusing_connection implies is_persistent_connection_supported + no_error: not has_error local l_remote_info: detachable like remote_info l_socket: like client_socket l_is_ready: BOOLEAN do + debug ("dbglog") + if a_is_reusing_connection then + dbglog ("execute_request: wait on persistent connection.") + end + end + reset_error l_socket := client_socket check socket_attached: l_socket /= Void @@ -248,17 +269,18 @@ feature -- Execution end if l_socket.is_closed then debug ("dbglog") - dbglog (generator + ".execute_request {socket is Closed!}") + dbglog ("execute_request {socket is Closed!}") end else debug ("dbglog") - dbglog (generator + ".execute_request socket=" + l_socket.descriptor.out + " ENTER") + dbglog ("execute_request socket=" + l_socket.descriptor.out + " ENTER") end if a_is_reusing_connection then --| set by default 5 seconds. l_socket.set_recv_timeout (keep_alive_timeout) -- in seconds! - l_is_ready := l_socket.ready_for_reading + -- FIXME: check if both are really needed. + l_is_ready := l_socket.ready_for_reading and then l_socket.has_incoming_data else l_is_ready := True end @@ -273,30 +295,31 @@ feature -- Execution remote_info := l_remote_info end analyze_request_message (l_socket) - else - has_error := True - debug ("dbglog") - dbglog (generator + ".execute_request socket=" + l_socket.descriptor.out + "} timeout!") - end - end - if has_error then - if l_is_ready then + if has_error then -- check catch_bad_incoming_connection: False end if is_verbose then log (request_header + "%NWARNING: invalid HTTP incoming request", warning_level) end - end - process_bad_request (l_socket) - is_persistent_connection_requested := False - else - if is_verbose then - log (request_header, information_level) - end - process_request (l_socket) - end + process_bad_request (l_socket) + is_persistent_connection_requested := False + else + if is_verbose then + log (request_header, information_level) + end + process_request (l_socket) + end + else + check is_reusing_connection: a_is_reusing_connection end + -- Close persistent connection, since no new connection occurred in the delay `keep_alive_timeout'. + is_persistent_connection_requested := False + debug ("dbglog") + dbglog ("execute_request socket=" + l_socket.descriptor.out + "} close persistent connection.") + end + end + debug ("dbglog") - dbglog (generator + ".execute_request {" + l_socket.descriptor.out + "} LEAVE") + dbglog ("execute_request {" + l_socket.descriptor.out + "} LEAVE") end end end @@ -329,22 +352,27 @@ feature -- Request processing h: STRING s: STRING do - s := "{ + -- NOTE: this is experiment code, and not ready yet. + if a_socket.is_connected and then a_socket.ready_for_writing then + s := "{