Внимание! Проверка этого задания не предусмотрена!
Вот что вам предстоит сделать:
lookup
Дополните реализацию lookup
, чтобы она возвращала значения:
text / css если extension это css (независимо от регистра букв),
text / html если extension это html (независимо от регистра букв),
image / gif если extension это gif (независимо от регистра букв),
image / x-icon если extension это ico (независимо от регистра букв),
image / jpeg (не image / jpg) если extension это jpg (независимо от регистра букв),
text / javascript если extension это js (независимо от регистра букв),
image / png если extension это png (независимо от регистра букв), или
NULL в других случаях
br>
parse
Завершите реализацию синтаксического анализа таким образом, чтобы функция анализировала (то есть перебирала) line
, извлекая ее absolute-path и query и сохраняя их соответственно в abs_path и query.
Проверка запроса
abs_path
В 3.1.1 на http://tools.ietf.org/html/rfc7230 request_line определена как
method SP request-target SP HTTP-version CRLF
где SP изображает единичный пробел (_) и CRLF обозначает \ r \ n
. Ни одно из полей method, request-target и HTTP-version не должно иметь пробелы.
В 5.3 того же RFC, поле request-target может иметь несколько форм, единственную из которых ваш сервер должен поддерживать:
absolute-path [ "?" query]
где absolute-path (без знака вопроса) должно начинаться на «/» и опционально заканчиваться на «?» за которым следует запрос, который не должен содержать «.
Убедитесь, что request_line
(уже сохранена для вас в переменной line
) соответствует этим правилам, а если нет, отправляйте браузеру ответ «400 Bad Request».
Даже если она им и отвечает, проверьте следующие требования:
Если это не GET метод, отправляйте «405 Method Not Allowed»,
Если request-target начинается не на /, отправляйте «501 Not Implemented»,
Если request-target содержит ", отправляйте« 400 Bad Request»,
Если HTTP-version НЕ HTTP / 1.1, отправляйте «505 HTTP Version Not Supported» или
Если absolute-path не содержит. (Точку, и таким образом расширение файла) - отправляйте «501 Not Implemented».
Есть шанс, что вам помогут функции strchr, strcpy, strncpy и / или strstr.
query
Переопределите строку query, содержащую подстроку query с request-target. Если последнее отсутствует (даже если есть знак вопроса), То в строке должны быть «» (то есть занимать один байт, поскольку query [0] содержит ‘\ 0’).
Например, если request-target имеет значение /hello.php или /hello.php ?, тогда query ставить значение «». И, если request-target содержит /hello.php?q=Alice
, то в query должно быть «q = Alice»
.
Вы можете найти такие функции, как strchr, strcpy, strncpy и / или strstr help!
load
Завершите реализацию load таким образом, чтобы функция:
- Читала все доступные байты из file.
- Сохраняла эти байты в динамически распределенной памяти в куче.
- Сохраняет адрес первого из этих байтов в *content.
- Хранила количество байтов в * length.
Обратите внимание, что content
— это «указатель на указатель» (то есть BYTE *), что означает, что вы можете эффективно «вернуть» BYTE в зависимости от того, какая функция вызывает load, разыменовывая content и сохраняя адрес BYTE в content. Меж тем, length — это указатель (то есть size_t), который вы также можете разыменовать, чтобы «вернуть» size_t в ту функцию, которая вызывает load путем разыменования длины и сохранения числа с *length.
Индексы
Завершите реализацию indexes таким образом, чтобы функция, заданная в каталоге /path/to/a/directory, возвращала /path/to/a/directory/index.php, если в ней фактически существует index.php, или /path/to/a/directory/index.html, если в там фактически существует index.html, или NULL. В первом из этих случаев функция должна динамически выделять память в куче для возвращаемой строки.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
https://ide-fdf86b05fa97437caf38fe607451deb3-8080.cs50.ws
Скопируйте и сохраните тот, что появится у вас - это и будет адрес вашего сервера в дальнейшем. По нему нужно будет заходить, когда напишите "свой" сервер. 3. Советую задание и объяснение изучать на странице оригинала здесь (хоть с google-переводчиком), т.к. перевод задания Javarush получился очень непонятный. 4. Выполнить задания на той странице (нужно дописать некоторые компоненты-части сервера). У меня ушла уйма времени на понимание, что там происходит в коде и околосерверной тематики, прежде чем смог написать первую строчку кода. 5. После компиляции server.c запускать свой сервер нужно похожей командой: После чего открыть соседнюю вкладку браузера и перейти по адресу сервера, скопированному ранее в п.2. *Как и у Artem, мой браузер Opera почему-то отдает команду HTTP/1.0, поэтому я также везде в коде заменил 1.1 на 1.0.