00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include "setup.h"
00025
00026 #include <curl/curl.h>
00027
00028 #include "urldata.h"
00029 #include "getinfo.h"
00030
00031 #include <stdio.h>
00032 #include <string.h>
00033 #include <stdarg.h>
00034 #include <stdlib.h>
00035 #include "memory.h"
00036 #include "sslgen.h"
00037
00038
00039 #include "memdebug.h"
00040
00041
00042
00043
00044
00045 CURLcode Curl_initinfo(struct SessionHandle *data)
00046 {
00047 struct Progress *pro = &data->progress;
00048 struct PureInfo *info =&data->info;
00049
00050 pro->t_nslookup = 0;
00051 pro->t_connect = 0;
00052 pro->t_pretransfer = 0;
00053 pro->t_starttransfer = 0;
00054 pro->timespent = 0;
00055 pro->t_redirect = 0;
00056
00057 info->httpcode = 0;
00058 info->httpversion=0;
00059 info->filetime=-1;
00060
00061 if (info->contenttype)
00062 free(info->contenttype);
00063 info->contenttype = NULL;
00064
00065 info->header_size = 0;
00066 info->request_size = 0;
00067 info->numconnects = 0;
00068 return CURLE_OK;
00069 }
00070
00071 CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
00072 {
00073 va_list arg;
00074 long *param_longp=NULL;
00075 double *param_doublep=NULL;
00076 char **param_charp=NULL;
00077 struct curl_slist **param_slistp=NULL;
00078 #ifdef MSG_PEEK
00079 char buf;
00080 #endif
00081 int type;
00082
00083 if(!data)
00084 return CURLE_BAD_FUNCTION_ARGUMENT;
00085
00086 va_start(arg, info);
00087
00088 type = CURLINFO_TYPEMASK & (int)info;
00089 switch(type) {
00090 case CURLINFO_STRING:
00091 param_charp = va_arg(arg, char **);
00092 if(NULL == param_charp)
00093 return CURLE_BAD_FUNCTION_ARGUMENT;
00094 break;
00095 case CURLINFO_LONG:
00096 param_longp = va_arg(arg, long *);
00097 if(NULL == param_longp)
00098 return CURLE_BAD_FUNCTION_ARGUMENT;
00099 break;
00100 case CURLINFO_DOUBLE:
00101 param_doublep = va_arg(arg, double *);
00102 if(NULL == param_doublep)
00103 return CURLE_BAD_FUNCTION_ARGUMENT;
00104 break;
00105 case CURLINFO_SLIST:
00106 param_slistp = va_arg(arg, struct curl_slist **);
00107 if(NULL == param_slistp)
00108 return CURLE_BAD_FUNCTION_ARGUMENT;
00109 break;
00110 default:
00111 return CURLE_BAD_FUNCTION_ARGUMENT;
00112 }
00113
00114 switch(info) {
00115 case CURLINFO_EFFECTIVE_URL:
00116 *param_charp = data->change.url?data->change.url:(char *)"";
00117 break;
00118 case CURLINFO_RESPONSE_CODE:
00119 *param_longp = data->info.httpcode;
00120 break;
00121 case CURLINFO_HTTP_CONNECTCODE:
00122 *param_longp = data->info.httpproxycode;
00123 break;
00124 case CURLINFO_FILETIME:
00125 *param_longp = data->info.filetime;
00126 break;
00127 case CURLINFO_HEADER_SIZE:
00128 *param_longp = data->info.header_size;
00129 break;
00130 case CURLINFO_REQUEST_SIZE:
00131 *param_longp = data->info.request_size;
00132 break;
00133 case CURLINFO_TOTAL_TIME:
00134 *param_doublep = data->progress.timespent;
00135 break;
00136 case CURLINFO_NAMELOOKUP_TIME:
00137 *param_doublep = data->progress.t_nslookup;
00138 break;
00139 case CURLINFO_CONNECT_TIME:
00140 *param_doublep = data->progress.t_connect;
00141 break;
00142 case CURLINFO_PRETRANSFER_TIME:
00143 *param_doublep = data->progress.t_pretransfer;
00144 break;
00145 case CURLINFO_STARTTRANSFER_TIME:
00146 *param_doublep = data->progress.t_starttransfer;
00147 break;
00148 case CURLINFO_SIZE_UPLOAD:
00149 *param_doublep = (double)data->progress.uploaded;
00150 break;
00151 case CURLINFO_SIZE_DOWNLOAD:
00152 *param_doublep = (double)data->progress.downloaded;
00153 break;
00154 case CURLINFO_SPEED_DOWNLOAD:
00155 *param_doublep = (double)data->progress.dlspeed;
00156 break;
00157 case CURLINFO_SPEED_UPLOAD:
00158 *param_doublep = (double)data->progress.ulspeed;
00159 break;
00160 case CURLINFO_SSL_VERIFYRESULT:
00161 *param_longp = data->set.ssl.certverifyresult;
00162 break;
00163 case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
00164 *param_doublep = (double)data->progress.size_dl;
00165 break;
00166 case CURLINFO_CONTENT_LENGTH_UPLOAD:
00167 *param_doublep = (double)data->progress.size_ul;
00168 break;
00169 case CURLINFO_REDIRECT_TIME:
00170 *param_doublep = data->progress.t_redirect;
00171 break;
00172 case CURLINFO_REDIRECT_COUNT:
00173 *param_longp = data->set.followlocation;
00174 break;
00175 case CURLINFO_CONTENT_TYPE:
00176 *param_charp = data->info.contenttype;
00177 break;
00178 case CURLINFO_PRIVATE:
00179 *param_charp = data->set.private_data;
00180 break;
00181 case CURLINFO_HTTPAUTH_AVAIL:
00182 *param_longp = data->info.httpauthavail;
00183 break;
00184 case CURLINFO_PROXYAUTH_AVAIL:
00185 *param_longp = data->info.proxyauthavail;
00186 break;
00187 case CURLINFO_OS_ERRNO:
00188 *param_longp = data->state.os_errno;
00189 break;
00190 case CURLINFO_NUM_CONNECTS:
00191 *param_longp = data->info.numconnects;
00192 break;
00193 case CURLINFO_SSL_ENGINES:
00194 *param_slistp = Curl_ssl_engines_list(data);
00195 break;
00196 case CURLINFO_COOKIELIST:
00197 *param_slistp = Curl_cookie_list(data);
00198 break;
00199 case CURLINFO_FTP_ENTRY_PATH:
00200
00201
00202
00203
00204
00205 *param_charp = data->state.most_recent_ftp_entrypath;
00206 break;
00207 case CURLINFO_LASTSOCKET:
00208 if((data->state.lastconnect != -1) &&
00209 (data->state.connc->connects[data->state.lastconnect] != NULL)) {
00210 struct connectdata *c = data->state.connc->connects
00211 [data->state.lastconnect];
00212 *param_longp = c->sock[FIRSTSOCKET];
00213
00214
00215 if(c->ssl[FIRSTSOCKET].use) {
00216
00217 if (!Curl_ssl_check_cxn(c))
00218 *param_longp = -1;
00219 }
00220
00221 #ifdef MSG_PEEK
00222 else {
00223
00224 if(recv((RECV_TYPE_ARG1)c->sock[FIRSTSOCKET], (RECV_TYPE_ARG2)&buf,
00225 (RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK) == 0) {
00226 *param_longp = -1;
00227 }
00228 }
00229 #endif
00230 }
00231 else
00232 *param_longp = -1;
00233 break;
00234 default:
00235 return CURLE_BAD_FUNCTION_ARGUMENT;
00236 }
00237 return CURLE_OK;
00238 }