Advertisement
rplantiko

Einfaches CGI-Proxy in Perl

Dec 16th, 2019 (edited)
1,150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Perl 1.93 KB | None | 0 0
  1. #!/usr/bin/perl
  2. #
  3. #  Proxy auf ein SAP-System
  4. #  (Alternative zum eingebauten CORS, Transaktion UCONCOCKPIT, falls dies im Release noch nicht möglich ist,
  5. #  oder falls es im Unternehmen Restriktionen für die Pflege der Whitelists gibt).
  6. #
  7. #  Der gewünschte URL-Pfad im Zielsystem wird in einem Query-Parameter "path" übergeben
  8. #
  9. #  Von den Kopffeldern werden nur Status, Content-Type und Content-Length weitergeleitet (die beiden letzten auch im Request)
  10.  
  11. use strict;
  12. use warnings;
  13. use CGI::Carp qw(fatalsToBrowser);
  14.  
  15. use LWP::UserAgent;
  16.  
  17. # Das Zielsystem
  18. use constant {
  19.   SAP    => 'http://sap-server.corp.ch:8000',
  20.   CLIENT => '500'
  21. };
  22.  
  23.  
  24. # Allfällige Request-Parameter aus QUERY_STRING in %args einlesen
  25. my %args = ();
  26. my $path = "";
  27. foreach (split /&/, $ENV{QUERY_STRING}) {
  28.   my ($name,$value) = split /\s*=\s*/;
  29. # Parameter 'path' wird hier für den Aufbau der URL verwendet und nicht weitergeleitet
  30.   if ($name eq 'path') {
  31.     $path = $value;
  32.     next;
  33.   }
  34.   $args{$name} = $value;  
  35. }
  36.  
  37. # Zielmandant hinzufügen
  38. $args{'sap-client'}= CLIENT;
  39.  
  40. # URL aufbauen
  41. my $ua = LWP::UserAgent->new;
  42. my $queryString = join("&", map { $_."=".$args{$_} } keys %args );
  43. my $url = SAP.$path."?".$queryString;
  44. my $response;
  45.  
  46. # Bei POST-Request usw. auch den HTTP-Body übernehmen
  47. if ($ENV{REQUEST_METHOD} eq "GET") {
  48.   $response = $ua->get( $url );
  49. }
  50. else {
  51.   my $request = HTTP::Request->new( $ENV{REQUEST_METHOD}, $url );
  52.   $request->header( 'Content-Type' => $ENV{CONTENT_TYPE} );
  53.   read STDIN, my $content, $ENV{CONTENT_LENGTH};
  54.   $request->content($content);
  55.   $response = $ua->request( $request );
  56. }
  57.  
  58. # HTTP-Antwort in STDOUT schreiben
  59. print "Status: ".$response->status_line."\n";
  60. my $contentType = $response->header('Content-Type');
  61. print "Content-Type: $contentType\n";
  62. my $contentLength = $response->header('Content-Length');
  63. print "Content-Length: $contentLength\n\n";
  64. print $response->decoded_content;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement