Amostra de sessão de solicitação de intervalo http

91

É possível me mostrar uma sessão http de amostra com solicitações de intervalo. Quero dizer, quais seriam os cabeçalhos de solicitação e resposta?

chamal
fonte
2
Há alguns meses, foi publicada a nova versão do padrão HTTP / 1.1. Tem um RFC especial para solicitações de intervalo, isso é muito mais legível do que o antigo spec, incluindo exemplos para muitos itens: tools.ietf.org/html/rfc7233
Thirler

Respostas:

135

A troca a seguir é entre o Chrome e um servidor da web estático, recuperando um vídeo MP4.

Pedido inicial - para o vídeo. Observe o Accept-Rangescabeçalho de resposta para indicar que o servidor tem suporte para cabeçalho de intervalo:

GET /BigBuckBunny_320x180.mp4
        Cache-Control: max-age=0
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range:
        Accept: text/html,application/xhtml+xml,application/xml,*/*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Accept-Encoding: gzip,deflate,sdch
        Accept-Charset: ISO-8859-1,utf-8,*
200 OK
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:24 GMT

Cabeçalho de intervalo detectado na resposta anterior - solicitação subsequente com intervalo aberto para confirmar o suporte. A resposta retorna um status e Content-Rangecabeçalho 206 para indicar os bytes presentes no corpo da resposta:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=0-
        Accept: */*
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 64657027
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 0-64657026/64657027

Solicitação de intervalo subsequente para capturar o final do arquivo (provavelmente para capturar os metadados finais):

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=64312833-64657026
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 344194
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 64312833-64657026/64657027

O usuário clica na barra de progresso do vídeo além do intervalo baixado - uma solicitação de intervalo é emitida para começar a jogar a partir da posição selecionada:

GET /BigBuckBunny_320x180.mp4
        Connection: keep-alive
        Accept-Language: en-GB,en-US,en
        Host: localhost:8080
        Range: bytes=1073152-64313343
        Accept: */*
        If-Range: A023EF02BD589BC472A2D6774EAE3C58
        User-Agent: Mozilla/5.0 (Windows NT 5.1) AppleWebKit/535.7 ...
        Referer: http://localhost:8080/BigBuckBunny_320x180.mp4
        Accept-Encoding: identity
        Accept-Charset: ISO-8859-1,utf-8,*
206 Partial Content
        Content-Type: video/mp4
        Connection: keep-alive
        Last-Modified: Wed,14 Dec 2011 15:50:59 GMT
        ETag: A023EF02BD589BC472A2D6774EAE3C58
        Transfer-Encoding:
        Content-Length: 63240192
        Accept-Ranges: bytes
        Server: Brisket/1.0.1
        Date: Wed,14 Dec 2011 16:11:25 GMT
        Content-Range: bytes 1073152-64313343/64657027
johnstok
fonte
7
O cabeçalho Transfer-Encoding em branco é um artefato da maneira como a comunicação HTTP foi capturada ou existe um servidor HTTP real gerando valores em branco para este cabeçalho?
swl10 de
7
No primeiro caso, parece que o servidor está retornando 64657027 bytes de conteúdo. Então, o que está acontecendo - o cliente está apenas jogando fora esse conteúdo e, em seguida, emitindo uma solicitação de intervalo para as partes realmente desejadas? Ou o servidor não está retornando nenhum conteúdo porque algo na mensagem do cliente diz para não fazer isso? Se assim for, o que é?
Morrie
3
@Morrie - parece que o servidor, sabendo que ele próprio suporta solicitações de intervalo, diz ao cliente "Eu aceito solicitações de intervalo" através do Accept-Ranges: bytescabeçalho, mas também envia o comprimento do conteúdo para o recurso para que o cliente possa fazer solicitações de intervalo com um superior limite. Pelo que sei, nada na mensagem do cliente diz para fazer isso - o servidor pode escolher responder com "aqui está o recurso inteiro" ou "Aceito solicitações de intervalo" - que, novamente, é a existência do Accept-Rangescabeçalho. Esse é o meu entendimento sobre isso de qualquer maneira.
Simon Whitehead
4
Mas o Content-Length de 64657027 na primeira resposta não significa que há, na verdade, tantos bytes de carga útil após o cabeçalho, que o cliente deve consumir porque a conexão é Keep-Alive? Estou me perguntando o que nessa mensagem de resposta diz que não há nenhuma carga útil.
Morrie
1
@Morrie Keep-alive é uma solicitação do cliente e o cliente não tem nenhuma obrigação de continuar usando a conexão. Acabei de concluir em meu próprio trabalho que, pelo menos para o Chrome, a primeira solicitação GET com intervalo "0-" é prontamente abortada assim que o cabeçalho é recebido, em vez de usar uma solicitação HEAD. Acredito que seja uma forma de evitar problemas com algum servidor que não implemente o verbo HEAD corretamente.
Zoomulator de