<testcase>
# Based on test 1315
<info>
<keywords>
HTTP
HTTP FORMPOST
HTTP file upload
--libcurl
</keywords>
</info>

# Server-side
<reply>
<data>
HTTP/1.1 200 OK
Date: Thu, 29 Jul 2008 14:49:00 GMT
Server: test-server/fake
Content-Length: 0
Connection: close

</data>
</reply>

# Client-side
<client>
<server>
http
</server>
 <name>
--libcurl for HTTP RFC1867-type formposting - -F with three files, one with explicit type
 </name>
 <command>
http://%HOSTIP:%HTTPPORT/we/want/1404 -F name=value -F 'file=@log/test1404.txt,log/test1404.txt;type=magic/content,log/test1404.txt' --libcurl log/test1404.c
</command>
# We create this file before the command is invoked!
<file name="log/test1404.txt">
dummy data
</file>
</client>

# Verify data after the test has been "shot"
<verify>
<strip>
(^User-Agent:.*|-----+\w+)
</strip>
<protocol>
POST /we/want/1404 HTTP/1.1
User-Agent: curl/7.18.2 (i686-pc-linux-gnu) libcurl/7.18.2 OpenSSL/0.9.7a ipv6 zlib/1.1.4
Host: %HOSTIP:%HTTPPORT
Accept: */*
Content-Length: 795
Expect: 100-continue
Content-Type: multipart/form-data; boundary=----------------------------9ef8d6205763

------------------------------9ef8d6205763
Content-Disposition: form-data; name="name"

value
------------------------------9ef8d6205763
Content-Disposition: form-data; name="file"
Content-Type: multipart/mixed; boundary=----------------------------aaaaaaaaaaaa

Content-Disposition: attachment; filename="test1404.txt"
Content-Type: text/plain

dummy data

------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test1404.txt"
Content-Type: magic/content

dummy data

------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test1404.txt"
Content-Type: text/plain

dummy data

------------------------------aaaaaaaaaaaa--
------------------------------9ef8d6205763--
</protocol>
<stripfile>
# curl's default user-agent varies with version, libraries etc.
s/(USERAGENT, \")[^\"]+/${1}stripped/
# CURLOPT_SSL_VERIFYPEER, SSH_KNOWNHOSTS and HTTP_VERSION vary with
# configurations - just ignore them
$_ = '' if /CURLOPT_SSL_VERIFYPEER/
$_ = '' if /CURLOPT_SSH_KNOWNHOSTS/
$_ = '' if /CURLOPT_HTTP_VERSION/
</stripfile>
<file name="log/test1404.c" mode="text">
/********* Sample code generated by the curl command line tool **********
 * All curl_easy_setopt() options are documented at:
 * https://curl.haxx.se/libcurl/c/curl_easy_setopt.html
 ************************************************************************/
#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;
  struct curl_httppost *post1;
  struct curl_httppost *postend;

  post1 = NULL;
  postend = NULL;
  curl_formadd(&post1, &postend,
               CURLFORM_COPYNAME, "name",
               CURLFORM_COPYCONTENTS, "value",
               CURLFORM_END);
  curl_formadd(&post1, &postend,
               CURLFORM_COPYNAME, "file",
               CURLFORM_FILE, "log/test1404.txt",
               CURLFORM_CONTENTTYPE, "text/plain",
               CURLFORM_FILE, "log/test1404.txt",
               CURLFORM_CONTENTTYPE, "magic/content",
               CURLFORM_FILE, "log/test1404.txt",
               CURLFORM_CONTENTTYPE, "text/plain",
               CURLFORM_END);

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/1404");
  curl_easy_setopt(hnd, CURLOPT_HEADER, 1L);
  curl_easy_setopt(hnd, CURLOPT_HTTPPOST, post1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
  curl_easy_setopt(hnd, CURLOPT_TCP_KEEPALIVE, 1L);

  /* Here is a list of options the curl code used that cannot get generated
     as source easily. You may select to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA set to a objectpointer
  CURLOPT_INTERLEAVEDATA set to a objectpointer
  CURLOPT_WRITEFUNCTION set to a functionpointer
  CURLOPT_READDATA set to a objectpointer
  CURLOPT_READFUNCTION set to a functionpointer
  CURLOPT_SEEKDATA set to a objectpointer
  CURLOPT_SEEKFUNCTION set to a functionpointer
  CURLOPT_ERRORBUFFER set to a objectpointer
  CURLOPT_STDERR set to a objectpointer
  CURLOPT_DEBUGFUNCTION set to a functionpointer
  CURLOPT_DEBUGDATA set to a objectpointer
  CURLOPT_HEADERFUNCTION set to a functionpointer
  CURLOPT_HEADERDATA set to a objectpointer

  */

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;
  curl_formfree(post1);
  post1 = NULL;

  return (int)ret;
}
/**** End of sample code ****/
</file>
</verify>
</testcase>
