diff --git a/draft/library/server/request/rest/src/contrib/doc/html/html_page.e b/draft/library/server/request/rest/src/contrib/doc/html/html_page.e index 6b3bf0a0..bf65185b 100644 --- a/draft/library/server/request/rest/src/contrib/doc/html/html_page.e +++ b/draft/library/server/request/rest/src/contrib/doc/html/html_page.e @@ -158,7 +158,7 @@ feature -- Output send (buf: WSF_RESPONSE) do buf.set_status_code (200) - buf.write_headers_string (header_string) + buf.write_header_text (header_string) buf.write_string (message_string) end diff --git a/draft/library/server/request/rest/src/response/rest_response.e b/draft/library/server/request/rest/src/response/rest_response.e index a9221271..c024d09d 100644 --- a/draft/library/server/request/rest/src/response/rest_response.e +++ b/draft/library/server/request/rest/src/response/rest_response.e @@ -133,7 +133,7 @@ feature -- Output do compute res.set_status_code (200) - res.write_headers_string (headers_string) + res.write_header_text (headers_string) if attached message as m then res.write_string (m) end diff --git a/draft/library/server/request/rest/tests/src/app/app_account_verify_credential.e b/draft/library/server/request/rest/tests/src/app/app_account_verify_credential.e index 00de5b16..3314c6e5 100644 --- a/draft/library/server/request/rest/tests/src/app/app_account_verify_credential.e +++ b/draft/library/server/request/rest/tests/src/app/app_account_verify_credential.e @@ -88,7 +88,7 @@ feature -- Execution end if not s.is_empty then res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) end else diff --git a/draft/library/server/request/rest/tests/src/app/app_test.e b/draft/library/server/request/rest/tests/src/app/app_test.e index 7ad0960a..265793f0 100644 --- a/draft/library/server/request/rest/tests/src/app/app_test.e +++ b/draft/library/server/request/rest/tests/src/app/app_test.e @@ -80,7 +80,7 @@ feature -- Execution end res.set_status_code (200) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) end diff --git a/draft/library/server/request/rest/tests/src/app_server.e b/draft/library/server/request/rest/tests/src/app_server.e index ec211259..6ca093ad 100644 --- a/draft/library/server/request/rest/tests/src/app_server.e +++ b/draft/library/server/request/rest/tests/src/app_server.e @@ -92,7 +92,7 @@ feature -- Execution s.append ("You are being redirected to /doc in 2 seconds ...%N") h.put_content_length (s.count) res.set_status_code ({HTTP_STATUS_CODE}.temp_redirect) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) end diff --git a/examples/hello_routed_world/src/hello_routed_world.e b/examples/hello_routed_world/src/hello_routed_world.e index 544a49aa..a1a83d92 100644 --- a/examples/hello_routed_world/src/hello_routed_world.e +++ b/examples/hello_routed_world/src/hello_routed_world.e @@ -99,7 +99,7 @@ feature -- Execution h.put_transfer_encoding_chunked -- h.put_content_length (0) res.set_status_code ({HTTP_STATUS_CODE}.moved_permanently) - res.write_headers_string (h.string) + res.write_header_text (h.string) from create e @@ -202,7 +202,7 @@ feature -- Execution h.put_content_type (l_response_content_type) h.put_content_length (l_body.count) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (l_body) end end diff --git a/examples/restbucks/src/resource/order_handler.e b/examples/restbucks/src/resource/order_handler.e index 850b60e7..b66b9fe5 100644 --- a/examples/restbucks/src/resource/order_handler.e +++ b/examples/restbucks/src/resource/order_handler.e @@ -92,7 +92,7 @@ feature -- HTTP Methods end h.add_header ("etag:" + etag_utils.md5_digest (l_order.out)) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (l_msg) end end @@ -171,7 +171,7 @@ feature -- HTTP Methods if attached {JSON_VALUE} json.value (l_order) as jv then h.put_content_length (jv.representation.count) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (jv.representation) end end @@ -214,7 +214,7 @@ feature -- HTTP Methods h.put_utc_date (time) end res.set_status_code ({HTTP_STATUS_CODE}.no_content) - res.write_headers_string (h.string) + res.write_header_text (h.string) end do_post (ctx: C; req: WSF_REQUEST; res: WSF_RESPONSE) @@ -264,7 +264,7 @@ feature -- HTTP Methods h.put_utc_date (time) end res.set_status_code ({HTTP_STATUS_CODE}.created) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (l_msg) end end diff --git a/examples/restbucks/src/restbucks_server.e b/examples/restbucks/src/restbucks_server.e index e6ffb8d5..be9f9da5 100644 --- a/examples/restbucks/src/restbucks_server.e +++ b/examples/restbucks/src/restbucks_server.e @@ -63,7 +63,7 @@ feature -- Execution h.put_content_length (l_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.method_not_allowed) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (l_description) end diff --git a/library/protocol/http/src/http_header.e b/library/protocol/http/src/http_header.e index c8824451..6221778e 100644 --- a/library/protocol/http/src/http_header.e +++ b/library/protocol/http/src/http_header.e @@ -66,11 +66,9 @@ feature -- Access local l_headers: like headers do - create Result.make (32) l_headers := headers - if l_headers.is_empty then - put_content_type_text_html -- See if this make sense to define a default content-type - else + if not l_headers.is_empty then + create Result.make (32) from l_headers.start until @@ -79,8 +77,12 @@ feature -- Access append_line_to (l_headers.item, Result) l_headers.forth end + else + create Result.make_empty end - append_end_of_line_to (Result) + ensure + result_has_ending_cr_lf: Result.count >= 2 implies Result.substring (Result.count - 2, Result.count).same_string ("%R%N") + result_has_single_ending_cr_lf: Result.count >= 4 implies not Result.substring (Result.count - 4, Result.count).same_string ("%R%N%R%N") end feature -- Header change: general diff --git a/library/server/ewsgi/examples/hello_world/src/hello_world.e b/library/server/ewsgi/examples/hello_world/src/hello_world.e index 510f3386..cf9593c0 100644 --- a/library/server/ewsgi/examples/hello_world/src/hello_world.e +++ b/library/server/ewsgi/examples/hello_world/src/hello_world.e @@ -20,7 +20,8 @@ feature {NONE} -- Initialization execute (req: WGI_REQUEST; res: WGI_RESPONSE) do - res.write_header (200, <<["Content-Type", "text/plain"]>>) + res.set_status_code (200) + res.write_header_lines (<<["Content-Type: text/plain"]>>) res.write_string ("Hello World!%N") end diff --git a/library/server/ewsgi/specification/response/wgi_response.e b/library/server/ewsgi/specification/response/wgi_response.e index b97ee1ef..8f814bae 100644 --- a/library/server/ewsgi/specification/response/wgi_response.e +++ b/library/server/ewsgi/specification/response/wgi_response.e @@ -68,7 +68,22 @@ feature -- Status setting feature -- Header output operation - write_headers (a_headers: READABLE_STRING_8) + write_header_text (a_text: READABLE_STRING_8) + -- Write http header string `a_text' + -- It should not contain the ending CR LF CR LF + -- since it is the duty of `write_header_text' to write it. + require + a_text_does_not_has_ending_crlf_crlf: a_text.count > 4 implies not a_text.substring (a_text.count - 4, a_text.count).same_string ("%R%N%R%N") + status_set: status_is_set + header_not_committed: not header_committed + deferred + ensure + status_set: status_is_set + header_committed: header_committed + message_writable: message_writable + end + + write_header_lines (a_lines: ITERABLE [TUPLE [name: READABLE_STRING_8; value: READABLE_STRING_8]]) require status_set: status_is_set header_not_committed: not header_committed diff --git a/library/server/ewsgi/src/helper/wgi_response_stream.e b/library/server/ewsgi/src/helper/wgi_response_stream.e index 8ada8a12..33c35e51 100644 --- a/library/server/ewsgi/src/helper/wgi_response_stream.e +++ b/library/server/ewsgi/src/helper/wgi_response_stream.e @@ -75,12 +75,31 @@ feature -- Status setting feature -- Header output operation - write_headers (a_headers: READABLE_STRING_8) + write_header_text (a_text: READABLE_STRING_8) do - write (a_headers) + write (a_text) + write (crlf) header_committed := True end + write_header_lines (a_lines: ITERABLE [TUPLE [name: READABLE_STRING_8; value: READABLE_STRING_8]]) + local + h: STRING_8 + do + create h.make (256) + across + a_lines as c + loop + h.append (c.item.name) + h.append_character (':') + h.append_character (' ') + h.append (c.item.value) + h.append_character ('%R') + h.append_character ('%N') + end + write_header_text (h) + end + feature -- Output operation write_string (s: READABLE_STRING_8) @@ -109,6 +128,9 @@ feature -- Output operation feature {NONE} -- Implementation: Access + crlf: STRING = "%R%N" + -- End of header + output: WGI_OUTPUT_STREAM -- Server output channel diff --git a/library/server/request/router/src/misc/request_resource_handler_helper.e b/library/server/request/router/src/misc/request_resource_handler_helper.e index 220cb8ca..2f17d737 100644 --- a/library/server/request/router/src/misc/request_resource_handler_helper.e +++ b/library/server/request/router/src/misc/request_resource_handler_helper.e @@ -177,7 +177,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.bad_request) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -192,7 +192,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.precondition_failed) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -206,7 +206,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.internal_server_error) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -220,7 +220,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.not_implemented) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -234,7 +234,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.method_not_allowed) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -248,7 +248,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.not_found) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -264,7 +264,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.not_modified) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end @@ -279,7 +279,7 @@ feature -- Handle responses h.put_content_length (a_description.count) h.put_current_date res.set_status_code ({HTTP_STATUS_CODE}.conflict) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (a_description) end diff --git a/library/server/request/router/src/request_file_system_handler.e b/library/server/request/router/src/request_file_system_handler.e index 9f6267ca..3f766391 100644 --- a/library/server/request/router/src/request_file_system_handler.e +++ b/library/server/request/router/src/request_file_system_handler.e @@ -63,7 +63,7 @@ feature -- Execution h.put_content_length (s.count) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) end end @@ -136,7 +136,7 @@ feature -- Execution h.put_content_type_text_html res.set_status_code ({HTTP_STATUS_CODE}.ok) h.put_content_length (s.count) - res.write_headers_string (h.string) + res.write_header_text (h.string) if not req.request_method.same_string ({HTTP_REQUEST_METHODS}.method_head) then res.write_string (s) end @@ -161,13 +161,13 @@ feature -- Execution h.put_content_type (ct) h.put_content_length (f.count) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) else create h.make h.put_content_type ({HTTP_MIME_TYPES}.application_force_download) h.put_content_length (f.count) res.set_status_code ({HTTP_STATUS_CODE}.ok) - res.write_headers_string (h.string) + res.write_header_text (h.string) end if not req.request_method.same_string ({HTTP_REQUEST_METHODS}.method_head) then res.write_file_content (fn) @@ -186,7 +186,7 @@ feature -- Execution s.append ("Resource %"" + uri + "%" not found%N") res.set_status_code ({HTTP_STATUS_CODE}.not_found) h.put_content_length (s.count) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) res.flush end @@ -202,7 +202,7 @@ feature -- Execution s.append ("Resource %"" + uri + "%": Access denied%N") res.set_status_code ({HTTP_STATUS_CODE}.forbidden) h.put_content_length (s.count) - res.write_headers_string (h.string) + res.write_header_text (h.string) res.write_string (s) res.flush end diff --git a/library/server/wsf/src/wsf_response.e b/library/server/wsf/src/wsf_response.e index c88ccbe4..11432186 100644 --- a/library/server/wsf/src/wsf_response.e +++ b/library/server/wsf/src/wsf_response.e @@ -73,12 +73,12 @@ feature -- Status setting feature -- Header output operation - write_headers_string (a_headers: READABLE_STRING_8) + write_header_text (a_headers: READABLE_STRING_8) require status_set: status_is_set header_not_committed: not header_committed do - wgi_response.write_headers (a_headers) + wgi_response.write_header_text (a_headers) ensure status_set: status_is_set header_committed: header_committed @@ -107,7 +107,7 @@ feature -- Header output operation i := i + 1 end end - wgi_response.write_headers (h.string) + wgi_response.write_header_text (h.string) ensure header_committed: header_committed status_set: status_is_set