Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [c / protocollo HTTP ] forzare la richiesta del campo content-length

    ciao

    avevo scritto un post un paio di settimane fa, chiedendo informazioni su come capire la dimensione della risposta di un server che parla HTTP 1.1, ho fatto alcune ricerche e ho ancora alcuni dubbi da chiarire... :

    - In alcuni casi (non ho ancora capito quando) il server manda nell'header HTTP un campo

    codice:
    Content-Length: 117
    ovviamente in questo caso io posso
    leggere l'header (che immagino e spero abbia una dimensione fissa)
    fare il parsing dell'header ed estrarre il valore 117
    - leggere 117 otteti

    ok, il problema ovviamente si pone quando il content-length non è specificato... (ad esempio quando il server invia immagini o elenchi di file contenuti di directory)

    non ce un modo,modificando la richiesta del client, per forzare il server a rispondere includendo content-length?

    grazie

    [edit]
    ho appena scoperto che nemmeno le dimensioni dell'header HTTP sono fisse.... e quindi come posso fare?

    il problema, se non sono riuscito a spiegarmi bene, è che non sapendo quanti dati mi manda il server, e volendo prenderli tutti... è ovvio che prima o poi (anche se leggo 1 byte alla volta) il server avrà finito di inviare e la mia recv resterà bloccata fino ad andare in timeout!
    "durante i primi 5 miuti di pioggia nel bosco c'è ancora asciutto, poi quando smetterà di piovere nel bosco cadranno gocce per 5 minuti.....la natura ha un'ottima memoria..."

    http://www.kumbe.it

  2. #2
    Moderatore di Sicurezza informatica e virus L'avatar di Habanero
    Registrato dal
    Jun 2001
    Messaggi
    9,782
    Il consiglio è di studiarti un po' il protocollo HTTP.
    HTTP 1.1 ftp://ftp.rfc-editor.org/in-notes/rfc2616.txt
    HTTP 1.0 ftp://ftp.rfc-editor.org/in-notes/rfc1945.txt

    in particolare il paragrafo 4.4 di http 1.1, versione del protocollo che oramai viene usato di default.

    In ogni caso, se il tuo intento è semplicemente ricevere il contenuto di una pagina e non ti interessano feature avanzate di http 1.1 ti consiglio di forzare una richiesta HTTP 1.0. In questo modo eviti sia risposte chunked sia connessioni persistenti (queste ultime, default per http 1.1, sono quelle che ti disorientano).
    Prova con:

    GET / HTTP/1.0

    al termine della risposta il server interromperà la connessione TCP e la tua RECV ritornerà il controllo al programma.

    Con HTTP 1.1 ci sono altre alternative come usare

    Connection: close

    nella richiesta. In questo modo si forza il server a chiudere la connessione al termine della risposta. Il comportamento di default per http 1.1 infatti è di tipo persistent il che consente di fare più richieste sulla stessa connessione ma necessita di capire quando la risposta è finita.

    Ancora un'altra possibilità con http 1.1... dopo la richiesta e prima di ricevere i dati fai una chiusura selettiva della socket in scrittura:
    shutdown(socket,SD_SEND)
    sicuramente meno elegante ma altrettanto efficace. Anche in questo caso il server chiuderà al connessione al termne della risposta.

    Ricordati inoltre che se usi http 1.1 devi aspettarti la possibilità (molto probabile) di ricevere risposte chunked. Questo viene testimoniato dalla presenza di un
    Transfer-Encoding: chunked
    negli header di risposta e dalla presenza di caratteri spuri in mezzo e alla fine del messaggio.
    Per info leggi i paragrafi 3.6.0 e 3.6.1 dell'rfc http 1.1

    Insomma la soluzione più semplice è quella di usare http 1.0.
    Leggi il REGOLAMENTO!

    E' molto complicato, un mucchio di input e output, una quantità di informazioni, un mucchio di elementi da considerare, ho una quantità di elementi da tener presente...
    Drugo

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.