2008-11-07 8 views
1

Je ne veux pas utiliser le paquet HTTP :: Proxy parce que je veux supprimer quelques requêtes. Mon un paquebot ressemble à ceci, mais se brise en essayant de passer l'en-tête:Comment puis-je écrire un simple proxy HTTP en Perl?

perl -MData::Dumper -MHTTP::Daemon -MHTTP::Status -MLWP::UserAgent -e 'my $ua = LWP::UserAgent->new;my $d=new HTTP::Daemon(LocalPort=>1999);print "Please contact me at: <", $d->url, ">\n";while (my $c = $d->accept) {while (my $r = $c->get_request) {if ($r->method eq 'GET' and $r->url->path eq "/uploader") {$c->send_response("whatever.");print Dumper($r);}else{$response=$ua->request($r->method,"http://localhost:1996".$r->uri,$r->headers,$r->content);$c->send_response($response);}}}' 

formaté, c'est:

#perl -e ' 
use Data::Dumper; 
use HTTP::Daemon; 
use HTTP::Status; 
use LWP::UserAgent; 
my $ua = LWP::UserAgent->new; 
my $d=new HTTP::Daemon(LocalPort=>1999); 
print "Please contact me at: < ", $d->url, " >\n"; 
while (my $c = $d->accept) { 
    while (my $r = $c->get_request) { 
    if ($r->method eq 'GET' and $r->url->path eq "/uploaded") { 
     $c->send_response("whatever."); 
     print Dumper($r); 
    } else { 
     $response = $ua -> request(
     $r->method, 
     "http://localhost:1996" . $r->uri, 
     $r->headers, 
     $r->content); 
     $c->send_response($response); 
    } 
    } 
}#' 

passe donc je ne peux pas juste à la demande, parce que je dois changer l'hôte, et je ne peux pas simplement passer dans les en-têtes, il semble ... alors que dois-je faire pour le garder court.

Alors, est-ce que quelqu'un peut faire un meilleur one-liner?

Répondre

7

Aw tournage, je l'ai fixé avec ceci:

#perl -e ' 
use Data::Dumper; 
use HTTP::Daemon; 
use HTTP::Status; 
use LWP::UserAgent; 
my $ua = LWP::UserAgent->new; 
my $d=new HTTP::Daemon(LocalPort=>1999); 
print "Please contact me at: < ", $d->url, " >\n"; 
while (my $c = $d->accept) { 
    while (my $r = $c->get_request) { 
    if ($r->method eq "GET" and $r->url->path eq "/uploaded") { 
     $c->send_response("whatever."); 
     print Dumper($r); 
    } else { 
     $response = $ua -> request(HTTP::Request->new(
     $r->method, 
     "http://localhost:1996" . $r->uri, 
     $r->headers, 
     $r->content)); 
     $c->send_response($response); 
    } 
    } 
}#' 

note le HTTP::Request->new ouais ... il fonctionne, il est un peu lent. mais c'est bon

+0

Vous ne voulez probablement pas utiliser de guillemets simples autour de GET. Cela fonctionne dans ce cas, mais pas pour les raisons que vous pensez que cela fonctionne (essayez d'activer le mode strict pour voir ce que je veux dire). –

+0

Je suis perdu sur pourquoi ne pas utiliser des guillemets simples. Les guillemets simples signifient simplement "aucune interpolation de variable". En fait, je recommanderais de changer les autres chaînes en guillemets simples juste pour être cohérent. –

+1

Parce qu'il les utilise également sur la ligne de commande. En raison de la chance, cela fonctionne dans ce cas, mais dans d'autres cas, ce ne sera pas le cas. –

2

Pourquoi essayez-vous si fort d'écrire un one-liner? Y at-il une raison pour laquelle vous ne pouvez pas enregistrer le programme dans un fichier? Je suis juste curieux de savoir quelle est la situation.

+0

C'est une question juste; J'ai fait un fichier maintenant. Un one-liner aurait idéalement plus de sens et pourrait être fouetté pour d'autres situations rapidement. Il pourrait se lire comme suit: perl -MMagic :: Package -e '$ d = M :: P-> new (1999, "http: // localhost: 1996"); while ($ x = $ d-> except ("/uploadé))) {Dumper ($ x);} ' – dlamblin

Questions connexes