Schrift
[thread]2904[/thread]

Socket: Verbindungsproblem?



<< >> 10 Einträge, 1 Seite
Gast Gast
 2004-04-17 13:25
#29214 #29214
Hallo,

wenn ich dieses Script ausführe:
Code: (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/usr/bin/perl
#-#############################################
use strict;
use warnings;
use IO::Socket qw(:DEFAULT :crlf);

#-#############################################
$/ = CRLF.CRLF;
my ($data, $host, $path, $socket, $header);
my $url = 'http://IrgendWo';

#-#############################################
($host, $path) = $url =~ m!^http://([^/]+)(/[^\#]*)!
or die "URL nicht gültig";

$socket = IO::Socket::INET->new(
PeerAddr => $host,
PeerPort => 80,
Proto => 'tcp',
Type => SOCK_STREAM
) or die("keine Verbindung zu $host <br>$@<br>");

print $socket qq|GET $path HTTP/1.0|.CRLF.CRLF;

$header = <$socket>;
$header =~ s/$CRLF/\n/g;
#print $header;

print $data while read($socket, $data, 1024) > 0;

close $socket;

#-#############################################
exit;


wird nicht in jedem Falle das erwartete Ergebnis geliefert; will sagen, die Datei wird nicht gefunden und der Remote-Server meldet die tollsten Sachen.

Wenn ich stattdessen ein LWP basiertes Script laufen lasse dann klappt alles problemlos.

Woran kann das liegen??

Mit Gruß
Dieter
esskar
 2004-04-17 14:48
#29215 #29215
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
liegt wohl daran, dass LWP weiß, was zu machen ist...
du wirfst ihm ja nur eine zeile zu...und sonst gar keine heade...
kann den webserver stören!
esskar
 2004-04-17 14:49
#29216 #29216
User since
2003-08-04
7321 Artikel
ModeratorIn

user image
versuch mal anstatt HTTP/1.0
HTTP/0.9 oder gar HTTP/0.8
Gast Gast
 2004-04-17 15:05
#29217 #29217
Es sieht so aus als würde das nur beim Ansprechen von virtuellen Servern nicht funktionieren ... hmmm
jan
 2004-04-17 15:37
#29218 #29218
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
du musst dem server mitteilen, welchen host du anfragen möchtest, damit er das bestimmen kann ... vhosts laufen ja im allgemeinen mit etlichen hosts auf einer IP, es bleibt also nur der host-wert aus dem http-request um zu differenzieren und zu bestimmen, welcher vhost die anfrage erhält...
Gast Gast
 2004-04-17 16:16
#29219 #29219
Quote
du musst dem server mitteilen, welchen host du anfragen möchtest, damit er das bestimmen kann


Klar, das mach ich auch - voller Name wird eingetragen ...
und:
bei dem LWP basierten Script verwende ich den selben URL wie ich ihn auch in diesem Script verwende.

Noch ne Zusatzfrage:
'GET' und 'POST' funktioniert ja ...
aber hat schon mal jemand von Euch 'PUT' und/oder 'DELETE' erfolgreich abgewickelt?

Gruß
Dieter
jan
 2004-04-17 16:22
#29220 #29220
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
nein, das machst du nicht, du musst den host nicht unbedingt im socket-aufbau verwenden, sondern im HTTP-Request, d.h nicht nur
GET $path HTTP/1.0
sondern auch noch eine weitere Zeile im header:
Host: dein.beispiel
mit PUT und DELETE habe ich mich nie auseinandergesetzt ...
Gast Gast
 2004-04-17 17:29
#29221 #29221
Da war die Initialzündung :)
Danke jan

Statt:
print $socket qq|GET $path HTTP/1.0|.CRLF.CRLF;

Muss ich schreiben:
print $socket qq|GET $url HTTP/1.0|.CRLF.CRLF;

dann klappt's auch mit den virtuelle Hosts.
jan
 2004-04-17 17:41
#29222 #29222
User since
2003-08-04
2536 Artikel
ModeratorIn
[Homepage] [default_avatar]
echt? das ist aber, denke ich, nicht sonderlich sauber:
Quote
The absoluteURI form is only allowed when the request is being made to a proxy. The proxy is requested to forward the request and return the response. If the request is GET or HEAD and a prior response is cached, the proxy may use the cached message if it passes any restrictions in the Expires header field. Note that the proxy may forward the request on to another proxy or directly to the server specified by the absoluteURI. In order to avoid request loops, a proxy must be able to recognize all of its server names, including any aliases, local variations, and the numeric IP address. An example Request-Line would be:


GET http://www.w3.org/pub/WWW/TheProject.html HTTP/1.0

The most common form of Request-URI is that used to identify a resource on an origin server or gateway. In this case, only the absolute path of the URI is transmitted (see Section 3.2.1, abs_path). For example, a client wishing to retrieve the resource above directly from the origin server would create a TCP connection to port 80 of the host "www.w3.org" and send the line:

GET /pub/WWW/TheProject.html HTTP/1.0

followed by the remainder of the Full-Request. Note that the absolute path cannot be empty; if none is present in the original URI, it must be given as "/" (the server root).

http://ftp.ics.uci.edu/pub/ietf/http/rfc1945.html

eine url an der stelle anzugeben, ist für die kommunikation via proxys gedacht - nicht für den eigentlichen request.
ich würde irgendwas wie
Code: (dl )
print $socket "GET $path HTTP/1.0" . CRLF . "Host: $host" . CRLF . CRLF;

benutzen - ungetestet ;)
das ist zwar nicht http/1.0-konform, weil 1.0 den host-request-header nicht kennt, wird aber allgemeinhin als erweiterung unterstützt und ist, denke ich, sauberer.
Gast Gast
 2004-04-17 18:12
#29223 #29223
Klasse, jan ...
das funktioniert auch :)

und danke für die Literatur-Hinweise.
<< >> 10 Einträge, 1 Seite



View all threads created 2004-04-17 13:25.