Elide предоставляет Blob, File, Headers, FormData, Request,
Response и fetch как глобальные объекты.
Blob и File
const blob = new Blob(["hello"]);
await blob.text(); // "hello"
await blob.bytes(); // Uint8Array(5)
const file = new File(["hello"], "greeting.txt", {
type: "text/plain",
lastModified: 1700000000000,
});
file instanceof Blob; // trueМетоды чтения Blob включают text(), arrayBuffer(), bytes() и
stream(). slice() возвращает Blob. File добавляет name и
lastModified.
Headers
const headers = new Headers([["X-Custom", "1"]]);
headers.append("X-Custom", "2");
headers.get("x-custom"); // "1, 2"
headers.append("Set-Cookie", "a=1");
headers.getSetCookie(); // ["a=1"]Имена не чувствительны к регистру. При итерации имена приводятся к нижнему регистру и сортируются, большинство
повторяющихся значений объединяется, а значения Set-Cookie остаются отдельными. Недопустимые имена или
значения приводят к TypeError. Защиты request, response, no-CORS и immutable
ограничивают изменения там, где это применимо.
FormData
FormData — упорядоченный по вставке список строковых значений или значений File.
const form = new FormData();
form.append("tag", "first");
form.append("tag", "second");
form.getAll("tag"); // ["first", "second"]
form.append("upload", new Blob(["hello"], { type: "text/plain" }));
form.get("upload").name; // "blob"При добавлении Blob нормализуется в File. set() заменяет первую
совпадающую запись и удаляет последующие дубликаты.
Тела Request и Response
Оба класса предоставляют body, bodyUsed, arrayBuffer(), blob(),
bytes(), formData(), json() и text().
Поддерживаемые входные данные тела: строки, Blob, источники буферов, FormData,
URLSearchParams и ReadableStream. Запросы GET и HEAD отклоняют непустое
тело. Потоковое тело запроса требует duplex: "half".
const request = new Request("https://example.invalid/", {
method: "POST",
body: "hello",
});
await request.text(); // "hello"
const response = Response.json({ ok: true });
await response.json(); // { ok: true }URL запросов должны быть абсолютными. Коды состояния в конструкторе Response ограничены
диапазоном 200–599. Response.redirect() также требует абсолютного URL.
Доступны Response.error(), Response.redirect(), Response.json() и
clone().
fetch
fetch(input, init?) принимает URL, строку URL или Request и возвращает
Promise, который разрешается при получении заголовков ответа. Тело ответа — это
ReadableStream: фрагменты становятся доступны до того, как сервер закончит отправку
ответа. Методы вроде response.text() читают поток до конца.
Тела запросов тоже могут быть потоками. Отмена тела ответа закрывает его сетевой
поток; AbortSignal может отменить отправку или последующее чтение тела. Режимы
перенаправления и метаданные целостности применяются при отправке. Проверка целостности
буферизует до 100 МиБ и завершается до того, как ответ станет доступен.
Ответы gzip и deflate декодируются один раз с сохранением их заголовков ответа. HTTPS по умолчанию проверяет цепочки сертификатов и имена хостов; дополнительная настройка доверия описана в разделе Переменные окружения среды выполнения.
fetch работает по HTTP/1.1 и HTTP/2 на
нативном транспорте Elide. Используйте elide info, чтобы увидеть
выбранный транспорт и провайдера TLS. Поддерживаются HTTP-прокси, выбранные
ProxySelector хоста, включая HTTPS CONNECT. Прокси с аутентификацией и
неподдерживаемые типы прокси приводят к явной ошибке.
Сжатие описано отдельно в разделе Потоки сжатия. Параметры и жизненный цикл HTTP-сервера описаны в справочнике по глобальному объекту Elide.
Значения HTTP по умолчанию и сжатие
Fetch отправляет User-Agent: Elide/<version> и Accept: */*. Любой из них можно переопределить обычными заголовками запроса:
await fetch(url, { headers: { "User-Agent": "my-service/1.0" } });Задайте ELIDE_HTTP_USER_AGENT, чтобы изменить значение по умолчанию для процесса. Встраивающие JVM-приложения могут использовать
системное свойство elide.http.userAgent; оно имеет приоритет над переменной окружения. Заголовок
конкретного запроса имеет приоритет над обеими настройками. Настроенные значения должны состоять из печатных символов ASCII.
Fetch объявляет поддержку и декодирует gzip, deflate, Brotli и Zstandard с помощью доступных кодеков среды выполнения.
Резервный вариант сжатия только на JDK объявляет gzip и deflate. Явные заголовки Accept-Encoding
сохраняются. Запросы диапазонов по умолчанию используют identity. Заголовки ответа описывают закодированный ответ даже после декодирования тела.
const response = await fetch(url, { decompress: false });
const encodedBytes = await response.arrayBuffer();С decompress: false значение Accept-Encoding по умолчанию — identity; если сервер всё равно отправляет
сжатое содержимое, оно возвращается без изменений. Это полезно при проксировании закодированных ответов. В остальных случаях
автоматическое декодирование остаётся потоковым и отклоняет повреждённые сжатые тела.
Условные заголовки, такие как If-None-Match и If-Modified-Since, отправляются как обычно. Ответ 304
сохраняет заголовки и не имеет тела; fetch не поддерживает HTTP-кэш в стиле браузера.
При обслуживании запросов закодированные ответы остаются под управлением приложения: отправляйте закодированное тело с его
Content-Encoding и используйте Vary: Accept-Encoding при согласовании представлений. Elide
не сжимает тела ответов повторно без вашего ведома.
Reference
Status: Full · 1,455 of 2,511 suite tests pass (57.9%) · since 1.1.0
Exports
| Export | Kind | Status | Notes |
|---|---|---|---|
Headers | class | Full | append(), delete(), get(), getSetCookie(), has(), set(), iteration |
Request | class | Full | method, url, headers, destination, referrer, referrerPolicy, mode, credentials, cache, redirect, integrity, keepalive, signal, duplex, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text() |
Response | class | Full | Response.error(), Response.redirect(), Response.json(), type, url, redirected, status, ok, statusText, headers, clone(), body, bodyUsed, arrayBuffer(), blob(), bytes(), formData(), json(), text() |
Blob | class | Full | size, type, slice(), text(), arrayBuffer(), bytes(), stream() |
File | class | Full | name, lastModified |
FormData | class | Full | append(), delete(), get(), getAll(), has(), set(), iteration |
Tests: wpt-wintertc fetch: 1,455 pass, 1,043 fail, 13 error, 400 skipped. Failing: fetch/api/basic/request-forbidden-headers.any.js (96), fetch/api/redirect/redirect-referrer-override.any.js (91), fetch/data-urls/processing.any.js (68), fetch/api/headers/header-values-normalize.any.js (57), fetch/api/cors/cors-keepalive.any.js (51), fetch/api/cors/cors-preflight-star.any.js (34), fetch/api/redirect/redirect-origin.any.js (30), fetch/api/cors/cors-preflight-status.any.js (27), and 110 more.