Solicitudes de rango HTTP

7 min

language: ja bn en es hi pt ru zh-cn zh-tw

Hola, soy un inútil.
Siempre he pensado que las solicitudes HTTP Get recuperan toda la página cada vez, lo que no me parece nada ecológico.
Al final, si solo quiero obtener la información necesaria, por ejemplo, solo el contenido dentro de <head>, debería obtener solo una parte, y si no, obtener todo y luego extraerlo.
Si pudiera hacerse así, los costos de transferencia de red y el procesamiento de análisis de etiquetas como las de head serían más amigables para la CPU y más cortos, lo que me parece una ventaja en todos los aspectos.
Además, pensé que no habría nada que HTTP no pudiera hacer, siendo una comunicación TCP, así que investigué y parece que sí se puede.
Solicitudes de rango HTTP

Prueba con curl

Parece que se puede limitar añadiendo un rango de bytes a la información del encabezado con la opción -H, de esta manera.

$ 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

Como es una especificación de rango, parece que no hay problema si no es desde el principio.

$ curl -H "Range: bytes=1025-1025" https://soulminingrig.com/
o

Incluso 1 byte se devuelve correctamente.

En la práctica

Como se puede aplicar una restricción de rango al obtener datos simplemente añadiéndola a la información del encabezado, es posible en cualquier lenguaje, y lo más importante, permite un uso más ecológico del ancho de banda de red, algo de lo que no solemos ser muy conscientes.
Si solo quieres extraer el contenido dentro de <head> de un HTML, puedes especificar Range: bytes=0-4096, y si eso no funciona, obtener todo, o para ser aún más ecológico, enviar una solicitud Get con el siguiente rango de 4096 bytes.
En última instancia, el tiempo de extracción de etiquetas HTML por parte de las librerías de procesamiento posterior se acorta, y también es más amable con el servidor de destino.

Sin embargo, como se menciona en el sitio de MDN,
la suposición de que "la mayoría de los servidores ahora admiten solicitudes parciales" no es buena, por lo que si se quiere hacer de forma estricta, también se deben utilizar condiciones para determinarlo a partir de la respuesta de la información del encabezado.

Sin embargo, un nuevo emperador de Internet...

Si se utiliza CloudFlare, que lleva el símbolo de cotización NET, como si fuera el nuevo rey de Internet, parece que se aplican restricciones por unidad de solicitud, por lo que incluso si el procesamiento se acelera, si se produce un bloqueo como medida anti-DDoS en el medio, al final no se sentirá un gran impacto.
Sin embargo, si, por ejemplo, se está ejecutando un bot en un VPS que consume mucho ancho de banda con solicitudes externas (aunque probablemente no haya mucha gente que lo use tanto...), entonces una solicitud parcial como esta podría ser efectiva.

No obstante, dado que la información de la solicitud HTTP debería almacenarse en el espacio de memoria una vez realizada, no es descabellado pensar que el uso de memoria se reducirá en cierta medida. Por lo tanto, si alguien está creando una herramienta para obtener información de algún sitio, incluir esta funcionalidad podría hacer que el comportamiento sea un poco más amable con el servidor de destino, por lo que parece necesario hacerlo según sea el caso.

Parecía que lo sabía, pero en realidad era algo que no sabía sobre HTTP.

Related Posts