2011-10-12 7 views
1

J'utilise curl pour aller chercher une page web, j'ai besoin de détecter si la réponse est gzip ou non. Cela fonctionne parfaitement bien si Content-Encoding est spécifié dans les en-têtes de réponse, mais certains serveurs renvoient plutôt "Transfer-Encoding": "Chunked" et pas d'en-tête Content-Encoding.PHP - Détecter la réponse du serveur gzip

Existe-t-il un moyen de détecter gzip ou d'obtenir la réponse brute (codée) du serveur?

J'ai essayé de regarder curl_getinfo mais le content_encoding n'est pas spécifié non plus.

Merci.

Répondre

2

Vous pouvez vérifier si la réponse commence par les nombres magiques gzip, plus précisément 1f 8b.

1

Est-il possible de détecter gzip

Oui. Vous pouvez utiliser les fonctions d'en-tête de cURLs. Par exemple, vous pouvez définir une fonction qui gère les réponses d'en-tête. Utilisez curl_setopt() avec l'option CURLOPT_HEADERFUNCTION. Ou écrivez-le dans un fichier (que vous avez créé avec fopen()) avec l'option CURLOPT_WRITEHEADER.

Il peut y avoir plus d'options que vous pourriez utiliser. Regardez les possibilités au manuel curl_setopt(). L'en-tête que vous cherchez porte le nom: Content-Encoding.

Si vous avez la sortie dans un fichier, vous pouvez également utiliser les PHP finfo avec certains de ses predefined constants. Ou mime_content_type() (DEPRECATED!) si finfo n'est pas disponible.

ou d'obtenir la réponse du serveur brut (codé)?

Oui. Vous pouvez spécifier l'en-tête accept-encoding. La valeur que vous recherchez est identity. Vous pouvez envoyer:

Accept-Encoding: identity 

mai avoir regarder la HTTP/1.1 RFC Pour obtenir une non codée/sortie non compressé (par exemple pour l'écrire directement dans un fichier). Utilisez CURLOPT_ENCODING à cette fin. Vous pouvez également le définir avec * curl_setopt *.

1

Vous pouvez émettre une requête HEAD distincte:

CURLOPT_HEADER => true 
CURLOPT_NOBODY => true 

Ou demander l'en-tête à préfixé à votre demande initiale:

CURLOPT_HEADER => true 

Mais, si vous voulez juste pour obtenir le (décodé) HTML, vous pouvez utiliser:

CURLOPT_ENCODING => '' 

Et CURL négociera automatiquement avec le serveur et décodera e pour vous.

Questions connexes