Leser: 26
2010-02-10T15:22:23 dater[...]
Wie gebe ich eine Fehlermeldung bei read.. aus?
QuoteDas habe ich schon versucht:
read(STDIN, $daten, $ENV{'CONTENT_LENGTH'});
2010-02-10T15:57:06 sid burnEvtl. hat CGI aber einen befehl der dir dir RAW Daten zurück gibt.
QuoteHANDLING NON-URLENCODED ARGUMENTS
If POSTed data is not of type application/x-www-form-urlencoded or multipart/form-data, then the POSTed data will not be processed, but instead be returned as-is in a parameter named POSTDATA. To retrieve it, use code like this:
my $data = $query->param('POSTDATA');
2010-02-10T15:57:06 sid burnQuoteDas habe ich schon versucht:
read(STDIN, $daten, $ENV{'CONTENT_LENGTH'});
Ziemlich Perl untypisch, kommst du von C? Ansonsten reicht ein "my $input = <STDIN>".
QuoteEDIT: Wobei dann das read() blockieren sollte wenn die Daten schon gelesen wurde.
Quotedas ist nicht besonders hilfreich, wenn da mittendrin ein newline vorkommt.
Quotewarum ist read() perl-untypisch, wenn man eine bestimmte anzahl zeichen einlesen will?
Quotesicher?
2010-02-10T20:37:54 sid burn[...]
Quotesicher?
Sofern STDIN vorher nicht auf non-blocking gestellt wurde blockt es, ja.
perl -wle 'my $x; read(STDIN, $x, 1000); print "hallo"'
2010-02-10T21:08:32 sid burnDieser Code läuft solange wie du STRG+C drückst. Und von STDIN lesen ist ja nunmal genau das was er macht und nicht von einer Datei.
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
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
use CGI;
print "Content-type: text/html\n\n";
my $q = new CGI;
#TODO
#Timeout verhindern
#Gültige URL Parameter
my $strPARTNERID_valid ="BECHTLE";
my $strPWD_valid = "TEST";
#-----------------------------------------------------
#Umgebungsvariablen - bei Bedarf zum Testen
#
#$ENV{CONTENT_LENGTH};
#
#----------------------------------------------------
my @params = split(/&/,$ENV{QUERY_STRING});
foreach (@params){
($key, $val) = split (/=/,$_);
$param{$key} = $val;
};
#Datenablage - in diesem Verzeichnis werden die Daten gespeichert
my $strDataPath = "/srv/www/webshop1/web888w/dattrans/backup_bechtle_orderresponse/";
#Eindeutiger Dateiname inkl. Pfad bilden aus Timestamp + Zufallszahl z.B.: /srv/www/webshop1/web888w/dattrans/backup_bechtle_order/20100209_345.xml
my $strTimeStamp = myCurrentDate().time();
#Randomize
my $strDateiname = $strDataPath.$strTimeStamp."_".int(rand()*1000).".xml";
#Uebergebene URL Parameter ueberpruefen
my $strPARTNERID = $param{PARTNERID};
if (length($strPARTNERID)>0 and ($strPARTNERID eq $strPARTNERID_valid)){
print "Alles OK - PARTNERID ist gueltig";
}
else{
#in Datei loggen
#Remote-Adresse,strPARTNERID
#Response.Status = "401 Unauthorized"
}
my $strPWD = $param{PWD};
if(length($strPWD)>0 and ($strPWD eq $strPWD_valid)>0){
print "Alles OK -PWD gültig";
}
else{
#in Datei loggen
#Remote-Adresse,strPWD
#Response.Status = "400";
}
#Daten auslesen
my $strData = "";
my $totalBytes;
read(STDIN, $input, $ENV{'CONTENT_LENGTH'})or die "error in read: $!";
print $input;
1
2
3
4
5
6
7
8
$url = 'https://webshop-test.rz.uni-wuerzburg.de/cgi-nadine/modules/upload2.pl?PARTNERID=BECHTLE&PWD=TEST';
my $ua = LWP::UserAgent->new;
my $req = HTTP::Request->new("POST",$url);
#Daten an URL senden
$req->content($output);
read(STDIN, $input, $ENV{'CONTENT_LENGTH'})or die "error in read: $!
2010-02-11T09:38:41 daterOk, ich habe das hier versucht: my $data = $q->param('POSTDATA');
$data ist leider leer.
read(STDIN, $input, $ENV{'CONTENT_LENGTH'})or die "error in read: $!";
2010-02-11T09:45:33 daterich muss diese Zeile
ganz am Anfang des Skriptes stellen.
$ua->request($req)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/usr/bin/env perl
use strict;
use warnings;
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $url = 'http://localhost/cgi-bin/test.pl?PARTNERID=BECHTLE&PWD=TEST';
my $req = HTTP::Request->new("POST",$url);
#Daten an URL senden
$req->header('Content-Type' => 'text/xml');
$req->content("Hallo dies ist nur ein Test");
$ua->request($req);
$q->param('POSTDATA')
my $input = $q->param('POSTDATA')
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 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86
#!/usr/bin/env perl use CGI; print "Content-type: text/html\n\n"; my $q = new CGI; #TODO #Timeout verhindern #Gültige URL Parameter my $strPARTNERID_valid ="BECHTLE"; my $strPWD_valid = "TEST"; #----------------------------------------------------- #Umgebungsvariablen - bei Bedarf zum Testen # #$ENV{CONTENT_LENGTH}; # #---------------------------------------------------- my @params = split(/&/,$ENV{QUERY_STRING}); foreach (@params){ ($key, $val) = split (/=/,$_); $param{$key} = $val; }; #Datenablage - in diesem Verzeichnis werden die Daten gespeichert my $strDataPath = "/srv/www/webshop1/web888w/dattrans/backup_bechtle_orderresponse/"; #Eindeutiger Dateiname inkl. Pfad bilden aus Timestamp + Zufallszahl z.B.: /srv/www/webshop1/web888w/dattrans/backup_bechtle_order/20100209_345.xml my $strTimeStamp = myCurrentDate().time(); #Randomize my $strDateiname = $strDataPath.$strTimeStamp."_".int(rand()*1000).".xml"; #Uebergebene URL Parameter ueberpruefen my $strPARTNERID = $param{PARTNERID}; if (length($strPARTNERID)>0 and ($strPARTNERID eq $strPARTNERID_valid)){ warn "Alles OK - PARTNERID ist gueltig"; } else{ #in Datei loggen #Remote-Adresse,strPARTNERID #Response.Status = "401 Unauthorized" } my $strPWD = $param{PWD}; if(length($strPWD)>0 and ($strPWD eq $strPWD_valid)>0){ warn "Alles OK -PWD gültig"; } else{ #in Datei loggen #Remote-Adresse,strPWD #Response.Status = "400"; } #Daten auslesen my $strData = ""; my $totalBytes; my $input = $q->param('POSTDATA'); warn "INPUT: ", $q->param('POSTDATA'), "\n"; print $q->header('text/html'); print $input; sub myCurrentDate { use DateTime; return DateTime->today->dmy('.'); }
1
2
3
Alles OK - PARTNERID ist gueltig at /usr/lib/cgi-bin/test.pl line 52.
Alles OK -PWD g\xc3\xbcltig at /usr/lib/cgi-bin/test.pl line 64.
INPUT: Hallo dies ist nur ein Test
1
2
3
4
5
6
7
my @params = split(/&/,$ENV{QUERY_STRING});
foreach (@params){
($key, $val) = split (/=/,$_);
$param{$key} = $val;
};
$q->param('PARTNERID')
1
2
3
4
5
#Eindeutiger Dateiname inkl. Pfad bilden aus Timestamp + Zufallszahl z.B.: /srv/www/webshop1/web888w/dattrans/backup_bechtle_order/20100209_345.xml
my $strTimeStamp = myCurrentDate().time();
#Randomize
my $strDateiname = $strDataPath.$strTimeStamp."_".int(rand()*1000).".xml";
$q->param('PARTNERID')
QuoteDas mit den Paramtern ist mir klar, das mache ich normalerweiße auch so.
Nur in diesem Fall ist das hier leer. Ich weiß nicht warum.
$q->url_param("PARTNERID")
QuoteHast du mein Post vorher gesehen? Auf alle Fälle kann ich die XML-Daten einlesen.