Ada - отправка HTTP-ответа с помощью GNAT.Sockets

У меня проблема с отправкой заголовков через сокет в ADA. Вот код:

    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-запрос через сокет, все замечательно. Проблема возникает, когда я пытаюсь отправить ответ. После последней строки в цитируемом коде мой браузер получает только HTTP/0.9 200 OK (Проверено с помощью живых HTTP-заголовков), и никакой контент вообще не отображается (что немного странно для меня, потому что я просто отправляю HTTP/1.1 200 OK).

Был бы очень признателен за небольшую помощь. Заранее спасибо:)

2 ответа

Решение

String’Output " Записывает значение Item в Stream, включая любые границы или дискриминанты" ( ARM 13.13.2 (21)).

String является неопределенным типом, поэтому строка, которую вы пытаетесь вывести, действительно имеет границы, и то, что вы отправляете, это индекс первого символа строки в виде 4-байтового двоичного числа, индекс последнего символа строка как 4-байтовое двоичное число, а затем строка.

использование String’Write вместо этого (см. ARM 13.13.2 (9)).

Я не знаком с Ада, но ваш код все равно выглядит неправильно.

  • Вы читаете заголовок из Socket и просто предположим, что полный заголовок находится в пределах одного чтения. Вместо этого вы должны читать строки из сокета, пока не получите конец заголовка (одна строка только с CRLF).
  • Вы пишете Channel Что бы это ни было. Вместо этого вам нужно написать в тот же Socket Вы получили запрос от.

мой браузер получает только HTTP/0,9 200 OK

Вы, вероятно, видите только псевдо-заголовок, добавленный браузером, потому что ничего полезного не было. На самом деле HTTP 0.9 вообще не имеет заголовка ответа (т. Е. Нет "HTTP/0.9"), так что это, вероятно, сделано браузером, потому что он получил что-то без действительного заголовка HTTP. Чтобы увидеть, что на самом деле происходит, сделайте захват пакета. Посмотрите на ответ Саймона Райта, чтобы увидеть, откуда берутся эти фиктивные данные.

Другие вопросы по тегам