Ada - 使用 GNAT.Sockets 发送 HTTP 响应

Ada - Sending HTTP response with GNAT.Sockets

我在通过 ADA 中的套接字发送 headers 时遇到了问题。 这是代码:

    Address.Addr := Addresses(Get_Host_By_Name(Host_Name), 1);
    Address.Port := 80;
    Create_Socket(Server);
    Set_Socket_Option(Server, Socket_Level, (Reuse_Address, True));
    Bind_Socket(Server, Address);
    Listen_Socket(Server);
    Accept_Socket(Server, Socket, Address);
    Channel := Stream(Socket);

    Receive_Socket(Socket, Data, Offset);
    for I in 1 .. Offset loop
        Append(Request, Character'Val(Data(I)));
    end loop;

    String'Output(Channel, 
         "HTTP/1.1 200 OK" & CRLF & 
         "Date: Fri, 09 Jan 2015 01:08:54 GMT" & CRLF & CRLF & 
         "something"
      );

我正在使用 Firefox 浏览器作为客户端。当我通过套接字读取 GET-request 时,一切都很好。当我尝试发送响应时出现问题。在引用代码的最后一行之后,我的浏览器只得到 HTTP/0.9 200 OK(通过 Live HTTP headers 检查)并且根本没有显示任何内容(这对我来说有点奇怪,因为我只是发送 HTTP/1.1 200 OK).

非常感谢您的帮助。提前致谢:)

我不熟悉 Ada,但你的代码看起来还是不对。

  • 您阅读了 Socket 中的 header 并简单地假设完整的 header 是在一次阅读中。相反,您应该从套接字读取行,直到到达 header 的结尾(只有 CRLF 的单行)。
  • 你写信给Channel,不管这是什么。相反,您需要写信给您收到请求的同一个 Socket

my browser gets only HTTP/0.9 200 OK

您可能只看到浏览器添加了一个 pseudo-header,因为没有任何用处。实际上,Simon Wright 的 HTTP 0.9 has no response header at all (i.e. there is not "HTTP/0.9"), so this is probably made up by the browser because it got something without any valid HTTP header. To see what really is going on do a packet capture. Look at the answer 可以查看这些虚假数据的来源。

String’Output“将 Item 的值写入 Stream,包括任何边界或判别式”(ARM 13.13.2 (21))。

String 是不确定类型,所以你要输出的字符串确实有界限,你发送的是字符串第一个字符的索引作为 4 字节二进制number, 字符串的最后一个字符的索引为 4 字节二进制数,然后是字符串。

改用String’Write(参见ARM 13.13.2 (9))。