Curl und Lighttpd

Ich habe mich gestern 2 1/2 Stunden mit einem ziemlich verrückten Bug rumgeärgert. Die Aufgabe war: Emuliere einen Browser und lade mit Curl eine Datei per HTTP hoch. Super einfach eigentlich, wenn man nicht gerade Lighttpd einsetzt 🙁

Curl greift wunderbar auf Lighty zu, bis man ein Feld per Post zu übermitteln versucht. Denn dann passiert folgendes:

user@host:~> curl -v -F "test=test" http://example.com/upload.php
* About to connect() to example.com port 80 (#0)
*   Trying 127.0.0.1... connected
* Connected to example.com (127.0.0.1) port 80 (#0)
> POST /upload.php HTTP/1.1
> User-Agent: curl/7.18.2 (i486-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.8g zlib/1.2.3.3 libidn/1.10
> Host: example.com
> Accept: */*
> Content-Length: 143
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=----------------------------65ad699c79c1
>
< HTTP/1.1 417 Expectation Failed
< Connection: close
< Content-Length: 0
< Date: Thu, 11 Jun 2009 08:40:02 GMT
< Server: lighttpd/1.4.19
<
* Closing connection #0

Curl sendet den Header Expect: 100-continue und Lighty sendet HTTP/1.1 417 Expectation Failed zurück. Das mag Curl garnicht und hört einfach auf. Um den HTTP-Header Expect von Curl zu unterdrücken, gibt man als Option noch -H "Expect: " an. Die Kommandozeile sieht dann so aus:

curl -v -H "Expect: " -F "test=test" http://example.com/upload.php

Und hier noch das Beispiel in PHP, mit hochladen einer Datei:

$uploadfile="test.pdf";
$ch = curl_init("http://example.com/upload.php");

//curl_setopt($ch, CURLOPT_VERBOSE, 1);
//curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_HTTPHEADER, Array('Expect: '));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);


curl_setopt($ch, CURLOPT_POSTFIELDS,
    array(  'datei'=>"@$uploadfile",
            'feld1'=>'test',
            'feld2'=>'test',
    )
);


$postResult = curl_exec($ch);
curl_close($ch);
print $postResult;
Jun 11th, 2009 | Posted in Linux, Programmieren
Tags: , , ,
  1. moe
    Nov 9th, 2009 at 14:26 | #1

    danke – dieser post hat mir gerade einiges an fehlersuche erspart 🙂

  2. diesajad
    Jan 29th, 2010 at 01:28 | #2

    mir hat das gerade ebenfalls sehr geholfen, wer ist jetzt schuld? Lighttpd wahrscheinlich die sich nicht an den Standard halten wollen?

  3. Urknaller
    Okt 16th, 2010 at 16:47 | #3

    Vielen Vielen dank! Ich denke auch mir wurden gerade Stunden an Fehlersuche erspart :)…

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>