|  | 
				
					
	
		
		
		在使用HTTP协议时,客户端有很多种方式向服务器提供验证信息。默认的 HTTP验证方法是"Basic”,它将用户名与密码以明文的方式、经Base64编码后保存在HTTP请求头中,发往服务器。当然这不太安全。    当前版本的libcurl支持的验证方法有:basic, Digest, NTLM, Negotiate, GSS-Negotiate and SPNEGO。可以通过CURLOPT_HTTPAUTH属性来设置具体 的验证方式:    curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST);    向代理服务器发送验证信息时,可以通过CURLOPT_PROXYAUTH设置验证方式:    curl_easy_setopt(easy_handle, CURLOPT_PROXYAUTH, CURLAUTH_NTLM);    也可以同时设置多种验证方式(通过按位与), 使用‘CURLAUTH_ANY‘将允许libcurl可以选择任何它所支持的验证方式。通过CURLOPT_HTTPAUTH或 CURLOPT_PROXYAUTH属性设置的多种验证方式,libcurl会在运行时选择一种它认为是最好的方式与服务器通信:    curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_DIGEST|CURLAUTH_BASIC);     // curl_easy_setopt(easy_handle, CURLOPT_HTTPAUTH, CURLAUTH_ANY);
   官网例子 1 /***************************************************************************
 2  *                                  _   _ ____  _
 3  *  Project                     ___| | | |  _ \| |
 4  *                             / __| | | | |_) | |
 5  *                            | (__| |_| |  _ <| |___
 6  *                             \___|\___/|_| \_\_____|
 7  *
 8  * Copyright (C) 1998 - 2021, Daniel Stenberg, <daniel@haxx.se>, et al.
 9  *
 10  * This software is licensed as described in the file COPYING, which
 11  * you should have received as part of this distribution. The terms
 12  * are also available at https://curl.se/docs/copyright.html.
 13  *
 14  * You may opt to use, copy, modify, merge, publish, distribute and/or sell
 15  * copies of the Software, and permit persons to whom the Software is
 16  * furnished to do so, under the terms of the COPYING file.
 17  *
 18  * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
 19  * KIND, either express or implied.
 20  *
 21  ***************************************************************************/
 22 /* <DESC>
 23  * HTTP PUT upload with authentication using "any" method. libcurl picks the
 24  * one the server supports/wants.
 25  * </DESC>
 26  */
 27 #include <stdio.h>
 28 #include <fcntl.h>
 29 #include <sys/types.h>
 30 #include <sys/stat.h>
 31
 32 #include <curl/curl.h>
 33
 34 #ifdef WIN32
 35 #  include <io.h>
 36 #  define READ_3RD_ARG unsigned int
 37 #else
 38 #  include <unistd.h>
 39 #  define READ_3RD_ARG size_t
 40 #endif
 41
 42 #if LIBCURL_VERSION_NUM < 0x070c03
 43 #error "upgrade your libcurl to no less than 7.12.3"
 44 #endif
 45
 46 /*
 47  * This example shows a HTTP PUT operation with authentication using "any"
 48  * type. It PUTs a file given as a command line argument to the URL also given
 49  * on the command line.
 50  *
 51  * Since libcurl 7.12.3, using "any" auth and POST/PUT requires a set ioctl
 52  * function.
 53  *
 54  * This example also uses its own read callback.
 55  */
 56
 57 /* ioctl callback function */
 58 static curlioerr my_ioctl(CURL *handle, curliocmd cmd, void *userp)
 59 {
 60   int *fdp = (int *)userp;
 61   int fd = *fdp;
 62
 63   (void)handle; /* not used in here */
 64
 65   switch(cmd) {
 66   case CURLIOCMD_RESTARTREAD:
 67     /* mr libcurl kindly asks as to rewind the read data stream to start */
 68     if(-1 == lseek(fd, 0, SEEK_SET))
 69       /* couldn't rewind */
 70       return CURLIOE_FAILRESTART;
 71
 72     break;
 73
 74   default: /* ignore unknown commands */
 75     return CURLIOE_UNKNOWNCMD;
 76   }
 77   return CURLIOE_OK; /* success! */
 78 }
 79
 80 /* read callback function, fread() look alike */
 81 static size_t read_callback(char *ptr, size_t size, size_t nmemb, void *stream)
 82 {
 83   ssize_t retcode;
 84   unsigned long nread;
 85
 86   int *fdp = (int *)stream;
 87   int fd = *fdp;
 88
 89   retcode = read(fd, ptr, (READ_3RD_ARG)(size * nmemb));
 90
 91   if(retcode > 0) {
 92     nread = (unsigned long)retcode;
 93     fprintf(stderr, "*** We read %lu bytes from file\n", nread);
 94   }
 95
 96   return retcode;
 97 }
 98
 99 int main(int argc, char **argv)
 100 {
 101   CURL *curl;
 102   CURLcode res;
 103   int hd;
 104   struct stat file_info;
 105
 106   char *file;
 107   char *url;
 108
 109   if(argc < 3)
 110     return 1;
 111
 112   file = argv[1];
 113   url = argv[2];
 114
 115   /* get the file size of the local file */
 116   hd = open(file, O_RDONLY);
 117   fstat(hd, &file_info);
 118
 119   /* In windows, this will init the winsock stuff */
 120   curl_global_init(CURL_GLOBAL_ALL);
 121
 122   /* get a curl handle */
 123   curl = curl_easy_init();
 124   if(curl) {
 125     /* we want to use our own read function */
 126     curl_easy_setopt(curl, CURLOPT_READFUNCTION, read_callback);
 127
 128     /* which file to upload */
 129     curl_easy_setopt(curl, CURLOPT_READDATA, (void *)&hd);
 130
 131     /* set the ioctl function */
 132     curl_easy_setopt(curl, CURLOPT_IOCTLFUNCTION, my_ioctl);
 133
 134     /* pass the file descriptor to the ioctl callback as well */
 135     curl_easy_setopt(curl, CURLOPT_IOCTLDATA, (void *)&hd);
 136
 137     /* enable "uploading" (which means PUT when doing HTTP) */
 138     curl_easy_setopt(curl, CURLOPT_UPLOAD, 1L);
 139
 140     /* specify target URL, and note that this URL should also include a file
 141        name, not only a directory (as you can do with GTP uploads) */
 142     curl_easy_setopt(curl, CURLOPT_URL, url);
 143
 144     /* and give the size of the upload, this supports large file sizes
 145        on systems that have general support for it */
 146     curl_easy_setopt(curl, CURLOPT_INFILESIZE_LARGE,
 147                      (curl_off_t)file_info.st_size);
 148
 149     /* tell libcurl we can use "any" auth, which lets the lib pick one, but it
 150        also costs one extra round-trip and possibly sending of all the PUT
 151        data twice!!! */
 152     curl_easy_setopt(curl, CURLOPT_HTTPAUTH, (long)CURLAUTH_ANY);
 153
 154     /* set user name and password for the authentication */
 155     curl_easy_setopt(curl, CURLOPT_USERPWD, "user:password");
 156
 157     /* Now run off and do what you have been told! */
 158     res = curl_easy_perform(curl);
 159     /* Check for errors */
 160     if(res != CURLE_OK)
 161       fprintf(stderr, "curl_easy_perform() failed: %s\n",
 162               curl_easy_strerror(res));
 163
 164     /* always cleanup */
 165     curl_easy_cleanup(curl);
 166   }
 167   close(hd); /* close the local file */
 168
 169   curl_global_cleanup();
 170   return 0;
 171
   
	    
    
 |