Внимание! Проверка этого задания не предусмотрена!

Вот что вам предстоит сделать:

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 в других случаях

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. В первом из этих случаев функция должна динамически выделять память в куче для возвращаемой строки.