HTTP Range-запросы
Привет, это я, бездарь.
Я всегда думал, что HTTP Get-запросы каждый раз получают всю страницу целиком, и это совсем неэкологично.
В конце концов, если вы хотите получить только необходимую информацию, например, только содержимое <head>, то следует получать только часть, а если нет, то получать все целиком и извлекать.
Если бы это можно было сделать таким образом, то затраты на сетевую передачу и обработка парсинга тегов, таких как те, что внутри head, были бы более щадящими для CPU и занимали бы меньше времени, что, как мне кажется, было бы сплошным плюсом.
Более того, я подумал, что нет ничего, что HTTP не мог бы сделать, особенно с учетом TCP-связи, и, проверив, оказалось, что это действительно возможно.
HTTP Range-запросы
Тестирование с curl
Похоже, что ограничение можно установить, добавив диапазон в информацию заголовка с помощью опции -H, как показано ниже.
$ curl -H "Range: bytes=0-1024" https://soulminingrig.com/
<!DOCTYPE html>
<html lang="ja"><head><meta charset="utf-8"><meta content="width=device-width,initial-scale=1.0" name="viewport"><title>Home - SOULMINIGRIG</title><meta content="light dark" name="supported-color-schemes"><meta content="hsl(220, 20%, 100%)" media="(prefers-color-scheme: light)" name="theme-color"><meta content="hsl(220, 20%, 10%)" media="(prefers-color-scheme: dark)" name="theme-color"><link href="/pagefind/pagefind-ui.css" rel="stylesheet"><link href="/styles.css" rel="stylesheet"><link href="/feed.xml" rel="alternate" title="SOULMINIGRIG" type="application/atom+xml"><link href="/feed.json" rel="alternate" title="SOULMINIGRIG" type="application/json"><link href="/favicon.png" rel="icon" sizes="32x32" type="image/png"><link href="https://soulminingrig.com/" rel="canonical"><script src="/js/main.js" type="module"></script><style>.page-title{background:var(--color-highlight);padding:.5em;font-size:1.2em}</style><script data-website-id="6031aa47-e715-4f87-a99a-9e3046e5dcdc" defer="" src="https://n
Поскольку это указание диапазона, похоже, что можно начинать не с самого начала.
$ curl -H "Range: bytes=1025-1025" https://soulminingrig.com/
o
Даже 1 байт возвращается корректно.
На практике
Поскольку ограничение диапазона при получении данных можно установить, просто добавив его в информацию заголовка, это в принципе возможно на любом языке, и, что самое главное, это позволяет использовать пропускную способность сети более экономично, о чем часто не задумываются.
Если вы хотите извлечь только содержимое <head> HTML, вы можете указать Range: bytes=0-4096, а если это не сработает, то либо получить все целиком, либо, чтобы быть еще более экономичным, отправить Get-запрос со следующим диапазоном в 4096 байт.
В результате, библиотека для последующей обработки будет тратить меньше времени на извлечение HTML-тегов, и это также будет более щадящим для целевого сервера.
Однако, как указано на сайте MDN,
предположение, что "проверка поддержки сервером частичных запросов" сейчас повсеместно поддерживается, не является хорошим; если вы хотите действовать строго, вам также придется использовать условия для определения этого по ответу из информации заголовка.
Однако, новый император интернета...
Если вы используете CloudFlare, который носит тикерный символ NET, как бы заявляя о себе как о новом короле интернета, то, похоже, запросы ограничиваются по единицам, поэтому, даже если обработка станет быстрее, если на полпути сработает блокировка в качестве меры защиты от DDoS, в конечном итоге это не будет иметь большого значения.
Однако, если, например, вы запускаете какого-либо бота на VPS, и он сильно потребляет пропускную способность из-за внешних запросов (хотя, вероятно, никто не использует его настолько...), то частичные запросы, подобные этому, могут быть эффективными.
Тем не менее, поскольку HTTP-запросы должны быть сохранены в памяти после их выполнения, не исключено, что потребление памяти также несколько уменьшится. Поэтому, если кто-то создает инструмент для получения информации с сайтов, включение этого поведения сделает его немного более щадящим для целевого сервера, так что, похоже, это необходимо делать по мере необходимости.
Это было о HTTP, о том, что я, казалось, знал, но на самом деле не знал.