PDA

Bekijk Volledige Versie : php fsockopen



WH-Tim
01/05/07, 21:52
Onderstaande code wilt helaas al anderhalf uur niet werken. $parts is een array bestaande uit [0] = www.eenbestaandedomeinnaam.nl en [1] = index.html . De array heb ik al hardcoded gedaan, en ook de $parts al eens verwijderd en hardcoded.


<?php $sock = fsockopen($parts[0], "80", $errno, $errstr, 30);
if($sock)
{
fwrite($sock, "HEAD /".$parts[1]." HTTP/1.0\r\n");
fwrite($sock, "Connection: close\r\n\r\n");
while(!feof($sock))
{
$headers .= fgets($sock);
}
echo $headers;

}
?>

Als ik http 1.0 gebruik krijg ik constant deze melding, hoe ik het ook schrijf of aanpas:



HTTP/1.1 302 Found
Date: Tue, 01 May 2007 19:50:51 GMT
Server: Apache
Location: http:///
Connection: close
Content-Type: text/html; charset=iso-8859-1


met http 1.1 krijg ik constant deze melding:


HTTP/1.1 400 Bad Request
Date: Tue, 01 May 2007 19:54:00 GMT
Server: Apache
Connection: close
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1


Wat ik wil is gewoon met PHP4 de header uitlezen, zodat ik kan controleren op Content-Type. Iemand voor mij de oplossing of een schop in de richting?

Ik ben er al achter dat het iets met Apache's VirtualHosts te maken heeft..

groenleer
02/05/07, 08:20
Het lijkt er op dat je het HOST: deel mist.

Hoewel je wel een connectie opbouwt naar een host $part[0] vertel je nergens in je HTTP request voor welke web-host het bestemd is.

Deze hoort onder je HEAD/GET/POST/REQUEST statement te komen.
Zie ook een dump uit mijn WireShark.

Een goede RFC is 2616 (DIe over het HTTP protocol)
http://www.w3.org/Protocols/rfc2616/rfc2616.html


Een andere leuke en goede bron is:
http://djce.org.uk/dumprequest.html
Het kijkt naar jouw request voor die specifieke pagina en ontrafelt dan de http request die is opgesteld.

WH-Tim
02/05/07, 10:02
Bedankt groenleer, dit is precies wat ik vanmorgen liggend in mijn bedje aan het bedenken was ;) Het host gedeelte toevoegen en een packetsniffer gebruiken voor nu en in de toekomst!

WH-Tim
16/05/07, 16:11
Ha, ik heb vandaag nogmaals zelf de packetsniffer gebruikt om headers uit te vogelen, maar zit nu wel met een vraag.
Op http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html sectie '14.10 Connection' en http://www.w3.org/Protocols/rfc2616/rfc2616-sec19.html#sec19.6.2 staat een beschrijving over HTTP/1.0 en HTTP/1.1 :



A system receiving an HTTP/1.0 (or lower-version) message that includes a Connection header MUST, for each connection-token in this field, remove and ignore any header field(s) from the message with the same name as the connection-token. This protects against mistaken forwarding of such header fields by pre-HTTP/1.1 proxies. See section 19.6.2.


Kan ik hieruit concluderen dat HTTP/1.0 standaard altijd de verbinding afsluit na een request en de 'Connection: close' header eigenlijk onnodig is?

Wat is het duidelijke verschil tussen HTTP/1.0 en HTTP/1.1?

groenleer
18/05/07, 09:05
Kan ik hieruit concluderen dat HTTP/1.0 standaard altijd de verbinding afsluit na een request en de 'Connection: close' header eigenlijk onnodig is?


Ik denk het ook, zoals ik de RFC lees.
QUOTE=RFC 2616 #19.6.2]
Persistent connections in HTTP/1.0 are explicitly negotiated as they are not the default behavior.
[/quote]



Wat is het duidelijke verschil tussen HTTP/1.0 en HTTP/1.1?
Echte duidelijke verschillen durf ik niet aan te geven.
Ik weet dat het o.a. met het aantal en het soort headers te maken heeft.