undefined

Практическое задание

Harvard CS50
7 уровень , 6 лекция
Открыта

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

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

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

Комментарии (18)
Чтобы просмотреть все комментарии или оставить свой,
перейдите в полную версию
Artem 0 уровень
7 марта 2021
здравствуйте, коллеги. здесь опишу, как я бодался с этим заданием. надеюсь, будет полезно тем, кто как и я работает в IDE. как кто-то уже отмечал, описание и подготовка к заданию изложено так себе. плюс к этому, с 2015 г. много что поменялось. поэтому, перво на перво, делаем, как описано на предыдущей странице ( здесь https://javarush.ru/quests/lectures/questharvardcs50.level07.lecture05 ): скачиваем задание 2014 г., разархивируем, изучаем теорию. не заморачивайтесь, когда после выполнения команды tree ваше файловое дерево не совпадёт с тем, что на картинке. наверное, так задумано, чтобы не скучно было :) далее, я бы порекомендовал поиграть с версией сервера, которую написали преподы. для этого переходим в каталог, где у вас лежит server.c, который предстоит допилить, печатаем в терминале http-server -p 8080 public и жмём ввод. вылезет что-то такое: Starting up http-server, serving public Available on: https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws Hit CTRL-C to stop the server здесь, как я понял, https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws это ваше уникальное место, где будет выполняться ваш личный сервер, а 8080 - это номер порта. кликаем по этой ссылке мышкой, из выпадающего меню выбираем Open и появляется новая вкладка браузера (по крайней мере у меня так работает в Mozilla FireFox). смотрим что появилось в терминале. в моём случае было так: [2021-03-07T00:55:20.683Z] "GET /" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0"
Artem 0 уровень
7 марта 2021
переходим на вкладку, которая появилась ранее при кликаньи на https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws и видим все те файлы, что у вас лежат в папке public. т.е. мы попали в корень сервера. покликайте по этим файлам. посмотрите, что при этом будет появляться в терминале. очень полезно, с моей точки зрения. когда попытаетесь в hello.html напечатать что-нибудь и нажать Say Hello, в ответ вы получите попытку браузера скачать hello.php (у меня в мозилле так). наверное это тоже сделано, чтобы было не скучно :). а может просто влом было преподам допиливать сервер. короче, не важно. далее, рекомендую в корне сервера ( https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws ) кликнуть на файл hello.html (по крайней мере я поступал так). у вас он откроется и в строке браузера вы увидите https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws/hello.html . каждый раз как вы что-то напечатаете в поле Name и нажмёте Say Hello (как писал выше) браузер попытается скачать hello.php, но при этом, в ОКНЕ ТЕРМИНАЛА вы увидите и путь и запрос. например, я напечатал своё имя и нажал Say Hello. вот, что я получил в терминале: "GET /hello.php?name=Artem" "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:86.0) Gecko/20100101 Firefox/86.0" здесь важно, с моей точки зрения, /hello.php?name=Artem . это request-target, про который говорится на этой странице и который состоит из absolute-path + query.
Artem 0 уровень
7 марта 2021
absolute-path - это /hello.php и name=Artem - это query. скопируйте из терминала /hello.php?name=Artem, перейдите на вкладку, где у вас открыт hello.html и замените в адресной строке /hello.html на /hello.php?name=Artem. т.е. в адресной строке получится https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws/hello.php?name=Artem . к стати, наверное, вам будет приятнее напечатать своё имя, но, если будете пользоваться моим, то я не возражаю :) при попытке перейти по этой ссылке произойдёт попытка, как несколько раз ранее упоминал, скачать hello.php, но главное не это. главное то, что ваш браузер уже успеет позапоминать все те ссылки, по которым вы переходили читая этот пост, и в дальнейшем это создаст удобства в работе при выполнении задания. теперь, я бы рекомендовал не закрывать в браузере вкладку https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws/букаффки-точки-вопросики-рвно-итд, т.к. понадобится при выполнении задания. переходим в окно терминала, жмём Ctrl+C, т.е. заканчиваем работу преподовского сервера. открываем srever.c и начинаем его допиливать в соответствии с заданием. что-нибудь написали в коде, откомпилировали и проверили, как работает, обновив страничку на вкладке https://ide-de5d8_куча_букафф_и_цыфар_522-8080.cs50.ws/букаффки-точки-вопросики-рвно-итд, а затем дальше в бой. К СТАТИ!!! чуть не забыл, моя мозилла посылает запросы серверу в вервии HTTP/1.0 (не 1.1). уже и в настройки её лазал, но какого хрена оно так получается я не стал разбираться, просто по всему коду server.c поменял HTTP/1.1 на HTTP/1.0 и проверку задания выполнил под вервию 1.0 . спасибо, что дочитали до конца. у кого будт вопросы - пишите в личку. Happy Coding!
Даниил 41 уровень Master
22 марта 2020
Люди добрые, подскажите пожалуйста у кого либо на 2020 год (или может быть позже, будет полезно для наследников) получилось выполнить хотя бы одну команду в CS50 IDE (имею ввиду запустить сервер как либо или запустить свою версию программы или же версию преподователей)? У меня получилось только выполнить команду на скачиваение исходных файлов

wget http://cdn.cs50.net/2015/fall/psets/6/pset6/pset6.zip
и команды из этой "оперы"

curl -i http://localhost:8081/
(стоит заметить что порт именно 8081 так как на порту 8080 сервак у меня не работает никак из того что я смог найти). Так же при переходе CS50 IDE(то что в левом верхнем углу) -> Web Server выдавало "502 Bad Gateway". Если сделать так: прав.кн.мыши по папке -> Serve, то открывается новая вкладка с запущеным сервером, но почем-то на порту 8081. В общем я не смог ни сервер с помощью команд apache50 (как в примерах на видео было) запустить/остановить, ни запустить не свою программу ./server, ни преподовательскую. Короче вообще никак!!! Как я догадываюсь из той информации что видел, то это связано с тем что обновилась эта CS50 IDE (нынче она выглядит не совсем так как на примерах в видео), да и наверное уже удалили те старые версии заданий курса (или попросту я не смог придумать/найти способ до них добраться). Пробовал найти лекции по свежее на эту тему, но как писали тут где-то в комментах ранее и по отсутсвию свежих видеолекций на канале CS50 на эту тему понятно что сейчас такого задания (как минимум в том варианте что мы тут пытаемся сделать) нет. Пожалуйста, кто как смог это всё осуществить?
Семен Сенемов 1 уровень, Tambov
12 февраля 2020
У одного меня запускается сервер по старым командам(./server /home/ubuntu/pset6/public/), но не открывается через кнопку web server(HTTP/1.1 505 HTTP Version Not Supported)? А по команде http-server сервер запускается и открывается, но не поддерживается php и эта и все дальнейшие задачи не работают.
eight-bit-samurai 17 уровень, Москва
2 февраля 2019
Для запуска программы-сервера c порта 8080 используйте команду

./server /home/ubuntu/workspace/pset6/public/
При отладке порт прослушки не всегда освобождается и для следующего запуска сервера нужно убить все процессы, связанные с этим портом, с помощью команды

killall -9 server
Для запуска преподавательской версии сервера используйте команду

~cs50/pset6/server public
С её помощью можно сравнить ответы сервера на те или иные запросы с теми, которые выдает ваш вариант. Можно делать это, кликая на ссылки своей веб-странички, которая хостится по адресу https://ide50-username.cs50.io (username - это ник, под которым вы зарегистрировались на https://cs50.io), либо прописывая запросы в строке ввода адреса в браузере, либо используя утилиту curl в отдельном окне терминала. Введя, например,

curl -i http://localhost:8080/cat.html
, вы как бы запрашиваете страничку cat.html, и если ваш сервер работает правильно, то он выдаст ответ HTTP/1.1 200 OK, а curl выдаст html-код запрошенной веб-странички. Обо всём этом подробнее можно узнать из оригинала на http://cdn.cs50.net/2015/fall/psets/6/pset6/pset6.html, т.к. задачник перевели не весь да еще и 2014 года версии.
Григорий 1 уровень, Москва
4 декабря 2018
Кто-нибудь сделал это?
eight-bit-samurai 17 уровень, Москва
29 ноября 2018
/* Комментарий удален */