Schrift
[thread]900[/thread]

LWP URL Abfragen, Weiterleitung ermitteln

Leser: 1


<< >> 6 Einträge, 1 Seite
Franz
 2007-03-09 13:09
#9732 #9732
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
Hallo,
ich möchte einen URL per LWP Abfragen. Die Abfrage wird weitergeleitet, nun möchte ich den URL ermitteln zu dem weitergeleitet wird.

Ich komme bei der Doku zu den Modulen nicht so richtig weiter, dachte es müsste so funktionieren:



Code: (dl )
1
2
3
4
5
6
7
8
use LWP::UserAgent;
use HTTP::Request;

my $url='http://del.icio.us/url/check?url=http://www.testing.invalid';
my $ua = LWP::UserAgent->new();
my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);
print $response->header('Location') , "\n";


Aber irgendwie funktioniert das nicht so wie ich dachte. HEAD request auch nicht.

Am Rande habe ich generell das problem, dass ich nicht wirklichj weiss wie ich auf Objekte zugreifen kann. Z.B. hier herausfinden, welche Informationen $response so bereithält - geht sowas mit DataDumper oder wie das heisst?

Ich hoffe mir kann jemand einen Tipp geben.\n\n

<!--EDIT|Franz|1173438594-->
GwenDragon
 2007-03-09 15:56
#9733 #9733
User since
2005-01-17
14578 Artikel
Admin1
[Homepage]
user image
Die Weiterleitung macht ja der Server. Das kannst du nicht testen.
Allerdings kannst du bei LWP Weiterleitungen verbieten.

Ich denke, das geht so:
requests_redirectable = [];
oder die Redirects auf 0 setzen:
max_redirect =0;

Hoffe ich.
//EDIT: Ja. Es geht

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
use strict;
use warnings;

use LWP::UserAgent;
use HTTP::Request;

my $url='http://del.icio.us/url/check?url=http://www.testing.invalid';
my $ua = LWP::UserAgent->new( max_redirect => 0 );

my $request = HTTP::Request->new(GET => $url);
my $response = $ua->request($request);

# check the outcome
 if ($response->is_success) {
    print $response->content;
 }
 else {
    # Testausgabe
    #print "Error: " . $response->status_line . "\n";
    #print "       " . print $response->header('Location') , "\n";
   
    # Umleitung ist z. B. Statuscode 301, 302, 303, 307
    my ($retsc) = $response->status_line =~ /^(\d{3})/;
    for my $sc (301,302,303,307) {
        print 'Umleitung -> ', $response->header('Location'), "\n" if ($retsc == $sc)
   }
 }


Allerdings findest du so nur die erste Weiterleitung, denke ich. Wenn der Server weitere Weiterleitungen hat, denn du willst ja wohl die letze finden, dann musst du wieder die Weiterleitung in ein GET einspeisen.\n\n

<!--EDIT|GwenDragon|1173449782-->
die Drachin Gwendolyn
Franz
 2007-03-09 16:48
#9734 #9734
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
Danke!, ich habe mein Problem auf andere Weise lösen können. ALlerdings bekommt man die Info zur Weitereltiung über den header - location meine ich.... naja wiedemauchsei :-)
GwenDragon
 2007-03-09 17:02
#9735 #9735
User since
2005-01-17
14578 Artikel
Admin1
[Homepage]
user image
[quote=Franz,09.03.2007, 15:48]Danke!, ich habe mein Problem auf andere Weise lösen können.[/quote]
Magst du es verraten, denn andere fänden deinen Tipp auch nützlich ;)
die Drachin Gwendolyn
Franz
 2007-03-15 15:22
#9736 #9736
User since
2006-07-12
31 Artikel
BenutzerIn
[default_avatar]
Hätte ich na klar, wenn ich das Problem gelöst hätte. ich lese aber nun einfach Seitencontent aus, da konnte ich die gewünschte Information in diesem speziellen Fall auch finden. Ist aber eben keine Lösung für das Grundproblem.
pacey
 2007-03-30 02:58
#9737 #9737
User since
2004-03-01
23 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hmm, könnte schwierig sein. Gesetzt dem Fall Gwens Beispiel ist richtig und is_success ist false wenn wir weitergeleitet wurden (ich weiss es nicht) wäre in meinen Augen die schnellste Möglichkeit den Location Teil in ein neues GET zu werfen.

Funktioniert aber wie gesagt nur bei header Weiterleitungen.

Übernimmt die Weiterleitung der Webserver selbst (Status 301 / 307) sollte man eigentlich auch sehen können wohin umgezogen wurde.

Ganz unsicher bin ich mir wenn mod_rewrite benutzt wird an welcher Stelle dann die Weiterleitung erkennbar wird. Eigentlich setzt man rewrite ja ein damit man es nicht merkt dass man umgeleitet wurde.

Oftmals wird auch über die Fehlerseiten 404 weitergeleitet. Wenn ich allgemeingültig bleiben will würde ich jedoch hier in meinem Skript keine Weiterleitung vermuten.

Ich glaube ich werde das mal untersuchen müssen

pacey
Quote
If You don't know what it does, why do you put it in your code

Code: ()
1
2
3
print +(a=>b=>c=>d=>e=>f=>g=>h=>i=>j=>k=>l=>m=>n=>o=>p=>q=>r=>s=>t=>u=>v=>w=>x=>y=>z=>" ")

[9=>20=>18=>19=>-1=>0=>13=>14=>19=>7=>4=>17=>-1=>15=>4=>17=>11=>-1=>7=>0=>2=>10=>4=>17];
<< >> 6 Einträge, 1 Seite



View all threads created 2007-03-09 13:09.