Ankündigung

Einklappen
Keine Ankündigung bisher.

Problem mit cross server script auf cgi Basis

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Problem mit cross server script auf cgi Basis

    Hi,

    das hier ist kein js Problem, sondern cgi. Ich hoffe Ihr könnt mir trotzdem helfen, das cgi Forum, das ich gefunden habe, hatte den letzen Eintrag 2014 ...

    Wenn ich was anderes habt, um Daten cross-domain ohne iframe zu übertragen, wäre mir auch geholfen. Das hier war die einzige Lösung, die ich vor Jahren gefunden habe (es geht um eine Lösung, die ganz einfach in bestehende Webseiten ins CMS eingepflegt werden kann).

    Es hätte aber seine Vorteile, wenn ich dieses script wieder ans Laufen kriege.

    Ich verwende das Script seit Jahren, um Termindaten, die auf meiner Webseite verwaltet werden, auf anderen Webseiten (billige Pakete oft) darstellen zu können. Das script hat vor kurzem einfach so seinen Geist aufgegeben, ohne dass ich irgendwas angefasst hätte. Mein Provider hilft mir nicht weiter, könnt ihr mir einen Tipp geben?

    Auf den Client-Webseiten ist dieses Script eingebunden:

    HTML-Code:
    <div id='terminePeriodisch'><script type='text/javascript' src='http://domain.de/cgi-bin/ACD/ACD.js?uri=(http://domain.de/extern/Termine/Termine.php?id=295&periodisch$varMobil)'></script><script type='text/javascript'>
    document.write(ACD.responseText);
        </script></div>
    In der Konsole der Client-Webseite findet sich:
    Failed to load resource: the server responded with a status of 500 (Internal Server Error)

    Und auf meinem Server in den Logs:

    [Tue Oct 09 15:54:45.801824 2018] [mime:warn] [pid 1802672:tid 140515424892672] AH01599: Cannot get media type from 'cgi-script'
    [Tue Oct 09 15:54:45.805348 2018] [mime:warn] [pid 1802605:tid 140515886491392] AH01599: Cannot get media type from 'cgi-script'
    [Tue Oct 09 15:54:45.818648 2018] [cgid:error] [pid 1802672:tid 140515424892672] [client 79.218.156.6:58420] End of script output before headers: ACD.js, referer: http://www.andere-domain.de/TERMINE-1.html
    [Tue Oct 09 15:54:45.824320 2018] [cgid:error] [pid 1802605:tid 140515886491392] [client 79.218.156.6:58421] End of script output before headers: ACD.js, referer: http://www.andere-domain.de/TERMINE-1.html

    Das ist das cgi-script:

    PHP-Code:
    #!/usr/bin/perl

    ##########################################################################################
    #                                                                                        #
    # AJAX Cross Domain - ACD                                                                #
    # ---------------------------------------------------------------------------------------#
    # Full documentation and license: see http://www.ajax-cross-domain.com/                  #
    # Author: Bart Van der Donck http://www.dotinternet.be/                                  #
    # ---------------------------------------------------------------------------------------#
    # For installation procedure, see http://www.ajax-cross-domain.com/#Installation         #
    # ---------------------------------------------------------------------------------------#
    # This software is provided "as is" without any express or implied warranty.             #
    #                                                                                        #
    ##########################################################################################


    ##########################################################################################
    # Configuration area                                                                     #
    ##########################################################################################

    # which query-strings are allowed to call this script ?
    my @allowed_uris = (
                          
    'uri=(http://doamin.de/extern/Termine/Termine.php?)'
                       
    );

    # which timeout to use for the remote request (in seconds) ?
    my $timeout 30;

    # which is the default request method when not specified (case sensitive) ?
    my $method 'GET';

    # what is the maximum size of the response in KB ?
    my $maxsize 1000;

    # as which content-type should ACD.js be served ?
    my $js_content_type 'application/x-javascript';

    # In which character set should ACD.js be served ?  e.g. 'UTF-8', 'ISO-8859-1', ...
    # Set " my $charset = undef; " if you want to keep the character set of the remote
    # resource
    my $charset undef;

    # What is the default User-Agent header that is offered to the remote resource ?
    my $useragent 'AJAX Cross Domain';


    ##########################################################################################
    # Load needed modules, those should be present in default Perl 5.6+ installations        #
    ##########################################################################################

    use strict;
    use 
    warnings;
    use 
    CGI::Carp qw(fatalsToBrowser);
    use 
    LWP::UserAgent;
    use 
    HTTP::Request;
    use 
    HTTP::Headers;
    use 
    MIME::Base64;
    use 
    subs 'format_output';


    ##########################################################################################
    # Decide which remote resources we allow                                                 #
    ##########################################################################################

    my $OKflag 0;
    my $auth_failed 'AJAX Cross Domain discovered that you cannot perform the remote '
                    
    'request. The query-string after ACD.js must be set as an allowed '
                    
    'query-string in the configuration area of ACD.js.';

    # Check '&' versus '&amp;' versions
    my $amp $ENV{'QUERY_STRING'};
    $amp =~s/&/&amp;/ig;
    my $amp2 $ENV{'QUERY_STRING'};
    $amp2 =~s/&amp;/&/ig;

    for (@
    allowed_uris)  {
      
    $OKflag if (index($ENV{'QUERY_STRING'}, $_)>=0  || index($amp$_)>=|| index($amp2$_)>=0);
    }
    $OKflag 1;
    if (
    $OKflag != 1)  {
      
    format_output($auth_failed$auth_failed$auth_failed$auth_failed$auth_failed);
    }


    ##########################################################################################
    # Parse the query-string                                                                 #
    ##########################################################################################

    # Parse the bracket-separated parts
    # ---------------------------------

    my $uri $ENV{'QUERY_STRING'};
    $uri =~ s/(.*)(uri=\()(.*?)(\))(.*)/$3/ig;

    my $postdata $ENV{'QUERY_STRING'};
    $postdata =~ s/(.*)(postdata=\()(.*?)(\))(.*)/$3/ig;
    $postdata '' if $postdata eq $ENV{'QUERY_STRING'};

    my $headers $ENV{'QUERY_STRING'};
    $headers =~ s/(.*)(headers=\()(.*?)(\))(.*)/$3/ig;
    $headers '' if $headers eq $ENV{'QUERY_STRING'};

    for (
    $headers)  {
      
    tr/+/ /;
      
    s/%([A-Fa-f\d]{2})/chr hex $1/eg;
    }


    # Parse the remaining parts
    # -------------------------

    my %param;

    my $rest $ENV{'QUERY_STRING'};
    for (
    $postdata$uri$headers)  {
      
    $rest =~ s/\Q$_//g if $_ ne '';
    }

    for (
    split/&/, $rest)  {
      
    my @t_s split /=/, $_;
      
    my $name $t_s[0];
      
    s/^\Q$t_s[0]=//i;
      
    my $value $_;
      for (
    $name$value)  {
        
    tr/+/ /;
        
    s/%([A-Fa-f\d]{2})/chr hex $1/eg;
      }
      
    $param{$name} = $value;
    }

    $method uc $param{method} if defined $param{method};
    $method 'POST' if $postdata ne '';


    ##########################################################################################
    # Escapes for left and right brackets inside $uri, $headers and $postdata                #
    ##########################################################################################

    for ($uri$headers$postdata) {
      
    s/%28/(/g;
      
    s/%29/)/g;
      
    s/%2528/%28/g;
      
    s/%2529/%29/g;
    }


    ###########################################################################################
    # Split headers in name/value pairs                                                       #
    ###########################################################################################

    my %add_header;
    $add_header{'User-Agent'} = $useragent;

    for (
    split /&/, $headers)  {
      
    my @t_s split /=/, $_;
      
    my $name $t_s[0];
      
    s/^\Q$t_s[0]=//i;
      
    my $value $_;
      for (
    $name$value)  {
        
    tr/+/ /;
        
    s/%([A-Fa-f\d]{2})/chr hex $1/eg;
      }
      
    $add_header{$name} = $value;
    }


    ###########################################################################################
    # Fire off the request                                                                    #
    ###########################################################################################

    # General parameters of the request
    # ---------------------------------

    my $ua = new LWP::UserAgent;
    $ua->max_size($maxsize 1024);
    $ua->timeout($timeout);
    $ua->parse_head(undef);

    # Perform request
    # ---------------

    my $req HTTP::Request->new($method$uri);
    if (
    $method eq 'POST')  {
      
    $req->content_type('application/x-www-form-urlencoded');
      
    $req->header('Content-Length' => length($postdata));
    }
    $req->header(%add_header);
    $req->content($postdata);

    # Receive response
    # ----------------

    my $res $ua->request($req);

    if (
    $res->is_success) {
      
    format_output(
                     
    $res->content,
                     
    $res->as_string,
                     
    $res->status_line,
                     
    '',
                     
    $req->as_string
                   
    );

    else  {
      
    format_output(
                     
    $res->content
                     
    $res->as_string,
                     
    $res->status_line,
                     
    'Request failed'
                     
    $req->as_string
                   
    );
    }       


    ###########################################################################################
    # Last possibility: if no content has been outputted yet, show error                      #
    ###########################################################################################

    format_output(
                   
    $res->content
                   
    $res->as_string
                   
    $res->status_line
                   
    'Unexpected error'
                   
    $req->as_string
                 
    );


    ###########################################################################################
    # Output formatter                                                                        #
    ###########################################################################################

    sub format_output  {

        
    # General regexes and headers
        # ---------------------------

        
    my @inp = @_;
        for (@
    inp)  {
          
    s/\\/\\\\/g;
          
    s/'/\\'/g;
          
    s/\//\\\//g;
          
    s/(\r\n|\r)/\n/g;
        }

        
    my ($responseText$getAllResponseHeaders$status$error$fullrequest) = @inp;
        
    $responseText encode_base64($responseText
          if ( 
    defined $param{'base64'} && $param{'base64'eq '1' );

        
    my $output "Content-Type: $js_content_type\r\n\r\n";

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// INITIALIZATION\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{var ACD = new Object();\r\n\r\n\r\n};


        
    # What was the sent request ?
        # ---------------------------

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// ACD.request - FULL REQUEST THAT WAS SENT\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{ACD.request '';\r\n};
        if (
    defined $fullrequest)  {
          for (
    split /\n/, $fullrequest)  {
            
    $output.=qq{ACD.request += '$_\\r\\n';\r\n};
          }
        }
        
    $output.=qq{\r\n\r\n};


        
    # What was the HTTP status code of the response ?
        # -----------------------------------------------

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// ACD.status - HTTP RESPONSE STATUS CODE\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{ACD.status '$status';\r\n};
        
    $output.=qq{\r\n\r\n};


        
    # What are the headers of the response ?
        # --------------------------------------

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// ACD.getAllResponseHeaders - FULL HEADERS OF RESPONSE\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{ACD.getAllResponseHeaders '';\r\n};

        
    my %getResponseHeader;
        
    my $spaces 0;

        if (
    defined $getAllResponseHeaders)  {
          
    $getAllResponseHeaders = (split /\n\n/, $getAllResponseHeaders)[0];
          for (
    split /\n/, $getAllResponseHeaders)  {
            
    $output.=qq{ACD.getAllResponseHeaders += '$_\\r\\n';\r\n};
            
    my @key_property split /: /, $_;
            if (
    defined $key_property[1] && $key_property[1ne '')  {
              
    $getResponseHeader{$key_property[0]} = $key_property[1];
              
    $spaces length($key_property[0]) if $spaces length($key_property[0]);
            }
          }
          
    $output.=qq{\r\n\r\n};
          
    $output.=qq{// ----------------------------------------------------------------\r\n};
          
    $output.=qq{// ACD.getResponseHeader - METHOD WITH EVERY KEY/VALUE HEADER\r\n};
          
    $output.=qq{// ----------------------------------------------------------------\r\n};
          
    $output.=qq{ACD.getResponseHeader = {};\r\n};
          while ( 
    my ($key$val) = each %getResponseHeader)  {
            
    $output.=qq{ACD.getResponseHeader['$key'] } . ' ' 
                     
    ($spaces length($key)) . qq{= '$val';\r\n};

            if (
    uc $key eq 'CONTENT-TYPE' && $val =~ /charset=/&& not defined $charset)  {
              
    $charset $val;
              
    $charset =~ s/(.*)(charset=)(.+)/$3/i;
            }
          }
        }

        
    $output.=qq{\r\n\r\n};
        
    $output =~ s/\Q$js_content_type/$js_content_typecharset=$charset/ if defined $charset;


        
    # What was the body of the response ?
        # -----------------------------------

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// ACD.responseText - BODY OF RESPONSE\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{ACD.responseText '';\r\n};

        if (
    defined $responseText)  {
          for (
    split /\n/, $responseText)  {
            
    $output.=qq{ACD.responseText += '$_\\r\\n';\r\n};
          }
        }
        
    $output.=qq{\r\n\r\n};


        
    # Were there any errors ?
        # -----------------------

        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{// ACD.error - ERRORS\r\n};
        
    $output.=qq{// ----------------------------------------------------------------\r\n};
        
    $output.=qq{ACD.error '$error';\r\n};
        
    $output.=qq{\r\n\r\n};


        
    # Output & end
        # ------------

        
    print $output;
        exit;
    }


    __END__ 





  • #2
    Wenn ich was anderes habt, um Daten cross-domain ohne iframe zu übertragen, wäre mir auch geholfen.
    Wenn der andere Server CORS-Header gesetzt hat, kann auch AJAX cross-domain requests machen. Sh. https://de.wikipedia.org/wiki/Cross-...source_Sharing

    Kommentar

    Lädt...
    X