##Домашняя работа №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 коммитов в пулреквесте
- тесты будут дополняться, сейчас только базовые тесты, не забывайте обновляться от исходного репозитория. Если вы написали код верно, то он будет работать, при изменении тестов, т.к. тесты тестируют функциональность, описанную в задании, они нужны только для вспомогательной цели.