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. Чтобы увидеть, что на самом деле происходит, сделайте захват пакета. Посмотрите на ответ Саймона Райта, чтобы увидеть, откуда берутся эти фиктивные данные.