Я пишу http-сервер, и у меня просто возник вопрос о том, как реализовать запрос PUT.
Я читаю клиентский сокет по одному байту за раз, пока не доберусь до новой строки CRLF "\ r\n", где я отправляю строку парсеру, который будет токенизировать. Когда я получаю два разрыва строки подряд, я отправляю ответ (так как это стандарт http, чтобы символизировать, что запрос завершен).
Это было хорошо для реализации GET/HEAD/DELETE. Но теперь я вижу, что PUT имеет двойной разрыв строки для контента.
PUT /index.html HTTP/1.0
Headers: stuff <--- not the real CRLF 1
<--- not the real CRLF 2
html content goes here <--- CRLF 1
<--- CRLF 2 ... done, send response
Это достаточно легко объяснить. Если первая строка, которую я анализирую, это PUT, я просто скажу, хорошо, не отправляйте запрос, пока мы не получим второй CRLF1 + 2.
Но что, если у содержимого есть разрывы строк, тогда как я могу узнать, когда клиент - действительно, отправил мне вещи?
Клиент должен отправить поле заголовка content-length
. Более подробное обсуждение см. В разделе RFC 2616 4.4. Длина сообщения.