According to HTTP/1.0 standard the HTTP reply consist of
 * Status Line + CRLF
 * Zero or more Response Header Fields (each ended with CRLF)
 * CRLF on new line (Response Header Fields end marker)
 * Optional Entity Body.

Thus in response headers we state:
  Content-Length = 30
but actual transferred file data is:
  "\r\n<html><body>Hi</body></html>\r\n".
This is 32 bytes of data.

So we get and check for correctness 32 bytes of data, but
 * The response we are used is incorrect, real server will
   set Content-Length to 32.
 * default_wget_info->hdr_cont_len will be set to wrong
   value 30 (used for efi http booting).

Fix an issue by:
 * replace bogus response with an actual response from the HTTP server
 * format response to show HTTP response structure
 * recalculate md5sum as transferred file data has been changed.

The server response was captured with the commands

  echo -ne "<html><body>Hi</body></html>\n" > ~/public_html/test.html
  echo -ne "GET /~${USER}/test.html HTTP/1.0\r\n\r\n" | netcat localhost 80 
>reply.txt

Signed-off-by: Mikhail Kshevetskiy <mikhail.kshevets...@iopsys.eu>
---
 test/cmd/wget.c | 27 ++++++++++++++++++++-------
 1 file changed, 20 insertions(+), 7 deletions(-)

diff --git a/test/cmd/wget.c b/test/cmd/wget.c
index d51650d5854..b020d20ad70 100644
--- a/test/cmd/wget.c
+++ b/test/cmd/wget.c
@@ -107,9 +107,22 @@ static int sb_ack_handler(struct udevice *dev, void 
*packet,
        int payload_len = 0;
        u32 tcp_seq, tcp_ack;
        int tcp_data_len;
-       const char *payload1 = "HTTP/1.1 200 OK\r\n"
-               "Content-Length: 30\r\n\r\n\r\n"
-               "<html><body>Hi</body></html>\r\n";
+       const char *payload1 =
+               /* response status line */
+               "HTTP/1.1 200 OK\r\n"
+               /* response header fields */
+               "Date: Mon, 23 Dec 2024 05:18:23 GMT\r\n"
+               "Server: Apache/2.4.62 (Debian)\r\n"
+               "Last-Modified: Mon, 23 Dec 2024 05:04:50 GMT\r\n"
+               "ETag: \"1d-629e8efb09e7b\"\r\n"
+               "Accept-Ranges: bytes\r\n"
+               "Content-Length: 29\r\n"
+               "Connection: close\r\n"
+               "Content-Type: text/html\r\n"
+               /* response header fields end marker */
+               "\r\n"
+               /* file data (for HTTP GET requests) */
+               "<html><body>Hi</body></html>\n";
 
        /* Don't allow the buffer to overrun */
        if (priv->recv_packets >= PKTBUFSRX)
@@ -136,11 +149,11 @@ static int sb_ack_handler(struct udevice *dev, void 
*packet,
 
        if (tcp_seq == 1 && tcp_ack == 1) {
                if (tcp_data_len == 0) {
-                       /* no data, wait for GET request */
+                       /* no data, wait for GET/HEAD request */
                        return -1;
                }
 
-               /* reply to GET request */
+               /* reply to GET/HEAD request */
                payload_len = strlen(payload1);
                memcpy(data, payload1, payload_len);
                tcp_send->tcp_flags = TCP_ACK;
@@ -215,12 +228,12 @@ static int net_test_wget(struct unit_test_state *uts)
        ut_assertok(run_command("wget ${loadaddr} 1.1.2.2:/index.html", 0));
        ut_assert_nextline_empty();
        ut_assert_nextline("Packets received 5, Transfer Successful");
-       ut_assert_nextline("Bytes transferred = 32 (20 hex)");
+       ut_assert_nextline("Bytes transferred = 29 (1d hex)");
 
        sandbox_eth_set_tx_handler(0, NULL);
 
        run_command("md5sum ${loadaddr} ${filesize}", 0);
-       ut_assert_nextline("md5 for 00020000 ... 0002001f ==> 
234af48e94b0085060249ecb5942ab57");
+       ut_assert_nextline("md5 for 00020000 ... 0002001c ==> 
847d5e7320a27462e90bc1ed75eb8cd8");
        ut_assert_console_end();
 
        env_set("ethact", prev_ethact);
-- 
2.45.2

Reply via email to