Skip to content
Snippets Groups Projects
url.c 135 KiB
Newer Older
  • Learn to ignore specific revisions
  •      * Set a list of aliases for HTTP 200 in response header
    
        data->set.http200aliases = va_arg(param, struct curl_slist *);
    
         * Cookie string to send to the remote server in the request.
    
        result = Curl_setstropt(&data->set.str[STRING_COOKIE],
                                va_arg(param, char *));
    
         * Set cookie file to read and parse. Can be used multiple times.
    
        argptr = (char *)va_arg(param, void *);
        if(argptr) {
    
          struct curl_slist *cl;
          /* append the cookie file name to the list of file names, and deal with
             them later */
    
          cl = curl_slist_append(data->change.cookielist, argptr);
    
    
          if(!cl)
            return CURLE_OUT_OF_MEMORY;
    
          data->change.cookielist = cl;
        }
    
         * Set cookie file name to dump all cookies to when we're done.
    
        result = Curl_setstropt(&data->set.str[STRING_COOKIEJAR],
                                va_arg(param, char *));
    
         * Activate the cookie parser. This may or may not already
         * have been made.
    
        data->cookies = Curl_cookie_init(data, NULL, data->cookies,
                                         data->set.cookiesession);
    
         * Set this option to TRUE to start a new "cookie session". It will
         * prevent the forthcoming read-cookies-from-file actions to accept
         * cookies that are marked as being session cookies, as they belong to a
         * previous session.
         *
         * In the original Netscape cookie spec, "session cookies" are cookies
         * with no expire date set. RFC2109 describes the same action if no
         * 'Max-Age' is set and RFC2965 includes the RFC2109 description and adds
         * a 'Discard' action that can enforce the discard even for cookies that
         * have a Max-Age.
         *
         * We run mostly with the original cookie spec, as hardly anyone implements
         * anything else.
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.cookiesession = (bool)(0 != va_arg(param, long));
    
    
      case CURLOPT_COOKIELIST:
        argptr = va_arg(param, char *);
    
    
          /* clear all cookies */
          Curl_cookie_clearall(data->cookies);
          break;
        }
        else if(strequal(argptr, "SESS")) {
          /* clear session cookies */
          Curl_cookie_clearsess(data->cookies);
    
          /* if cookie engine was not running, activate it */
          data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE);
    
    
        argptr = strdup(argptr);
        if(!argptr) {
          result = CURLE_OUT_OF_MEMORY;
          break;
        }
    
        if(checkprefix("Set-Cookie:", argptr))
    
          /* HTTP Header format line */
          Curl_cookie_add(data, data->cookies, TRUE, argptr + 11, NULL, NULL);
    
        else
          /* Netscape format line */
          Curl_cookie_add(data, data->cookies, FALSE, argptr, NULL, NULL);
    
        if(va_arg(param, long)) {
          data->set.httpreq = HTTPREQ_GET;
          data->set.upload = FALSE; /* switch off upload */
    
          data->set.opt_no_body = FALSE; /* this is implied */
    
         * This sets a requested HTTP version to be used. The value is one of
         * the listed enums in curl/curl.h.
    
        data->set.httpversion = va_arg(param, long);
    
         * Tunnel operations through the proxy instead of normal proxy use
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.tunnel_thru_httpproxy = (bool)(0 != va_arg(param, long));
    
         * Set a custom string to use as request
    
        result = Curl_setstropt(&data->set.str[STRING_CUSTOMREQUEST],
                                va_arg(param, char *));
    
    
        /* we don't set
           data->set.httpreq = HTTPREQ_CUSTOM;
           here, we continue as if we were using the already set type
           and this just changes the actual request keyword */
    
      case CURLOPT_PROXYPORT:
    
        /*
         * Explicitly set HTTP proxy port number.
         */
    
        data->set.proxyport = va_arg(param, long);
    
         * Set HTTP Authentication type BITMASK.
    
        long auth = va_arg(param, long);
        /* switch off bits we can't support */
    
        auth &= ~CURLAUTH_NTLM; /* no NTLM without SSL */
    
        auth &= ~CURLAUTH_GSSNEGOTIATE; /* no GSS-Negotiate without GSSAPI */
    
        if(!auth)
          return CURLE_FAILED_INIT; /* no supported types left! */
    
        data->set.httpauth = auth;
    
      case CURLOPT_PROXYAUTH:
        /*
         * Set HTTP Authentication type BITMASK.
         */
      {
        long auth = va_arg(param, long);
        /* switch off bits we can't support */
    
        auth &= ~CURLAUTH_NTLM; /* no NTLM without SSL */
    #endif
    
        auth &= ~CURLAUTH_GSSNEGOTIATE; /* no GSS-Negotiate without GSSAPI */
    #endif
        if(!auth)
          return CURLE_FAILED_INIT; /* no supported types left! */
    
        data->set.proxyauth = auth;
      }
      break;
    
      case CURLOPT_PROXY:
        /*
         * Set proxy server:port to use as HTTP proxy.
         *
         * If the proxy is set to "" we explicitly say that we don't want to use a
         * proxy (even though there might be environment variables saying so).
         *
         * Setting it to NULL, means no proxy but allows the environment variables
         * to decide for us.
         */
    
        result = Curl_setstropt(&data->set.str[STRING_PROXY],
                                va_arg(param, char *));
    
      case CURLOPT_WRITEHEADER:
        /*
         * Custom pointer to pass the header write callback function
         */
        data->set.writeheader = (void *)va_arg(param, void *);
        break;
      case CURLOPT_ERRORBUFFER:
        /*
         * Error buffer provided by the caller to get the human readable
         * error string in.
         */
        data->set.errorbuffer = va_arg(param, char *);
        break;
      case CURLOPT_FILE:
        /*
         * FILE pointer to write to or include in the data write callback
         */
        data->set.out = va_arg(param, FILE *);
        break;
      case CURLOPT_FTPPORT:
        /*
         * Use FTP PORT, this also specifies which IP address to use
         */
    
        result = Curl_setstropt(&data->set.str[STRING_FTPPORT],
                                va_arg(param, char *));
        data->set.ftp_use_port = (bool)(NULL != data->set.str[STRING_FTPPORT]);
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.ftp_use_eprt = (bool)(0 != va_arg(param, long));
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.ftp_use_epsv = (bool)(0 != va_arg(param, long));
    
        data->set.ftp_ccc = (curl_ftpccc)va_arg(param, long);
    
      case CURLOPT_FTP_SKIP_PASV_IP:
        /*
         * Enable or disable FTP_SKIP_PASV_IP, which will disable/enable the
         * bypass of the IP address in PASV responses.
         */
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.ftp_skip_ip = (bool)(0 != va_arg(param, long));
    
      case CURLOPT_INFILE:
        /*
         * FILE pointer to read the file to be uploaded from. Or possibly
         * used as argument to the read callback.
         */
        data->set.in = va_arg(param, FILE *);
        break;
      case CURLOPT_INFILESIZE:
        /*
         * If known, this should inform curl about the file size of the
         * to-be-uploaded file.
         */
        data->set.infilesize = va_arg(param, long);
        break;
      case CURLOPT_INFILESIZE_LARGE:
        /*
         * If known, this should inform curl about the file size of the
         * to-be-uploaded file.
         */
        data->set.infilesize = va_arg(param, curl_off_t);
        break;
      case CURLOPT_LOW_SPEED_LIMIT:
        /*
         * The low speed limit that if transfers are below this for
         * CURLOPT_LOW_SPEED_TIME, the transfer is aborted.
         */
        data->set.low_speed_limit=va_arg(param, long);
        break;
    
      case CURLOPT_MAX_SEND_SPEED_LARGE:
        /*
         * The max speed limit that sends transfer more than
         * CURLOPT_MAX_SEND_PER_SECOND bytes per second the transfer is
         * throttled..
         */
        data->set.max_send_speed=va_arg(param, curl_off_t);
        break;
      case CURLOPT_MAX_RECV_SPEED_LARGE:
        /*
         * The max speed limit that sends transfer more than
         * CURLOPT_MAX_RECV_PER_SECOND bytes per second the transfer is
         * throttled..
         */
        data->set.max_recv_speed=va_arg(param, curl_off_t);
        break;
    
      case CURLOPT_LOW_SPEED_TIME:
        /*
         * The low speed time that if transfers are below the set
         * CURLOPT_LOW_SPEED_LIMIT during this time, the transfer is aborted.
         */
        data->set.low_speed_time=va_arg(param, long);
        break;
      case CURLOPT_URL:
        /*
         * The URL to fetch.
         */
        if(data->change.url_alloc) {
          /* the already set URL is allocated, free it first! */
          free(data->change.url);
          data->change.url_alloc=FALSE;
        }
    
        result = Curl_setstropt(&data->set.str[STRING_SET_URL],
                                va_arg(param, char *));
        data->change.url = data->set.str[STRING_SET_URL];
    
        data->change.url_changed = TRUE;
        break;
      case CURLOPT_PORT:
        /*
         * The port number to use when getting the URL
         */
        data->set.use_port = va_arg(param, long);
        break;
      case CURLOPT_TIMEOUT:
        /*
         * The maximum time you allow curl to use for a single transfer
         * operation.
         */
    
        data->set.timeout = va_arg(param, long) * 1000L;
        break;
    
      case CURLOPT_TIMEOUT_MS:
    
        data->set.timeout = va_arg(param, long);
        break;
    
      case CURLOPT_CONNECTTIMEOUT:
        /*
         * The maximum time you allow curl to use to connect.
         */
    
        data->set.connecttimeout = va_arg(param, long) * 1000L;
        break;
    
      case CURLOPT_CONNECTTIMEOUT_MS:
    
        data->set.connecttimeout = va_arg(param, long);
        break;
    
      case CURLOPT_USERPWD:
    
        /*
         * user:password to use in the operation
         */
    
        result = Curl_setstropt(&data->set.str[STRING_USERPWD],
                                va_arg(param, char *));
    
      case CURLOPT_POSTQUOTE:
    
         * List of RAW FTP commands to use after a transfer
    
        data->set.postquote = va_arg(param, struct curl_slist *);
    
      case CURLOPT_PREQUOTE:
        /*
         * List of RAW FTP commands to use prior to RETR (Wesley Laxton)
         */
        data->set.prequote = va_arg(param, struct curl_slist *);
        break;
    
         * List of RAW FTP commands to use before a transfer
    
        data->set.quote = va_arg(param, struct curl_slist *);
    
        data->set.fprogress = va_arg(param, curl_progress_callback);
    
        if(data->set.fprogress)
          data->progress.callback = TRUE; /* no longer internal */
        else
          data->progress.callback = FALSE; /* NULL enforces internal */
    
    
        /*
         * Custom client data to pass to the progress callback
         */
    
        data->set.progress_client = va_arg(param, void *);
    
      case CURLOPT_PROXYUSERPWD:
    
        /*
         * user:password needed to use the proxy
         */
    
        result = Curl_setstropt(&data->set.str[STRING_PROXYUSERPWD],
                                va_arg(param, char *));
    
      case CURLOPT_RANGE:
    
        /*
         * What range of the file you want to transfer
         */
    
        result = Curl_setstropt(&data->set.str[STRING_SET_RANGE],
                                va_arg(param, char *));
    
      case CURLOPT_RESUME_FROM:
    
        /*
         * Resume transfer at the give file position
         */
    
        data->set.set_resume_from = va_arg(param, long);
    
      case CURLOPT_RESUME_FROM_LARGE:
        /*
         * Resume transfer at the give file position
         */
    
        data->set.set_resume_from = va_arg(param, curl_off_t);
    
      case CURLOPT_DEBUGFUNCTION:
        /*
         * stderr write callback.
         */
        data->set.fdebug = va_arg(param, curl_debug_callback);
        /*
         * if the callback provided is NULL, it'll use the default callback
         */
        break;
      case CURLOPT_DEBUGDATA:
        /*
         * Set to a void * that should receive all error writes. This
         * defaults to CURLOPT_STDERR for normal operations.
         */
        data->set.debugdata = va_arg(param, void *);
    
      case CURLOPT_STDERR:
    
        /*
         * Set to a FILE * that should receive all error writes. This
         * defaults to stderr for normal operations.
         */
    
        data->set.err = va_arg(param, FILE *);
    
        if(!data->set.err)
          data->set.err = stderr;
    
      case CURLOPT_HEADERFUNCTION:
        /*
         * Set header write callback
         */
    
        data->set.fwrite_header = va_arg(param, curl_write_callback);
    
      case CURLOPT_WRITEFUNCTION:
    
        data->set.fwrite_func = va_arg(param, curl_write_callback);
        if(!data->set.fwrite_func)
    
          /* When set to NULL, reset to our internal default function */
    
          data->set.fwrite_func = (curl_write_callback)fwrite;
    
      case CURLOPT_READFUNCTION:
    
        data->set.fread_func = va_arg(param, curl_read_callback);
        if(!data->set.fread_func)
    
          /* When set to NULL, reset to our internal default function */
    
          data->set.fread_func = (curl_read_callback)fread;
    
      case CURLOPT_CONV_FROM_NETWORK_FUNCTION:
        /*
         * "Convert from network encoding" callback
         */
        data->set.convfromnetwork = va_arg(param, curl_conv_callback);
        break;
      case CURLOPT_CONV_TO_NETWORK_FUNCTION:
        /*
         * "Convert to network encoding" callback
         */
        data->set.convtonetwork = va_arg(param, curl_conv_callback);
        break;
      case CURLOPT_CONV_FROM_UTF8_FUNCTION:
        /*
         * "Convert from UTF-8 encoding" callback
         */
        data->set.convfromutf8 = va_arg(param, curl_conv_callback);
        break;
    
      case CURLOPT_IOCTLFUNCTION:
        /*
         * I/O control callback. Might be NULL.
         */
    
        data->set.ioctl_func = va_arg(param, curl_ioctl_callback);
    
        break;
      case CURLOPT_IOCTLDATA:
        /*
         * I/O control data pointer. Might be NULL.
         */
    
        data->set.ioctl_client = va_arg(param, void *);
    
      case CURLOPT_SSLCERT:
    
        /*
         * String that holds file name of the SSL certificate to use
         */
    
        result = Curl_setstropt(&data->set.str[STRING_CERT],
                                va_arg(param, char *));
    
      case CURLOPT_SSLCERTTYPE:
    
         * String that holds file type of the SSL certificate to use
    
        result = Curl_setstropt(&data->set.str[STRING_CERT_TYPE],
                                va_arg(param, char *));
    
        break;
      case CURLOPT_SSLKEY:
        /*
         * String that holds file name of the SSL certificate to use
         */
    
        result = Curl_setstropt(&data->set.str[STRING_KEY],
                                va_arg(param, char *));
    
        break;
      case CURLOPT_SSLKEYTYPE:
        /*
         * String that holds file type of the SSL certificate to use
         */
    
        result = Curl_setstropt(&data->set.str[STRING_KEY_TYPE],
                                va_arg(param, char *));
    
        break;
      case CURLOPT_SSLKEYPASSWD:
        /*
         * String that holds the SSL private key password.
         */
    
        result = Curl_setstropt(&data->set.str[STRING_KEY_PASSWD],
                                va_arg(param, char *));
    
        break;
      case CURLOPT_SSLENGINE:
        /*
         * String that holds the SSL crypto engine.
         */
    
        if (argptr && argptr[0])
    
           result = Curl_ssl_set_engine(data, argptr);
    
      case CURLOPT_SSLENGINE_DEFAULT:
        /*
         * flag to set engine as default.
         */
    
        result = Curl_ssl_set_engine_default(data);
    
      case CURLOPT_CRLF:
    
         * Kludgy option to enable CRLF conversions. Subject for removal.
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.crlf = (bool)(0 != va_arg(param, long));
    
      case CURLOPT_INTERFACE:
    
         * Set what interface or address/hostname to bind the socket to when
         * performing an operation and thus what from-IP your connection will use.
    
        result = Curl_setstropt(&data->set.str[STRING_DEVICE],
                                va_arg(param, char *));
    
      case CURLOPT_LOCALPORT:
        /*
         * Set what local port to bind the socket to when performing an operation.
         */
        data->set.localport = (unsigned short) va_arg(param, long);
        break;
      case CURLOPT_LOCALPORTRANGE:
        /*
         * Set number of local ports to try, starting with CURLOPT_LOCALPORT.
         */
        data->set.localportrange = (int) va_arg(param, long);
        break;
    
         * A string that defines the kerberos security level.
    
        result = Curl_setstropt(&data->set.str[STRING_KRB_LEVEL],
                                va_arg(param, char *));
        data->set.krb = (bool)(NULL != data->set.str[STRING_KRB_LEVEL]);
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
        break;
    
        data->set.ssl.verifypeer = va_arg(param, long);
    
      case CURLOPT_SSL_VERIFYHOST:
        /*
         * Enable verification of the CN contained in the peer certificate
         */
    
        data->set.ssl.verifyhost = va_arg(param, long);
    
      case CURLOPT_SSL_CTX_FUNCTION:
        /*
         * Set a SSL_CTX callback
         */
    
        data->set.ssl.fsslctx = va_arg(param, curl_ssl_ctx_callback);
    
        break;
      case CURLOPT_SSL_CTX_DATA:
        /*
         * Set a SSL_CTX callback parameter pointer
         */
        data->set.ssl.fsslctxp = va_arg(param, void *);
        break;
    
        /*
         * Set CA info for SSL connection. Specify file name of the CA certificate
         */
    
        result = Curl_setstropt(&data->set.str[STRING_SSL_CAFILE],
                                va_arg(param, char *));
    
        break;
      case CURLOPT_CAPATH:
        /*
    
         * Set CA path info for SSL connection. Specify directory name of the CA
         * certificates which have been prepared using openssl c_rehash utility.
    
        /* This does not work on windows. */
    
        result = Curl_setstropt(&data->set.str[STRING_SSL_CAPATH],
                                va_arg(param, char *));
    
      case CURLOPT_TELNETOPTIONS:
    
        /*
         * Set a linked list of telnet options
         */
    
        data->set.telnet_options = va_arg(param, struct curl_slist *);
    
    
      case CURLOPT_BUFFERSIZE:
        /*
         * The application kindly asks for a differently sized receive buffer.
         * If it seems reasonable, we'll use it.
         */
        data->set.buffer_size = va_arg(param, long);
    
    
        if((data->set.buffer_size> (BUFSIZE -1 )) ||
           (data->set.buffer_size < 1))
    
          data->set.buffer_size = 0; /* huge internal default */
    
        break;
    
    
      case CURLOPT_NOSIGNAL:
        /*
         * The application asks not to set any signal() or alarm() handlers,
         * even when using a timeout.
         */
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.no_signal = (bool)(0 != va_arg(param, long));
    
          struct Curl_share *set;
          set = va_arg(param, struct Curl_share *);
    
    
          /* disconnect from old share, if any */
          if(data->share) {
    
            Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
    
            if(data->dns.hostcachetype == HCACHE_SHARED) {
              data->dns.hostcache = NULL;
              data->dns.hostcachetype = HCACHE_NONE;
            }
    
    
            if(data->share->cookies == data->cookies)
              data->cookies = NULL;
    
            data->share->dirty--;
    
            Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
    
          data->share = set;
    
          if(data->share) {
    
            Curl_share_lock(data, CURL_LOCK_DATA_SHARE, CURL_LOCK_ACCESS_SINGLE);
    
              /* use shared host cache, first free the private one if any */
              if(data->dns.hostcachetype == HCACHE_PRIVATE)
                Curl_hash_destroy(data->dns.hostcache);
    
              data->dns.hostcache = data->share->hostcache;
              data->dns.hostcachetype = HCACHE_SHARED;
    
    #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
    
            if(data->share->cookies) {
              /* use shared cookie list, first free own one if any */
              if (data->cookies)
                Curl_cookie_cleanup(data->cookies);
              data->cookies = data->share->cookies;
            }
    
            Curl_share_unlock(data, CURL_LOCK_DATA_SHARE);
    
    #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_COOKIES)
    
          /* check cookie list is set */
          if(!data->cookies)
    
            data->cookies = Curl_cookie_init(data, NULL, NULL, TRUE );
    
           * it will be done by curl_easy_perform */
    
      case CURLOPT_PROXYTYPE:
        /*
         * Set proxy type. HTTP/SOCKS4/SOCKS5
         */
    
        data->set.proxytype = (curl_proxytype)va_arg(param, long);
    
      case CURLOPT_PRIVATE:
        /*
         * Set private data pointer.
         */
    
        data->set.private_data = va_arg(param, void *);
    
      case CURLOPT_MAXFILESIZE:
        /*
         * Set the maximum size of a file to download.
         */
        data->set.max_filesize = va_arg(param, long);
        break;
    
    
      case CURLOPT_FTP_SSL:
        /*
         * Make FTP transfers attempt to use SSL/TLS.
         */
    
        data->set.ftp_ssl = (curl_ftpssl)va_arg(param, long);
    
      case CURLOPT_FTPSSLAUTH:
        /*
         * Set a specific auth for FTP-SSL transfers.
         */
        data->set.ftpsslauth = (curl_ftpauth)va_arg(param, long);
        break;
    
    
      case CURLOPT_IPRESOLVE:
        data->set.ip_version = va_arg(param, long);
        break;
    
    
      case CURLOPT_MAXFILESIZE_LARGE:
        /*
         * Set the maximum size of a file to download.
         */
    
        data->set.max_filesize = va_arg(param, curl_off_t);
    
      case CURLOPT_TCP_NODELAY:
        /*
         * Enable or disable TCP_NODELAY, which will disable/enable the Nagle
         * algorithm
         */
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.tcp_nodelay = (bool)(0 != va_arg(param, long));
    
          case CURLOPT_SOURCE_URL:
          case CURLOPT_SOURCE_USERPWD:
          case CURLOPT_SOURCE_QUOTE:
          case CURLOPT_SOURCE_PREQUOTE:
          case CURLOPT_SOURCE_POSTQUOTE:
          These former 3rd party transfer options are deprecated */
    
        result = Curl_setstropt(&data->set.str[STRING_FTP_ACCOUNT],
                                va_arg(param, char *));
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.ignorecl = (bool)(0 != va_arg(param, long));
    
      case CURLOPT_CONNECT_ONLY:
        /*
         * No data transfer, set up connection and let application use the socket
         */
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.connect_only = (bool)(0 != va_arg(param, long));
    
        result = Curl_setstropt(&data->set.str[STRING_FTP_ALTERNATIVE_TO_USER],
                                va_arg(param, char *));
    
      case CURLOPT_SOCKOPTFUNCTION:
        /*
         * socket callback function: called after socket() but before connect()
         */
        data->set.fsockopt = va_arg(param, curl_sockopt_callback);
        break;
    
      case CURLOPT_SOCKOPTDATA:
        /*
         * socket callback data pointer. Might be NULL.
         */
        data->set.sockopt_client = va_arg(param, void *);
        break;
    
    
    Yang Tse's avatar
    Yang Tse committed
        data->set.ssl.sessionid = (bool)(0 != va_arg(param, long));
    
      case CURLOPT_SSH_AUTH_TYPES:
        data->set.ssh_auth_types = va_arg(param, long);
        break;
    
      case CURLOPT_SSH_PUBLIC_KEYFILE:
        /*
         * Use this file instead of the $HOME/.ssh/id_dsa.pub file
         */
    
        result = Curl_setstropt(&data->set.str[STRING_SSH_PUBLIC_KEY],
                                va_arg(param, char *));
    
        break;
    
      case CURLOPT_SSH_PRIVATE_KEYFILE:
        /*
         * Use this file instead of the $HOME/.ssh/id_dsa file
         */
    
        result = Curl_setstropt(&data->set.str[STRING_SSH_PRIVATE_KEY],
                                va_arg(param, char *));
    
      case CURLOPT_HTTP_TRANSFER_DECODING:
        /*
         * disable libcurl transfer encoding is used
         */
        data->set.http_te_skip = (bool)(0 == va_arg(param, long));
        break;
    
      case CURLOPT_HTTP_CONTENT_DECODING:
        /*
         * raw data passed to the application when content encoding is used
         */
        data->set.http_ce_skip = (bool)(0 == va_arg(param, long));
        break;
    
    
      case CURLOPT_NEW_FILE_PERMS:
        /*
         * Uses these permissions instead of 0644
         */
        data->set.new_file_perms = va_arg(param, long);
        break;
    
      case CURLOPT_NEW_DIRECTORY_PERMS:
        /*
         * Uses these permissions instead of 0755
         */
        data->set.new_directory_perms = va_arg(param, long);
        break;
    
    
      default:
        /* unknown tag and its companion, just ignore: */
    
        result = CURLE_FAILED_INIT; /* correct this */
        break;
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
      }
    
    static void conn_free(struct connectdata *conn)
    {
      if (!conn)
        return;
    
      /* close possibly still open sockets */
      if(CURL_SOCKET_BAD != conn->sock[SECONDARYSOCKET])
        sclose(conn->sock[SECONDARYSOCKET]);
      if(CURL_SOCKET_BAD != conn->sock[FIRSTSOCKET])
        sclose(conn->sock[FIRSTSOCKET]);
    
      Curl_safefree(conn->user);
      Curl_safefree(conn->passwd);
      Curl_safefree(conn->proxyuser);
      Curl_safefree(conn->proxypasswd);
      Curl_safefree(conn->allocptr.proxyuserpwd);
      Curl_safefree(conn->allocptr.uagent);
      Curl_safefree(conn->allocptr.userpwd);
      Curl_safefree(conn->allocptr.accept_encoding);
      Curl_safefree(conn->allocptr.rangeline);
      Curl_safefree(conn->allocptr.ref);
      Curl_safefree(conn->allocptr.host);
      Curl_safefree(conn->allocptr.cookiehost);
      Curl_safefree(conn->ip_addr_str);
      Curl_safefree(conn->trailer);
      Curl_safefree(conn->host.rawalloc); /* host name buffer */
      Curl_safefree(conn->proxy.rawalloc); /* proxy name buffer */
    
    
      Curl_llist_destroy(conn->send_pipe, NULL);
      Curl_llist_destroy(conn->recv_pipe, NULL);
    
      /* possible left-overs from the async name resolvers */
    #if defined(USE_ARES)
      Curl_safefree(conn->async.hostname);
      Curl_safefree(conn->async.os_specific);
    #elif defined(CURLRES_THREADED)
      Curl_destroy_thread_data(&conn->async);
    #endif
    
    
      Curl_ssl_close(conn, FIRSTSOCKET);
      Curl_ssl_close(conn, SECONDARYSOCKET);
    
      Curl_free_ssl_config(&conn->ssl_config);
    
      free(conn); /* free all the connection oriented data */
    }
    
    
    CURLcode Curl_disconnect(struct connectdata *conn)
    
      struct SessionHandle *data;
    
      if(!conn)
        return CURLE_OK; /* this is closed and fine already */
    
      data = conn->data;
    
      if(!data) {
        DEBUGF(infof(data, "DISCONNECT without easy handle, ignoring\n"));
        return CURLE_OK;
      }
    
    
    #if defined(CURLDEBUG) && defined(AGGRESIVE_TEST)
      /* scan for DNS cache entries still marked as in use */
      Curl_hash_apply(data->hostcache,
                      NULL, Curl_scan_cache_used);
    #endif
    
    
      Curl_expire(data, 0); /* shut off timers */
    
      Curl_hostcache_prune(data); /* kill old DNS cache entries */
    
    
      if((conn->ntlm.state != NTLMSTATE_NONE) ||
    
         (conn->proxyntlm.state != NTLMSTATE_NONE)) {
    
        /* Authentication data is a mix of connection-related and sessionhandle-
           related stuff. NTLM is connection-related so when we close the shop
           we shall forget. */
    
        data->state.authhost.done = FALSE;
    
        data->state.authhost.picked =
    
          data->state.authhost.want;
    
        data->state.authproxy.done = FALSE;
    
        data->state.authproxy.picked =
    
          data->state.authproxy.want;
    
    
        data->state.authproblem = FALSE;
    
      if(conn->curl_disconnect)
        /* This is set if protocol-specific cleanups should be made */
        conn->curl_disconnect(conn);
    
    
      if(-1 != conn->connectindex) {
    
        infof(data, "Closing connection #%ld\n", conn->connectindex);
    
        if(data->state.connc)
          /* only clear the table entry if we still know in which cache we
             used to be in */
          data->state.connc->connects[conn->connectindex] = NULL;
    
    #ifdef USE_LIBIDN
    
        idn_free(conn->host.encalloc); /* encoded host name buffer, must be freed
                                          with idn_free() since this was allocated
                                          by libidn */
    
        idn_free(conn->proxy.encalloc); /* encoded proxy name buffer, must be
                                           freed with idn_free() since this was
                                           allocated by libidn */
    
      /* Indicate to all handles on the pipe that we're dead */
    
      if (IsPipeliningEnabled(data)) {
        signalPipeClose(conn->send_pipe);
        signalPipeClose(conn->recv_pipe);
      }
    
    Daniel Stenberg's avatar
    Daniel Stenberg committed
    /*
     * This function should return TRUE if the socket is to be assumed to
     * be dead. Most commonly this happens when the server has closed the
     * connection due to inactivity.
     */
    
    static bool SocketIsDead(curl_socket_t sock)