IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Web Perl Discussion :

proxy while avec un handle


Sujet :

Web Perl

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut proxy while avec un handle
    Bonjour,

    j'ai fait un script qui envois l'entête a un site puis récupère le contenu de la page, jusque là tout marche.

    Sauf qu'arrivé au while, je bloque.

    J'ai bien essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while(read(SOCK, $line, 520)) {
    mais ce code bien que parfaitement fonctionnel s'arrete au premier passage, hors il y a plus de 4000 bit par exemple.

    Merci par avance pour toute aide,
    tsukasa.

  2. #2
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Bonjour,
    Tu as le début du script qu'on puisse tester ?

    Sinon, j'essayerais comme avec un FILEHANDLE directement:

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Voici le code a tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    35
    36
    37
    38
    39
    40
     
    	#my $url = "http://www.pspgen.com/";
    	$url=~m/http\:\/\/([^\:^\/]*)(?:\:(\d+))?\/(.*)/;
    	my $host = $1;
    	my $port = $2;
    	$port = 80 unless($port);
    	my $file = '/'.$3;
     
    	my $proto = getprotobyname('tcp');
    	socket(SOCK, PF_INET, SOCK_STREAM, $proto);
    	my $sin = sockaddr_in($port, inet_aton($host));
    	connect(SOCK, $sin) || die "Connect failed: $!\n";
     
    	my $old_fh = select(SOCK);
    	$|=1;
    	select($old_fh);
    	print SOCK "GET ".$file." HTTP/1.1\n";
    	print SOCK "Host: ".$host."\n";
    	print SOCK "Accept: */*\n";
    	print SOCK "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\n";
    	print SOCK "Connection: close\n";
    	print SOCK "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\n\n";
    	$content = "";
    	$headers = "";
    	$temp = 0;
    	$b = 1;
    	while(read(SOCK,$line,600)) {
    		if ($temp == 0) {
    		$content = $content . $line;
    		$pos_h = index($content,"\r\n\r\n");
    			if ($pos != -1) {
    			print substr($content,$pos_h+10);
    			$temp = 1;
    			}
    		}
    		else {
    		print $line ;
    		}
    	sleep(0.3);
    	}
    merci encore

  4. #4
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Whoaaa, je viens de mieux comprendre ce que tu veux faire,
    tu as des modules qui permette de faire ce que tu veux faire (LWP::Agent),
    tu as de nombreux exemples dans ce forum (http://www.developpez.net/forums/d37...web/https-lwp/ par exemple).

    Sinno ça ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
      require LWP::UserAgent;
      my $agent = LWP::UserAgent->new;
      $agent->timeout(25);
      $uag = $uas[int rand(@uas)];
      $agent->agent($uag);
    # A utiliser si tu veux passer via un proxy  $agent->proxy($proxy);
      require HTTP::Request;
      $request = HTTP::Request->new(GET => "$url");
      $dapage = $agent->request($request);
      $content = $dapage->content;
     
      # Affichage de la page:
      print $content

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    re,

    Certe mais je souhaite l'utiliser en tant que plugin pour nginx et j'ai besoin a chaque retour de l'envoyer a nginx avec $r->print

    merci comme même pour ton idée, si quelqu'un sait faire ...

  6. #6
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Bien, dans ce cas on continue. :-)

    Qu'essayes-tu de faire avce le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $pos_h = index($content,"\r\n\r\n");
      if ($pos != -1){
        print substr($content,$pos_h+10);
        $temp = 1;
      }
    De plus $pos ne devrait pas être un $pos_h ?


    SInon le code suivant fonctionne bien:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	my $url = "http://url.domain.com/";
    	$url=~m/http\:\/\/([^\:^\/]*)(?:\:(\d+))?\/(.*)/;
    	my $host = $1;
    	my $port = $2;
    	$port = 80 unless($port);
    	my $file = '/'.$3;
     
    	my $proto = getprotobyname('tcp');
    	socket(SOCK, PF_INET, SOCK_STREAM, $proto);
    	my $sin = sockaddr_in($port, inet_aton($host));
    	connect(SOCK, $sin) || die "Connect failed: $!\n";
     
    	my $old_fh = select(SOCK);
    	$|=1;
    	select($old_fh);
    	print SOCK "GET ".$file." HTTP/1.1\n";
    	print SOCK "Host: ".$host."\n";
    	print SOCK "Accept: */*\n";
    	print SOCK "User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; fr; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3\n";
    	print SOCK "Connection: close\n";
    	print SOCK "Accept-Language: fr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3\n\n";
    	my ($content, $headers, $line, $temp, $b) = ("", "", "", 0, 1);
    	while($line = <SOCK>) {
    		chomp($line);
    		# Ignore les lignes vides
    		$line =~ /^\s*$/ && next;
    		# $content contient le contenu
    		$content = $content.$line;
    	}
    	print $content;
    Généralement, je ne m'embête pas avec la fonction read, la lecture directe sur le socket fonctionne bien et Perl gère tout seul ses buffers comme un grand.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    46
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 46
    Par défaut
    Le problème c'est qu'il ma semble que :

    lit ligne par ligne, hors le but est au final de faire un proxy de fichier, et de renvoyer simultanément ...

    une idée ou précision?

  8. #8
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2009
    Messages
    156
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 156
    Par défaut
    Que tu lise avec une tailled e buffer définie, ou ligne par ligne en laissant Perl gérer la taille de son buffer ne change rien.

    Les deux possibilitées doivent marcher:
    while (lecture_source)
    concatenation de tout dans une seule variable
    Envoi du resultat complet

    while (lecture_source)
    envoi morceau par morceau

    Ca dépend commetn c'est fait sur le serveur/client final qui va lire les données.
    C'est directement un affichage par navigateur la finalité ?

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/04/2006, 22h49
  2. Cacher une fenètre avec son handle
    Par [Silk] dans le forum API, COM et SDKs
    Réponses: 6
    Dernier message: 02/03/2006, 19h46
  3. [SQL] Dans un while avec fichier
    Par ozzmax dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 10/02/2006, 20h54
  4. Fermer fenêtre avec le handle
    Par ni0urk dans le forum MFC
    Réponses: 10
    Dernier message: 24/11/2005, 08h43
  5. Réponses: 3
    Dernier message: 22/11/2005, 20h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo