Initial import
This commit is contained in:
parent
baeba76200
commit
6ecc00601c
372
Source/CTest/Curl/CMake/CurlTests.c
Normal file
372
Source/CTest/Curl/CMake/CurlTests.c
Normal file
@ -0,0 +1,372 @@
|
|||||||
|
#ifdef TIME_WITH_SYS_TIME
|
||||||
|
/* Time with sys/time test */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/time.h>
|
||||||
|
#include <time.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
if ((struct tm *) 0)
|
||||||
|
return 0;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_O_NONBLOCK
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <unistd.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
/* try to compile O_NONBLOCK */
|
||||||
|
|
||||||
|
#if defined(sun) || defined(__sun__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)
|
||||||
|
# if defined(__SVR4) || defined(__srv4__)
|
||||||
|
# define PLATFORM_SOLARIS
|
||||||
|
# else
|
||||||
|
# define PLATFORM_SUNOS4
|
||||||
|
# endif
|
||||||
|
#endif
|
||||||
|
#if (defined(_AIX) || defined(__xlC__)) && !defined(_AIX4)
|
||||||
|
# define PLATFORM_AIX_V3
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#if defined(PLATFORM_SUNOS4) || defined(PLATFORM_AIX_V3)
|
||||||
|
#error "O_NONBLOCK does not work on this platform"
|
||||||
|
#endif
|
||||||
|
int socket;
|
||||||
|
int flags = fcntl(socket, F_SETFL, flags | O_NONBLOCK);
|
||||||
|
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_5
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
struct hostent_data hdata;
|
||||||
|
int rc;
|
||||||
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_5_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;q
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
struct hostent_data hdata;
|
||||||
|
int rc;
|
||||||
|
rc = gethostbyaddr_r(address, length, type, &h, &hdata);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_7
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
char buffer[8192];
|
||||||
|
int h_errnop;
|
||||||
|
struct hostent * hp;
|
||||||
|
|
||||||
|
hp = gethostbyaddr_r(address, length, type, &h,
|
||||||
|
buffer, 8192, &h_errnop);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_7_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
char buffer[8192];
|
||||||
|
int h_errnop;
|
||||||
|
struct hostent * hp;
|
||||||
|
|
||||||
|
hp = gethostbyaddr_r(address, length, type, &h,
|
||||||
|
buffer, 8192, &h_errnop);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_8
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
char buffer[8192];
|
||||||
|
int h_errnop;
|
||||||
|
struct hostent * hp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = gethostbyaddr_r(address, length, type, &h,
|
||||||
|
buffer, 8192, &hp, &h_errnop);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYADDR_R_8_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
char * address;
|
||||||
|
int length;
|
||||||
|
int type;
|
||||||
|
struct hostent h;
|
||||||
|
char buffer[8192];
|
||||||
|
int h_errnop;
|
||||||
|
struct hostent * hp;
|
||||||
|
int rc;
|
||||||
|
|
||||||
|
rc = gethostbyaddr_r(address, length, type, &h,
|
||||||
|
buffer, 8192, &hp, &h_errnop);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_3
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
int
|
||||||
|
gethostbyname_r(const char *, struct hostent *, struct hostent_data *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
struct hostent_data data;
|
||||||
|
gethostbyname_r(NULL, NULL, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_3_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
int
|
||||||
|
gethostbyname_r(const char *, struct hostent *, struct hostent_data *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
struct hostent_data data;
|
||||||
|
gethostbyname_r(NULL, NULL, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_5
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netinet/in.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
struct hostent *
|
||||||
|
gethostbyname_r(const char *, struct hostent *, char *, int, int *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_5_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
struct hostent *
|
||||||
|
gethostbyname_r(const char *, struct hostent *, char *, int, int *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_6
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
int
|
||||||
|
gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
||||||
|
struct hostent **, int *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_GETHOSTBYNAME_R_6_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <netdb.h>
|
||||||
|
#undef NULL
|
||||||
|
#define NULL (void *)0
|
||||||
|
|
||||||
|
int
|
||||||
|
gethostbyname_r(const char *, struct hostent *, char *, size_t,
|
||||||
|
struct hostent **, int *);
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
|
||||||
|
gethostbyname_r(NULL, NULL, NULL, 0, NULL, NULL);
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_SOCKLEN_T
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
if ((socklen_t *) 0)
|
||||||
|
return 0;
|
||||||
|
if (sizeof (socklen_t))
|
||||||
|
return 0;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_IN_ADDR_T
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/socket.h>
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
if ((in_addr_t *) 0)
|
||||||
|
return 0;
|
||||||
|
if (sizeof (in_addr_t))
|
||||||
|
return 0;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef STDC_HEADERS
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <float.h>
|
||||||
|
int main() { return 0; }
|
||||||
|
#endif
|
||||||
|
#ifdef RETSIGTYPE_TEST
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <signal.h>
|
||||||
|
#ifdef signal
|
||||||
|
# undef signal
|
||||||
|
#endif
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" void (*signal (int, void (*)(int)))(int);
|
||||||
|
#else
|
||||||
|
void (*signal ()) ();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int
|
||||||
|
main ()
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_INET_NTOA_R_DECL
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
typedef void (*func_type)();
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
func_type func;
|
||||||
|
func = (func_type)inet_ntoa_r;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
#ifdef HAVE_INET_NTOA_R_DECL_REENTRANT
|
||||||
|
#define _REENTRANT
|
||||||
|
#include <arpa/inet.h>
|
||||||
|
|
||||||
|
typedef void (*func_type)();
|
||||||
|
|
||||||
|
int main()
|
||||||
|
{
|
||||||
|
func_type func;
|
||||||
|
func = (func_type)&inet_ntoa_r;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
#endif
|
19
Source/CTest/Curl/Testing/CMakeLists.txt
Normal file
19
Source/CTest/Curl/Testing/CMakeLists.txt
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
SET(CURL_TESTS
|
||||||
|
ftpget
|
||||||
|
ftpgetresp
|
||||||
|
ftpupload
|
||||||
|
getinmemory
|
||||||
|
persistant
|
||||||
|
sepheaders
|
||||||
|
simple
|
||||||
|
)
|
||||||
|
|
||||||
|
CONFIGURE_FILE(${LIBCURL_SOURCE_DIR}/Testing/testconfig.h.in
|
||||||
|
${LIBCURL_BINARY_DIR}/Testing/testconfig.h)
|
||||||
|
|
||||||
|
INCLUDE_DIRECTORIES(${LIBCURL_BINARY_DIR}/Testing)
|
||||||
|
|
||||||
|
FOREACH(TEST ${CURL_TESTS})
|
||||||
|
ADD_EXECUTABLE(${TEST} ${TEST}.c)
|
||||||
|
TARGET_LINK_LIBRARIES(${TEST} Curl)
|
||||||
|
ENDFOREACH(TEST)
|
95
Source/CTest/Curl/Testing/curlgtk.c
Normal file
95
Source/CTest/Curl/Testing/curlgtk.c
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
/* Copyright (c) 2000 David Odin (aka DindinX) for MandrakeSoft */
|
||||||
|
/* an attempt to use the curl library in concert with a gtk-threaded application */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <gtk/gtk.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <curl/types.h> /* new for v7 */
|
||||||
|
#include <curl/easy.h> /* new for v7 */
|
||||||
|
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
GtkWidget *Bar;
|
||||||
|
|
||||||
|
size_t my_read_func(void *ptr, size_t size, size_t nmemb, FILE *stream)
|
||||||
|
{
|
||||||
|
return fread(ptr, size, nmemb, stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
int my_progress_func(GtkWidget *Bar, int t, int d)
|
||||||
|
{
|
||||||
|
/* printf("%d / %d (%g %%)\n", d, t, d*100.0/t);*/
|
||||||
|
gdk_threads_enter();
|
||||||
|
gtk_progress_set_value(GTK_PROGRESS(Bar), d*100.0/t);
|
||||||
|
gdk_threads_leave();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void *curl_thread(void *ptr)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
FILE *outfile;
|
||||||
|
gchar *url = ptr;
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl)
|
||||||
|
{
|
||||||
|
outfile = fopen("/tmp/test.curl", "w");
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FILE, outfile);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_READFUNCTION, my_read_func);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_PROGRESSFUNCTION, my_progress_func);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_PROGRESSDATA, Bar);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
fclose(outfile);
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
GtkWidget *Window, *Frame, *Frame2;
|
||||||
|
GtkAdjustment *adj;
|
||||||
|
pthread_t curl_tid;
|
||||||
|
|
||||||
|
/* Init thread */
|
||||||
|
g_thread_init(NULL);
|
||||||
|
|
||||||
|
gtk_init(&argc, &argv);
|
||||||
|
Window = gtk_window_new(GTK_WINDOW_TOPLEVEL);
|
||||||
|
Frame = gtk_frame_new(NULL);
|
||||||
|
gtk_frame_set_shadow_type(GTK_FRAME(Frame), GTK_SHADOW_OUT);
|
||||||
|
gtk_container_add(GTK_CONTAINER(Window), Frame);
|
||||||
|
Frame2 = gtk_frame_new(NULL);
|
||||||
|
gtk_frame_set_shadow_type(GTK_FRAME(Frame2), GTK_SHADOW_IN);
|
||||||
|
gtk_container_add(GTK_CONTAINER(Frame), Frame2);
|
||||||
|
gtk_container_set_border_width(GTK_CONTAINER(Frame2), 5);
|
||||||
|
adj = (GtkAdjustment*)gtk_adjustment_new(0, 0, 100, 0, 0, 0);
|
||||||
|
Bar = gtk_progress_bar_new_with_adjustment(adj);
|
||||||
|
gtk_container_add(GTK_CONTAINER(Frame2), Bar);
|
||||||
|
gtk_widget_show_all(Window);
|
||||||
|
|
||||||
|
pthread_create(&curl_tid, NULL, curl_thread, argv[1]);
|
||||||
|
|
||||||
|
gdk_threads_enter();
|
||||||
|
gtk_main();
|
||||||
|
gdk_threads_leave();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
83
Source/CTest/Curl/Testing/ftpget.c
Normal file
83
Source/CTest/Curl/Testing/ftpget.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include "curl/types.h"
|
||||||
|
#include "curl/easy.h"
|
||||||
|
|
||||||
|
#include "testconfig.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is an example showing how to get a single file from an FTP server.
|
||||||
|
* It delays the actual destination file creation until the first write
|
||||||
|
* callback so that it won't create an empty file in case the remote file
|
||||||
|
* doesn't exist or something else fails.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct FtpFile {
|
||||||
|
char *filename;
|
||||||
|
FILE *stream;
|
||||||
|
};
|
||||||
|
|
||||||
|
int my_fwrite(void *buffer, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
struct FtpFile *out=(struct FtpFile *)stream;
|
||||||
|
if(out && !out->stream) {
|
||||||
|
/* open file for writing */
|
||||||
|
out->stream=fopen(out->filename, "wb");
|
||||||
|
if(!out->stream)
|
||||||
|
return -1; /* failure, can't open file to write */
|
||||||
|
}
|
||||||
|
return fwrite(buffer, size, nmemb, out->stream);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
struct FtpFile ftpfile={
|
||||||
|
LIBCURL_BINARY_DIR "/Testing/ftpget-download.txt", /* name to store the file as if succesful */
|
||||||
|
NULL
|
||||||
|
};
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* Get curl 7.9.2 from sunet.se's FTP site: */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL,
|
||||||
|
"ftp://public.kitware.com/pub/cmake/cygwin/setup.hint");
|
||||||
|
/* Define our callback to get called when there's data to be written */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, my_fwrite);
|
||||||
|
/* Set a pointer to our struct to pass to the callback */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FILE, &ftpfile);
|
||||||
|
|
||||||
|
/* Switch on full protocol/debug output */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, TRUE);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
|
if(CURLE_OK != res) {
|
||||||
|
/* we failed */
|
||||||
|
fprintf(stderr, "curl told us %d\n", res);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ftpfile.stream)
|
||||||
|
fclose(ftpfile.stream); /* close the local file */
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
63
Source/CTest/Curl/Testing/ftpgetresp.c
Normal file
63
Source/CTest/Curl/Testing/ftpgetresp.c
Normal file
@ -0,0 +1,63 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include "curl/types.h"
|
||||||
|
#include "curl/easy.h"
|
||||||
|
|
||||||
|
#include "testconfig.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Similar to ftpget.c but this also stores the received response-lines
|
||||||
|
* in a separate file using our own callback!
|
||||||
|
*
|
||||||
|
* This functionality was introduced in libcurl 7.9.3.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t
|
||||||
|
write_response(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
|
{
|
||||||
|
FILE *writehere = (FILE *)data;
|
||||||
|
return fwrite(ptr, size, nmemb, writehere);
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
FILE *ftpfile;
|
||||||
|
FILE *respfile;
|
||||||
|
|
||||||
|
/* local file name to store the file as */
|
||||||
|
ftpfile = fopen(LIBCURL_BINARY_DIR "/Testing/ftpgetresp-list.txt", "wb"); /* b is binary, needed on win32 */
|
||||||
|
|
||||||
|
/* local file name to store the FTP server's response lines in */
|
||||||
|
respfile = fopen(LIBCURL_BINARY_DIR "/Testing/ftpgetresp-responses.txt", "wb"); /* b is binary, needed on win32 */
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* Get a file listing from sunet */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "ftp://public.kitware.com/");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_FILE, ftpfile);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HEADERFUNCTION, write_response);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, respfile);
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
|
||||||
|
fclose(ftpfile); /* close the local file */
|
||||||
|
fclose(respfile); /* close the response file */
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
92
Source/CTest/Curl/Testing/ftpupload.c
Normal file
92
Source/CTest/Curl/Testing/ftpupload.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
|
||||||
|
#include "testconfig.h"
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This example shows an FTP upload, with a rename of the file just after
|
||||||
|
* a successful upload.
|
||||||
|
*
|
||||||
|
* Example based on source code provided by Erick Nuwendam. Thanks!
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOCAL_FILE LIBCURL_SOURCE_DIR "/Testing/ftpupload.c"
|
||||||
|
#define UPLOAD_FILE_AS "while-uploading.txt"
|
||||||
|
#define REMOTE_URL "ftp://public.kitware.com/incoming/" UPLOAD_FILE_AS
|
||||||
|
#define RENAME_FILE_TO "renamed-and-fine.txt"
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
FILE *ftpfile;
|
||||||
|
FILE * hd_src ;
|
||||||
|
int hd ;
|
||||||
|
struct stat file_info;
|
||||||
|
|
||||||
|
struct curl_slist *headerlist=NULL;
|
||||||
|
char buf_1 [] = "RNFR " UPLOAD_FILE_AS;
|
||||||
|
char buf_2 [] = "RNTO " RENAME_FILE_TO;
|
||||||
|
|
||||||
|
/* get the file size of the local file */
|
||||||
|
hd = open(LOCAL_FILE, O_RDONLY) ;
|
||||||
|
fstat(hd, &file_info);
|
||||||
|
close(hd) ;
|
||||||
|
|
||||||
|
/* get a FILE * of the same file, could also be made with
|
||||||
|
fdopen() from the previous descriptor, but hey this is just
|
||||||
|
an example! */
|
||||||
|
hd_src = fopen(LOCAL_FILE, "rb");
|
||||||
|
|
||||||
|
/* In windows, this will init the winsock stuff */
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
|
/* get a curl handle */
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* build a list of commands to pass to libcurl */
|
||||||
|
headerlist = curl_slist_append(headerlist, buf_1);
|
||||||
|
headerlist = curl_slist_append(headerlist, buf_2);
|
||||||
|
|
||||||
|
/* enable uploading */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ;
|
||||||
|
|
||||||
|
/* specify target */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_URL, REMOTE_URL);
|
||||||
|
|
||||||
|
/* pass in that last of FTP commands to run after the transfer */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTQUOTE, headerlist);
|
||||||
|
|
||||||
|
/* now specify which file to upload */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_INFILE, hd_src);
|
||||||
|
|
||||||
|
/* and give the size of the upload (optional) */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_info.st_size);
|
||||||
|
|
||||||
|
/* Now run off and do what you've been told! */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* clean up the FTP commands list */
|
||||||
|
curl_slist_free_all (headerlist);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
fclose(hd_src); /* close the local file */
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
83
Source/CTest/Curl/Testing/getinmemory.c
Normal file
83
Source/CTest/Curl/Testing/getinmemory.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example source code to show how the callback function can be used to
|
||||||
|
* download data into a chunk of memory instead of storing it in a file.
|
||||||
|
*
|
||||||
|
* This exact source code has not been verified to work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* to make this work under windows, use the win32-functions from the
|
||||||
|
win32socket.c file as well */
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include "curl/types.h"
|
||||||
|
#include "curl/easy.h"
|
||||||
|
|
||||||
|
struct MemoryStruct {
|
||||||
|
char *memory;
|
||||||
|
size_t size;
|
||||||
|
};
|
||||||
|
|
||||||
|
size_t
|
||||||
|
WriteMemoryCallback(void *ptr, size_t size, size_t nmemb, void *data)
|
||||||
|
{
|
||||||
|
register int realsize = size * nmemb;
|
||||||
|
struct MemoryStruct *mem = (struct MemoryStruct *)data;
|
||||||
|
|
||||||
|
mem->memory = (char *)realloc(mem->memory, mem->size + realsize + 1);
|
||||||
|
if (mem->memory) {
|
||||||
|
memcpy(&(mem->memory[mem->size]), ptr, realsize);
|
||||||
|
mem->size += realsize;
|
||||||
|
mem->memory[mem->size] = 0;
|
||||||
|
}
|
||||||
|
return realsize;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl_handle;
|
||||||
|
|
||||||
|
struct MemoryStruct chunk;
|
||||||
|
|
||||||
|
chunk.memory=NULL; /* we expect realloc(NULL, size) to work */
|
||||||
|
chunk.size = 0; /* no data at this point */
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
|
||||||
|
/* init the curl session */
|
||||||
|
curl_handle = curl_easy_init();
|
||||||
|
|
||||||
|
/* specify URL to get */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.cmake.org/HTML/Index.html");
|
||||||
|
|
||||||
|
/* send all data to this function */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, WriteMemoryCallback);
|
||||||
|
|
||||||
|
/* we pass our 'chunk' struct to the callback function */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_FILE, (void *)&chunk);
|
||||||
|
|
||||||
|
/* get it! */
|
||||||
|
curl_easy_perform(curl_handle);
|
||||||
|
|
||||||
|
/* cleanup curl stuff */
|
||||||
|
curl_easy_cleanup(curl_handle);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Now, our chunk.memory points to a memory block that is chunk.size
|
||||||
|
* bytes big and contains the remote file.
|
||||||
|
*
|
||||||
|
* Do something nice with it!
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* For example display it... */
|
||||||
|
write(1, chunk.memory, chunk.size);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
35
Source/CTest/Curl/Testing/http-post.c
Normal file
35
Source/CTest/Curl/Testing/http-post.c
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* First set the URL that is about to receive our POST. This URL can
|
||||||
|
just as well be a https:// URL if that is what should receive the
|
||||||
|
data. */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://postit.example.com/moo.cgi");
|
||||||
|
/* Now specify the POST data */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "name=daniel&project=curl");
|
||||||
|
|
||||||
|
/* Perform the request, res will get the return code */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
100
Source/CTest/Curl/Testing/httpput.c
Normal file
100
Source/CTest/Curl/Testing/httpput.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <fcntl.h>
|
||||||
|
#include <sys/stat.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This example shows a HTTP PUT operation. PUTs a file given as a command
|
||||||
|
* line argument to the URL also given on the command line.
|
||||||
|
*
|
||||||
|
* This example also uses its own read callback.
|
||||||
|
*/
|
||||||
|
|
||||||
|
size_t read_callback(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
size_t retcode;
|
||||||
|
|
||||||
|
/* in real-world cases, this would probably get this data differently
|
||||||
|
as this fread() stuff is exactly what the library already would do
|
||||||
|
by default internally */
|
||||||
|
retcode = fread(ptr, size, nmemb, stream);
|
||||||
|
|
||||||
|
fprintf(stderr, "*** We read %d bytes from file\n", retcode);
|
||||||
|
|
||||||
|
return retcode;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
FILE *ftpfile;
|
||||||
|
FILE * hd_src ;
|
||||||
|
int hd ;
|
||||||
|
struct stat file_info;
|
||||||
|
|
||||||
|
char *file;
|
||||||
|
char *url;
|
||||||
|
|
||||||
|
if(argc < 3)
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
file= argv[1];
|
||||||
|
url = argv[2];
|
||||||
|
|
||||||
|
/* get the file size of the local file */
|
||||||
|
hd = open(file, O_RDONLY) ;
|
||||||
|
fstat(hd, &file_info);
|
||||||
|
close(hd) ;
|
||||||
|
|
||||||
|
/* get a FILE * of the same file, could also be made with
|
||||||
|
fdopen() from the previous descriptor, but hey this is just
|
||||||
|
an example! */
|
||||||
|
hd_src = fopen(file, "rb");
|
||||||
|
|
||||||
|
/* In windows, this will init the winsock stuff */
|
||||||
|
curl_global_init(CURL_GLOBAL_ALL);
|
||||||
|
|
||||||
|
/* get a curl handle */
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* we want to use our own read function */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
|
||||||
|
|
||||||
|
/* enable uploading */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_UPLOAD, TRUE) ;
|
||||||
|
|
||||||
|
/* HTTP PUT please */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_PUT, TRUE);
|
||||||
|
|
||||||
|
/* specify target */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_URL, url);
|
||||||
|
|
||||||
|
/* now specify which file to upload */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_INFILE, hd_src);
|
||||||
|
|
||||||
|
/* and give the size of the upload (optional) */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_INFILESIZE, file_info.st_size);
|
||||||
|
|
||||||
|
/* Now run off and do what you've been told! */
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
fclose(hd_src); /* close the local file */
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
return 0;
|
||||||
|
}
|
70
Source/CTest/Curl/Testing/multithread.c
Normal file
70
Source/CTest/Curl/Testing/multithread.c
Normal file
@ -0,0 +1,70 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* A multi-threaded example that uses pthreads extensively to fetch
|
||||||
|
* X remote files at once */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
#include <curl/curl.h>
|
||||||
|
|
||||||
|
/* silly list of test-URLs */
|
||||||
|
char *urls[]= {
|
||||||
|
"http://curl.haxx.se/",
|
||||||
|
"ftp://cool.haxx.se/",
|
||||||
|
"http://www.contactor.se/",
|
||||||
|
"www.haxx.se"
|
||||||
|
};
|
||||||
|
|
||||||
|
void *pull_one_url(void *url)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, url);
|
||||||
|
curl_easy_perform(curl);
|
||||||
|
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
int pthread_create(pthread_t *new_thread_ID,
|
||||||
|
const pthread_attr_t *attr,
|
||||||
|
void * (*start_func)(void *), void *arg);
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
pthread_t tid[4];
|
||||||
|
int i;
|
||||||
|
int error;
|
||||||
|
for(i=0; i< 4; i++) {
|
||||||
|
error = pthread_create(&tid[i],
|
||||||
|
NULL, /* default attributes please */
|
||||||
|
pull_one_url,
|
||||||
|
urls[i]);
|
||||||
|
if(0 != error)
|
||||||
|
fprintf(stderr, "Couldn't run thread number %d, errno %d\n", i, error);
|
||||||
|
else
|
||||||
|
fprintf(stderr, "Thread %d, gets %s\n", i, urls[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* now wait for all threads to terminate */
|
||||||
|
for(i=0; i< 4; i++) {
|
||||||
|
error = pthread_join(tid[i], NULL);
|
||||||
|
fprintf(stderr, "Thread %d terminated\n", i);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
53
Source/CTest/Curl/Testing/persistant.c
Normal file
53
Source/CTest/Curl/Testing/persistant.c
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
|
||||||
|
/* to make this work under windows, use the win32-functions from the
|
||||||
|
docs/examples/win32socket.c file as well */
|
||||||
|
|
||||||
|
/* This example REQUIRES libcurl 7.7 or later */
|
||||||
|
#if (LIBCURL_VERSION_NUM < 0x070700)
|
||||||
|
#error Too old libcurl version, upgrade or stay away.
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
#ifdef MALLOCDEBUG
|
||||||
|
/* this sends all memory debug messages to a specified logfile */
|
||||||
|
curl_memdebug("memdump");
|
||||||
|
#endif
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_VERBOSE, 1);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HEADER, 1);
|
||||||
|
|
||||||
|
/* get the first document */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://www.cmake.org/");
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* get another document from the same server using the same
|
||||||
|
connection */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://www.cmake.org/HTML/Index.html");
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
92
Source/CTest/Curl/Testing/postit2.c
Normal file
92
Source/CTest/Curl/Testing/postit2.c
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*
|
||||||
|
* Example code that uploads a file name 'foo' to a remote script that accepts
|
||||||
|
* "HTML form based" (as described in RFC1738) uploads using HTTP POST.
|
||||||
|
*
|
||||||
|
* The imaginary form we'll fill in looks like:
|
||||||
|
*
|
||||||
|
* <form method="post" enctype="multipart/form-data" action="examplepost.cgi">
|
||||||
|
* Enter file: <input type="file" name="sendfile" size="40">
|
||||||
|
* Enter file name: <input type="text" name="filename" size="30">
|
||||||
|
* <input type="submit" value="send" name="submit">
|
||||||
|
* </form>
|
||||||
|
*
|
||||||
|
* This exact source code has not been verified to work.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* to make this work under windows, use the win32-functions from the
|
||||||
|
win32socket.c file as well */
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <curl/types.h>
|
||||||
|
#include <curl/easy.h>
|
||||||
|
|
||||||
|
#if LIBCURL_VERSION_NUM < 0x070900
|
||||||
|
#error "curl_formadd() is not introduced until libcurl 7.9 and later"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
int main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
struct HttpPost *formpost=NULL;
|
||||||
|
struct HttpPost *lastptr=NULL;
|
||||||
|
struct curl_slist *headerlist=NULL;
|
||||||
|
char buf[] = "Expect:";
|
||||||
|
|
||||||
|
/* Fill in the file upload field */
|
||||||
|
curl_formadd(&formpost,
|
||||||
|
&lastptr,
|
||||||
|
CURLFORM_COPYNAME, "sendfile",
|
||||||
|
CURLFORM_FILE, "postit2.c",
|
||||||
|
CURLFORM_END);
|
||||||
|
|
||||||
|
/* Fill in the filename field */
|
||||||
|
curl_formadd(&formpost,
|
||||||
|
&lastptr,
|
||||||
|
CURLFORM_COPYNAME, "filename",
|
||||||
|
CURLFORM_COPYCONTENTS, "postit2.c",
|
||||||
|
CURLFORM_END);
|
||||||
|
|
||||||
|
|
||||||
|
/* Fill in the submit field too, even if this is rarely needed */
|
||||||
|
curl_formadd(&formpost,
|
||||||
|
&lastptr,
|
||||||
|
CURLFORM_COPYNAME, "submit",
|
||||||
|
CURLFORM_COPYCONTENTS, "send",
|
||||||
|
CURLFORM_END);
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
/* initalize custom header list (stating that Expect: 100-continue is not
|
||||||
|
wanted */
|
||||||
|
headerlist = curl_slist_append(headerlist, buf);
|
||||||
|
if(curl) {
|
||||||
|
/* what URL that receives this POST */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://curl.haxx.se/examplepost.cgi");
|
||||||
|
if ( (argc == 2) && (!strcmp(argv[1], "noexpectheader")) )
|
||||||
|
/* only disable 100-continue header if explicitly requested */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headerlist);
|
||||||
|
curl_easy_setopt(curl, CURLOPT_HTTPPOST, formpost);
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
|
||||||
|
/* then cleanup the formpost chain */
|
||||||
|
curl_formfree(formpost);
|
||||||
|
/* free slist */
|
||||||
|
curl_slist_free_all (headerlist);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
78
Source/CTest/Curl/Testing/sepheaders.c
Normal file
78
Source/CTest/Curl/Testing/sepheaders.c
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* to make this work under windows, use the win32-functions from the
|
||||||
|
win32socket.c file as well */
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
#include "curl/types.h"
|
||||||
|
#include "curl/easy.h"
|
||||||
|
|
||||||
|
#include "testconfig.h"
|
||||||
|
|
||||||
|
size_t write_data(void *ptr, size_t size, size_t nmemb, void *stream)
|
||||||
|
{
|
||||||
|
int written = fwrite(ptr, size, nmemb, (FILE *)stream);
|
||||||
|
return written;
|
||||||
|
}
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl_handle;
|
||||||
|
char *headerfilename = LIBCURL_BINARY_DIR "/Testing/sepheaders-head.out";
|
||||||
|
FILE *headerfile;
|
||||||
|
char *bodyfilename = LIBCURL_BINARY_DIR "/Testing/sepheaders-body.out";
|
||||||
|
FILE *bodyfile;
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
/* init the curl session */
|
||||||
|
curl_handle = curl_easy_init();
|
||||||
|
|
||||||
|
/* set URL to get */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_URL, "http://www.cmake.org/HTML/Index.html");
|
||||||
|
|
||||||
|
/* no progress meter please */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_NOPROGRESS, 1);
|
||||||
|
|
||||||
|
/* shut up completely */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_MUTE, 1);
|
||||||
|
|
||||||
|
/* send all data to this function */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_WRITEFUNCTION, write_data);
|
||||||
|
|
||||||
|
/* open the files */
|
||||||
|
headerfile = fopen(headerfilename,"w");
|
||||||
|
if (headerfile == NULL) {
|
||||||
|
curl_easy_cleanup(curl_handle);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
bodyfile = fopen(bodyfilename,"w");
|
||||||
|
if (bodyfile == NULL) {
|
||||||
|
curl_easy_cleanup(curl_handle);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* we want the headers to this file handle */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_WRITEHEADER ,headerfile);
|
||||||
|
|
||||||
|
/* we want the body to this file handle */
|
||||||
|
curl_easy_setopt(curl_handle, CURLOPT_FILE ,bodyfile);
|
||||||
|
|
||||||
|
/* get it! */
|
||||||
|
curl_easy_perform(curl_handle);
|
||||||
|
|
||||||
|
/* close the header file */
|
||||||
|
fclose(headerfile);
|
||||||
|
|
||||||
|
/* cleanup curl stuff */
|
||||||
|
curl_easy_cleanup(curl_handle);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
28
Source/CTest/Curl/Testing/simple.c
Normal file
28
Source/CTest/Curl/Testing/simple.c
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include "curl/curl.h"
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "http://www.cmake.org/HTML/Index.html");
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
118
Source/CTest/Curl/Testing/simplessl.c
Normal file
118
Source/CTest/Curl/Testing/simplessl.c
Normal file
@ -0,0 +1,118 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* _ _ ____ _
|
||||||
|
* Project ___| | | | _ \| |
|
||||||
|
* / __| | | | |_) | |
|
||||||
|
* | (__| |_| | _ <| |___
|
||||||
|
* \___|\___/|_| \_\_____|
|
||||||
|
*
|
||||||
|
* $Id$
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
#include <curl/curl.h>
|
||||||
|
#include <curl/types.h>
|
||||||
|
#include <curl/easy.h>
|
||||||
|
|
||||||
|
|
||||||
|
/* some requirements for this to work:
|
||||||
|
1. set pCertFile to the file with the client certificate
|
||||||
|
2. if the key is passphrase protected, set pPassphrase to the
|
||||||
|
passphrase you use
|
||||||
|
3. if you are using a crypto engine:
|
||||||
|
3.1. set a #define USE_ENGINE
|
||||||
|
3.2. set pEngine to the name of the crypto engine you use
|
||||||
|
3.3. set pKeyName to the key identifier you want to use
|
||||||
|
4. if you don't use a crypto engine:
|
||||||
|
4.1. set pKeyName to the file name of your client key
|
||||||
|
4.2. if the format of the key file is DER, set pKeyType to "DER"
|
||||||
|
|
||||||
|
!! verify of the server certificate is not implemented here !!
|
||||||
|
|
||||||
|
**** This example only works with libcurl 7.9.3 and later! ****
|
||||||
|
|
||||||
|
*/
|
||||||
|
|
||||||
|
int main(int argc, char **argv)
|
||||||
|
{
|
||||||
|
CURL *curl;
|
||||||
|
CURLcode res;
|
||||||
|
FILE *headerfile;
|
||||||
|
|
||||||
|
const char *pCertFile = "testcert.pem";
|
||||||
|
const char *pCACertFile="cacert.pem"
|
||||||
|
|
||||||
|
const char *pKeyName;
|
||||||
|
const char *pKeyType;
|
||||||
|
|
||||||
|
const char *pEngine;
|
||||||
|
|
||||||
|
#if USE_ENGINE
|
||||||
|
pKeyName = "rsa_test";
|
||||||
|
pKeyType = "ENG";
|
||||||
|
pEngine = "chil"; /* for nChiper HSM... */
|
||||||
|
#else
|
||||||
|
pKeyName = "testkey.pem";
|
||||||
|
pKeyType = "PEM";
|
||||||
|
pEngine = NULL;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
const char *pPassphrase = NULL;
|
||||||
|
|
||||||
|
headerfile = fopen("dumpit", "w");
|
||||||
|
|
||||||
|
curl_global_init(CURL_GLOBAL_DEFAULT);
|
||||||
|
|
||||||
|
curl = curl_easy_init();
|
||||||
|
if(curl) {
|
||||||
|
/* what call to write: */
|
||||||
|
curl_easy_setopt(curl, CURLOPT_URL, "HTTPS://curl.haxx.se");
|
||||||
|
curl_easy_setopt(curl, CURLOPT_WRITEHEADER, headerfile);
|
||||||
|
|
||||||
|
while(1) /* do some ugly short cut... */
|
||||||
|
{
|
||||||
|
if (pEngine) /* use crypto engine */
|
||||||
|
{
|
||||||
|
if (curl_easy_setopt(curl, CURLOPT_SSLENGINE,pEngine) != CURLE_OK)
|
||||||
|
{ /* load the crypto engine */
|
||||||
|
fprintf(stderr,"can't set crypto engine\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (curl_easy_setopt(curl, CURLOPT_SSLENGINE_DEFAULT,1) != CURLE_OK)
|
||||||
|
{ /* set the crypto engine as default */
|
||||||
|
/* only needed for the first time you load
|
||||||
|
a engine in a curl object... */
|
||||||
|
fprintf(stderr,"can't set crypto engine as default\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* cert is stored PEM coded in file... */
|
||||||
|
/* since PEM is default, we needn't set it for PEM */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSLCERTTYPE,"PEM");
|
||||||
|
/* set the cert for client authentication */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSLCERT,pCertFile);
|
||||||
|
/* sorry, for engine we must set the passphrase
|
||||||
|
(if the key has one...) */
|
||||||
|
if (pPassphrase)
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSLKEYPASSWD,pPassphrase);
|
||||||
|
/* if we use a key stored in a crypto engine,
|
||||||
|
we must set the key type to "ENG" */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSLKEYTYPE,pKeyType);
|
||||||
|
/* set the private key (file or ID in engine) */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSLKEY,pKeyName);
|
||||||
|
/* set the file with the certs vaildating the server */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_CAINFO,pCACertFile);
|
||||||
|
/* disconnect if we can't validate server's cert */
|
||||||
|
curl_easy_setopt(curl,CURLOPT_SSL_VERIFYPEER,1);
|
||||||
|
|
||||||
|
res = curl_easy_perform(curl);
|
||||||
|
break; /* we are done... */
|
||||||
|
}
|
||||||
|
/* always cleanup */
|
||||||
|
curl_easy_cleanup(curl);
|
||||||
|
}
|
||||||
|
|
||||||
|
curl_global_cleanup();
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
7
Source/CTest/Curl/Testing/testconfig.h.in
Normal file
7
Source/CTest/Curl/Testing/testconfig.h.in
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#ifndef __testconfig_h__
|
||||||
|
#define __testconfig_h__
|
||||||
|
|
||||||
|
#define LIBCURL_SOURCE_DIR "${LIBCURL_SOURCE_DIR}"
|
||||||
|
#define LIBCURL_BINARY_DIR "${LIBCURL_BINARY_DIR}"
|
||||||
|
|
||||||
|
#endif /* __testconfig_h__ */
|
49
Source/CTest/Curl/Testing/win32sockets.c
Normal file
49
Source/CTest/Curl/Testing/win32sockets.c
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
|
||||||
|
/*
|
||||||
|
* Note: This is only required if you use curl 7.8 or lower, later
|
||||||
|
* versions provide an option to curl_global_init() that does the
|
||||||
|
* win32 initialization for you.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* These are example functions doing socket init that Windows
|
||||||
|
* require. If you don't use windows, you can safely ignore this crap.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <windows.h>
|
||||||
|
|
||||||
|
void win32_cleanup(void)
|
||||||
|
{
|
||||||
|
WSACleanup();
|
||||||
|
}
|
||||||
|
|
||||||
|
int win32_init(void)
|
||||||
|
{
|
||||||
|
WORD wVersionRequested;
|
||||||
|
WSADATA wsaData;
|
||||||
|
int err;
|
||||||
|
wVersionRequested = MAKEWORD(1, 1);
|
||||||
|
|
||||||
|
err = WSAStartup(wVersionRequested, &wsaData);
|
||||||
|
|
||||||
|
if (err != 0)
|
||||||
|
/* Tell the user that we couldn't find a useable */
|
||||||
|
/* winsock.dll. */
|
||||||
|
return 1;
|
||||||
|
|
||||||
|
/* Confirm that the Windows Sockets DLL supports 1.1.*/
|
||||||
|
/* Note that if the DLL supports versions greater */
|
||||||
|
/* than 1.1 in addition to 1.1, it will still return */
|
||||||
|
/* 1.1 in wVersion since that is the version we */
|
||||||
|
/* requested. */
|
||||||
|
|
||||||
|
if ( LOBYTE( wsaData.wVersion ) != 1 ||
|
||||||
|
HIBYTE( wsaData.wVersion ) != 1 ) {
|
||||||
|
/* Tell the user that we couldn't find a useable */
|
||||||
|
|
||||||
|
/* winsock.dll. */
|
||||||
|
WSACleanup();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0; /* 0 is ok */
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user