diff --git a/tests/standalone/client/test-safe.ecf b/tests/standalone/client/test.ecf
similarity index 81%
rename from tests/standalone/client/test-safe.ecf
rename to tests/standalone/client/test.ecf
index cdfdc999..d13dcd3a 100644
--- a/tests/standalone/client/test-safe.ecf
+++ b/tests/standalone/client/test.ecf
@@ -6,8 +6,8 @@
-
-
+
+
diff --git a/tests/standalone/client/test_app.e b/tests/standalone/client/test_app.e
new file mode 100644
index 00000000..1be80201
--- /dev/null
+++ b/tests/standalone/client/test_app.e
@@ -0,0 +1,253 @@
+note
+ description: "[
+ Enter class description here!
+ ]"
+
+class
+ TEST_APP
+
+inherit
+ SHARED_EXECUTION_ENVIRONMENT
+
+create
+ make
+
+feature {NONE} -- Initialization
+
+ make
+ -- Instantiate Current object.
+ local
+ h, res: STRING
+ i: INTEGER
+ l_test_name: detachable READABLE_STRING_GENERAL
+ choices: HASH_TABLE [READABLE_STRING_GENERAL, INTEGER]
+ do
+ create h.make_empty
+ h.append_character ((0).to_character_8)
+ h.append_character ((0).to_character_8)
+ h.append_character ((255).to_character_8)
+ h.append_character ((255).to_character_8)
+
+ i := 0
+ if attached execution_environment.arguments.argument (1) as tn then
+ l_test_name := tn
+ else
+ create choices.make (tests.count)
+ across
+ tests as ic
+ loop
+ i := i + 1
+ choices.force (ic.key, i)
+ print (i.out + " - " + ic.key.out + "%N")
+ end
+ print (" > ")
+ io.read_line
+ res := io.last_string
+ res.adjust
+ if
+ res.is_integer and then
+ attached choices [res.to_integer] as tn
+ then
+ l_test_name := tn
+ end
+ end
+ if
+ l_test_name /= Void and then
+ attached tests [l_test_name] as proc
+ then
+ proc.call ()
+ else
+ print ("Quit...%N")
+ end
+ end
+
+ port_number: INTEGER = 9090
+
+ hostname: STRING = "localhost"
+
+ has_error: BOOLEAN
+
+ tests: STRING_TABLE [PROCEDURE]
+ once
+ create Result.make (10)
+ Result.force (agent cli_execute_get_request, "get_request")
+ Result.force (agent execute_get_request (1, 0), "get_request (1,0)")
+ Result.force (agent execute_get_request (10, 0), "get_request (10,0)")
+ Result.force (agent execute_get_request (1, 10_000), "get_request (1, 10000)")
+ Result.force (agent execute_get_request (10, 10_000), "get_request (10, 10000)")
+ Result.force (agent execute_wait_for_ever, "wait_for_ever")
+ end
+
+feature -- Execution
+
+ wait_ms (a_delay_ms: INTEGER; m: detachable READABLE_STRING_8)
+ local
+ i64: INTEGER_64
+ do
+ if a_delay_ms > 0 then
+ if has_error then
+ print ("[ERROR/WAIT] Skipped due to previous error%N")
+ else
+
+ i64 := a_delay_ms.as_integer_64 * {INTEGER_64} 1_000_000
+ if m /= Void then
+ print ("[WAIT] " + i64.out + " nanoseconds -> " + m + "%N")
+ else
+ print ("[WAIT] " + i64.out + " nanoseconds.%N")
+ end
+ execution_environment.sleep (i64) -- nanoseconds
+ print ("[WAIT] done.%N")
+ end
+ end
+ end
+
+ cli_execute_get_request
+ local
+ i,n: INTEGER
+ rq_nb: INTEGER
+ sl_val: INTEGER
+ do
+ if attached execution_environment.arguments as args then
+ n := args.argument_count
+ rq_nb := 1
+ sl_val := 0
+ i := 1
+ if n > i then
+ if args.argument (i).is_case_insensitive_equal_general ("get_request") then
+ if n >= i + 1 then
+ rq_nb := args.argument (i + 1).to_integer
+ if n >= i + 2 then
+ sl_val := args.argument (i + 2).to_integer
+ end
+ end
+ execute_get_request (rq_nb, sl_val)
+ end
+ end
+ end
+ end
+
+ execute_get_request (rq_nb: INTEGER; a_delay_ms: INTEGER)
+ require
+ rq_nb > 0
+ local
+ l_socket: NETWORK_STREAM_SOCKET
+ l_packet: PACKET
+ l_header_done, l_done: BOOLEAN
+ line, txt: READABLE_STRING_8
+ h: STRING
+ len: INTEGER
+ i: INTEGER
+ do
+ create l_socket.make_client_by_port (port_number, hostname)
+ l_socket.connect
+
+ from
+ i := rq_nb
+ until
+ i <= 0
+ loop
+ i := i - 1
+
+ print ("GET /test/"+ i.out +" HTTP/1.1%N")
+-- socket_put_string (l_socket, "GET /test/"+ i.out +" HTTP/1.1%R%N")
+
+ socket_put_string (l_socket, "GET /test/"+ i.out)
+ wait_ms (a_delay_ms, "inside GET request line")
+ socket_put_string (l_socket, " HTTP/1.1%R%N")
+ wait_ms (a_delay_ms, "before Host")
+ socket_put_string (l_socket, "Host: localhost:9090%R%N")
+ wait_ms (a_delay_ms, "before Accept")
+ socket_put_string (l_socket, "Accept: */*%R%N")
+ wait_ms (a_delay_ms, "before CRNL")
+ socket_put_string (l_socket, "%R%N")
+ wait_ms (a_delay_ms, "before reading!")
+
+ if not has_error then
+ from
+ l_done := False
+ l_header_done := False
+ create h.make_empty
+ until
+ l_done
+ loop
+ if l_header_done then
+ l_socket.read_stream (len)
+ txt := l_socket.last_string
+ print ("BODY:%N")
+ print (txt)
+ print ("%N")
+ if txt.count /= len then
+ print ("BAD len: " + txt.count.out + " /= " + len.out + "%N")
+ end
+ l_done := True
+ else
+ l_socket.read_line
+ line := l_socket.last_string
+ if l_socket.was_error then
+ l_done := True
+ elseif line.is_empty or (line.count = 1 and line[1] = '%R') then
+ l_header_done := True
+ else
+ if line.starts_with_general ("Content-Length:") then
+ len := line.substring (16, line.count).to_integer
+ end
+ h.append (line)
+ h.append ("%R%N")
+
+ print ("HEADER:")
+ print (line)
+ print ("%N")
+ end
+ end
+ end
+ end
+ end
+ end
+
+ execute_wait_for_ever
+ local
+ l_socket: NETWORK_STREAM_SOCKET
+ l_packet: PACKET
+ do
+ create l_socket.make_client_by_port(9090, "localhost")
+ l_socket.connect
+
+ create l_packet.make(1)
+ l_packet.put_element('a', 0)
+
+ l_socket.send(l_packet, 0)
+
+ from
+
+ until
+ not l_socket.is_connected
+ loop
+
+ end
+ end
+
+ socket_put_string (a_socket: NETWORK_STREAM_SOCKET; s: STRING_8)
+ local
+ retried: BOOLEAN
+ t: STRING
+ i: INTEGER
+ do
+ if has_error then
+ create t.make_from_string (s)
+ i := t.index_of ('%N', 1)
+ if i > 0 then
+ t.keep_head (i - 1)
+ end
+ t.adjust
+ print ("[ERROR] Skip put_string ("+ s +"..)%N")
+ elseif retried then
+ has_error := True
+ else
+ a_socket.put_string (s)
+ end
+ rescue
+ retried := True
+ retry
+ end
+
+end