From 855f39812585f216d01505f6ce283acc0f97b4d1 Mon Sep 17 00:00:00 2001 From: Andrey Krasavin Date: Fri, 22 Mar 2019 12:41:19 +0300 Subject: [PATCH] typos fix --- ru/03.3.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ru/03.3.md b/ru/03.3.md index ccf7b96a..d22cbd63 100644 --- a/ru/03.3.md +++ b/ru/03.3.md @@ -14,7 +14,7 @@ Handler: логика обработки запроса и генерация о ## механизм работы пакета http -На следующей картинке показано как работает веб-сервер Go/ +На следующей картинке показано как работает веб-сервер Go. ![](images/3.3.http.png?raw=true) @@ -24,7 +24,7 @@ Handler: логика обработки запроса и генерация о 2. Сервер принимает запросы от клиентов. 3. Обрабатывает запросы посредством чтения HTTP заголовков (если используется метод POST, читаются данные из тела запроса) и отправляет их обработчикам. Наконец, сокет возвращает данные клиентам. -Для того чтобы точно узнать как Go работает с Веб - необходимо получить ответ на три вопроса: +Для того чтобы точно узнать, как Go работает с Веб - необходимо получить ответ на три вопроса: - Как прослушивается порт? - Как принимаются клиентские соединения? @@ -68,9 +68,9 @@ Handler: логика обработки запроса и генерация о Как происходит прием клиентских запросов? В исходном коде мы видим, что происходит вызов метода `srv.Serve(net.Listener)` для управления клиентскими запросами. В теле функции бесконечный цикл `for{}` принимает запросы, создает новое соединение, запускает новую горутину `go c.serve()` и передает в нее данные запроса. Так Go поддерживает высокий параллелизм, за счет того, что все горутины являются независимыми. -Теперь ответим на вопрос как используются конкретные функции для управления запросами? Сначала метод `conn` парсит запрос возвращаемый `c.ReadRequest()`, а затем получет соответсвующий обработчик: `handler := c.server.Handler`, который, в совою очередь, передается в качестве второго аргумента при вызове метода `ListenAndServe`. В нашем сервере мы использовали `nil`, поэтому Go использует обработчик по умолчанию: `handler = DefaultServeMux`. Возникает вопрос - что здесь делает `DefaultServeMux`? DefaultServeMux - это переменная, содержащая указатель на текущий маршрутизатор, который вызывает обработчики для заданных URL-адресов. Разве мы его устанавливали? Ответ - да. Помните в первой строке нашего веб-сервера мы использовали `http.HandleFunc("/", sayhelloName)`. Эта функция регистрирует правила маршрутизации для пути "/". Когда URL-адрес запроса соответствует «/», маршрутизатор вызывает функцию «sayhelloName». DefaultServeMux вызывает ServerHTTP для получения функции обработчика соответсвующего заданному пути.В нашем случае он вызывает «sayhelloName». Наконец, сервер отвечает клиенту. +Теперь ответим на вопрос как используются конкретные функции для управления запросами? Сначала метод `conn` парсит запрос возвращаемый `c.ReadRequest()`, а затем получает соответствующий обработчик: `handler := c.server.Handler`, который, в совою очередь, передается в качестве второго аргумента при вызове метода `ListenAndServe`. В нашем сервере мы использовали `nil`, поэтому Go использует обработчик по умолчанию: `handler = DefaultServeMux`. Возникает вопрос - что здесь делает `DefaultServeMux`? DefaultServeMux - это переменная, содержащая указатель на текущий маршрутизатор, который вызывает обработчики для заданных URL-адресов. Разве мы его устанавливали? Ответ - да. Помните в первой строке нашего веб-сервера мы использовали `http.HandleFunc("/", sayhelloName)`. Эта функция регистрирует правила маршрутизации для пути "/". Когда URL-адрес запроса соответствует «/», маршрутизатор вызывает функцию «sayhelloName». DefaultServeMux вызывает ServerHTTP для получения функции обработчика соответствующего заданному пути. В нашем случае он вызывает «sayhelloName». Наконец, сервер отвечает клиенту. -Подробное оприсание процесса: +Подробное описание процесса: ![](images/3.3.illustrator_Ru.png?raw=true)