Forum Programmation.autre Envoyer un multipart/form-data avec ocaml-curl

Posté par  . Licence CC By‑SA.
Étiquettes :
1
23
oct.
2013

Bonsoir !

J'écrit un petit programme pour envoyer mes TPs sur un serveur en ocaml, en utilisant ocurl, un wrapper pour libcurl.
J'arrive à faire ce que je veux sans soucis en ligne de commande, mais pas avec ocurl

Je veux vraisemblablement envoyé mon fichier en multipart/form-data

Ma ligne

curl -v "myhost/upload2.php" --form "fichier1= @file.tar.gz" --form "MAX_FILE_SIZE=1000000" -b cookie

Qui répond

> POST /upload2.php HTTP/1.1
> User-Agent: curl/7.32.0
> Host: myhost
> Accept: */*
> Cookie: PHPSESSID=4qbihrkhode23902q1v988a114; cookie_test=1
> Content-Length: 10563
> Expect: 100-continue
> Content-Type: multipart/form-data; boundary=------------------------53aa2e4a08d1f7c0
> 
< HTTP/1.1 100 Continue
< HTTP/1.1 200 OK
< Date: Wed, 23 Oct 2013 17:34:21 GMT
* Server Apache/2.2.16 (Debian) is not blacklisted
< Server: Apache/2.2.16 (Debian)
< X-Powered-By: PHP/5.3.3-7+squeeze17
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
< Pragma: no-cache
< Vary: Accept-Encoding
< Content-Length: 2265
< Content-Type: text/html
<

Mon ocaml

    let fetch connection url =
    Printf.printf "Retriving %s ...\n" (url);
    flush stdout;
    Curl.set_url connection url;
    Curl.perform connection;
    Curl.set_post connection false
    in
    let curl_file_option = Curl.CURLFORM_FILECONTENT("fichier1","unexisting.tar.gz",Curl.CONTENTTYPE "application/x-tar") in                                     
    Curl.set_maxfilesize connection (Int32.of_int 1000000);                                                                                                      
    Curl.set_httppost connection [curl_file_option];
    fetch connection (baseURL^"upload2.php");

Qui ne produit absolument rien sinon de manger 100% CPU

Une idée ? un aiguillage ?

Merci d'avance :)

  • # host ?

    Posté par  . Évalué à 2.

    dans le premier tu lui dis de se connecte à myhost/upload2.php
    dans le deuxiemme à baseURL"upload2.php"

    alors j'y connais pas grand chose en ocaml
    mais tu lui a precisé quelques part ou devait aller baseURL ?

    • [^] # Re: host ?

      Posté par  . Évalué à 1.

      Erreur dans le copier coller, mais oui, baseURL contient bien l'url, j'ai besoin de me logguer avant d'arriver sur la page d'url (et faut que je passe par une page de selection du projet puis tp), et ca se passe sans problème.
      Avec quelques symboles de debug (un printf entre chaque ligne :) ), je bloque avant Curl.set_httppost

      Non vraiment je sèche, je n'ai trouvé qu'un lien de quelqu'un qui, visiblement, essaie la meme chose que moi, et je voit pas la différence ; https://github.com/ocaml/oasis-db/blob/master/test/TestAPI.ml

  • # Un effet de bord ?

    Posté par  (site web personnel) . Évalué à 3.

    Je ne connais pas ocurl ni son api.

    Par contre, je vois un gros bloc de séquences d'instructions (séparées par des ;), qui semble produire un effet de bord :

    connection est un paramètre fourni à la méthode fetch (et créé en dehors de ton exemple), sur lequel tu applique Curl.perform, Curl.set_post etc.

    Si ces fonctions ont vraiment un type unit en sortie, alors il y a effet de bord.

    J'ignore s'il s'agit d'une piste, mais déjà, ça saute aux yeux !

    • [^] # Re: Un effet de bord ?

      Posté par  . Évalué à 2.

      Oui, toute ces fonctions sont de types unit en sortie. Je ne comprend pas en quoi les effets de bords sont problématique ?
      De ce que j'ai compris, ces fonctions ajoute des options avant la connection (tout pareil que ce que dit la doc de libcurl)

      J'ai recompilé ocurl avec les options de debug, suis tombé sur pas mal de segfault, j'ai recompilé depuis le master et visiblement la version de ma distribution était plutot ancienne (celle hébergée sur sourceforge aussi), et pouf, ca fonctionne.

      Maintenant, le serveur me répond que l'envoie à échoué, mais il au moins, il se passe quelque chose.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.