2009-04-06 7 views
17

Ho cercato di trasmettere l'audio da un punto particolare usando i valori dell'intestazione Range ma ottengo sempre il brano dall'inizio. Sto facendo questo attraverso un programma quindi non sono sicuro se il problema risiede nel mio codice o sul server.Come posso sapere se un server supporta l'intestazione Range?

Come posso sapere se il server supporta il parametro intestazione intervallo?

Grazie.

+0

Vedere questa domanda su Server Fault: [Verificare un server per il supporto dell'intervallo di byte?] (Http://serverfault.com/q/547073/104579) – Flimm

risposta

27

Il modo in cui lo definisce HTTP spec, se il server sa come supportare l'intestazione Range, lo farà. Ciò, a sua volta, richiede che restituisca un codice di risposta 206 Partial Content con un'intestazione Content-Range, quando restituisce il contenuto. Altrimenti, semplicemente ignorerà l'intestazione Range nella richiesta e restituirà un codice di risposta 200.

Questo potrebbe sembrare sciocco, ma sei sicuro di creare un'intestazione di richiesta HTTP valida? Troppo spesso, ho dimenticato di specificare HTTP/1.1 nella richiesta, o dimenticare di specificare l'identificatore di intervallo, come "byte".

Oh, e se tutto ciò che si vuole fare è controllare, quindi inviare semplicemente una richiesta HEAD invece di una richiesta GET. Stessi header, stesso tutto, solo "HEAD" invece di "GET". Se ricevi una risposta 206, saprai che Range è supportato e in caso contrario riceverai una risposta 200.

5

Un modo è solo per provare e controllare la risposta. Nel tuo caso, sembra che il server non supporti intervalli.

In alternativa, eseguire GET o HEAD sull'URI e verificare Accept-Ranges response header.

6

Anche se sono un po 'in ritardo nel rispondere a questa domanda, penso che la mia risposta aiuterà i futuri visitatori. Ecco un metodo python che rileva se un server supporta query di intervallo o meno.

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
  • È possibile utilizzare GET metodo con 0-0 intestazione Range richiesta, e controllare se il codice di risposta è 206 o meno, che risponderà con primi e ultimi byte del corpo della risposta
  • È anche possibile utilizzare il metodo HEAD fare la stessa cosa della prima sessione che otterrà la stessa intestazione di risposta e il codice senza corpo risposta

Inoltre, è possibile controllare Accept-Ranges nell'intestazione della risposta per giudicare se può supportare l'intervallo, ma si prega di notare se il valore è none nel campo Accept-Ranges, significa che non può supportare l'intervallo e se l'intestazione della risposta non avere il campo Accept-Ranges non si può nemmeno dargli un dito, non può supportare la distanza da esso.

C'è un'altra cosa che dovete sapere se si sta utilizzando 0-Range sull'intestazione richiesta con GET metodo per controllare il codice di risposta, il corpo del messaggio di risposta verrà memorizzata nella cache automaticamente sul TCP finestra di ricezione fino a quando la cache è pieno.