aboutsummaryrefslogtreecommitdiff
path: root/lib/urldata.h
diff options
context:
space:
mode:
Diffstat (limited to 'lib/urldata.h')
-rw-r--r--lib/urldata.h320
1 files changed, 156 insertions, 164 deletions
diff --git a/lib/urldata.h b/lib/urldata.h
index 72e288142..b13745ef3 100644
--- a/lib/urldata.h
+++ b/lib/urldata.h
@@ -195,8 +195,8 @@ struct ConnectBits {
bool close; /* if set, we close the connection after this request */
bool reuse; /* if set, this is a re-used connection */
bool chunk; /* if set, this is a chunked transfer-encoding */
- bool httpproxy; /* if set, this transfer is done through a http proxy */
- bool user_passwd; /* do we use user+password for this connection? */
+ bool httpproxy; /* if set, this transfer is done through a http proxy */
+ bool user_passwd; /* do we use user+password for this connection? */
bool proxy_user_passwd; /* user+password for the proxy? */
bool use_range;
@@ -212,7 +212,7 @@ struct ConnectBits {
*/
struct connectdata {
/**** Fields set when inited and not modified again */
- struct UrlData *data; /* link to the root CURL struct */
+ struct SessionHandle *data; /* link to the root CURL struct */
int connectindex; /* what index in the connects index this particular
struct has */
@@ -348,9 +348,21 @@ struct connectdata {
void *generic;
} proto;
+};
+/*
+ * Struct to keep statistical and informational data.
+ */
+struct PureInfo {
+ int httpcode;
+ int httpversion;
+ time_t filetime; /* If requested, this is might get set. It may be 0 if
+ the time was unretrievable */
+ long header_size; /* size of read header(s) in bytes */
+ long request_size; /* the amount of bytes sent in the request(s) */
};
+
struct Progress {
long lastshow; /* time() of the last displayed progress meter or NULL to
force redraw at next call */
@@ -368,17 +380,12 @@ struct Progress {
double dlspeed;
double ulspeed;
- struct timeval start;
- struct timeval t_startsingle;
- /* various data stored for possible later report */
double t_nslookup;
double t_connect;
double t_pretransfer;
- int httpcode;
- int httpversion;
- time_t filetime; /* If requested, this is might get set. It may be 0 if
- the time was unretrievable */
+ struct timeval start;
+ struct timeval t_startsingle;
#define CURR_TIME 5
double speeder[ CURR_TIME ];
@@ -395,197 +402,182 @@ typedef enum {
HTTPREQ_LAST /* last in list */
} Curl_HttpReq;
-/* This struct is for boolean settings that define how to behave during
- this session. */
-struct Configbits {
- bool get_filetime;
- bool tunnel_thru_httpproxy;
- bool ftp_append;
- bool ftp_ascii;
- bool ftp_list_only;
- bool ftp_use_port;
- bool hide_progress;
- bool http_fail_on_error;
- bool http_follow_location;
- bool http_include_header;
- bool http_set_referer;
- bool http_auto_referer; /* set "correct" referer when following location: */
- bool httpproxy;
- bool no_body;
- bool set_port;
- bool set_range;
- bool upload;
- bool use_netrc;
- bool verbose;
+/*
+ * Values that are generated, temporary or calculated internally for a
+ * "session handle" must be defined within the 'struct urlstate'. This struct
+ * will be used within the SessionHandle struct. When the 'SessionHandle'
+ * struct is cloned, this data MUST NOT be copied.
+ *
+ * Remember that any "state" information goes globally for the curl handle.
+ * Session-data MUST be put in the connectdata struct and here. */
+#define MAX_CURL_USER_LENGTH 256
+#define MAX_CURL_PASSWORD_LENGTH 256
+
+struct UrlState {
+ /* buffers to store authentication data in, as parsed from input options */
+ char user[MAX_CURL_USER_LENGTH];
+ char passwd[MAX_CURL_PASSWORD_LENGTH];
+ char proxyuser[MAX_CURL_USER_LENGTH];
+ char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
+
+ struct timeval keeps_speed; /* for the progress meter really */
+
+ /* 'connects' will be an allocated array with pointers. If the pointer is
+ set, it holds an allocated connection. */
+ struct connectdata **connects;
+ long numconnects; /* size of the 'connects' array */
+
+ char *headerbuff; /* allocated buffer to store headers in */
+ int headersize; /* size of the allocation */
+
+ char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */
+
+ double current_speed; /* the ProgressShow() funcion sets this */
+
bool this_is_a_follow; /* this is a followed Location: request */
- bool krb4; /* kerberos4 connection requested */
- bool proxystringalloc; /* the http proxy string is malloc()'ed */
- bool urlstringalloc; /* the URL string is malloc()'ed */
- bool reuse_forbid; /* if this is forbidden to be reused, close
- after use */
- bool reuse_fresh; /* do not re-use an existing connection for this
- transfer */
- bool expect100header; /* TRUE if we added Expect: 100-continue to the
- HTTP header */
+
+ char *auth_host; /* if set, this should be the host name that we will
+ sent authorization to, no else. Used to make Location:
+ following not keep sending user+password... This is
+ strdup() data.
+ */
};
+
/*
- * As of April 11, 2000 we're now trying to split up the urldata struct in
- * three different parts:
- *
- * (Global)
- * 1 - No matter how many hosts and requests that are being performed, this
- * goes for all of them.
- *
- * (Session)
- * 2 - Host and protocol-specific. No matter if we do several transfers to and
- * from this host, these variables stay the same.
- *
- * (Request)
- * 3 - Request-specific. Variables that are of interest for this particular
- * transfer being made right now. THIS IS WRONG STRUCT FOR THOSE.
- *
- * In Febrary 2001, this is being done stricter. The 'connectdata' struct
- * MUST have all the connection oriented stuff as we may now have several
- * simultaneous connections and connection structs in memory.
- *
- * From now on, the 'UrlData' must only contain data that is set once to go
+ * This 'DynamicStatic' struct defines dynamic states that actually change
+ * values in the 'UserDefined' area, which MUST be taken into consideration
+ * if the UserDefined struct is cloned or similar. You can probably just
+ * copy these, but each one indicate a special action on other data.
+ */
+
+struct DynamicStatic {
+ char *url; /* work URL, copied from UserDefined */
+ bool url_alloc; /* URL string is malloc()'ed */
+ char *proxy; /* work proxy, copied from UserDefined */
+ bool proxy_alloc; /* http proxy string is malloc()'ed */
+ char *referer; /* referer string */
+ bool referer_alloc; /* referer sting is malloc()ed */
+};
+
+/*
+ * This 'UserDefined' struct must only contain data that is set once to go
* for many (perhaps) independent connections. Values that are generated or
- * calculated internally MUST NOT be a part of this struct.
+ * calculated internally for the "session handle" MUST be defined within the
+ * 'struct urlstate' instead. The only exceptions MUST note the changes in
+ * the 'DynamicStatic' struct.
*/
-struct UrlData {
- /*************** Global - specific items ************/
+struct UserDefined {
FILE *err; /* the stderr writes goes here */
char *errorbuffer; /* store failure messages in here */
-
- /*************** Session - specific items ************/
- char *proxy; /* if proxy, set it here */
char *proxyuserpwd; /* Proxy <user:password>, if used */
long proxyport; /* If non-zero, use this port number by default. If the
proxy string features a ":[port]" that one will override
- this. */
-
-
- long header_size; /* size of read header(s) in bytes */
- long request_size; /* the amount of bytes sent in the request(s) */
-
+ this. */
void *out; /* the fetched file goes here */
void *in; /* the uploaded file is read from here */
void *writeheader; /* write the header to this is non-NULL */
-
- char *url; /* what to get */
- char *freethis; /* if non-NULL, an allocated string for the URL */
- long use_port; /* which port to use (when not using default) */
- struct Configbits bits; /* new-style (v7) flag data */
- struct ssl_config_data ssl; /* this is for ssl-stuff */
-
- char *userpwd; /* <user:password>, if used */
- char *set_range; /* range, if used. See README for detailed specification on
- this syntax. */
-
- /* stuff related to HTTP */
-
- long followlocation;
- long maxredirs; /* maximum no. of http(s) redirects to follow */
- char *referer;
+ char *set_url; /* what original URL to work on */
+ char *set_proxy; /* proxy to use */
+ long use_port; /* which port to use (when not using default) */
+ char *userpwd; /* <user:password>, if used */
+ char *set_range; /* range, if used. See README for detailed specification
+ on this syntax. */
+ long followlocation; /* as in HTTP Location: */
+ long maxredirs; /* maximum no. of http(s) redirects to follow */
+ char *set_referer; /* custom string */
bool free_referer; /* set TRUE if 'referer' points to a string we
allocated */
char *useragent; /* User-Agent string */
- char *postfields; /* if POST, set the fields' values here */
+ char *postfields; /* if POST, set the fields' values here */
size_t postfieldsize; /* if POST, this might have a size to use instead of
strlen(), and then the data *may* be binary (contain
zero bytes) */
-
- /* stuff related to FTP */
- char *ftpport; /* port to send with the PORT command */
-
- /* general things */
- char *device; /* Interface to use */
-
- /* function that stores the output:*/
- curl_write_callback fwrite;
-
- /* optional function that stores the header output:*/
- curl_write_callback fwrite_header;
-
- /* function that reads the input:*/
- curl_read_callback fread;
-
- /* function that wants progress information */
- curl_progress_callback fprogress;
+ char *ftpport; /* port to send with the FTP PORT command */
+ char *device; /* network interface to use */
+ curl_write_callback fwrite; /* function that stores the output */
+ curl_write_callback fwrite_header; /* function that stores headers */
+ curl_read_callback fread; /* function that reads the input */
+ curl_progress_callback fprogress; /* function for progress information */
void *progress_client; /* pointer to pass to the progress callback */
-
- /* function to call instead of the internal for password */
- curl_passwd_callback fpasswd;
- void *passwd_client; /* pointer to pass to the passwd callback */
-
- long timeout; /* in seconds, 0 means no timeout */
- long connecttimeout; /* in seconds, 0 means no timeout */
- long infilesize; /* size of file to upload, -1 means unknown */
-
- char buffer[BUFSIZE+1]; /* buffer with size BUFSIZE */
-
- double current_speed; /* the ProgressShow() funcion sets this */
-
+ curl_passwd_callback fpasswd; /* call for password */
+ void *passwd_client; /* pass to the passwd callback */
+ long timeout; /* in seconds, 0 means no timeout */
+ long connecttimeout; /* in seconds, 0 means no timeout */
+ long infilesize; /* size of file to upload, -1 means unknown */
long low_speed_limit; /* bytes/second */
long low_speed_time; /* number of seconds */
-
- int set_resume_from; /* continue [ftp] transfer from here */
-
- char *cookie; /* HTTP cookie string to send */
-
+ int set_resume_from; /* continue [ftp] transfer from here */
+ char *cookie; /* HTTP cookie string to send */
struct curl_slist *headers; /* linked list of extra headers */
struct HttpPost *httppost; /* linked list of POST data */
-
- char *cert; /* PEM-formatted certificate */
- char *cert_passwd; /* plain text certificate password */
-
- struct CookieInfo *cookies;
- char *cookiejar; /* dump all cookies to this file */
-
- long crlf;
+ char *cert; /* PEM-formatted certificate */
+ char *cert_passwd; /* plain text certificate password */
+ char *cookiejar; /* dump all cookies to this file */
+ bool crlf; /* convert crlf on ftp upload(?) */
struct curl_slist *quote; /* before the transfer */
struct curl_slist *postquote; /* after the transfer */
-
- /* Telnet negotiation options */
struct curl_slist *telnet_options; /* linked list of telnet options */
-
- TimeCond timecondition; /* kind of comparison */
+ TimeCond timecondition; /* kind of time/date comparison */
time_t timevalue; /* what time to compare with */
-
- Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
-
- char *customrequest; /* http/ftp request to use */
-
- char *headerbuff; /* allocated buffer to store headers in */
- int headersize; /* size of the allocation */
-
- struct Progress progress; /* for all the progress meter data */
-
-#define MAX_CURL_USER_LENGTH 128
-#define MAX_CURL_PASSWORD_LENGTH 128
-
+ curl_closepolicy closepolicy; /* connection cache close concept */
+ Curl_HttpReq httpreq; /* what kind of HTTP request (if any) is this */
+ char *customrequest; /* HTTP/FTP request to use */
char *auth_host; /* if set, this is the allocated string to the host name
* to which to send the authorization data to, and no other
* host (which location-following otherwise could lead to)
*/
-
- /* buffers to store authentication data in */
- char user[MAX_CURL_USER_LENGTH];
- char passwd[MAX_CURL_PASSWORD_LENGTH];
- char proxyuser[MAX_CURL_USER_LENGTH];
- char proxypasswd[MAX_CURL_PASSWORD_LENGTH];
-
char *krb4_level; /* what security level */
- struct timeval keeps_speed; /* this should be request-specific */
+ struct ssl_config_data ssl; /* user defined SSL stuff */
- /* 'connects' will be an allocated array with pointers. If the pointer is
- set, it holds an allocated connection. */
- struct connectdata **connects;
- long numconnects; /* size of the 'connects' array */
- curl_closepolicy closepolicy;
+/* Here follows boolean settings that define how to behave during
+ this session. They are STATIC, set by libcurl users or at least initially
+ and they don't change during operations. */
+
+ bool get_filetime;
+ bool tunnel_thru_httpproxy;
+ bool ftp_append;
+ bool ftp_ascii;
+ bool ftp_list_only;
+ bool ftp_use_port;
+ bool hide_progress;
+ bool http_fail_on_error;
+ bool http_follow_location;
+ bool http_include_header;
+ bool http_set_referer;
+ bool http_auto_referer; /* set "correct" referer when following location: */
+ bool no_body;
+ bool set_port;
+ bool upload;
+ bool use_netrc;
+ bool verbose;
+ bool krb4; /* kerberos4 connection requested */
+ bool reuse_forbid; /* forbidden to be reused, close after use */
+ bool reuse_fresh; /* do not re-use an existing connection */
+ bool expect100header; /* TRUE if we added Expect: 100-continue */
+};
+/*
+ * In August 2001, this struct was redesigned and is since stricter than
+ * before. The 'connectdata' struct MUST have all the connection oriented
+ * stuff as we may now have several simultaneous connections and connection
+ * structs in memory.
+ *
+ * From now on, the 'SessionHandle' must only contain data that is set once to
+ * go for many (perhaps) independent connections. Values that are generated or
+ * calculated internally for the "session handle" must be defined within the
+ * 'struct urlstate' instead. */
+
+struct SessionHandle {
+ struct UserDefined set; /* values set by the libcurl user */
+ struct DynamicStatic change; /* possibly modified userdefined data */
+
+ struct CookieInfo *cookies; /* the cookies, read from files and servers */
+ struct Progress progress; /* for all the progress meter data */
+ struct UrlState state; /* struct for fields used for state info and
+ other dynamic purposes */
+ struct PureInfo info; /* stats, reports and info data */
};
#define LIBCURL_NAME "libcurl"