##Домашняя работа №3
###Express
Express — фреймфорк для написания веб-приложений на платформе Node.js. В основе работы Express лежит паттерн middleware
.
###Middleware
Middleware — функция, имеющая доступ к объекту запроса req
, объекту ответа res
и следующей функции next
в цикле обработки запроса/ответа в приложении.
Middleware-функции могут выполнять такие задачи:
- Выполнять любой код
- Изменять объекты запроса
req
и ответаres
- Заканчивать цикл обработки запроса/ответа
- Вызывать следующую middleware-функцию в стэке
###Задание
- Нельзя исользовать дополнительные внешние модули, например
cookie-parser
- Для успешно сдачи нужно чтобы проходили базовые тесты, проверять
npm test
####Реализуйте набор middleware-функций
-
Middleware авторизации. Она должна проверять значение авторизационной куки (
authorize
), в случае если оно неизвестно или отсутствует — отдавать 403 ошибку. Если значение известно — передавать следующую функцию в стэке middleware. Например, если пришли кука"authorize": "random authorize string"
, то считаем, что пользователь авторизован, а если кука вообще не пришла или пришла как пустая строка, то нет -
Middleware логирования времени исполнения. Замеряет время работы в миллисекундах (до тысячных) всех остальных middleware в стэке, логирует это время в консоль, и устанавливает хедер со временем работы
X-Time
. Например, по результатам работы, сервер должен ответить заголовкомX-Time: 112.432
-
Middleware логирования запросов. Логирует в консоль все урлы и методы вызовов к веб-приложению, устанавливает в ответ хедер
X-Request-Url
Например, если был вызван методGET
для урла/apiUrl
, то должен установиться заголовокX-Request-Url: "GET /apiUrl"
-
Middleware обработки ошибок. Обрабатывает все ошибки, произошедшие в предыдущих middleware, так же обрабатывает все некорректные запросы к серверу, выводит их в консоль
console.error
и возвращает пустой ответ с хедеромX-Request-Error: "error message"
Если был некорректный вызов API, напримерGET /incorrect
(без/v1/
), то возвращать ошибкуX-Request-Error: "Unknown request"
####Реализуйте трансформирующий поток
Реализуйте два трансформирующих потока которые принимают строку и производят транслитерацию:
- Ожидает строку на русском, делает прямую (из кириллических символов в латинские) трансформацию
- Ожидает строку на английском, делает обратную (из латинских символов в кириллические) трансформацию
Правила транслитерации:
Кириллица | Латиница |
---|---|
А | A |
Б | B |
В | V |
Г | G |
Д | D |
Е | E |
Ё | Jo |
Ж | Zh |
З | Z |
И | I |
Й | J |
К | K |
Л | L |
М | M |
Н | N |
О | O |
П | P |
Р | R |
С | S |
Т | T |
У | U |
Ф | F |
Х | H |
Ц | C |
Ч | Ch |
Ш | Sh |
Щ | Shh |
Ъ | # |
Ы | Y |
Ь | ' |
Э | Je |
Ю | Ju |
Я | Ja |
Считаем что заглавные и прописные буквы кодируются одинаково, вам в помощь translit.ru
####Реализуйте веб-приложение
Реализуйте с помощью Express веб-приложение которое предоставляет доступ к файловой системе. Приложение должно использовать все middleware из предыдущего задания и на лету производить транслитерацию. При старте приложение должно монтироваться к какой-либо директории на локальной файловой системе.
Если полученный URL ссылается на директорию, нужно отдать список файлов в директории. URL указывается относительно текущей дериктории
> GET /v1/files/ HTTP/1.1
> Host: example.com
> Cookie: <auth_cookie>
>
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Content-Length: 36
< Last-Modified: Fri, 23 Sep 2016 12:56:44 GMT
<
< {"content": [".", "..", "file.txt"]}
Если полученный URL ссылается на файл, нужно отдать JSON с транслитерированным содержимым файла. Язык файла мы определяем по первому определяемому символу, по которому можно определить язык. Например, для файла "12asd" - первые символы латинские, производим обратную транслитерацию. В случае, если используются кириллические символы, нужно провести прямую транслитерацию; в случае если латинские — обратную. В иных случаях нужно ответить ошибкой.
> GET /v1/files/file.txt HTTP/1.1
> Host: example.com
> Cookie: <auth_cookie>
>
< HTTP/1.1 200 OK
< Content-Type: application/json;charset=UTF-8
< Content-Length: 21
< Last-Modified: Fri, 23 Sep 2016 12:56:44 GMT
<
< {"content": "Privet"}
####Задания со звездочкой*
- Расширьте приложение возможностью монтироваться не только к локальной файловой системе, но и к удаленным FTP- и WebDAV-серверам. Напишите в комментарии к коду небольшую инструкцию как переключаться, как пользоваться и как проверить что возвращаются нужные файлы. Если нужно будет светить логин-пароль, то можете завести фейковый аккаунт
- Реализуйте трансформирующий поток, осуществляющий преобразование бинарных данных в Base64. Напишите небольшую инструкцию в коде как запустить данный трансформирующий поток вместо транслитерационного.
Чтобы успешно сделать задание:
- нужно сделать не менее 10 коммитов в пулреквесте
- тесты будут дополняться, сейчас только базовые тесты, не забывайте обновляться от исходного репозитория. Если вы написали код верно, то он будет работать, при изменении тестов, т.к. тесты тестируют функциональность, описанную в задании, они нужны только для вспомогательной цели.