2010-05-13 7 views
0

Je suis en train de mettre les données en utilisant libcurl pour imiter la commandeImpossible de HTTP PUT avec libcurl à django-piston

curl -u test:test -X PUT --data-binary @data.yaml "http://127.0.0.1:8000/foo/" 

qui fonctionne correctement. Mes options ressemblent:

curl_easy_setopt(handle, CURLOPT_USERPWD, "test:test"); 
curl_easy_setopt(handle, CURLOPT_URL, "http://127.0.0.1:8000/foo/"); 
curl_easy_setopt(handle, CURLOPT_VERBOSE, 1); 
curl_easy_setopt(handle, CURLOPT_UPLOAD, 1); 
curl_easy_setopt(handle, CURLOPT_READFUNCTION, read_data); 
curl_easy_setopt(handle, CURLOPT_READDATA, &yaml); 
curl_easy_setopt(handle, CURLOPT_INFILESIZE, yaml.size()); 
curl_easy_perform(handle); 

je crois que la fonction read_data fonctionne correctement, mais si vous demandez, je posterai ce code.

J'utilise Django avec django-piston, et ma fonction update n'est jamais appelée! (Il est appelé quand j'utilise la version ligne de commande ci-dessus.) La sortie de

libcurl est:

* About to connect() to 127.0.0.1 port 8000 (#0) 
* Trying 127.0.0.1... * connected 
* Connected to 127.0.0.1 (127.0.0.1) port 8000 (#0) 
* Server auth using Basic with user 'test' 
> PUT /foo/ HTTP/1.1 
Authorization: Basic dGVzdDp0ZXN0 
Host: 127.0.0.1:8000 
Accept: */* 
Content-Length: 244 
Expect: 100-continue 

* Done waiting for 100-continue 
** this is where my read_data handler confirms: read 244 bytes ** 
* HTTP 1.0, assume close after body 
< HTTP/1.0 400 BAD REQUEST 
< Date: Thu, 13 May 2010 08:22:52 GMT 
< Server: WSGIServer/0.1 Python/2.5.1 
< Vary: Authorization 
< Content-Type: text/plain 
< 
Bad Request* Closing connection #0 

Répondre

0

je ne donne pas l'en-tête approprié. Lorsque vous exécutez la version ligne de commande avec -v, il a donné l'en-tête

Content-Type: application/x-www-form-urlencoded 

Pour ajouter ce avec libcurl:

struct curl_slist *slist = 0; 
slist = curl_slist_append(slist, "Content-Type: application/x-www-form-urlencoded"); 
curl_easy_setopt(handle, CURLOPT_HTTPHEADER, slist); 
// ... 

curl_easy_perform(handle); 

curl_slist_free_all(slist); 

et ça marche!

Questions connexes