Schrift
[thread]11693[/thread]

Problem bei cURL Aufrufen...

Leser: 1


<< |< 1 2 >| >> 20 Einträge, 2 Seiten
~Br4inP4in~
 2008-04-23 18:03
#108781 #108781
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hallo.

Ich habe ein etwas größeres Projekt, bei dem ich auf mehrere Oneklickhoster-APIs
zugreife und Files per post hochlade.
Dafür nutze cURL auf einem Unix-System, da das cURL Modul den Fileupload
per post scheinbar noch nicht unterstützt...

Nun zu meinem Problem:
Ich habe für jeden Hoster ein Modul geschrieben, an das ich $file, $login und
$password sende und das mir den Downloadlink zurückgibt.

Die Module rufe ich nacheinander auf (5 Stück) und es tritt bei den
letzten zwei Modulen immer ein Fehler auf, obwohl sie wenn ich sie
einzeln aufrufe einwandfrei funktionieren.

Der Fehler besteht darin, dass ein essenzieller Systemaufruf einfach nicht
ausgeführt wird:

Code (perl): (dl )
$result = qx(curl -s -F 'user_id=$login' -F 'user_password=$password' -F 'file_modus=post' -F 'modus=file_upload' -F 'auth=$auth_key' -F 'file_link=\@$file' '$server');


Beziehungsweise im anderen Modul:

Code (perl): (dl )
$logincode = qx(curl -s -i -d 'email=$login&password=$password&login=Log+In' $server |grep Cookie);


Die Variablen $result und $logincode sind nach dem Aufruf leer, wenn ich den
Verbosemode von cURL setze, bekomme ich dort keine Ausgabe.
Ich habe auch schon versucht, die Zeilen in eine until($result){} Schleife zu
setzen, das gibt dann eine Endlosschleife.
Ein print wird an dieser Stelle ohne Problem ausgegeben.
Backticks bringen mich auch nicht weiter.

Hat jemand eine Idee, was den Fehler verursachen könnte? (den Code habe ich inzwischen schon mindestens 4x komplett durchgecheckt, da ist definitiv kein Fehler drin)
Kennt jemand vielleicht ein passendes Modul, womit ich die Zeilen ersetzen
kann?

Gruß, ~Br4inP4in~
GwenDragon
 2008-04-23 20:12
#108784 #108784
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
Hat zwar damit nix zu tun: du solltest vielleicht den kompletten Pfad für Curl angeben.

Was soll dir denn curl per qx an Perl zurück geben? Fehlercode? also $? oder was?

Warum verwendest du nicht LWP::Simple?
~Br4inP4in~
 2008-04-23 21:15
#108786 #108786
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi, danke für deine Antwort.

Also der Curl Aufruf funktioniert ja sonst auch, daran sollte der fehler nicht liegen.
Der Return ist eben der Downloadlink, bzw die Seite, die die API eben nach dem
Upload zurückgibt.

LWP::Simple hatte ich nicht genutzt, um das Script einerseits besser weitergeben
zu können (keine Module zum installieren), der Hauptgrund war aber, dass
LWP mir keine Returns vom Server zurückgegeben hat.
Es hat zwar das File Hochgeladen, aber es kam eben kein Return zurück.

Curl war außerdem Syntaxmäßig recht einfach anzusprechen, der Einzeiler
war für die Aufrufe Comfortabler. Das ließe sich aber natürlich auch durch ein
Modul schnell regeln... Wenn mir jemand ein Beispiel geben kann, wie ich mit
LWP auch Cookies und Headers verarbeiten kann, bin zur Not auch dazu bereit,
die Curl Zeilen damit zu ersetzen... Dennoch würde mich Interessieren, was das
Problem verursacht.

Gruß, ~Br4inP4in~
GwenDragon
 2008-04-23 21:18
#108787 #108787
User since
2005-01-17
14748 Artikel
Admin1
[Homepage]
user image
~Br4inP4in~+2008-04-23 19:15:37--
Hi, danke für deine Antwort.

Also der Curl Aufruf funktioniert ja sonst auch, daran sollte der fehler nicht liegen.
Und welchen Fehlercode liefert denn curl wenn es nicht geht?
~Br4inP4in~
 2008-04-23 21:33
#108790 #108790
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Entweder den, den die Seite ihm sendet (Fehlerseite mit Code), oder garkeinen.
Allerdings müsste bei einem Fehler im Verbosemode wenigstens etwas von Curl
zurückkommen, dies ist aber nicht der Fall.
Und die Seite sendet normalerweise auch einen Fehlercode zurück.

Ich habe übrigens die Erfahrung gemacht, dass das Script bei Dateien im
100kB-bereich funktioniert. Mit Dateien von ~100MB kommt es aber nicht
zurecht.
Von einem Kollegen weiss ich, dass es für Curl unter C einen Parameter namens
CURLOPT_INFILESIZE, der die Dateigröße des Uploads angibt. Eventuell
benötigt das binary-curl auch etwas in der Art? Würde allerdings immernochnicht
erklären, warum der Upload mit den anderen Modulen hinhaut, bzw mit den
"fehlerhaften" wenn ich sie ohne die anderen aufrufe.

Gruß, ~Br4inP4in~
renee
 2008-04-24 10:34
#108802 #108802
User since
2003-08-04
14371 Artikel
ModeratorIn
[Homepage] [default_avatar]
Vielleicht schreibt curl auch was auf STDERR, was Du mit qx{} nicht einfängst. Also STDERR nach STDOUT umleiten und dann mal schauen, ob von curl was kommt...
OTRS-Erweiterungen (http://feature-addons.de/)
Frankfurt Perlmongers (http://frankfurt.pm/)
--

Unterlagen OTRS-Workshop 2012: http://otrs.perl-services.de/workshop.html
Perl-Entwicklung: http://perl-services.de/
tschloss
 2008-04-25 00:31
#108834 #108834
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Werden denn die Variablen $password etc. in den single-quotes richtig interpoliert?

Thomas
~Br4inP4in~
 2008-04-27 13:54
#108908 #108908
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Hi.

Sorry, war ein Paar Tage unterwegs..

renee, wie leite ich STDERR auf STDOUT um?
So?:
Code: (dl )
curl [...] 2>&1


tschoss, die Singlequotes werden nicht von Perl interpretiert,
die Variablen werden richtig interpoliert...
Wie gesagt funktioniert das Modul ja auch als einzelnes bzw.
das komplette Script mit allen Modulen solange die Dateien,
die hochgeladen werden, klein sind...
Das ist ja das, was mich so stutzig macht...

Danke && Gruß, ~Br4inP4in~
tschloss
 2008-04-28 10:16
#108927 #108927
User since
2008-04-21
30 Artikel
BenutzerIn
[default_avatar]
Irgendwie schwierig zu helfen, wenn man den Kontext (Modul, Code der Sub, Fehler) nicht so richtig kennt.

Zwei Anregungen:
- vielleicht liegt das Problem ja an Modul Nr. 3 und dieses macht irgendwas "kaputt", so dass dann Nr 4 hinfällt. Vielleicht globale Variablen, Zuweisung statt Vergleich etc.
- Hast Du Dir mal den nakten Output des curl (und den nakten Call-String) in Aufruf Nr. 3 und 4 angesehen?
- Hast Du die Aufrufe mal umgestellt, um zu sehen, wo es dann kracht

Thomas

PS: Wie oben schon vogreschlagen, würde ich es auch lieber mit LWP versuchen. Ich persönlich finde dass sich das eleganter im Perl Code handhaben läßt. Aber sicher Geschmackssache. Zum Einlesen: http://www.perl.com/pub/a/2002/08/20/perlandlwp.ht...
~Br4inP4in~
 2008-04-28 20:51
#108957 #108957
User since
2007-06-13
28 Artikel
BenutzerIn
[default_avatar]
Also STDERR nach STDIN umleiten hat mir nicht weitergeholfen.
Den Output von Curl und den Callstring hab ich mir angeschaut,
das sah alles gut aus...

Ich habe mich jetzt dazu entschieden LWP zu verwenden.
Jedoch habe ich gleich beim ersten Test einen Fehler zurückbekommen:
Code: (dl )
Out of memory!

Ich kann mir nicht wirklich erklären warum. Die Datei, die ich
hochladen will, ist um die 100MB groß, soviel Speicher ist auf jeden
Fall verfügbar.

Der zugehörige Code:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
my $ua = LWP::UserAgent->new;

my $result=$ua->request(POST $server,
            Content_Type    => 'multipart/form-data',
            Content         => [user_id         => $login,
                                user_password   => $password,
                                file_modus      => 'post',
                                modus           => 'file_upload',
                                auth            => $auth_key,
                                file_link       => [$file]]);
print $result->content;


Der Upload funktioniert mit kleinen Dateien übrigens problemlos.

Gruß, ~Br4inP4in~
<< |< 1 2 >| >> 20 Einträge, 2 Seiten



View all threads created 2008-04-23 18:03.