(кроме защищенных сокетов и базового транспортного протокола)
Я пытаюсь реализовать самый простой HTTP-сервер в C # (в частности, я пытаюсь заставить мою программу создать локальный сокет, прослушивающий http://localhost:nnnn, где nnnn - это номер пользовательского порта, который отвечает как если бы это был безопасный веб-сервер).
У меня есть основной код связи, работающий, принимающий соединения, получающий запросы и отвечающий на GET. Я знаю, что это работает в принципе, потому что, если я указываю свой браузер на мой сокет прослушивания через стандартный HTTP, он все работает, и он счастливо отображает веб-страницу, которую я возвращаю.
Но если я пытаюсь подключиться с использованием HTTPS (я использую другой номер порта), он подключается, принимает и даже получает запрос GET, но, несмотря на то, что я возвращаю ответ, браузер зависает, как будто он ждет для чего-то еще - и все же я получаю больше ничего, насколько я знаю (я все еще прислушиваюсь к соединениям, на случай, если он решит установить другие соединения).
Мой ответ таков:
HTTP/1.1 200 OK
Host: localhost:4301
Date: <assume date is correctly formatted>
Content-Type: text/html; charset=us-ascii
Content-Length: 52
Connection: Keep-Alive
<html><head></head><body>Hello, World!</body></html>
Как я уже сказал, это нормально работает для стандартного HTTP - браузер принимает его. Я попытался включить элементы заголовка, на которых, я думал, он мог бы настаивать (я также попытался Connection: закрыть и принудительно разорвать соединение - в этом случае браузер показывает проблему с соединением. При отправке запроса GET он указывал Keep-Alive, поэтому я вернулся к этому. ).
Есть ли что-то, чего мне не хватает, чтобы браузер принял ответ для HTTPS, как это было для HTTP?
Если это помогает, запрос GET, который я получаю для случая HTTPS:
GET /test.html?param1=Test HTTP/1.1
Accept: text/html, application/xhtml+xml, */*
Accept-Language: en-US
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; WOW64; Trident/5.0)
Accept-Encoding: gzip, deflate
Host: localhost:4301
Connection: Keep-Alive
Кроме того, я использую самоподписанный сертификат, созданный с помощью MAKECERT - из-за этого я должен принимать предупреждения и заставлять браузер переходить на страницу, но суть в том, что в конечном итоге отправить запрос GET.