/* * curl_easy_reset() is an external interface that allows an app to re- * initialize a session handle to the default values. */ void curl_easy_reset(struct Curl_easy *data) { Curl_free_request_state(data); /* zero out UserDefined data: */ Curl_freeset(data); memset(&data->set, 0, sizeof(struct UserDefined)); (void)Curl_init_userdefined(data); /* zero out Progress data: */ memset(&data->progress, 0, sizeof(struct Progress)); /* zero out PureInfo data: */ Curl_initinfo(data); data->progress.flags |= PGRS_HIDE; data->state.current_speed = -1; /* init to negative == impossible */ /* zero out authentication data: */ memset(&data->state.authhost, 0, sizeof(struct auth)); memset(&data->state.authproxy, 0, sizeof(struct auth)); #if !defined(CURL_DISABLE_HTTP) && !defined(CURL_DISABLE_CRYPTO_AUTH) Curl_digest_cleanup(data); #endif }
CURLdigest Curl_input_digest(struct connectdata *conn, char *header) /* rest of the www-authenticate: header */ { bool more = TRUE; struct SessionHandle *data=conn->data; /* skip initial whitespaces */ while(*header && isspace((int)*header)) header++; if(checkprefix("Digest", header)) { header += strlen("Digest"); /* clear off any former leftovers and init to defaults */ Curl_digest_cleanup(data); while(more) { char value[32]; char content[128]; size_t totlen=0; while(*header && isspace((int)*header)) header++; /* how big can these strings be? */ if(2 == sscanf(header, "%31[^=]=\"%127[^\"]\"", value, content)) { if(strequal(value, "nonce")) { data->state.digest.nonce = strdup(content); } else if(strequal(value, "cnonce")) { data->state.digest.cnonce = strdup(content); } else if(strequal(value, "realm")) { data->state.digest.realm = strdup(content); } else if(strequal(value, "algorithm")) { if(strequal(content, "MD5-sess")) data->state.digest.algo = CURLDIGESTALGO_MD5SESS; /* else, remain using the default md5 */ } else { /* unknown specifier, ignore it! */ } totlen = strlen(value)+strlen(content)+3; } else break; /* we're done here */ header += totlen; if(',' == *header) /* allow the list to be comma-separated */ header++; } if(!data->state.digest.nonce) return CURLDIGEST_BAD; } else /* else not a digest, get out */ return CURLDIGEST_NONE; return CURLDIGEST_FINE; }