Newer
Older
/***************************************************************************
Daniel Stenberg
committed
* _ _ ____ _
* Project ___| | | | _ \| |
* / __| | | | |_) | |
* | (__| |_| | _ <| |___
Daniel Stenberg
committed
* Copyright (C) 1998 - 2008, Daniel Stenberg, <daniel@haxx.se>, et al.
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
* are also available at http://curl.haxx.se/docs/copyright.html.
Daniel Stenberg
committed
*
* You may opt to use, copy, modify, merge, publish, distribute and/or sell
* copies of the Software, and permit persons to whom the Software is
* furnished to do so, under the terms of the COPYING file.
* This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
* KIND, either express or implied.
***************************************************************************/
#include "setup.h"
#include <curl/curl.h>
#include "urldata.h"
#include "getinfo.h"
#include <stdio.h>
#include <string.h>
#include <stdarg.h>
#include <stdlib.h>
#include "memory.h"
Daniel Stenberg
committed
#include "sslgen.h"
Daniel Stenberg
committed
#include "connect.h" /* Curl_getconnectinfo() */
/* Make this the last #include */
#include "memdebug.h"
/*
* This is supposed to be called in the beginning of a perform() session
* and should reset all session-info variables
*/
Daniel Stenberg
committed
CURLcode Curl_initinfo(struct SessionHandle *data)
{
struct Progress *pro = &data->progress;
Daniel Stenberg
committed
struct PureInfo *info =&data->info;
pro->t_nslookup = 0;
pro->t_connect = 0;
pro->t_pretransfer = 0;
pro->t_redirect = 0;
Daniel Stenberg
committed
info->httpcode = 0;
info->httpversion=0;
info->filetime=-1; /* -1 is an illegal time and thus means unknown */
Daniel Stenberg
committed
free(info->contenttype);
info->contenttype = NULL;
info->header_size = 0;
info->request_size = 0;
return CURLE_OK;
}
Daniel Stenberg
committed
CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
long *param_longp=NULL;
double *param_doublep=NULL;
char **param_charp=NULL;
Yang Tse
committed
union {
struct curl_certinfo * to_certinfo;
struct curl_slist * to_slist;
} ptr;
if(!data)
return CURLE_BAD_FUNCTION_ARGUMENT;
type = CURLINFO_TYPEMASK & (int)info;
switch(type) {
case CURLINFO_STRING:
Daniel Stenberg
committed
param_charp = va_arg(arg, char **);
if(NULL == param_charp)
return CURLE_BAD_FUNCTION_ARGUMENT;
param_longp = va_arg(arg, long *);
if(NULL == param_longp)
return CURLE_BAD_FUNCTION_ARGUMENT;
param_doublep = va_arg(arg, double *);
if(NULL == param_doublep)
return CURLE_BAD_FUNCTION_ARGUMENT;
param_slistp = va_arg(arg, struct curl_slist **);
if(NULL == param_slistp)
return CURLE_BAD_FUNCTION_ARGUMENT;
Daniel Stenberg
committed
return CURLE_BAD_FUNCTION_ARGUMENT;
Daniel Stenberg
committed
switch(info) {
case CURLINFO_EFFECTIVE_URL:
Daniel Stenberg
committed
*param_charp = data->change.url?data->change.url:(char *)"";
case CURLINFO_RESPONSE_CODE:
Daniel Stenberg
committed
*param_longp = data->info.httpcode;
case CURLINFO_HTTP_CONNECTCODE:
*param_longp = data->info.httpproxycode;
break;
Daniel Stenberg
committed
*param_longp = data->info.filetime;
Daniel Stenberg
committed
*param_longp = data->info.header_size;
Daniel Stenberg
committed
*param_longp = data->info.request_size;
case CURLINFO_TOTAL_TIME:
*param_doublep = data->progress.timespent;
break;
case CURLINFO_NAMELOOKUP_TIME:
*param_doublep = data->progress.t_nslookup;
break;
case CURLINFO_CONNECT_TIME:
*param_doublep = data->progress.t_connect;
case CURLINFO_APPCONNECT_TIME:
*param_doublep = data->progress.t_appconnect;
break;
case CURLINFO_PRETRANSFER_TIME:
*param_doublep = data->progress.t_pretransfer;
case CURLINFO_STARTTRANSFER_TIME:
*param_doublep = data->progress.t_starttransfer;
break;
Daniel Stenberg
committed
*param_doublep = (double)data->progress.uploaded;
break;
case CURLINFO_SIZE_DOWNLOAD:
Daniel Stenberg
committed
*param_doublep = (double)data->progress.downloaded;
break;
case CURLINFO_SPEED_DOWNLOAD:
*param_doublep = (double)data->progress.dlspeed;
break;
case CURLINFO_SPEED_UPLOAD:
*param_doublep = (double)data->progress.ulspeed;
Daniel Stenberg
committed
case CURLINFO_SSL_VERIFYRESULT:
Daniel Stenberg
committed
*param_longp = data->set.ssl.certverifyresult;
Daniel Stenberg
committed
break;
case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
Daniel Stenberg
committed
*param_doublep = (double)data->progress.size_dl;
break;
case CURLINFO_CONTENT_LENGTH_UPLOAD:
Daniel Stenberg
committed
*param_doublep = (double)data->progress.size_ul;
break;
case CURLINFO_REDIRECT_TIME:
*param_doublep = data->progress.t_redirect;
break;
case CURLINFO_REDIRECT_COUNT:
*param_longp = data->set.followlocation;
break;
case CURLINFO_CONTENT_TYPE:
*param_charp = data->info.contenttype;
break;
Daniel Stenberg
committed
case CURLINFO_PRIVATE:
Daniel Stenberg
committed
*param_charp = (char *) data->set.private_data;
Daniel Stenberg
committed
break;
case CURLINFO_HTTPAUTH_AVAIL:
*param_longp = data->info.httpauthavail;
break;
case CURLINFO_PROXYAUTH_AVAIL:
*param_longp = data->info.proxyauthavail;
break;
Daniel Stenberg
committed
case CURLINFO_OS_ERRNO:
*param_longp = data->state.os_errno;
break;
case CURLINFO_NUM_CONNECTS:
*param_longp = data->info.numconnects;
break;
Daniel Stenberg
committed
*param_slistp = Curl_ssl_engines_list(data);
Daniel Stenberg
committed
case CURLINFO_COOKIELIST:
*param_slistp = Curl_cookie_list(data);
break;
case CURLINFO_FTP_ENTRY_PATH:
/* Return the entrypath string from the most recent connection.
This pointer was copied from the connectdata structure by FTP.
The actual string may be free()ed by subsequent libcurl calls so
it must be copied to a safer area before the next libcurl call.
Callers must never free it themselves. */
*param_charp = data->state.most_recent_ftp_entrypath;
break;
Daniel Stenberg
committed
case CURLINFO_LASTSOCKET:
Daniel Stenberg
committed
(void)Curl_getconnectinfo(data, param_longp, NULL);
Daniel Stenberg
committed
break;
Daniel Stenberg
committed
case CURLINFO_REDIRECT_URL:
/* Return the URL this request would have been redirected to if that
option had been enabled! */
*param_charp = data->info.wouldredirect;
break;
case CURLINFO_PRIMARY_IP:
/* Return the ip address of the most recent (primary) connection */
*param_charp = data->info.ip;
break;
Daniel Stenberg
committed
case CURLINFO_CERTINFO:
/* Return the a pointer to the certinfo struct. Not really an slist
pointer but we can pretend it is here */
Yang Tse
committed
ptr.to_certinfo = &data->info.certs;
*param_slistp = ptr.to_slist;
Daniel Stenberg
committed
break;
default:
return CURLE_BAD_FUNCTION_ARGUMENT;
}
return CURLE_OK;
}