LCML/HTTP

cookieget

cookieget - Получение значения или свойства cookie

Метод

Part: LCML/HTTP

Функция cookieGet извлекает значение или указанное свойство cookie по его имени из HTTP-запроса.

Формат:

cookieGet name field request
  • name - имя cookie.

  • field - название свойства cookie (опционально).

  • EXPIRES - возвращает время истечения срока действия cookie.

  • MAXAGE - возвращает максимальный возраст cookie в секундах.

  • PATH - возвращает путь, для которого действителен cookie.

  • SECURE - возвращает флаг безопасности (true/false).

  • по умолчанию - возвращает значение cookie.

  • request - HTTP-запрос (http.Request), содержащий cookie. Результат:

Возвращает значение cookie или указанное свойство. Если cookie не найдено, возвращается текст ошибки.

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

{{ $ticketUid := cookieget "ticket" "" $.Value.Request }}

cookieset

cookieset - Установка cookie в HTTP-ответе

Метод

Part: LCML/HTTP

Функция cookieSet устанавливает cookie с заданными параметрами в HTTP-ответ.

Формат:

cookieSet name value ttl response
  • name - имя cookie.

  • value - значение cookie.

  • ttl - время жизни cookie в формате time.Duration (например, “1h”, “30m”).

  • response - HTTP-ответ (http.ResponseWriter), в который будет добавлено cookie. Результат:

Возвращает пустую строку, если cookie успешно установлено. В случае ошибки парсинга времени жизни ( ttl ) возвращает описание ошибки.

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

{{ cookieset "ticket" $uidTicket "2592000s" $.RespWriter }}

curl

curl - Отправка HTTP-запроса

Метод

Part: LCML/HTTP

Функция curl выполняет HTTP-запрос с заданными параметрами. Она поддерживает передачу заголовков, тела запроса и cookie. Если ответ не содержит данных ( res.Data пуст), функция возвращает “сырые” данные ответа.

Формат:

curl method url bodyJSON headers cookies
  • method - HTTP-метод запроса (GET, POST, PUT, и т. д.).

  • url - URL, на который отправляется запрос.

  • bodyJSON - тело запроса в формате JSON.

  • headers - мапа заголовков, где ключи - имена заголовков, а значения - их содержимое.

  • cookies - массив мапок, представляющих cookie. Результат:

  • Данные из ответа ( res ), если поле res.Data содержит значения.

  • “Сырые” данные ( raw ), если res.Data пуст. Пример использования:

    {{ curl "GET" $exampleUrl "" nil nil }}
    

parsebody

parsebody - Чтение и обработка тела HTTP-запроса

Метод

Part: LCML/HTTP

Функция parseBody предназначена для чтения содержимого тела HTTP-запроса и его преобразования в указанный формат. Полезна при работе с API-запросами или при обработке данных от клиента.

Формат:

parsebody request format
  • request — HTTP-запрос, тело которого необходимо обработать.

  • format — формат, в который требуется преобразовать данные (по умолчанию возвращает содержимое тела запроса в виде строки). Результат:

Возвращает десериализованный объект или строку в зависимости от заданного формата. В случае ошибок возвращает сообщение об ошибке.

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

{{ $formData := parsebody $.Request "json" }}
{{ $name := index $formData "name" }}
{{ $email := index $formData "email" }}
{{ $message := index $formData "message" }}

Тело запроса (JSON):

{
"name": "Иван Ловецкий",
"email": "ivan.lovetsky@example.com",
"message": "Хотелось бы узнать больше о курсе по программированию на Golang."
}

Результат: Если данные корректны, выводится сообщение благодарности с данными пользователя.


parseform

parseform -

Метод

Part: LCML/HTTP

Функция parseForm извлекает данные из формы, отправленной в HTTP-запросе, и преобразует их в карту, где каждому ключу сопоставлен массив значений.

Формат:

parseform request
  • request — HTTP-запрос (объект http.Request), содержащий данные формы. Результат:

Возвращает карту ( map[string][]string ), где ключи — имена полей формы, а значения — массив значений, соответствующих каждому ключу. Если возникает ошибка при обработке данных формы, возвращается nil.

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

{{ $formData := parseform $.Request }}
{{ $name := index $formData "name" }}
{{ $email := index $formData "email" }}
{{ $course := index $formData "course" }}

Тело формы (отправленное POST-запросом):

name=Иван Ловецкий
email=ivan.lovetsky@example.com
course=Программирование на Golang

Результат: Получение информации о регистрации пользователя для курса программирования на Golang.


parseformsep

parseformsep -

Метод

Part: LCML/HTTP

Функция parseformsep предназначена для обработки значений из HTTP-запроса и их преобразования в карту ( map ), где ключ — это имя параметра, а значение — строка, содержащая значения этого параметра, объединённые указанным разделителем.

Формат:

parseformsep request separator
  • request — HTTP-запрос (объект http.Request), содержащий данные формы.
  • separator — Разделитель, используемый для объединения значений (по умолчанию, ). Результат:

Возвращает map[string]string, где ключи — это названия полей из формы, а значения — строки, объединённые указанным разделителем.

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

Входной HTTP-запрос содержит следующие данные формы:

name: [Ivan, Katerina]
course: [Golang, Javascript]
email: [ivan.lovetsky@example.com, katerina.zakharova@example.com]

Шаблон:

{{ $formData := parseformsep $.Request ";" }}

Имя: {{ index $formData “name” }}

Курсы: {{ index $formData “course” }}

Email: {{ index $formData “email” }}

>>

<p>Имя: Ivan;Katerina</p>

<p>Курсы: Golang;Javascript</p>

<p>Email: ivan.lovetsky@example.com;katerina.zakharova@example.com</p>


parseuseragent

parseuseragent - Функция parseuseragent анализирует строку заголовка User-Agent, извлекая различные параметры, такие как название приложения, версия, операционная система, тип устройства и статус (мобильное ли это устройство, планшет или бот).

Метод

Part: LCML/HTTP

Функция возвращает строковое значение, соответствующее запрашиваемому параметру.

Формат:

parseUserAgent header param
  • header (тип: string) — строка, содержащая заголовок User-Agent, который необходимо разобрать.

  • param (тип: string) — параметр, значение которого требуется вернуть. Возможные значения param:

  • “Name” — Название приложения или браузера.

  • “Version” — Версия приложения или браузера.

  • “OS” — Название операционной системы устройства.

  • “OSVersion” — Версия операционной системы устройства.

  • “Device” — Тип устройства (например, мобильный телефон, планшет или десктоп).

  • “isMobile” — true, если это мобильное устройство.

  • “isTablet” — true, если это планшет.

  • “isBot” — true, если это бот.

  • “isDesktop” — true, если это десктоп. Результат:

Возвращаемое значение — строка, соответствующая значению для запрашиваемого параметра.Если параметр не найден, возвращается пустая строка.

Пример:

{{$platform := parseUserAgent (index (index $.Value.Request.Header "User-Agent") 0) "OS" }}

profile

profile - Получение профиля пользователя

Метод

Part: LCML/HTTP

Функция profile извлекает данные о текущем профиле пользователя из контекста HTTP-запроса, затем парсит эти данные в структуру models.ProfileData.


**Формат**
profile r
  • r (http.Request) — HTTP-запрос, в котором содержится информация о текущем профиле пользователя в контексте. Результат

Возвращает структуру данных models.ProfileData, содержащую информацию о профиле пользователя. Если произошла ошибка при парсинге или если профиль отсутствует, возвращается пустая структура.

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


profileuid

profileuid - Получение UID профиля по UID роли

Метод

Part: LCML/HTTP

Формат


profileuid r roleuid
  • r (http.Request) — HTTP-запрос, содержащий информацию о профиле пользователя.

  • roleuid (string) — UID роли, связанной с профилем. Если пусто, возвращается UID текущей роли. Результат

Возвращает строку — UID профиля, связанного с указанной ролью.

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


{{ $p := profileuid $.Value.Request $role }}

proxyrequest

proxyRequest — выполняет проксирование HTTP запросов на указанный адрес

Метод

Part: LCML/HTTP

Функция позволяет делать запросы различных типов (GET, POST, PUT, DELETE и т.д.) с возможностью передачи заголовков и тела запроса, а затем возвращает структурированный ответ для использования в шаблоне.

Формат запроса:

proxyRequest method targetURL headers body

Параметры - method (string) - HTTP метод запроса (GET, POST, PUT, DELETE, PATCH и т.д.) - targetURL (string) - Полный URL адрес для проксирования - headers map[string]string - Заголовки запроса в формате ключ-значение - body (string) - Тело запроса (для методов POST, PUT, PATCH)

Формат ответа

interface{} error

Функция возвращает map с полями: - status (string) HTTP статус ответа (например, “200 OK”) - statusCode (int) Числовой код статуса (200, 404, 500 и т.д.) - headers (http.Header) Заголовки ответа - body (HTML) Тело ответа, помеченное как безопасный HTML - bodyString (string) Тело ответа в виде обычной строки - error (string) Сообщение об ошибке (если произошла)

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

Базовый GET запрос

{{ $result := proxyRequest "GET" "https://jsonplaceholder.typicode.com/posts/1" nil "" }}
{{ if $result.error }}
<div class="error">Ошибка: {{ $result.error }}</div>
{{ else }}
<div class="response">
<h3>Статус: {{ $result.status }}</h3>
<pre>{{ $result.bodyString }}</pre>
</div>
{{ end }}

GET запрос с заголовками

{{ $headers := dict 
"Authorization" "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9"
"Accept" "application/json"
"X-Custom-Header" "custom-value"
}}
{{ $userData := proxyRequest "GET" "https://api.example.com/user/profile" $headers "" }}
<div class="user-profile">
{{ if eq $userData.statusCode 200 }}
<p>Имя пользователя: {{ $userData.bodyString }}</p>
{{ else if eq $userData.statusCode 401 }}
<p>Ошибка авторизации. Пожалуйста, войдите снова.</p>
{{ else }}
<p>Ошибка загрузки профиля: {{ $userData.statusCode }}</p>
{{ end }}
</div>

POST запрос с JSON данными

{{ $postData := dict
"title" "Новая статья"
"content" "Содержание статьи"
"author" "Иван Иванов"
}}
{{ $jsonBody := $postData | jsonEncode }}
{{ $headers := dict
"Content-Type" "application/json"
"Accept" "application/json"
}}
{{ $result := proxyRequest "POST" "https://api.example.com/articles" $headers $jsonBody }}
{{ if eq $result.statusCode 201 }}
<div class="success">
<h3>Статья успешно создана!</h3>
<p>Ответ сервера: {{ $result.bodyString }}</p>
</div>
{{ else }}
<div class="error">
<h3>Ошибка создания статьи</h3>
<p>Код: {{ $result.statusCode }}</p>
<p>Сообщение: {{ $result.bodyString }}</p>
</div>
{{ end }}

POST форма с application/x-www-form-urlencoded

{{ $formData := dict
"username" .Form.Username
"password" .Form.Password
"remember" "true"
}}
{{ $formBody := "" }}
{{ range $key, $value := $formData }}
{{ $formBody = printf "%s%s=%s&" $formBody $key $value }}
{{ end }}
{{ $formBody = $formBody | trimSuffix "&" }}
{{ $headers := dict "Content-Type" "application/x-www-form-urlencoded" }}
{{ $loginResult := proxyRequest "POST" "https://api.example.com/login" $headers $formBody }}
{{ if eq $loginResult.statusCode 200 }}
<div class="success">Вход выполнен успешно!</div>
{{ else }}
<div class="error">Ошибка входа: {{ $loginResult.bodyString }}</div>
{{ end }}

PUT запрос для обновления данных

{{ $updateData := dict
"id" .Article.ID
"title" .Article.NewTitle
"status" "published"
}}
{{ $jsonBody := $updateData | jsonEncode }}
{{ $headers := dict
"Content-Type" "application/json"
"Authorization" (printf "Bearer %s" .User.Token)
}}
{{ $result := proxyRequest "PUT" 
(printf "https://api.example.com/articles/%d" .Article.ID) 
$headers 
$jsonBody 
}}
<div class="update-status">
{{ if eq $result.statusCode 200 }}
<p class="success">✓ Статья успешно обновлена</p>
{{ else }}
<p class="error">✗ Ошибка обновления: {{ $result.bodyString }}</p>
{{ end }}
</div>

DELETE запрос

{{ $headers := dict 
"Authorization" (printf "Bearer %s" .User.Token)
"X-CSRF-Token" .CSRFToken
}}
{{ $result := proxyRequest "DELETE" 
(printf "https://api.example.com/posts/%s" .PostID) 
$headers 
"" 
}}
<div class="delete-result">
{{ if eq $result.statusCode 204 }}
<p class="success"> Пост успешно удален</p>
{{ else if eq $result.statusCode 404 }}
<p class="error"> Пост не найден</p>
{{ else }}
<p class="error"> Ошибка удаления ({{ $result.statusCode }})</p>
{{ end }}
</div>

Расширенные операции

Обработка различных типов ответов

{{ $apiResponse := proxyRequest "GET" "https://api.github.com/users/golang/repos" nil "" }}
{{ if not $apiResponse.error }}
{{ if eq $apiResponse.statusCode 200 }}
{{/* Проверяем Content-Type для правильной обработки */}}
{{ $contentType := index $apiResponse.headers "Content-Type" }}
{{ if contains $contentType "application/json" }}
<div class="json-data">
<h3>JSON ответ:</h3>
<pre>{{ $apiResponse.bodyString }}</pre>
</div>
{{ else if contains $contentType "text/html" }}
<div class="html-data">
<h3>HTML ответ:</h3>
{{ $apiResponse.body }}
</div>
{{ else }}
<div class="raw-data">
<h3>Данные:</h3>
<pre>{{ $apiResponse.bodyString }}</pre>
</div>
{{ end }}
{{ else }}
<p>Ошибка API: {{ $apiResponse.status }}</p>
{{ end }}
{{ end }}

Составные запросы с несколькими вызовами

{{/* Сначала получаем данные пользователя */}}
{{ $userHeaders := dict "Authorization" (printf "Bearer %s" .Token) }}
{{ $user := proxyRequest "GET" "https://api.example.com/user" $userHeaders "" }}
{{ if eq $user.statusCode 200 }}
{{/* Затем получаем посты пользователя */}}
{{ $posts := proxyRequest "GET" 
(printf "https://api.example.com/users/%s/posts" .UserID) 
$userHeaders 
"" 
}}
{{/* Наконец, получаем комментарии к постам */}}
{{ if eq $posts.statusCode 200 }}
{{ $comments := proxyRequest "GET" 
(printf "https://api.example.com/posts/%s/comments" .FirstPostID) 
$userHeaders 
"" 
}}
<div class="dashboard">
<h2>Профиль: {{ $user.bodyString }}</h2>
<h3>Посты: {{ len $posts.bodyString }}</h3>
<h4>Последние комментарии: {{ $comments.bodyString }}</h4>
</div>
{{ end }}
{{ else }}
<div class="error">Ошибка авторизации</div>
{{ end }}

proxystream

proxyStream — это функция для проксирования потоковых данных непосредственно в HTTP ответ.

Метод

Part: LCML/HTTP

В отличие от proxyRequest, которая возвращает данные для использования в шаблоне, proxyStream предназначена для прямого проксирования больших объемов данных (файлы, видео, аудио, стриминг) без загрузки всего содержимого в память.

Формат запроса:

proxyStream w targetURL addRequestHeaders addResponseHeaders

Параметры - w (вставьте $.RespWriter) - ResponseWriter текущего HTTP запроса - targetURL (string) - Полный URL адрес для проксирования - addRequestHeaders, addResponseHeaders - map[string]string - мапы для добавления/замены заголовков в запрос/ответ

Возвращаемое значение - error - Ошибка в случае неудачи (nil при успешном проксировании)

Особенности

  • Потоковая передача: Данные передаются напрямую без буферизации в памяти
  • Сохранение заголовков: Все заголовки от целевого сервера копируются в ответ
  • Сохранение статус кода: HTTP статус код проксируется без изменений
  • Эффективность: Минимальное использование памяти, подходит для больших файлов

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

{{ $videoURL := "http://video.com/dog.mpeg" }}
{{ proxyStream respWriter $videoURL nil nil}}

redirect

redirect - Перенаправление пользователя на указанный URL

Метод

Part: LCML/HTTP

Функция redirect выполняет перенаправление HTTP-запроса на указанный URL с определенным статусным кодом.

Формат:

redirect writer request url statusCode
  • writer ( http.ResponseWriter ) — объект для записи HTTP-ответа.

  • request ( http.Request ) — объект HTTP-запроса, вызывающего перенаправление.

  • url — строка, содержащая URL, на который должно произойти перенаправление.

  • statusCode — целое число, статус кода перенаправления (например, 302 для временного перенаправления). Результат:

Функция не возвращает результатов. Пользователь перенаправляется на указанный URL.

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

{{ redirect $.Writer $.Request "/new-page" 302 }}

Пользователь регистрируется на образовательной платформе и после успешного завершения регистрации перенаправляется на страницу курсов:

{{ redirect $.Writer $.Request "/courses" 302 }}

urljoin

urljoin - Функция urljoin собирает URL-строку из словаря.

Метод

Part: LCML/HTTP

Формат

urljoin dict

  • dict: map с ключами, определенными функцией urlParse. Результат

  • Возвращает строку URL, собранную из словаря.

  • Если ключи отсутствуют, используются пустые строки.

  • Если значение userinfo содержит недопустимые данные, возникает паника. Пример использования

{{ $dict := dict “scheme” “https” “host” “host.com:8080” “path” “/path” “query” “query=1” “fragment” “frag” “userinfo” “user:pass” }} {{ $result := urljoin $dict }} {{ $result }} >> https://user:pass@host.com:8080/path?query=1#frag


urlparse

urlparse - Функция urlparse преобразует URL-строку в словарь, содержащий его составляющие.

Метод

Part: LCML/HTTP

Формат

urlparse url

  • url: строка URL. Результат

Возвращает map с ключами:

  • scheme: схема URL.

  • host: полный хост (включая порт).

  • hostname: хост без порта.

  • path: путь URL.

  • query: строка запроса.

  • opaque: непрозрачная часть URL.

  • fragment: фрагмент (якорь).

  • userinfo: информация о пользователе (имя и пароль). Пример использования

{{ $result := urlparse “https://user:pass@host.com:8080/path?query=1” }} {{ $result }} >> map[scheme:https host:host.com:8080 hostname:host.com path:/path query:query=1 userinfo:user:pass]


xrealip

xrealip - Получение IP-адреса из HTTP-запроса

Метод

Part: LCML/HTTP

Функция xrealip извлекает IP-адрес клиента из заголовков HTTP-запроса или, если заголовки отсутствуют, из адреса удаленного подключения.

Формат:

xRealIp r
  • r — объект HTTP-запроса (http.Request). Пример:

Возвращает строку с IP-адресом, полученным из:

  • Заголовка X-Real-Ip.

  • Если X-Real-Ip отсутствует — заголовка X-Forwarded-For.

  • Если оба заголовка отсутствуют — из свойства RemoteAddr объекта HTTP-запроса.