<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>
<features>
Mime
</features>
<server>
http
</server>
<name>
--libcurl for HTTP RFC1867-type formposting - -F with 3 files, one with explicit type & encoder
</name>
<setenv>
SSL_CERT_FILE=
</setenv>
<command>
http://%HOSTIP:%HTTPPORT/we/want/%TESTNUMBER -F name=value -F 'file=@%LOGDIR/test%TESTNUMBER.txt,%LOGDIR/test%TESTNUMBER.txt;type=magic/content;encoder=8bit,%LOGDIR/test%TESTNUMBER.txt;headers=X-testheader-1: header 1;headers=X-testheader-2: header 2' --libcurl %LOGDIR/test%TESTNUMBER.c
</command>
# We create this file before the command is invoked!
<file name="%LOGDIR/test%TESTNUMBER.txt">
dummy data
</file>
</client>

# Verify data after the test has been "shot"
<verify>
<strip>
-----+\w+
</strip>
<protocol>
POST /we/want/%TESTNUMBER HTTP/1.1
Host: %HOSTIP:%HTTPPORT
User-Agent: curl/%VERSION
Accept: */*
Content-Length: 930
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="test%TESTNUMBER.txt"
Content-Type: text/plain

dummy data

------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test%TESTNUMBER.txt"
Content-Type: magic/content
Content-Transfer-Encoding: 8bit

dummy data

------------------------------9ef8d6205763
Content-Disposition: attachment; filename="test%TESTNUMBER.txt"
Content-Type: text/plain
X-testheader-1: header 1
X-testheader-2: header 2

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/
$_ = '' if /CURLOPT_INTERLEAVEDATA/
# CURL_DOES_CONVERSION generates an extra comment.
$_ = '' if /\/\* "value" \*\//
</stripfile>
<file name="%LOGDIR/test%TESTNUMBER.c" mode="text">
/********* Sample code generated by the curl command line tool **********
 * All curl_easy_setopt() options are documented at:
 * https://curl.se/libcurl/c/curl_easy_setopt.html
 ************************************************************************/
#include <curl/curl.h>

int main(int argc, char *argv[])
{
  CURLcode ret;
  CURL *hnd;
  curl_mime *mime1;
  curl_mimepart *part1;
  curl_mime *mime2;
  curl_mimepart *part2;
  struct curl_slist *slist1;

  mime1 = NULL;
  mime2 = NULL;
  slist1 = NULL;
  slist1 = curl_slist_append(slist1, "X-testheader-1: header 1");
  slist1 = curl_slist_append(slist1, "X-testheader-2: header 2");

  hnd = curl_easy_init();
  curl_easy_setopt(hnd, CURLOPT_BUFFERSIZE, 102400L);
  curl_easy_setopt(hnd, CURLOPT_URL, "http://%HOSTIP:%HTTPPORT/we/want/%TESTNUMBER");
  mime1 = curl_mime_init(hnd);
  part1 = curl_mime_addpart(mime1);
  curl_mime_data(part1, "value", CURL_ZERO_TERMINATED);
  curl_mime_name(part1, "name");
  part1 = curl_mime_addpart(mime1);
  mime2 = curl_mime_init(hnd);
  part2 = curl_mime_addpart(mime2);
  curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt");
  part2 = curl_mime_addpart(mime2);
  curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt");
  curl_mime_encoder(part2, "8bit");
  curl_mime_type(part2, "magic/content");
  part2 = curl_mime_addpart(mime2);
  curl_mime_filedata(part2, "%LOGDIR/test%TESTNUMBER.txt");
  curl_mime_headers(part2, slist1, 1);
  slist1 = NULL;
  curl_mime_subparts(part1, mime2);
  mime2 = NULL;
  curl_mime_name(part1, "file");
  curl_easy_setopt(hnd, CURLOPT_MIMEPOST, mime1);
  curl_easy_setopt(hnd, CURLOPT_USERAGENT, "stripped");
  curl_easy_setopt(hnd, CURLOPT_MAXREDIRS, 50L);
  curl_easy_setopt(hnd, CURLOPT_VERBOSE, 1L);
%if ftp
  curl_easy_setopt(hnd, CURLOPT_FTP_SKIP_PASV_IP, 1L);
%endif
  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 choose to either not use them or implement
     them yourself.

  CURLOPT_WRITEDATA was set to an object pointer
  CURLOPT_WRITEFUNCTION was set to a function pointer
  CURLOPT_READDATA was set to an object pointer
  CURLOPT_READFUNCTION was set to a function pointer
  CURLOPT_SEEKDATA was set to an object pointer
  CURLOPT_SEEKFUNCTION was set to a function pointer
  CURLOPT_ERRORBUFFER was set to an object pointer
  CURLOPT_STDERR was set to an object pointer
  CURLOPT_DEBUGFUNCTION was set to a function pointer
  CURLOPT_DEBUGDATA was set to an object pointer
  CURLOPT_HEADERFUNCTION was set to a function pointer
  CURLOPT_HEADERDATA was set to an object pointer

  */

  ret = curl_easy_perform(hnd);

  curl_easy_cleanup(hnd);
  hnd = NULL;
  curl_mime_free(mime1);
  mime1 = NULL;
  curl_mime_free(mime2);
  mime2 = NULL;
  curl_slist_free_all(slist1);
  slist1 = NULL;

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