diff options
| author | Steve Holme <steve_holme@hotmail.com> | 2013-04-20 08:47:59 +0100 | 
|---|---|---|
| committer | Steve Holme <steve_holme@hotmail.com> | 2013-04-20 09:08:28 +0100 | 
| commit | fddb7b44a79d78e05043e1c97e069308b6b85f79 (patch) | |
| tree | f4fb3ef299b89a36849c33ec65f381d8011ac394 /lib | |
| parent | 49184c37233c2cf27b79ebcd29fb8a4f5fb2e1ed (diff) | |
url: Added support for parsing login options from the CURLOPT_USERPWD
In addition to parsing the optional login options from the URL, added
support for parsing them from CURLOPT_USERPWD, to allow the following
supported command line:
--user username:password;options
Diffstat (limited to 'lib')
| -rw-r--r-- | lib/url.c | 66 | ||||
| -rw-r--r-- | lib/urldata.h | 1 | 
2 files changed, 39 insertions, 28 deletions
@@ -298,43 +298,52 @@ static CURLcode setstropt(char **charp, char * s)  }  static CURLcode setstropt_userpwd(char *option, char **user_storage, -                                  char **pwd_storage) +                                  char **pwd_storage, char **options_storage)  { -  char* separator;    CURLcode result = CURLE_OK; +  char *userp = NULL; +  char *passwdp = NULL; +  char *optionsp = NULL;    if(!option) {      /* we treat a NULL passed in as a hint to clear existing info */ -    Curl_safefree(*user_storage); -    *user_storage = (char *) NULL; -    Curl_safefree(*pwd_storage); -    *pwd_storage = (char *) NULL; +    if(user_storage) { +      Curl_safefree(*user_storage); +      *user_storage = (char *) NULL; +    } + +    if(pwd_storage) { +      Curl_safefree(*pwd_storage); +      *pwd_storage = (char *) NULL; +    } + +    if(options_storage) { +      Curl_safefree(*options_storage); +      *options_storage = (char *) NULL; +    } +      return CURLE_OK;    } -  separator = strchr(option, ':'); -  if(separator != NULL) { - +  /* Parse the login details */ +  result = parse_login_details(option, strlen(option), +                               (user_storage ? &userp : NULL), +                               (pwd_storage ? &passwdp : NULL), +                               (options_storage ? &optionsp : NULL)); +  if(!result) {      /* store username part of option */ -    char * p; -    size_t username_len = (size_t)(separator-option); -    p = malloc(username_len+1); -    if(!p) -      result = CURLE_OUT_OF_MEMORY; -    else { -      memcpy(p, option, username_len); -      p[username_len] = '\0'; -      Curl_safefree(*user_storage); -      *user_storage = p; -    } +    if(user_storage) +      setstropt(user_storage, userp);      /* store password part of option */ -    if(result == CURLE_OK) -      result = setstropt(pwd_storage, separator+1); -  } -  else { -    result = setstropt(user_storage, option); +    if(pwd_storage) +      setstropt(pwd_storage, passwdp); + +    /* store options part of option */ +    if(options_storage) +      setstropt(options_storage, optionsp);    } +    return result;  } @@ -1537,11 +1546,12 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,    case CURLOPT_USERPWD:      /* -     * user:password to use in the operation +     * user:password;options to use in the operation       */      result = setstropt_userpwd(va_arg(param, char *),                                 &data->set.str[STRING_USERNAME], -                               &data->set.str[STRING_PASSWORD]); +                               &data->set.str[STRING_PASSWORD], +                               &data->set.str[STRING_OPTIONS]);      break;    case CURLOPT_USERNAME:      /* @@ -1614,7 +1624,7 @@ CURLcode Curl_setopt(struct SessionHandle *data, CURLoption option,       */      result = setstropt_userpwd(va_arg(param, char *),                                 &data->set.str[STRING_PROXYUSERNAME], -                               &data->set.str[STRING_PROXYPASSWORD]); +                               &data->set.str[STRING_PROXYPASSWORD], NULL);      break;    case CURLOPT_PROXYUSERNAME:      /* diff --git a/lib/urldata.h b/lib/urldata.h index 13a01d4b3..39ef82367 100644 --- a/lib/urldata.h +++ b/lib/urldata.h @@ -1355,6 +1355,7 @@ enum dupstring {    STRING_SSL_ISSUERCERT,  /* issuer cert file to check certificate */    STRING_USERNAME,        /* <username>, if used */    STRING_PASSWORD,        /* <password>, if used */ +  STRING_OPTIONS,         /* <options>, if used */    STRING_PROXYUSERNAME,   /* Proxy <username>, if used */    STRING_PROXYPASSWORD,   /* Proxy <password>, if used */    STRING_NOPROXY,         /* List of hosts which should not use the proxy, if  | 
