Séparation de Corps de la Réponse HTTP à partir d'en-Tête dans le C++
Je suis en train d'écrire mon propre C++ HTTP classe pour un certain projet. Et j'essaie de trouver un moyen de séparer le corps de la réponse de l'en-tête, parce que c'est la seule partie j'ai besoin de revenir.
Voici un échantillon des matières premières en-têtes http, si vous n'êtes pas familier avec elle:
HTTP/1.1 200 OK
Server: nginx/0.7.65
Date: Wed, 29 Dec 2010 06:13:07 GMT
Content-Type: text
Connection: keep-alive
Vary: Cookie
Content-Length: 82
Ci-dessous qui est le HTML/corps de la Réponse. Quelle serait la meilleure façon de le faire? Je suis seulement en utilisant Winsock bibliothèque pour les demandes en passant (je ne pense même pas à cette matière).
Merci d'avance.
OriginalL'auteur Ruel | 2010-12-29
Vous devez vous connecter pour publier un commentaire.
En-têtes HTTP sont terminées par la séquence
\r\n\r\n
(une ligne vide). Il suffit de chercher, et de tout reprendre après. (Il ne peut pas exister de cours, par exemple si c'était en réponse à uneHEAD
demande.)J'aurais dit "si c'était en réponse à une
HEAD
demande". En HTTP,\r\n\r\n
se termine en-têtes pour les demandes et les réponses.Bon, résolu. Merci.
response.substr(response.find("\r\n\r\n"));
OriginalL'auteur j_random_hacker
Avez-vous besoin pour restaurer votre propre? Il y a des bibliothèques C/C++ pour faire des HTTP, par exemple libcurl. Si vous avez besoin de l'appui de toute la gamme de HTTP, alors il n'est pas toujours simple de délimitation. Vous pourriez aussi avoir à répondre, par exemple, pour le codage mémorisé en bloc.
Juste assez. Keep it simple si il est sûr de supposer un sous-ensemble limité de HTTP est manipulé.
OriginalL'auteur axw
FAIRE SI le Socket.IsServerReady(Chaussette) Texte = texte + Socket.Lire(Chaussette, 65000) 'imprimer le texte" 32000 octets... tout ce qu'ils nous donnent Octets = octets + Socket.Transféré De La Barre D'État.Panneau(0).Caption = "Octets Lus:" + STR$(Octets)
FIN SI
'RichEdit.addstrings texte zzz=Octets BOUCLE JUSQU'à ce Support.Transférés = 0 RichEdit.Claire RichEdit.Texte = texte Support.Close(Sock) dim mem comme qmemorystream dim$ S as string S$ = texte pour n=0 à 400 buff$=mid$($S,n,5)
si buff$="vivant", puis " trouvé la fin des en-têtes de richedit1.addstrings (buff$) richedit1.addstrings (mid$($S,n,9)) richedit1.addstrings str$(n+9) zzz=n+8'offset + 8 bits de l'espace après les en-têtes et avant Bof fin si prochaine n Mem.WriteStr(S$, LEN(S$))'écrire ensemble du fichier dans la mémoire Mem.Position = zzz 'utiliser la compensation de la position de Départ de$ S = "Mem".ReadStr(LEN(S$)) ' lire reste de fichier en chaîne jusqu'à Eof Mem.Fermer n'oubliez pas de fermer d'IMPRESSION 'S$" imprimer
Fichier x.Open("c:/CAP.AVI", fmCreate)'création d'un fichier sur le système de fichier x.WriteBinStr(S$,len(S$)-zzz)' écrire dans ce fichier x.fermer n'oubliez pas de fermer
OriginalL'auteur user7384758