1 /***************************************************************************
3 * Project ___| | | | _ \| |
5 * | (__| |_| | _ <| |___
6 * \___|\___/|_| \_\_____|
8 * Copyright (C) 1998 - 2007, Daniel Stenberg, <daniel@haxx.se>, et al.
10 * This software is licensed as described in the file COPYING, which
11 * you should have received as part of this distribution. The terms
12 * are also available at http://curl.haxx.se/docs/copyright.html.
14 * You may opt to use, copy, modify, merge, publish, distribute and/or sell
15 * copies of the Software, and permit persons to whom the Software is
16 * furnished to do so, under the terms of the COPYING file.
18 * This software is distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY
19 * KIND, either express or implied.
22 ***************************************************************************/
26 #include <curl/curl.h>
38 /* Make this the last #include */
42 * This is supposed to be called in the beginning of a perform() session
43 * and should reset all session-info variables
45 CURLcode Curl_initinfo(struct SessionHandle *data)
47 struct Progress *pro = &data->progress;
48 struct PureInfo *info =&data->info;
52 pro->t_pretransfer = 0;
53 pro->t_starttransfer = 0;
59 info->filetime=-1; /* -1 is an illegal time and thus means unknown */
61 if (info->contenttype)
62 free(info->contenttype);
63 info->contenttype = NULL;
65 info->header_size = 0;
66 info->request_size = 0;
67 info->numconnects = 0;
71 CURLcode Curl_getinfo(struct SessionHandle *data, CURLINFO info, ...)
74 long *param_longp=NULL;
75 double *param_doublep=NULL;
76 char **param_charp=NULL;
77 struct curl_slist **param_slistp=NULL;
84 return CURLE_BAD_FUNCTION_ARGUMENT;
88 type = CURLINFO_TYPEMASK & (int)info;
91 param_charp = va_arg(arg, char **);
92 if(NULL == param_charp)
93 return CURLE_BAD_FUNCTION_ARGUMENT;
96 param_longp = va_arg(arg, long *);
97 if(NULL == param_longp)
98 return CURLE_BAD_FUNCTION_ARGUMENT;
100 case CURLINFO_DOUBLE:
101 param_doublep = va_arg(arg, double *);
102 if(NULL == param_doublep)
103 return CURLE_BAD_FUNCTION_ARGUMENT;
106 param_slistp = va_arg(arg, struct curl_slist **);
107 if(NULL == param_slistp)
108 return CURLE_BAD_FUNCTION_ARGUMENT;
111 return CURLE_BAD_FUNCTION_ARGUMENT;
115 case CURLINFO_EFFECTIVE_URL:
116 *param_charp = data->change.url?data->change.url:(char *)"";
118 case CURLINFO_RESPONSE_CODE:
119 *param_longp = data->info.httpcode;
121 case CURLINFO_HTTP_CONNECTCODE:
122 *param_longp = data->info.httpproxycode;
124 case CURLINFO_FILETIME:
125 *param_longp = data->info.filetime;
127 case CURLINFO_HEADER_SIZE:
128 *param_longp = data->info.header_size;
130 case CURLINFO_REQUEST_SIZE:
131 *param_longp = data->info.request_size;
133 case CURLINFO_TOTAL_TIME:
134 *param_doublep = data->progress.timespent;
136 case CURLINFO_NAMELOOKUP_TIME:
137 *param_doublep = data->progress.t_nslookup;
139 case CURLINFO_CONNECT_TIME:
140 *param_doublep = data->progress.t_connect;
142 case CURLINFO_PRETRANSFER_TIME:
143 *param_doublep = data->progress.t_pretransfer;
145 case CURLINFO_STARTTRANSFER_TIME:
146 *param_doublep = data->progress.t_starttransfer;
148 case CURLINFO_SIZE_UPLOAD:
149 *param_doublep = (double)data->progress.uploaded;
151 case CURLINFO_SIZE_DOWNLOAD:
152 *param_doublep = (double)data->progress.downloaded;
154 case CURLINFO_SPEED_DOWNLOAD:
155 *param_doublep = (double)data->progress.dlspeed;
157 case CURLINFO_SPEED_UPLOAD:
158 *param_doublep = (double)data->progress.ulspeed;
160 case CURLINFO_SSL_VERIFYRESULT:
161 *param_longp = data->set.ssl.certverifyresult;
163 case CURLINFO_CONTENT_LENGTH_DOWNLOAD:
164 *param_doublep = (double)data->progress.size_dl;
166 case CURLINFO_CONTENT_LENGTH_UPLOAD:
167 *param_doublep = (double)data->progress.size_ul;
169 case CURLINFO_REDIRECT_TIME:
170 *param_doublep = data->progress.t_redirect;
172 case CURLINFO_REDIRECT_COUNT:
173 *param_longp = data->set.followlocation;
175 case CURLINFO_CONTENT_TYPE:
176 *param_charp = data->info.contenttype;
178 case CURLINFO_PRIVATE:
179 *param_charp = data->set.private_data;
181 case CURLINFO_HTTPAUTH_AVAIL:
182 *param_longp = data->info.httpauthavail;
184 case CURLINFO_PROXYAUTH_AVAIL:
185 *param_longp = data->info.proxyauthavail;
187 case CURLINFO_OS_ERRNO:
188 *param_longp = data->state.os_errno;
190 case CURLINFO_NUM_CONNECTS:
191 *param_longp = data->info.numconnects;
193 case CURLINFO_SSL_ENGINES:
194 *param_slistp = Curl_ssl_engines_list(data);
196 case CURLINFO_COOKIELIST:
197 *param_slistp = Curl_cookie_list(data);
199 case CURLINFO_FTP_ENTRY_PATH:
200 /* Return the entrypath string from the most recent connection.
201 This pointer was copied from the connectdata structure by FTP.
202 The actual string may be free()ed by subsequent libcurl calls so
203 it must be copied to a safer area before the next libcurl call.
204 Callers must never free it themselves. */
205 *param_charp = data->state.most_recent_ftp_entrypath;
207 case CURLINFO_LASTSOCKET:
208 if((data->state.lastconnect != -1) &&
209 (data->state.connc->connects[data->state.lastconnect] != NULL)) {
210 struct connectdata *c = data->state.connc->connects
211 [data->state.lastconnect];
212 *param_longp = c->sock[FIRSTSOCKET];
213 /* we have a socket connected, let's determine if the server shut down */
214 /* determine if ssl */
215 if(c->ssl[FIRSTSOCKET].use) {
216 /* use the SSL context */
217 if (!Curl_ssl_check_cxn(c))
218 *param_longp = -1; /* FIN received */
220 /* Minix 3.1 doesn't support any flags on recv; just assume socket is OK */
224 if(recv((RECV_TYPE_ARG1)c->sock[FIRSTSOCKET], (RECV_TYPE_ARG2)&buf,
225 (RECV_TYPE_ARG3)1, (RECV_TYPE_ARG4)MSG_PEEK) == 0) {
226 *param_longp = -1; /* FIN received */
235 return CURLE_BAD_FUNCTION_ARGUMENT;