Горячие публикации

Здесь самые интересные посты прямо сейчас. Пользователи отобрали эти посты из ленты Свежего, но они еще не успели набрать вес, чтобы попасть в Лучшее.

Поздравьте меня

Мне стукнуло 35 лет 6 месяцев 3 недели 6 дней и 8 часов. Это важно знать всему пикабу

Поздравьте меня Поздравьте меня, День рождения, Поздравление, Не воспринимай всерьез, Мат

Upd: правильно заметили комментаторы, 3 недели, а не 4

Прямая линия с Владимиром Путиным

Прямая линия с Владимиром Путиным

Тссс..)

ТГ УЛеД

Микрозаймы и Госуслуги

Моя история о том, как моя супруга оказалось в очень неожиданной ситуации, которая, как нам казалось, произойти с нами и не может.

Примерно с середины октября на номер жены начали поступать звонки с левых номеров с периодичностью раз в два-три дня.

Звонки жене выглядели так:
«Добрый день, вас беспокоит компания *Название*, я разговариваю с *ФИО супруги*?

В диалог со звонящими с левых номеров, как правило, ни я, ни супруга, не вступаем. Снимаем трубку и буквально через 5 секунд кладём, потому что в большинстве случаев звонят автоответчики, торговые организации, интернет-провайдеры, соцопросы, мошенники и т.д

Спустя примерно неделю звонки начались и мне. Девушки вежливо представлялись той же организацией и спрашивали знаю ли я *ФИО супруги*. На такие звонки я отвечал «Нет» и бросал трубку, либо вообще не брал.
Причем девушки общались вежливо, без наездов и угроз.

Когда звонки участились, решил пробить по одному известному приложению номера, с которых поступали звонки.

Тэги приложения указывали на то, что номера принадлежат коллекторскому агенству *Название*.

Всё это нам показалось очень странным т.к никаких микрозаймов мы никогда не брали, а по действующим кредитам всегда всё платим в срок.

Решил я поискать информацию в интернете про эту организацию и действительно такое коллекторное агентство есть.

Следующий мой запрос был: «Зачем звонят коллекторы если у меня нет долгов?»

Вариантов оказалось два:
1. У вас всё таки имеется какая-то непогашенная задолженность
2. Человек с аналогичным ФИО имеет просрочку и по открытым источникам коллекторы вышли на вас по ошибке.

Далее мы запрашиваем выписку БКИ через приложение банка с зелёным логотипом, которым пользуемся уже давно. Что мы видим? А ничего интересного. Наши действующие кредиты, всё платится в срок, кредитный рейтинг хороший, никаких левых задолженностей нет.

Успокоив душу этим фактом, мы решили, что звонят коллекторы по ошибке и стали просто не придавать этому значению.

Прошло около 2х недель.
Звонки с разных номеров продолжались. Уже особо мы не парились, но всё равно было интересно зачем звонят и тут у меня супруга решила поговорить с представителями коллекторского агенства.

Телефонный разговор выглядел примерно так:

-Компания *Название*, добрый день. Могу я слышать *ФИО супруги*?
-Да слушаю вас
- *ФИО супруги* а вы в курсе у вас есть действующая задолженность перед микрофинансовой организацией *Название МФО*?
-А что за задолженность?
-В начале июля вами был оформлен микрозайм в размере 7 тысяч рублей, на текущую дату задолженность составляет 13 900 руб.
-Мы ничего не оформляли. И в выписке БКИ ничего не нет.
-А причем тут выписка? А выписке может не и не быть ничего
-Это всё здорово, но ни с какими микрофинансовыми организациями у нас нет дел.

На то что девушка-коллектор отвечает в стиле:
-Ну разбирайтесь сами тогда.

Мы немного прифигели.
Я начал плотно изучать данный вопрос.
Нашел множество информации в интернете, пообщался со знакомым юристом.

Если тезисно:
1. Первым делом нужно обратиться в полицию.
2. Случаев с оформлением мошенниками микрозаймов на третьих лиц в стране великое множество.
3. МФО, если они аккредитованные, обязаны передавать информацию о заемщиках в БКИ.
4. Бюро БКИ есть разные и 4 разных долга могут быть отражены в 4х разных БКИ.
5. Ситуация непростая, т.к дело доходит до суда.
6. Часто полиция не заводит уголовное дело на мошенников, т.к вы не являетесь пострадавшей стороной, а заявление вовсе должны писать МФО, из же кинули на бабки.
7. Просрочки по микрозаймам портят вашу кредитную историю из-за которой вам ни один банк не даст кредит, а убрать эти записи из БКИ чуть не не из области фантастики.
8. Долг у коллекторов висит до поры до времени. Потом он передается судебным приставам, накладывается арест, блокируются банковские счета и начинается уже новая история.
9. Есть случаи когда даже с помощью юристов люди годами не могут закрыть данный вопрос.

Полученная информация навела на мозговой штурм: кто виноват и что делать?

Стали смотреть информацию про эту МФО в интернете. Компания такая действительно есть. И супруга решила им позвонить и уточнить.
На том конце провода по ФИО озвучили информацию в точности такую как и коллекторское агенство. Значит займ, якобы, есть.
Остался для нас один вопрос почему его нет в выписке?

И тут мы запросили выписку в других четырех БКИ.
Три выписки были идентичны, всё чисто.

А в четвертой как раз и был тот самый микрозайм, который на фоне остальных «зеленых» кредитов горел уже бордовым цветом из-за просрочки свыше 100 дней.
Оформлен займ на 7 тысяч рублей на срок 5 дней.
Кредитный рейтинг в полном очке, в красном секторе, что особенно огорчило т.к через полгода мы планировали оформлять ипотеку на новую квартиру.

Сердце заколотилось еще сильнее.
Чувство было как-будто во время проверки компьютера антивирус нашел троян.

Еще был момент, что пока идет разбирательство через полицию, долг продолжает висеть и копиться.

Посмотрели отзывы о данной МФО и наткнулись на интересный момент. Пишут, что шарага мутная, подтверждают личность через Портал Госуслуг и выдают займы удаленно. И тут у нас щелкнуло.

История переносится на несколько месяцев назад.
В начале июля у жены взломали госуслуги. Как это было? В один прекрасный день супруга просто не могла зайти в свой кабинет. А при запросе подтверждения по СМС, код уходит на какой-то незнакомый номер.
Каким-то образом мошенники получили доступ к личному кабинету и поменяли номер телефона.

Сопоставив дату взлома и количество дней просрочки пазл сложился. Взломав Госуслуги, мошенники подтвердили личность при оформлении займа на мою жену.

Супруга звонит в МФО, запрашивает договор, данные для заявления в полицию. На что МФО отвечают:
-Как подадите заявление, предоставьте нас талон на почту и будем разбираться.

Подсобрав инфу, мы едем в пункт полиции, пишем заявление. Нам говорят, что вы такие не первый и в начале июля был массовый взлом Госуслуг.

Ждем ответа и отправляем талон в МФО

И тут самый прикол!

Через пару дней на почту жены приходит письмо от МФО с вложениями: официальное письмо, договор.

Читаем.

Пишут:

Уважаемая *ФИО жены*!
По результатам внутренней проверки был установлен факт мошенничества. Займ оформленный на вас будет аннулирован, а записи в БКИ удалены.

Далее договор, который заключили мошенники.
ФИО - верно, дата рождения и паспортные данные - верные. Адрес регистрации, место работы, электронная почт - просто какая то абракадабра от балды)

Мы думаем а как так?

Через пару дней запрашиваем снова выписку БКИ и видим, что займа реально нет и кредитный рейтинг снова в зеленом секторе.

Какая первая была мысль?
Само МФО мошенническим методом оформляет микрозаймы, далее коллекторы звонят на лоха, и кто очканёт и переведет деньги, тот сделал всё по запланированному мошенниками плану. Ну а если «клиент» идет в полицию, то МФО тут же пишет письмо, что вопросик снят и претензий к вам никаких нет, это всё мошенники.

Вот как-то так.

Сказочке конец.

Кто дочитал - молодец.

Берегите себя и свои персональные данные!

Показать полностью

Сосед говорит что завел собаку, но не знает что за порода...

Пришлось выложить 2 файла, ибо Пикабу не позволяет выкладывать видео длиннее 3 минут

Показать полностью 1

Основы HTTP-серверов

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

В этой статье вы поближе познакомитесь с пакетом net/http и полезными сторонними библиотеками на примере построения простых серверов, маршрутизаторов и промежуточного ПО.



Создание простого сервера:

Код снизу запускает сервер, который обрабатывает запросы по одному пути. (Все листинги кода находятся в корне /exist репозитория GitHub https://github.com/blackhat-go/bhg/.) Этот сервер должен обнаруживать URL-параметр name, содержащий имя пользователя, и отвечать заданным приветствием.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Сервер Hello World

Этот простой пример предоставляет ресурс по адресу /hello. Данный ресурс получает параметр и возвращает его значение обратно клиенту. http.HandleFunc() в функции main() получает два аргумента: строку, являющуюся шаблоном URL-пути, который сервер должен искать, и функцию, которая будет обрабатывать сам запрос. При желании определение функции можно оформить в виде анонимной встроенной функции. В этом примере мы передаем определенную чуть раньше функцию hello().

Функция hello() обрабатывает запросы и возвращает клиенту сообщение «Hello». Она получает два аргумента. Первый — это http.ResponseWriter, используемый для записи ответов на запрос. Второй аргумент является указателем на http.Request, который позволит считывать информацию из входящего запроса. Обратите внимание на то, что мы не вызываем hello() из main(), а просто сообщаем HTTP-серверу, что любые запросы для /hello должны обрабатываться функцией hello().

Что же на самом деле происходит внутри http.HandleFunc()? В документации Go сказано, что она помещает обработчик в DefaultServerMux. ServerMux означает серверный мультиплексор. На деле же это просто сложное выражение, подразумевающее, что внутренний код может обрабатывать несколько HTTP-запросов для шаблонов и функций. Это выполняется посредством горутин, по одной для каждого запроса. При импорте пакета net/http создается ServerMux и прикрепляется к пространству имен этого пакета. Это DefaultServerMux.

В следующей строке прописан вызов http.ListenAndServe(), которая получает в качестве аргументов строку и http.Handler. Она запускает HTTP-сервер, используя первый аргумент в роли адреса, которым в данном случае является :8000. Это означает, что сервер должен прослушивать порт 8000 по всем интерфейсам. Для второго аргумента, http.Handler, передается nil. В результате пакет задействует в качестве обработчика DefaultServerMux. Вскоре мы будем реализовывать собственный http.Handler и передавать его, но пока что используем предустановленный вариант. Можно также задействовать http.ListenAndServeTLS(), которая запустит сервер с использованием HTTPS и TLS, но потребует дополнительных параметров.

Для реализации интерфейса http.Handler необходим один метод — ServeHTTP(http.ResponseWriter, *http.Request). И это здорово, потому что упрощается создание собственных специализированных HTTP-серверов. Существует множество сторонних реализаций, которые расширяют функциональность пакета net/http, добавляя такие возможности, как промежуточное ПО, аутентификация, кодирование ответа и др.

Протестировать созданный сервер можно с помощью curl:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Превосходно! Этот сервер считывает URL-параметр name и отвечает приветствием.


Создание простого маршрутизатора:



Далее мы создадим простой маршрутизатор, приведенный , который показывает, как динамически обрабатывать входящие запросы, проверяя URL-путь. В зависимости от того, что содержит URL-путь, /a, /b или /c, будет выводиться сообщение Executing /a, Executing /b или Executing /c. Во всех остальных случаях отобразится ошибка 404 Not Found.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Простой маршрутизатор

Сначала идет определение типа router без полей, который будет использован в реализации интерфейса http.Handler. Для этого нужно определить метод ServerHTTP(). Он использует для URL-запроса инструкцию switch, выполняя различную логику в зависимости от пути. В нем применяется предустановленный ответ 404 Not Found. В main() мы создаем новый router и передаем соответствующий ему указатель в http.ListenAndServe().

Давайте взглянем на это в ole-терминале:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Все работает, как ожидалось. Программа возвращает сообщение Executing /a для URL, который содержит путь /a. При этом для несуществующего пути она возвращает ответ 404. Это тривиальный пример, и сторонние маршрутизаторы, которые вам предстоит использовать, будут иметь намного более сложную логику, но теперь основной принцип вам должен быть понятен.


Создание простого промежуточного ПО:



Пора перейти к созданию промежуточного ПО, выступающего в качестве обертки, которая будет выполняться для всех входящих запросов независимо от целевой функции. В примере из кода ниже мы создаем логер, отображающий время начала и окончания обработки.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Простое промежуточное ПО

По сути, здесь создается внешний обработчик, который при каждом запросе логирует определенную информацию на сервер и вызывает функцию hello(), вокруг которой логика этого процесса и обертывается.

Как и в примере с маршрутизатором, здесь определяется новый тип logger, но на этот раз в нем есть поле inner, которое является самим http.Handler. В определении ServeHTTP() мы используем log() для вывода времени начала и завершения запроса, вызывая между этими выводами метод ServeHTTP() внутреннего обработчика. Для клиента данный запрос завершится внутри этого обработчика. В main() с помощью http.HandlerFunc() из функции создается http.Handler. Здесь реализуется logger, в котором для inner устанавливается только что созданный обработчик. В завершение происходит запуск сервера с помощью указателя на экземпляр logger.

Выполнение кода и отправка запроса выводят два сообщения, содержащих время его начала и завершения:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Маршрутизация с помощью пакета gorilla/mux



Как показано в Простом Маршрутизаторе, с помощью маршрутизации можно сопоставлять путь запроса с функцией. Ее можно использовать также для сопоставления с функцией и других свойств, таких как HTTP-глаголы (методы запроса) или заголовки хостов. В экосистеме Go доступны несколько сторонних маршрутизаторов. Здесь мы представим один из них — пакет gorilla/mux. Но как и в остальных случаях, рекомендуем расширять знания самостоятельно, изучая и другие пакеты по мере их появления на вашем пути.

gorilla/mux — это зрелый сторонний пакет маршрутизации, который позволяет выполнять перенаправление на основе как простых, так и сложных шаблонов. Помимо прочих возможностей, он предоставляет регулярные выражения, вторичную маршрутизацию, а также сопоставление параметров и глаголов.

Рассмотрим пару вариантов применения этого маршрутизатора. Выполнять эти примеры необязательно, так как вскоре мы задействуем их в реальной программе.

Для использования gorilla/mux нужно его сначала установить с помощью команды go get:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Теперь можно приступить к делу и создать маршрутизатор с помощью mux.NewRouter():

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Возвращаемый тип реализует http.Handler, а также имеет множество других ассоциированных методов. Например, если требуется определить новый маршрут для обработки запросов GET к шаблону /foo, можно сделать так:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Теперь благодаря вызову Methods() этому маршруту будут соответствовать только запросы GET. Все остальные методы будут возвращать ответ 404. Поверх этого можно надстроить цепочку других квалификаторов, например Host(string), который сопоставляет определенное значение заголовка хоста. Как вариант, следующий код будет сопоставлять только те запросы, чей заголовок установлен как www.foo.com:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Иногда это полезно для сравнения и передачи параметров внутри пути запроса, например при реализации RESTful API. С помощью gorilla/mux это делается легко. Следующий код будет выводить на экран все, что следует за /users/ в пути запроса:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

В определении пути параметр запроса задается с использованием фигурных скобок. Можете рассматривать его как место для подстановки. Затем внутри функции-обработчика происходит вызов mux.Vars(), куда передается объект запроса. В ответ вернется map[string] string — карта имен параметров запроса с соответствующими значениями. Поле для подстановки имени user передается в качестве ключа. В итоге запрос к /users/bob должен выдать приветствие для Боба:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Этот шаг можно продолжить, и использовать регулярное выражение для уточнения переданных шаблонов. Например, можно указать, что параметр user должен состоять из букв нижнего регистра:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Теперь любые запросы, не совпадающие с этим шаблоном, будут возвращать ответ 404:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Далее мы разовьем тему маршрутизации, включив реализации промежуточного ПО с помощью других библиотек. Это повысит гибкость обработки HTTP-запросов


Создание промежуточного ПО с помощью Negroni



Простое промежуточное ПО, которое мы показали ранее, логировало время начала и завершения обработки запроса и возвращало ответ. Подобные промежуточные программы не обязательно должны работать с каждым входящим запросом, но в большинстве случаев именно так и будет. Для их применения есть много причин, включая логирование запросов, аутентификацию и авторизацию пользователей, а также отображение ресурсов.

Например, можно написать такую программу для выполнения базовой аутентификации. Она будет парсить заголовок авторизации для каждого запроса, проверять переданные имя пользователя и пароль, возвращая ответ 401 в случае ошибки при аутентификации. Помимо этого, можно связывать в цепочку несколько промежуточных функций так, чтобы они выполнялись поочередно.

При создании промежуточной программы логирования ранее в этой главе мы обернули только одну функцию. На практике же это не особо эффективно, так как вам наверняка понадобится использовать более одной функции. Для этого необходимо применить логику, которая сможет выполнять эти функции поочередно. Написание такого кода с чистого листа не представляет особой сложности, но в этот раз мы обойдемся без изобретения колеса и просто применим проработанный пакет negroni, который уже умеет это делать.

Этот пакет, расположенный в репозитории по адресу https://github.com/urfave/negroni/, хорош тем, что не привязывает вас к крупному фреймворку. При этом его можно легко подключать к другим библиотекам, что делает его особенно гибким.

Также в нем присутствуют предустановленные промежуточные программы, которые могут пригодиться во многих сценариях. Для начала опять же нужно выполнить команду
go get negroni:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Несмотря на то что технически этот пакет можно использовать для всей логики приложения, это будет далеко не самым оптимальным решением, потому что он призван служить промежуточным ПО и не включает маршрутизатор. Лучше применять negroni в тандеме с другим пакетом, например gorilla/mux или net/http. Применим первый для создания программы, которая познакомит вас с negroni и наглядно покажет порядок операций по ходу их реализации в цепочке промежуточных программ.

Начнем с создания нового файла main.go в пространстве имен каталогов, например github.com/blackhat-go/bhg/ch-4/negroni_example/. (Если вы клонировали репозиторий BHG, это пространство имен уже будет создано.) Теперь нужно добавить в созданный файл в код который мы сейчас напишем.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Пример использования Negroni

Сначала, как и ранее, с помощью вызова mux.NewRouter() создается маршрутизатор. Далее идет первое взаимодействие с пакетом negroni, а именно вызов negroni.Classic(). Таким образом создается новый указатель на экземпляр Negroni.

Это можно сделать разными способами: использовать negroni.Classic() или вызвать negroniNew(). Первый вариант, negroni.Classic(), устанавливает набор промежуточных программ по умолчанию, включая логер запросов, утилиту восстановления, которая будет осуществлять прерывание и восстановление в случае паники (аварийной остановки выполнения программы), а также программу, которая будет предоставлять файлы из публичного каталога, расположенного в той же папке. Что же касается функции negroni.New(), то она не создает предустановленного промежуточного ПО.

В пакете negroni доступна каждая из перечисленных промежуточных программ. Например, пакет восстановления можно добавить, выполнив

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Далее следует добавление в стек промежуточного ПО маршрутизатора с помощью вызова n.UseHandler(r). Планируя и собирая собственный промежуточный комплект программ, не забудьте учесть порядок их выполнения. Например, необходимо, чтобы программа проверки аутентификации срабатывала до функции-обработчика, которая эту аутентификацию требует. Любая такая программа, надстроенная над маршрутизатором, будет выполняться после обработчика. Порядок важен. В данном случае мы не определяли собственное ПО, но вскоре к этому прибегнем.

Сейчас же мы создадим сервер из Примера использования Negroni и запустим его. Затем отправим ему веб-запросы по адресу http://localhost:8000. В результате программа логирования negroni должна вывести информацию в stdout, как показано далее. В выводе отражены временная метка, код ответа, время обработки, хост и HTTP-метод:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Конечно, предустановленное промежуточное ПО — это очень хорошо, но реальная мощь проявляется, когда вы создаете собственное. При работе с negroni добавлять промежуточные программы в стек можно с помощью нескольких методов. Взгляните на следующий код. Он создает простую программу, которая выводит сообщение и передает выполнение следующей программе в цепочке:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Эта реализация немного отличается от предыдущих примеров. Ранее мы реализовывали интерфейс http.Handler, который ожидал метод ServeHTTP(), получающий два параметра: http.ResponseWriter и *http.Request. В этом же примере вместо интерфейса http.Handler реализуем интерфейс negroni.Handler.

Небольшое различие здесь в том, что интерфейс negroni.Handler ожидает реализации метода ServeHTTP(), который получает уже не два, а три параметра: http.ResponseWriter, *http.Request и http.HandlerFunc. Параметр http.HandlerFunc представляет следующую промежуточную функцию в цепочке, которую мы назовем next. Сначала обработка выполняется методом ServeHTTP(), после чего происходит вызов next(), которой передаются изначально полученные значения http.ResponseWriter и *http.Request. В результате выполнение передается дальше по цепочке.

Но нам по-прежнему нужно указать negroni использовать в цепочке промежуточного ПО и нашу реализацию. Для этого можно вызвать метод negroni под названием Use и передать ему экземпляр реализации negroni.Handler:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Писать собственный набор промежуточных программ с помощью этого метода удобно, поскольку можно легко передавать их выполнение по цепочке. Но при этом есть один недостаток: все, что вы пишете, должно использовать negroni. Например, если создать пакет промежуточного ПО, который записывает в ответ заголовки безопасности, то он должен будет реализовывать http.Handler, чтобы его можно было применять и в других стеках приложения, так как большинство из них не будут ожидать negroni.Handler. Суть в том, что независимо от назначения создаваемых промежуточных программ проблемы совместимости могут возникнуть при попытке использовать промежуточное ПО negroni в другом стеке и наоборот.

Есть два других способа сообщить negroni, что следует задействовать ваше промежуточное ПО. Первый из них — это уже знакомый вам UseHandler (handler http.Handler). Второй — это вызов UseHandleFunc(handlerFunc func(w http.ResponseWriter, r *http.Request)). Последним вы вряд ли станете пользоваться часто, поскольку он не позволяет поочередно выполнять программы в цепочке. Например, если нужно написать промежуточную функцию для выполнения аутентификации, то в случае неверной информации сессии или учетных данных потребуется возвращать ответ 401 и останавливать выполнение. С помощью названного метода это сделать не получится.



Добавление аутентификации с помощью Negroni:




Прежде чем продолжать, давайте изменим пример из предыдущего раздела, чтобы продемонстрировать использование context, который может легко передавать переменные между функциями. В примере из кода ниже с помощью negroni добавляется промежуточная программа аутентификации.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Использование context в обработчиках

Здесь мы добавили новую промежуточную программу, badAuth, которая будет симулировать аутентификацию исключительно в целях демонстрации. Этот новый тип содержит поля Username и Password и реализует negroni.Handler, поскольку в нем определяется версия метода ServeHTTP() с тремя параметрами. Внутри ServeHTTP() сначала из запроса извлекаются имя пользователя и пароль, после чего их значения сравниваются с имеющимися полями. Если данные не совпадают, выполнение останавливается и запрашивающей стороне отправляется ответ 401.

Обратите внимание на то, что мы делаем возврат до вызова next(). Это останавливает выполнение оставшейся цепочки промежуточных программ. Если учетные данные окажутся верными, выполняется довольно объемный код для добавления имени пользователя в контекст запроса. Сначала происходит вызов context.WithValue() для инициализации контекста из запроса с установкой в него переменной username. Затем мы убеждаемся, что запрос использует новый контекст, вызывая r.WithContext(ctx). Если вы планируете написать веб-приложение на Go, то вам нужно будет получше познакомиться с этим шаблоном, поскольку применять его придется часто.

В функции hello() мы получаем имя пользователя из контекста запроса, применяя функцию Context().Value(interface{}), которая возвращает interface{}. Так как вам известно, что это строка, здесь можно задействовать утверждение типа. Если же вы не можете гарантировать тип или то, что это значение будет существовать в этом контексте, используйте для преобразования инструкцию switch.

Выполните сборку и запустите код Использования context в обработчиках, а затем отправьте несколько запросов на сервер. Попробуйте использовать как верные, так и неверные учетные данные. Вывод должен получиться следующим:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

Отправка запросов без учетных данных приводит к возврату ошибки 401 Unauthorized. Если тот же запрос отправить с верным набором данных, то в ответ придет суперсекретное сообщение, доступное только аутентифицированным пользователям.

Усвоить нужно очень большой объем рассмотренного здесь материала. Функции-обработчики используют для записи ответа в экземпляр http.ResponseWriter только fmt.FPrintf(). Закончу эту статью последним разделом про создание HTML- ответов с помощью шаблонов.



Создание HTML-ответов с помощью шаблонов:



Шаблоны позволяют динамически генерировать содержимое, включая HTML, с помощью переменных из программ Go. Во многих языках генерация шаблонов реализуется с помощью сторонних пакетов. В Go для этой цели есть два пакета, text/template и html/template. Мы же в этой главе используем пакет HTML, потому что он предоставляет необходимую нам контекстную кодировку.

Одна из особенностей учета контекста в пакете Go заключается в том, что он кодирует переменную по-разному, в зависимости от ее расположения в шаблоне. Например, строка в виде URL, переданная в атрибут href, будет закодирована в URL, но при отображении в HTML-элементе она будет закодирована уже в HTML.

Процесс генерации шаблона для его дальнейшего использования начинается с определения самого шаблона, который содержит поле ввода для обозначения динамических контекстных данных для отображения. Его синтаксис покажется знакомым тем, кто применял Jinja совместно с Python. При отрисовке шаблона мы передаем ему переменную, которая будет использоваться в качестве контекста. Она может быть сложной структурой с несколькими полями либо примитивом.

Давайте проработаем код ниже, который создает простой шаблон и заполняет поле ввода JS-кодом. Это искусственный пример, показывающий, как динамически заполнять содержимое, которое возвращается в браузер.

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

HTML-шаблонизация

Сначала создается переменная x, которая будет хранить HTML-шаблон. Здесьдля определения шаблона используется строка, вложенная в код, но в большинстве случаев вам потребуется хранить шаблоны в отдельных файлах. Обратите внимание на то, что этот шаблон представляет простую HTML-страницу. Внутри него с помощью специальной инструкции {{variable-name}} определяются поля ввода. Variable-name — это элемент внутри контекстных данных, который требуется отобразить. Напомним, что это может быть структура или другой примитив.В данном случае мы используем одну точку, сообщая таким образом пакету, что нужно отобразить весь контекст. Учитывая, что мы будем работать с одной строкой, это нормально, но в случае применения более крупных и сложных структур, таких как struct, получение нужных полей осуществляется вызовом после этой точки. Например, если в шаблон передать структуру с полем Username, то отобразить это поле можно будет, используя выражение {{.Username}}.

Далее в функции main() с помощью вызова template.New(string) создается новый шаблон ❸. Затем выполняется вызов Parse(string), обеспечивающий верное форматирование шаблона и его парсинг. Совместно эти две функции возвращают указатель на Template.

В этом примере задействуется всего один шаблон, но шаблоны можно вкладывать в другие шаблоны. При использовании нескольких шаблонов для удобства их дальнейшего вызова важно именовать их последовательно. В завершение происходит вызов Execute(io.Writer, interface{}), который обрабатывает шаблон, используя переменную, переданную в качестве второго аргумента, и записывает его в предоставленный io.Writer. Для демонстрации мы применяем os.Stdout. Вторая передаваемая в метод Execute() переменная — это контекст, который будет использоваться для отображения шаблона.

Выполнение этого кода сформирует HTML-код, и можно заметить, что теги скриптов и другие переданные в контексте вредоносные символы закодированы правильно:

Основы HTTP-серверов Linux, Интернет, Программирование, Длиннопост, Сервер, Http

О шаблонах можно сказать еще много, например то, что вместе с ними допустимо применять логические операторы или что их можно задействовать с циклами и другими управляющими конструкциями. Помимо этого, они позволяют использовать встроенные функции и даже определять и раскрывать любые вспомогательные функции, что существенно расширяет возможности шаблонизации. Я советую вам познакомиться со всеми этими возможностями получше погуглив.

ССЫЛКА НА ТЕЛЕГРАМ КАНАЛ АВТОРА

Показать полностью 25

Очень ценный специалист

Очень ценный специалист Преступление, Происшествие, Уголовное дело, МВД, Расследование, Наказание, Коррупция, Мигранты, Криминал, Негатив, Политика

В Санкт-Петербурге 62-летний таджик пырнул восьмиклассника ножом, подростка в тяжёлом состоянии доставили в больницу.

Изверг напал на парня вечером на улице Пограничника Гарькавого, нанеся тому тяжёлое ранение в бедро, сейчас подростка госпитализировали в Детскую больницу №1. Правоохранительные органы быстро выявили личность нападавшего, им оказался 62-летний гражданин Таджикистана Махмаджон Ходжаев, нелегально находящийся на территории России.

Самое интересное, что Ходжаева в 2000 году уже судили - за хранение оружия, но затем амнистировали. В том же году его снова задержали за угрозу убийства и нанесение вреда здоровью средней тяжести, но и тогда ему удалось избежать ответственности.

Как оказалось, всего вышеперечисленного в нашей многонациональной державе недостаточно для выдворения навечно. А ведь, если бы его выперли из страны ещё за первое преступление, парню сейчас бы ничего не угрожало.

https://www.spb.kp.ru/online/news/5571039/

Показать полностью 1
Мои подписки
Подписывайтесь на интересные вам теги, сообщества,
пользователей — и читайте свои любимые темы в этой ленте.
Чтобы добавить подписку, нужно авторизоваться.
Отличная работа, все прочитано!