Contenido

    Respuesta del servidor 206 Partial Content

    1. Definición del código 206 (Partial Content)

    El código de estado HTTP 206 (Contenido Parcial) indica que el servidor ha procesado con éxito una solicitud parcial del cliente y devuelve solo la parte solicitada del recurso. Este código es útil en situaciones en las que el cliente solicita solo una parte de un archivo, lo que puede ser beneficioso para la transmisión de datos o para la descarga de archivos grandes.

    206 - Partial Content
    • Transmisión de video en línea donde solo se requiere una parte del archivo.
    • Descarga de archivos grandes en segmentos para evitar la saturación del ancho de banda.
    • Recuperación de datos en aplicaciones donde la latencia es crítica.

    2. Ejemplos prácticos de la aplicación del estado 206

    Uso en la descarga de archivos grandes

    Cuando un cliente desea descargar un archivo grande, puede solicitar una parte específica del mismo. Esto se logra mediante el uso del encabezado Range.

    • El cliente puede solicitar, por ejemplo, solo los primeros 500 bytes de un archivo.
    • Esto reduce el tiempo de espera y el uso del ancho de banda.

    Ejemplo de solicitudes utilizando el encabezado Range

    GET /archivo.zip HTTP/1.1
    Host: ejemplo.com
    Range: bytes=0-499

    Aplicación en la transmisión de video y audio

    En la transmisión de medios, el código 206 permite que los datos se envíen en segmentos. La técnica de buffering se utiliza para cargar solo la parte del video que se está reproduciendo.

    • El cliente solicita segmentos del archivo a medida que avanza la reproducción.
    • Esto mejora la eficiencia y la experiencia del usuario al reducir el tiempo de carga.

    Uso en las CDN (Redes de Entrega de Contenido)

    Las CDN utilizan el código 206 para optimizar la entrega de contenido, permitiendo que solo se envíen las partes necesarias de un archivo grande a los usuarios, mejorando así la velocidad de carga y reduciendo la carga en el servidor.

    3. Ejemplos de solicitudes usando el encabezado Range

    Formato del encabezado Range

    El encabezado Range permite al cliente especificar qué parte del recurso desea recibir. El formato básico es:

    Range: bytes=desde-hasta

    Ejemplos de solicitudes para obtener bytes específicos de un archivo

    GET /archivo.txt HTTP/1.1
    Host: ejemplo.com
    Range: bytes=100-200

    Respuesta del servidor con código 206 y encabezados correspondientes

    El servidor responde con el código 206 y proporciona los encabezados necesarios, incluyendo:

    Encabezado Descripción
    Content-Range Indica el rango de bytes que se están enviando.
    Content-Length El tamaño de la parte del contenido que se está enviando.
    Accept-Ranges Indica que el servidor acepta rangos.

    4. Manejo del código 206 en diferentes lenguajes de programación

    PHP

    En PHP, se puede implementar la descarga parcial de archivos configurando adecuadamente los encabezados y manejando el rango solicitado.

    <?php
    $file = 'archivo.zip';
    $size = filesize($file);
    $length = $size;
    $start = 0;
    $end = $size - 1;
    
    if (isset($_SERVER['HTTP_RANGE'])) {
        list($start, $end) = sscanf($_SERVER['HTTP_RANGE'], 'bytes=%d-%d');
        $length = $end - $start + 1;
        header("HTTP/1.1 206 Partial Content");
    } else {
        header("HTTP/1.1 200 OK");
    }
    
    header("Content-Type: application/zip");
    header("Content-Range: bytes $start-$end/$size");
    header("Content-Length: $length");
    header("Accept-Ranges: bytes");
    
    $fp = fopen($file, 'rb');
    fseek($fp, $start);
    fpassthru($fp);
    fclose($fp);
    ?>

    Python

    Usando Flask, se pueden manejar solicitudes parciales de manera sencilla.

    from flask import Flask, Response, request
    
    app = Flask(__name__)
    
    @app.route('/archivo')
    def archivo():
        file_path = 'archivo.zip'
        file_size = os.path.getsize(file_path)
        range_header = request.headers.get('Range', None)
    
        if not range_header:
            return Response(open(file_path, 'rb'), mimetype='application/zip')
    
        start, end = map(int, range_header.replace('bytes=', '').split('-'))
        length = end - start + 1
    
        with open(file_path, 'rb') as f:
            f.seek(start)
            data = f.read(length)
    
        response = Response(data, 206)
        response.headers.add('Content-Range', f'bytes {start}-{end}/{file_size}')
        response.headers.add('Content-Length', str(length))
        response.headers.add('Accept-Ranges', 'bytes')
        return response
    
    if __name__ == '__main__':
        app.run()  
    

    Node.js

    En Node.js, se puede utilizar Express para gestionar las solicitudes con el encabezado Range.

    const express = require('express');
    const fs = require('fs');
    const app = express();
    
    app.get('/archivo', (req, res) => {
        const file = 'archivo.zip';
        const stat = fs.statSync(file);
        const fileSize = stat.size;
        const range = req.headers.range;
    
        if (range) {
            const parts = range.replace(/bytes=/, '').split('-');
            const start = parseInt(parts[0], 10);
            const end = parts[1] ? parseInt(parts[1], 10) : fileSize - 1;
    
            res.writeHead(206, {
                'Content-Range': bytes ${start}-${end}/${fileSize},
                'Accept-Ranges': 'bytes',
                'Content-Length': end - start + 1,
                'Content-Type': 'application/zip',
            });
    
            const stream = fs.createReadStream(file, { start, end });
            stream.pipe(res);
        } else {
            res.writeHead(200, { 'Content-Length': fileSize, 'Content-Type': 'application/zip' });
            fs.createReadStream(file).pipe(res);
        }
    });
    
    app.listen(3000);  
    

    5. Posibles errores y su corrección

    Errores relacionados con encabezados Range incorrectos

    Los errores más comunes incluyen rangos mal formados o fuera de los límites del archivo. Es crucial validar el encabezado Range antes de procesar la solicitud.

    Cómo evitar errores en la implementación de la descarga parcial

    • Verificar que el encabezado Range esté presente y bien formado.
    • Asegurarse de que los valores de inicio y fin estén dentro del tamaño del archivo.

    Recomendaciones para pruebas y depuración

    Realizar pruebas exhaustivas utilizando herramientas como Postman para simular diferentes escenarios de carga de archivos y verificar cómo el servidor responde a solicitudes parciales.