/*************************************************************************** * _ _ ____ _ * Project ___| | | | _ \| | * / __| | | | |_) | | * | (__| |_| | _ <| |___ * \___|\___/|_| \_\_____| * * Copyright (C) 1998 - 2004, Daniel Stenberg, , 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. * * 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. * * $Id: getinfo.c,v 1.38 2004/09/30 21:01:23 bagder Exp $ ***************************************************************************/ #include "setup.h" #include #include "urldata.h" #include "getinfo.h" #include #include #include #include #include "memory.h" /* Make this the last #include */ #include "memdebug.h" /* * This is supposed to be called in the beginning of a permform() session * and should reset all session-info variables */ CURLcode Curl_initinfo( struct SessionHandle *data ) { struct Progress *pro = &data->progress; struct PureInfo *info = &data->info; pro->t_nslookup = 0; pro->t_connect = 0; pro->t_pretransfer = 0; pro->t_starttransfer = 0; pro->timespent = 0; pro->t_redirect = 0; info->httpcode = 0; info->httpversion = 0; info->filetime = -1; /* -1 is an illegal time and thus means unknown */ if ( info->contenttype ) { free( info->contenttype ); } info->contenttype = NULL; info->header_size = 0; info->request_size = 0; return CURLE_OK; } CURLcode Curl_getinfo( struct SessionHandle *data, CURLINFO info, ... ) { va_list arg; long *param_longp = NULL; double *param_doublep = NULL; char **param_charp = NULL; va_start( arg, info ); switch ( info & CURLINFO_TYPEMASK ) { default: return CURLE_BAD_FUNCTION_ARGUMENT; case CURLINFO_STRING: param_charp = va_arg( arg, char ** ); if ( NULL == param_charp ) { return CURLE_BAD_FUNCTION_ARGUMENT; } break; case CURLINFO_LONG: param_longp = va_arg( arg, long * ); if ( NULL == param_longp ) { return CURLE_BAD_FUNCTION_ARGUMENT; } break; case CURLINFO_DOUBLE: param_doublep = va_arg( arg, double * ); if ( NULL == param_doublep ) { return CURLE_BAD_FUNCTION_ARGUMENT; } break; } switch ( info ) { case CURLINFO_EFFECTIVE_URL: *param_charp = data->change.url ? data->change.url : (char *)""; break; case CURLINFO_RESPONSE_CODE: *param_longp = data->info.httpcode; break; case CURLINFO_HTTP_CONNECTCODE: *param_longp = data->info.httpproxycode; break; case CURLINFO_FILETIME: *param_longp = data->info.filetime; break; case CURLINFO_HEADER_SIZE: *param_longp = data->info.header_size; break; case CURLINFO_REQUEST_SIZE: *param_longp = data->info.request_size; break; 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; break; case CURLINFO_PRETRANSFER_TIME: *param_doublep = data->progress.t_pretransfer; break; case CURLINFO_STARTTRANSFER_TIME: *param_doublep = data->progress.t_starttransfer; break; case CURLINFO_SIZE_UPLOAD: *param_doublep = (double)data->progress.uploaded; break; case CURLINFO_SIZE_DOWNLOAD: *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; break; case CURLINFO_SSL_VERIFYRESULT: *param_longp = data->set.ssl.certverifyresult; break; case CURLINFO_CONTENT_LENGTH_DOWNLOAD: *param_doublep = (double)data->progress.size_dl; break; case CURLINFO_CONTENT_LENGTH_UPLOAD: *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; case CURLINFO_PRIVATE: *param_charp = data->set.private; break; case CURLINFO_HTTPAUTH_AVAIL: *param_longp = data->info.httpauthavail; break; case CURLINFO_PROXYAUTH_AVAIL: *param_longp = data->info.proxyauthavail; break; case CURLINFO_OS_ERRNO: *param_longp = data->state.os_errno; break; default: return CURLE_BAD_FUNCTION_ARGUMENT; } return CURLE_OK; }