Note: HTRequest defined and request parameter added to almost all calls 18 Nov 1993.
This document is a part of the libwww library. The code is implemented in HTAcces.c
#ifndef HTACCESS_H #define HTACCESS_H #include "HTList.h"Short Names
#ifdef SHORT_NAMES #define HTClientHost HTClHost #define HTSearchAbsolute HTSeAbso #define HTOutputStream HTOuStre #define HTOutputFormat HTOuForm #endif
extern char * HTSaveLocallyDir; /* Dir home for "save locally" files */ extern char * HTCacheDir; /* Cache dir, default NULL: no cache */ extern char * HTClientHost; /* Name or number of telnetting host */ extern FILE * HTlogfile; /* File to output one-liners to */ extern BOOL HTSecure; /* Disable security holes? */ extern char * HTImServer; /* If I'm cern_httpd */ extern BOOL HTImProxy; /* If I'm cern_httpd as a proxy */ extern BOOL HTForceReload; /* Force reload from cache or net */
typedef enum { METHOD_INVALID = 0, METHOD_GET = 1, METHOD_HEAD, METHOD_POST, METHOD_PUT, METHOD_DELETE, METHOD_CHECKOUT, METHOD_CHECKIN, METHOD_SHOWMETHOD, METHOD_LINK, METHOD_UNLINK, MAX_METHODS } HTMethod;
PUBLIC HTMethod HTMethod_enum PARAMS((char * name));
PUBLIC char * HTMethod_name PARAMS((HTMethod method));
PUBLIC BOOL HTMethod_inList PARAMS((HTMethod method, HTList * list));
/* PUBLIC HTAA_templateMatch() ** STRING COMPARISON FUNCTION FOR FILE NAMES ** WITH ONE WILDCARD * IN THE TEMPLATE ** NOTE: ** This is essentially the same code as in HTRules.c, but it ** cannot be used because it is embedded in between other code. ** (In fact, HTRules.c should use this routine, but then this ** routine would have to be more sophisticated... why is life ** sometimes so hard...) ** ** ON ENTRY: ** template is a template string to match the file name ** agaist, may contain a single wildcard ** character * which matches zero or more ** arbitrary characters. ** filename is the filename (or pathname) to be matched ** agaist the template. ** ** ON EXIT: ** returns YES, if filename matches the template. ** NO, otherwise. */ PUBLIC BOOL HTAA_templateMatch PARAMS((CONST char * template, CONST char * filename));
typedef struct _HTRequest HTRequest; /* ** Callback to call when username and password ** have been prompted. */ typedef int (*HTRetryCallbackType) PARAMS((HTRequest * req)); #include "HTAnchor.h" #include "HTFormat.h" #include "HTAAUtil.h" /* HTAAScheme, HTAAFailReason */ #include "HTAABrow.h" /* HTAASetup */
#define LOGICAL_DEFAULT "WWW_HOME" /* Defined to be the home page */ #ifndef PERSONAL_DEFAULT #define PERSONAL_DEFAULT "WWW/default.html" /* in home directory */ #endif #ifndef LOCAL_DEFAULT_FILE #define LOCAL_DEFAULT_FILE "/usr/local/lib/WWW/default.html" #endif /* If one telnets to an access point it will look in this file for home page */ #ifndef REMOTE_POINTER #define REMOTE_POINTER "/etc/www-remote.url" /* can't be file */ #endif /* and if that fails it will use this. */ #ifndef REMOTE_ADDRESS #define REMOTE_ADDRESS "http://info.cern.ch/remote.html" /* can't be file */ #endif /* If run from telnet daemon and no -l specified, use this file: */ #ifndef DEFAULT_LOGFILE #define DEFAULT_LOGFILE "/usr/adm/www-log/www-log" #endif /* If the home page isn't found, use this file: */ #ifndef LAST_RESORT #define LAST_RESORT "http://info.cern.ch/default.html" #endif /* This is the default cache directory: */ #ifndef CACHE_HOME_DIR #define CACHE_HOME_DIR "/tmp/" #endif /* The default directory for "save locally" and "save and execute" files: */ #ifndef SAVE_LOCALLY_HOME_DIR #define SAVE_LOCALLY_HOME_DIR "/tmp/" #endif
typedef struct _HTNetInfo { int sockfd; /* Socket descriptor */ HTInputSocket * isoc; /* Input buffer */ int addressCount; /* Attempts if multi-homed host */ BOOL CRLFdotCRLF; /* Does the transmission end like this */ struct _HTRequest * request; /* Link back to request structure */ } HTNetInfo;Note: The AddressCount varaible is used to count the number of attempt to connect to a multi-homed host so we know when to stop trying new IP-addresses.
Note 1: There is also a global list of converters
Note 2: If you reuse the request structure for more than one request then make sure that the request is re-initialized, so that no `old' data is reused, see functions to manipulate HTRequest Structure. The library handles its own internal information from request to request but the information set by the caller is untouched.
struct _HTRequest {The elements of the request structure are as follows.
HTMethod method;An atom for the name of the operation using HTTP method names .
HTList * conversions ;NULL, or a list of conversions which the format manager can do in order to fulfill the request. This is set by the caller of HTAccess. Typically points to a list set up an initialisation time for example by HTInit.
HTList * encodings; /* allowed content-encodings */The list of encodings acceptablein the output stream.
HTList * languages; /* accepted content-languages */The list of (human) language values acceptable in the response
BOOL (* callback ) PARAMS(( struct _HTRequest* request, void *param));A function to be called back in the event that a file has been saved to disk by HTSaveAndCallBack for example.
void * context; /* caller data -- HTAccess unaware */An arbitrary pointer passed to HTAccess and passed back as a parameter to the callback .
HTStream* output_stream;NULL in the case of display to the user, or if a specific output stream is required, the stream.
HTAtom * output_format;The output format required, or a generic format such as www/present (present to user).
char * from;Email format address of person responible for request, see From field in HTTP Protocol. The default address used is the current location, but that can be changed, see HTTCP module.
HTParentAnchor *parentAnchor;If this parameter is set then a `Referer: <parent address> is generated in the request to the server, see Referer field in a HTTP Request
HTParentAnchor* anchor;The anchor for the object in question. Set immediately by HTAcesss. Used by the protocol and parsing modules. Valid thoughout the access.
HTChildAnchor * childAnchor; /* For element within the object */The anchor for the sub object if any. The object builder should ensure that htis is selected, highlighted, etc when the object is loaded. NOTE: Set by HTAccess.
void * using_cache;pointer to cache element if cache hit
BOOL error_block; /* YES if stream has been used */ HTList * error_stack; /* List of errors */
HTNetInfo * net_info; /* Information about socket etc. */ int redirections; /* Number of redirections */
HTAtom * content_type; /* Content-Type: */ HTAtom * content_language;/* Language */ HTAtom * content_encoding;/* Encoding */ int content_length; /* Content-Length: */ HTInputSocket * isoc; /* InputSocket object for reading */ char * authorization; /* Authorization: field */ HTAAScheme scheme; /* Authentication scheme used */
HTList * valid_schemes; /* Valid auth.schemes */ HTAssocList ** scheme_specifics;/* Scheme-specific parameters */ char * prot_template; /* WWW-Protection-Template: field */ HTAASetup * setup; /* Doc protection info */ HTAARealm * realm; /* Password realm */ char * dialog_msg; /* Authentication prompt (client) */ HTRetryCallbackType retry_callback; /* Called when password entered */ };
PUBLIC HTRequest * HTRequest_new NOPARAMS;
PUBLIC void HTRequest_delete PARAMS((HTRequest * req));
extern void HTRequest_clear PARAMS((HTRequest * req));
extern BOOL HTLoadRelative PARAMS(( CONST char * relative_name, HTParentAnchor * here, HTRequest * request));
extern BOOL HTLoadAbsolute PARAMS((CONST char * addr, HTRequest * request));
extern BOOL HTLoadToStream PARAMS(( CONST char * addr, BOOL filter, HTRequest * request));
extern BOOL HTLoadAnchor PARAMS((HTAnchor * a, HTRequest * request)); extern BOOL HTLoadAnchorRecursive PARAMS((HTAnchor * a, HTRequest * request));
PUBLIC int HTLoad PARAMS((HTRequest * request, BOOL keep_error_stack));
returns YES Success
returns NO Failure
request->anchor The parenet anchor.
extern BOOL HTBindAnchor PARAMS((HTAnchor *anchor, HTRequest *request));
extern HTStream * HTSaveStream PARAMS((HTRequest * request));
extern BOOL HTSearch PARAMS(( CONST char * keywords, HTParentAnchor* here, HTRequest * request));
extern BOOL HTSearchAbsolute PARAMS(( CONST char * keywords, CONST char * indexname, HTRequest * request));
Each of these routine takes as a parameter a request structure containing details ofthe request. When the protocol class routine is called, the anchor elemnt in the request is already valid (made valid by HTAccess).
typedef struct _HTProtocol { char * name; int (*load)PARAMS((HTRequest * request)); HTStream* (*saveStream)PARAMS((HTRequest * request)); HTStream* (*postStream)PARAMS(( HTRequest * request, HTParentAnchor* postTo)); } HTProtocol; extern BOOL HTRegisterProtocol PARAMS((HTProtocol * protocol));
As it involves file access, this should only be done once when the program first runs. This is a default algorithm -- browser don't HAVE to use this.
extern HTParentAnchor * HTHomeAnchor NOPARAMS;
#endif /* HTACCESS_H */end of HTAccess