2009-04-06 4 views
17

He estado tratando de transmitir audio desde un punto en particular usando los valores del encabezado de rango, pero siempre obtengo la canción desde el principio. Estoy haciendo esto a través de un programa, así que no estoy seguro de si el problema radica en mi código o en el servidor.¿Cómo puedo saber si un servidor admite el encabezado de rango?

¿Cómo puedo averiguar si el servidor admite el parámetro de encabezado de rango?

Gracias.

+0

Consulte esta pregunta en Error del servidor: [¿Pruebe un servidor para el soporte del rango de bytes?] (Http://serverfault.com/q/547073/104579) – Flimm

Respuesta

27

La forma en que lo define el HTTP spec, si el servidor sabe cómo admitir el encabezado Range, lo hará. Eso, a su vez, requiere que devuelva un código de respuesta 206 Partial Content con un encabezado Content-Range, cuando le devuelve el contenido. De lo contrario, simplemente ignorará el encabezado Range en su solicitud y devolverá un código de respuesta 200.

Esto puede parecer tonto, pero ¿está seguro de que está creando un encabezado de solicitud HTTP válido? Con demasiada frecuencia, olvido especificar HTTP/1.1 en la solicitud, u olvido especificar el especificador de rango, como "bytes".

Ah, y si todo lo que quiere hacer es , marque, simplemente envíe una solicitud HEAD en lugar de una solicitud GET. Mismos encabezados, mismo todo, solo "HEAD" en lugar de "GET". Si recibe una respuesta 206, sabrá que Range es compatible, y de lo contrario obtendrá una respuesta 200.

5

Una forma es intentarlo y verificar la respuesta. En su caso, parece que el servidor no admite rangos.

O bien, haz un GET o HEAD en el URI, y busca el Accept-Ranges response header.

6

Aunque estoy un poco tarde respondiendo esta pregunta, creo que mi respuesta ayudará a los futuros visitantes. Aquí hay un método de python que detecta si un servidor admite consultas de rango o no.

def accepts_byte_ranges(self, effective_url): 
    """Test if the server supports multi-part file download. Method expects effective (absolute) url.""" 
    import pycurl 
    import cStringIO 
    import re 

    c = pycurl.Curl() 
    header = cStringIO.StringIO() 

    # Get http header 
    c.setopt(c.URL, effective_url) 
    c.setopt(c.NOBODY, 1) 
    c.setopt(c.HEADERFUNCTION, header.write) 
    c.perform() 
    c.close() 

    header_text = header.getvalue() 
    header.close() 

    verbose_print(header_text) 

    # Check if server accepts byte-ranges 
    match = re.search('Accept-Ranges:\s+bytes', header_text) 
    if match: 
     return True 
    else: 
     # If server explicitly specifies "Accept-Ranges: none" in the header, we do not attempt partial download. 
     match = re.search('Accept-Ranges:\s+none', header_text) 
     if match: 
      return False 
     else: 
      c = pycurl.Curl() 

      # There is still hope, try a simple byte range query 
      c.setopt(c.RANGE, '0-0') # First byte 
      c.setopt(c.URL, effective_url) 
      c.setopt(c.NOBODY, 1) 
      c.perform() 

      http_code = c.getinfo(c.HTTP_CODE) 
      c.close() 

      if http_code == 206: # Http status code 206 means byte-ranges are accepted 
       return True 
      else: 
       return False 
0
  • Puede utilizar GET método con 0-0 cabecera Range solicitud y comprobar si el código de respuesta es 206 o no, que responderá con los primeros y últimos bytes del cuerpo de la respuesta
  • Usted también puede usar el método HEAD hacer lo mismo que la primera sesión que obtendrá el mismo encabezado de respuesta y código sin cuerpo de respuesta

Además, puede marcar Accept-Ranges en el encabezado de respuesta para determinar si puede admitir el rango, pero observe si el valor es none en el campo Accept-Ranges, significa que no puede admitir el rango, y si el encabezado de respuesta no lo hace tiene el campo Accept-Ranges que tampoco puede señalar con el dedo, no puede admitir el rango desde él.

Hay otra cosa que tienes que saber si está utilizando 0-Range en el encabezado de la solicitud con GET método para comprobar el código de respuesta, el cuerpo del mensaje de respuesta se almacena en caché automáticamente en la ventana de recepción TCP hasta que la caché es completo.

Cuestiones relacionadas