Annotation of libwww/Library/src/HTAccess.html, revision 2.43
2.9 timbl 1: <HTML>
2: <HEAD>
2.6 timbl 3: <TITLE>HTAccess: Access manager for libwww</TITLE>
2.19 timbl 4: <NEXTID N="z11">
2.9 timbl 5: </HEAD>
2.5 timbl 6: <BODY>
2.39 frystyk 7:
2.33 frystyk 8: <H1>Access Manager</H1>
2.39 frystyk 9:
2.41 frystyk 10: <PRE>
11: /*
12: ** (c) COPYRIGHT CERN 1994.
13: ** Please first read the full copyright statement in the file COPYRIGH.
14: */
15: </PRE>
16:
2.39 frystyk 17: This module keeps a list of valid protocol (naming scheme) specifiers
18: with associated access code. It allows documents to be loaded given
19: various combinations of parameters. New access protocols may be
20: registered at any time.<P>
21:
22: <B>Note:</B> HTRequest defined and request parameter added to almost
23: all calls 18 Nov 1993.<P>
24:
25: This module is implemented by <A HREF="HTAccess.c">HTAccess.c</A>, and
26: it is a part of the <A NAME="z10"
27: HREF="http://info.cern.ch/hypertext/WWW/Library/User/Guide/Guide.html">Library
28: of Common Code</A>. <P>
29:
30: The module contains a lot of stuff but the main topics are:
31:
32: <UL>
2.41 frystyk 33: <LI><A HREF="#Library">Initializing and Terminating the Library</A>
2.39 frystyk 34: <LI><A HREF="#Methods">Management of access methods</A>
35: <LI><A HREF="#Addresses">A lot of hard coded addresses</A>
36: <LI><A HREF="#z1">The HTRequest structure</A>
37: <LI><A HREF="#z100">Management of the HTRequest structure</A>
38: <LI><A HREF="#LoadDoc">Functions for loading a document</A>
39: <LI><A HREF="#ClientHelp">Help functions for clients to get started</A>
40: <LI><A HREF="#PostDoc">Functions for posting a document</A>
41: <LI><A HREF="#ProtReg">Access Method Registration</H2></A>
42: </UL>
43:
2.33 frystyk 44:
45: <PRE>
46: #ifndef HTACCESS_H
1.1 timbl 47: #define HTACCESS_H
2.16 luotonen 48: #include "HTList.h"
2.39 frystyk 49: #include "HTChunk.h"
2.35 frystyk 50: </PRE>
1.1 timbl 51:
2.35 frystyk 52: <B>Short Names</B>
53: <PRE>
1.1 timbl 54: #ifdef SHORT_NAMES
2.8 timbl 55: #define HTClientHost HTClHost
56: #define HTSearchAbsolute HTSeAbso
57: #define HTOutputStream HTOuStre
58: #define HTOutputFormat HTOuForm
1.1 timbl 59: #endif
2.33 frystyk 60: </PRE>
1.1 timbl 61:
2.36 frystyk 62: <H2>Flags which may be set to control this module</H2>
63:
64: <PRE>
65: extern char * HTSaveLocallyDir; /* Dir home for "save locally" files */
66: extern char * HTCacheDir; /* Cache dir, default NULL: no cache */
67: extern char * HTClientHost; /* Name or number of telnetting host */
68: extern FILE * HTlogfile; /* File to output one-liners to */
69: extern BOOL HTSecure; /* Disable security holes? */
70: extern char * HTImServer; /* If I'm cern_httpd */
71: extern BOOL HTImProxy; /* If I'm cern_httpd as a proxy */
72: extern BOOL HTForceReload; /* Force reload from cache or net */
73: </PRE>
74:
2.41 frystyk 75: <A NAME="Library"><H2>Initializing and Terminating the Library</H2></A>
76:
77: <IMG SRC="http://info.cern.ch/hypertext/WWW/Icons/32x32/warning.gif">
78: These two functions initiates memory and settings for the Library and
79: cleans up memory kept by the Library when about to exit the
80: application. It is highly recommended that they are used!
81:
82: <PRE>
83: extern BOOL HTLibInit NOPARAMS;
84: extern BOOL HTLibTerminate NOPARAMS;
85: </PRE>
86:
2.39 frystyk 87: <A NAME="Methods"><H2>Method Management</H2></A>
2.33 frystyk 88:
2.41 frystyk 89: These are the valid methods, see <A
2.39 frystyk 90: HREF="http://info.cern.ch/hypertext/WWW/Protocols/HTTP/Methods.html">HTTP
91: Methods</A>
2.33 frystyk 92:
93: <PRE>
2.16 luotonen 94: typedef enum {
95: METHOD_INVALID = 0,
96: METHOD_GET = 1,
97: METHOD_HEAD,
98: METHOD_POST,
99: METHOD_PUT,
100: METHOD_DELETE,
101: METHOD_CHECKOUT,
102: METHOD_CHECKIN,
103: METHOD_SHOWMETHOD,
104: METHOD_LINK,
105: METHOD_UNLINK,
106: MAX_METHODS
107: } HTMethod;
2.33 frystyk 108: </PRE>
109:
110: <H3>Get Method Enumeration</H3>
2.16 luotonen 111:
2.33 frystyk 112: Gives the enumeration value of the method as a function of the (char *) name.
2.16 luotonen 113:
2.33 frystyk 114: <PRE>
2.40 frystyk 115: extern HTMethod HTMethod_enum PARAMS((char * name));
2.16 luotonen 116: </PRE>
117:
2.33 frystyk 118: <H3>Get Method String</H3>
2.16 luotonen 119:
2.33 frystyk 120: The reverse of <I>HTMethod_enum()</I>
2.16 luotonen 121:
2.33 frystyk 122: <PRE>
2.40 frystyk 123: extern char * HTMethod_name PARAMS((HTMethod method));
2.33 frystyk 124: </PRE>
125:
126: <H3>Valid Methods</H3>
2.16 luotonen 127:
2.33 frystyk 128: This functions searches the list of valid methods for a given anchor, see
129: <A HREF="HTAnchor.html">HTAnchor module</A> If the method is found it returns
130: YES else NO.
2.16 luotonen 131:
2.33 frystyk 132: <PRE>
2.40 frystyk 133: extern BOOL HTMethod_inList PARAMS((HTMethod method,
2.16 luotonen 134: HTList * list));
135: </PRE>
2.33 frystyk 136:
2.35 frystyk 137: <HR>
138: <EM>This section might be move to the Access Authentication Module</EM>
139:
2.36 frystyk 140: <H4>Match Template Against Filename</H4>
2.16 luotonen 141: <PRE>
2.40 frystyk 142: /* extern HTAA_templateMatch()
2.16 luotonen 143: ** STRING COMPARISON FUNCTION FOR FILE NAMES
144: ** WITH ONE WILDCARD * IN THE TEMPLATE
145: ** NOTE:
146: ** This is essentially the same code as in HTRules.c, but it
147: ** cannot be used because it is embedded in between other code.
148: ** (In fact, HTRules.c should use this routine, but then this
149: ** routine would have to be more sophisticated... why is life
150: ** sometimes so hard...)
151: **
152: ** ON ENTRY:
2.37 frystyk 153: ** tmplate is a template string to match the file name
2.16 luotonen 154: ** agaist, may contain a single wildcard
155: ** character * which matches zero or more
156: ** arbitrary characters.
157: ** filename is the filename (or pathname) to be matched
158: ** agaist the template.
159: **
160: ** ON EXIT:
161: ** returns YES, if filename matches the template.
162: ** NO, otherwise.
163: */
2.40 frystyk 164: extern BOOL HTAA_templateMatch PARAMS((CONST char * tmplate,
2.16 luotonen 165: CONST char * filename));
2.35 frystyk 166: </PRE>
2.16 luotonen 167:
2.35 frystyk 168: <HR>
2.16 luotonen 169:
2.35 frystyk 170: The following have to be defined
2.10 timbl 171: in advance of the other include files
172: because of circular references.
2.33 frystyk 173: <PRE>
174: typedef struct _HTRequest HTRequest;
2.39 frystyk 175: typedef struct _HTNetInfo HTNetInfo;
2.10 timbl 176:
2.14 luotonen 177: /*
2.39 frystyk 178: ** Callback to a protocol module
2.14 luotonen 179: */
2.39 frystyk 180: typedef int (*HTLoadCallBack) PARAMS((HTRequest * req));
2.14 luotonen 181:
2.10 timbl 182: #include "HTAnchor.h"
183: #include <A
184: NAME="z3" HREF="HTFormat.html">"HTFormat.h"</A>
2.15 luotonen 185: #include "HTAAUtil.h" /* HTAAScheme, HTAAFailReason */
2.14 luotonen 186: #include "HTAABrow.h" /* HTAASetup */
2.33 frystyk 187: </PRE>
2.10 timbl 188:
2.39 frystyk 189: <A NAME="Addresses"><H2>Default WWW Addresses</H2></A>
2.10 timbl 190:
2.33 frystyk 191: These control the home page selection. To mess with these for normal browses
2.6 timbl 192: is asking for user confusion.
2.33 frystyk 193: <PRE>
194: #define LOGICAL_DEFAULT "WWW_HOME" /* Defined to be the home page */
1.1 timbl 195:
2.6 timbl 196: #ifndef PERSONAL_DEFAULT
2.33 frystyk 197: #define PERSONAL_DEFAULT "WWW/default.html" /* in home directory */
2.6 timbl 198: #endif
2.33 frystyk 199:
2.6 timbl 200: #ifndef LOCAL_DEFAULT_FILE
1.1 timbl 201: #define LOCAL_DEFAULT_FILE "/usr/local/lib/WWW/default.html"
2.6 timbl 202: #endif
2.33 frystyk 203:
204: /* If one telnets to an access point it will look in this file for home page */
2.7 timbl 205: #ifndef REMOTE_POINTER
2.33 frystyk 206: #define REMOTE_POINTER "/etc/www-remote.url" /* can't be file */
2.7 timbl 207: #endif
2.33 frystyk 208:
2.7 timbl 209: /* and if that fails it will use this. */
2.6 timbl 210: #ifndef REMOTE_ADDRESS
2.33 frystyk 211: #define REMOTE_ADDRESS "http://info.cern.ch/remote.html" /* can't be file */
1.1 timbl 212: #endif
213:
2.33 frystyk 214: /* If run from telnet daemon and no -l specified, use this file: */
1.1 timbl 215: #ifndef DEFAULT_LOGFILE
216: #define DEFAULT_LOGFILE "/usr/adm/www-log/www-log"
217: #endif
218:
2.33 frystyk 219: /* If the home page isn't found, use this file: */
1.1 timbl 220: #ifndef LAST_RESORT
2.6 timbl 221: #define LAST_RESORT "http://info.cern.ch/default.html"
1.1 timbl 222: #endif
223:
2.33 frystyk 224: /* This is the default cache directory: */
2.23 frystyk 225: #ifndef CACHE_HOME_DIR
226: #define CACHE_HOME_DIR "/tmp/"
227: #endif
228:
2.33 frystyk 229: /* The default directory for "save locally" and "save and execute" files: */
2.23 frystyk 230: #ifndef SAVE_LOCALLY_HOME_DIR
231: #define SAVE_LOCALLY_HOME_DIR "/tmp/"
232: #endif
2.33 frystyk 233: </PRE>
2.10 timbl 234:
2.34 frystyk 235: <H2><A NAME="HTNetInfo">Protocol Specific Information</A></H2>
236:
237: This structure contains information about socket number, input buffer for
238: reading from the network etc. The structure is used through out the protocol
239: modules and is the refenrence point for introducing multi threaded execution
2.35 frystyk 240: into the library, see specifications on <A HREF="http://info.cern.ch/hypertext/WWW/Library/User/Multithread/multithread.html">Multiple Threads</A>.
2.34 frystyk 241:
242: <PRE>
2.39 frystyk 243: struct _HTNetInfo {
244: int sockfd; /* Socket descripter */
245: SockA sock_addr; /* SockA is defined in tcp.h */
2.36 frystyk 246: HTInputSocket * isoc; /* Input buffer */
2.39 frystyk 247: HTStream * target; /* Output stream */
248: HTChunk * transmit; /* Line to be send */
2.36 frystyk 249: int addressCount; /* Attempts if multi-homed host */
2.39 frystyk 250: time_t connecttime; /* Used on multihomed hosts */
2.36 frystyk 251: struct _HTRequest * request; /* Link back to request structure */
2.39 frystyk 252: };
2.34 frystyk 253: </PRE>
254:
2.36 frystyk 255: <EM><B>Note:</B> The AddressCount varaible is used to count the number
256: of attempt to connect to a multi-homed host so we know when to stop
257: trying new IP-addresses.</EM>
258:
2.9 timbl 259: <H2><A
260: NAME="z1">The Request structure</A></H2>When a request is handled, all kinds
261: of things about it need to be passed
262: along. These are all put into a
2.31 frystyk 263: HTRequest structure. <P>
264:
2.35 frystyk 265: <B>Note 1:</B> There is also a <A NAME="z4" HREF="HTFormat.html#z17">global list of converters</A> <P>
266: <B>Note 2:</B> If you reuse the request structure for more than one
2.33 frystyk 267: request then make sure that the request is re-initialized, so that no `old'
268: data is reused, see <A HREF="#z100">functions to manipulate HTRequest
269: Structure</A>. The library handles its own internal information from request
2.39 frystyk 270: to request but the information set by the caller is untouched. <P>
2.31 frystyk 271:
2.39 frystyk 272: The elements of the request structure are as follows.
273:
274: <PRE>
275: struct _HTRequest {
276: </PRE>
2.19 timbl 277:
278: <H3>Set by the caller of HTaccess:</H3>
279:
2.39 frystyk 280: <PRE>
281: <A HREF="#Methods">HTMethod</A> method;
282: </PRE>
283:
284: An enum used to specify the HTTP <A NAME="z7"
285: HREF="../../Protocols/HTTP/Methods.html">method</A> used. The default
286: value is <CODE>GET</CODE>
287:
288: <PRE>
289: HTList * conversions;
290: </PRE>
291:
292: NULL, or a list of conversions which the format manager can do in
293: order to fulfill the request. It typically points to a list set up an
294: initialisation time for example by <A HREF="HTInit.html">HTInit().</A>
295:
296: <PRE>
297: HTList * encodings;
298: </PRE>
299:
300: The list of encodings acceptable in the output stream.
301:
302: <PRE>
303: HTList * languages;
304: </PRE>
305:
306: The list of (human) language values acceptable in the response. The default
307: is all languages.
308:
309: <PRE>
310: BOOL (*<A NAME="z9"> callback</A> ) PARAMS((struct _HTRequest* request,
311: void *param));
312: </PRE>
313:
314: A function to be called back in the event that a file has been saved
315: to disk by HTSaveAndCallBack for example.
316:
317: <PRE>
318: void * context;
319: </PRE>
320:
321: An arbitrary pointer passed to HTAccess and passed back as a parameter
322: to the <A NAME="z10" HREF="#z9">callback</A> .
323:
324: <PRE>
325: HTStream* output_stream;
326: </PRE>
327:
328: The output stream to be used to put data down to as they come in from the
329: network. The default value is <CODE>NULL</CODE> which means that the stream
330: goes to the user (display).
331:
332: <PRE>
333: HTAtom * output_format;
334: </PRE>
335:
336: The output format of the stream. This can be used to get unconverted
337: data etc. from the library. If <CODE>NULL</CODE>, then WWW_PRESENT is
338: default value.
339:
340: <PRE>
2.43 ! frystyk 341: BOOL BlockingIO;
! 342: </PRE>
! 343:
! 344: This flag can be set to override if a protocol module is registered as
! 345: using non-blocking IO.
! 346:
! 347: <PRE>
2.39 frystyk 348: HTParentAnchor *parentAnchor;
349: </PRE>
350:
351: If this parameter is set then a `Referer: <parent address> is
352: generated in the request to the server, see <A
353: HREF="http://info.cern.ch/hypertext/WWW/Protocols/HTTP/HTRQ_Headers.html#z14">
354: Referer field in a HTTP Request</A>
355:
356: <H3>Set by HTAccess</H3>
357:
358: None of the bits below may be looked at by a client application except
359: in the callback routine, when the anchor may be picked out.
360:
361: <PRE>
362: HTParentAnchor* anchor;
363: </PRE>
364:
365: The anchor for the object in question. Set immediately by HTAcesss.
366: Used by the protocol and parsing modules. Valid thoughout the access.
367:
368: <PRE>
369: HTChildAnchor * childAnchor; /* For element within the object */
370: </PRE>
371:
372: The anchor for the sub object if any. The object builder should
373: ensure that htis is selected, highlighted, etc when the object is
374: loaded.
375:
376: <PRE>
377: void * using_cache;
378: </PRE>
379:
380: Pointer to cache element if cache hit
2.19 timbl 381:
2.25 luotonen 382: <H3>Error Diagnostics</H3>
383: <PRE>
2.30 frystyk 384: BOOL error_block; /* YES if stream has been used */
2.29 luotonen 385: HTList * error_stack; /* List of errors */
2.25 luotonen 386:
2.34 frystyk 387: </PRE>
388: <H3>Library Side</H3>
389: <PRE>
390: HTNetInfo * net_info; /* Information about socket etc. */
2.36 frystyk 391: int redirections; /* Number of redirections */
2.25 luotonen 392: </PRE>
2.39 frystyk 393:
394: <H3>Temporary until we get a good MIME parser</H3>
395: <PRE>
396: char * redirect; /* Location or URI */
397: char * WWWAAScheme; /* WWW-Authenticate scheme */
398: char * WWWAARealm; /* WWW-Authenticate realm */
399: char * WWWprotection; /* WWW-Protection-Template */
400: </PRE>
401:
2.21 luotonen 402: <H3>Server Side</H3>
403: <PRE>
404: HTAtom * content_type; /* Content-Type: */
2.18 luotonen 405: HTAtom * content_language;/* Language */
406: HTAtom * content_encoding;/* Encoding */
2.16 luotonen 407: int content_length; /* Content-Length: */
2.21 luotonen 408: HTInputSocket * isoc; /* InputSocket object for reading */
2.14 luotonen 409: char * authorization; /* Authorization: field */
410: HTAAScheme scheme; /* Authentication scheme used */
2.19 timbl 411: </PRE>
2.21 luotonen 412: <H3>Client Side</H3>
2.19 timbl 413: <PRE>
2.14 luotonen 414: HTList * valid_schemes; /* Valid auth.schemes */
415: HTAssocList ** scheme_specifics;/* Scheme-specific parameters */
2.39 frystyk 416: char * authenticate; /* WWW-authenticate: field */
2.14 luotonen 417: char * prot_template; /* WWW-Protection-Template: field */
418: HTAASetup * setup; /* Doc protection info */
419: HTAARealm * realm; /* Password realm */
420: char * dialog_msg; /* Authentication prompt (client) */
2.10 timbl 421: };
2.9 timbl 422:
2.31 frystyk 423: </PRE>
424:
425: <H2><A NAME="z100">Functions to Manipulate a HTRequest Structure</A></H2>
426:
427: Just to make things easier especially for clients, here are some functions to
428: manipulate the request structure:
429:
430: <H3>Create blank request</H3>This request has defaults in -- in
2.9 timbl 431: most cases it will need some information
432: added before being passed to HTAccess,
433: but it will work as is for a simple
434: request.
2.14 luotonen 435: <PRE>
2.40 frystyk 436: extern HTRequest * HTRequest_new NOPARAMS;
2.31 frystyk 437: </PRE>
2.14 luotonen 438:
2.31 frystyk 439: <H3>Delete request structure</H3>Frees also conversion list hanging
2.19 timbl 440: from req->conversions.
2.14 luotonen 441: <PRE>
2.40 frystyk 442: extern void HTRequest_delete PARAMS((HTRequest * req));
2.31 frystyk 443: </PRE>
1.1 timbl 444:
2.31 frystyk 445: <H3>Clear a request structure</H3>
446: Clears a request structure so that it can be reused. The only thing that differs from using free/new is that the list of conversions is kept.
447: <PRE>
448: extern void HTRequest_clear PARAMS((HTRequest * req));
449: </PRE>
2.9 timbl 450:
2.39 frystyk 451: <A NAME="LoadDoc"><H2>Functions for Loading a Document</H2></A>
452:
453: There are several different ways of loading a document. However, the
454: major difference between them is whether the document is referenced by
455:
456: <UL>
457: <LI><A HREF="#Relative">Relative URI</A>
458: <LI><A HREF="#Absolute">Absolute URI</A>
459: <LI><A HREF="#Anchor">Anchor element</A> or
460: <LI>Contains keywords for <A HREF="#RelSearch">searching an relative URI</A>
461: <LI>Contains keywords for <A HREF="#AbsSearch">searching an absolute URI</A>
462: </UL>
463:
464: <B>NOTE:</B> From release 3.0 of the Library, the return codes from
465: the loading functions are no mode <CODE>BOOL</CODE>, that is
466: <CODE>YES</CODE> or <CODE>NO</CODE>. Insted they have been replaced
467: with the following set of return codes defined in the <A
468: HREF="HTUtils.html#ReturnCodes">Utility module</A>:
469:
2.5 timbl 470: <DL>
2.39 frystyk 471: <DT>HT_WOULD_BLOCK
472: <DD>An I/O operation would block
473:
474: <DT>HT_ERROR
475: <DD>Error has occured
476:
477: <DT>HT_LOADED
478: <DD>Success
479:
480: <DT>HT_NO_DATA
481: <DD>Success, but no document loaded. This might be the situation when a
482: telnet sesssion is started etc.
2.5 timbl 483: </DL>
484:
2.39 frystyk 485: However, a general rule about the return codes is that <B>ERRORS</B>
486: have a <EM>negative</EM> value whereas <B>SUCCESS</B> has a
487: <EM>positive</EM> value. <P>
1.1 timbl 488:
2.39 frystyk 489: There are also some functions to help the client getting started with
490: <A HREF="#ClientHelp">the first URI</A>.
1.1 timbl 491:
2.39 frystyk 492: <A NAME="Relative"><H3>Load a document from relative name</H3></A>
1.1 timbl 493:
2.39 frystyk 494: <PRE>
495: extern int HTLoadRelative PARAMS((CONST char * relative_name,
496: HTParentAnchor* here,
497: HTRequest * request));
2.5 timbl 498: </PRE>
2.39 frystyk 499:
500: <A NAME="Absolute"></A><H3>Load a document from absolute name</H3>
1.1 timbl 501:
2.5 timbl 502: <PRE>
2.39 frystyk 503: extern int HTLoadAbsolute PARAMS((CONST char * addr,
504: HTRequest * request));
2.5 timbl 505: </PRE>
2.39 frystyk 506:
507: <H3>Load a document from absolute name to a stream</H3>
508:
2.5 timbl 509: <PRE>
2.39 frystyk 510: extern int HTLoadToStream PARAMS((CONST char * addr,
511: BOOL filter,
512: HTRequest * request));
2.5 timbl 513: </PRE>
1.1 timbl 514:
2.39 frystyk 515: <A NAME="Anchor"><H3>Load if necessary, and select an anchor</H3></A>
1.1 timbl 516:
2.39 frystyk 517: The anchor parameter may be a child anchor. The anchor in the request
518: is set to the parent anchor. The recursive function keeps the error
519: stack in the request structure so that no information is lost having
520: more than one call. See also <A HREF="#BindAnchor">HTBindAnchor()</A>.
1.1 timbl 521:
2.39 frystyk 522: <PRE>
2.41 frystyk 523: extern int HTLoadAnchor PARAMS((HTAnchor * a,
524: HTRequest * request));
2.39 frystyk 525: extern int HTLoadAnchorRecursive PARAMS((HTAnchor * a,
526: HTRequest * request));
2.5 timbl 527: </PRE>
528:
2.39 frystyk 529: <H3>Load a Document</H3>
530:
2.41 frystyk 531: These are two internal routines fro loading a document which has an
532: address AND a matching anchor. (The public routines are called with
533: one OR the other.) This is recursively called from file load module
534: to try ftp (though this will be obsolete in the next major
535: release).<P>
1.1 timbl 536:
2.39 frystyk 537: If <CODE>keep_error_stack</CODE> is YES then the error (or info) stack
538: is not cleared from the previous call.
1.1 timbl 539:
2.39 frystyk 540: <PRE>
2.41 frystyk 541: extern int HTLoad PARAMS((HTRequest * request,
542: BOOL keep_error_stack));
543: </PRE>
544:
545: <PRE>
546: extern BOOL HTLoadTerminate PARAMS((HTRequest * request, int status));
2.5 timbl 547: </PRE>
548:
2.39 frystyk 549: <A NAME="RelSearch"><H3>Search Using Relative URI</H3></A>
550:
551: Performs a search on word given by the user. Adds the search words to
552: the end of the current address and attempts to open the new address.
553:
2.5 timbl 554: <PRE>
2.39 frystyk 555: extern int HTSearch PARAMS((CONST char * keywords,
556: HTParentAnchor* here,
557: HTRequest * request));
2.5 timbl 558: </PRE>
2.39 frystyk 559:
560: <A NAME="AbsSearch"><H3>Search using Absolute URI</H3></A>
561:
562: Performs a keyword search on word given by the user. Adds the keyword
563: to the end of the current address and attempts to open the new
564: address.
2.5 timbl 565:
2.33 frystyk 566: <PRE>
2.40 frystyk 567: extern int HTSearchAbsolute PARAMS((CONST char * keywords,
2.39 frystyk 568: CONST char * indexname,
569: HTRequest * request));
2.5 timbl 570: </PRE>
2.24 luotonen 571:
2.39 frystyk 572:
573: <A NAME="ClientHelp"><H2>Help Function for Clients to get started</H2></A>
574:
575: These function helps the client to load the first document. They are
576: not mandatory to use - but they make life easier!
577:
578: <A NAME="BindAnchor"><H3>Bind an anchor to a request structure without
579: loading</H3></A>
2.24 luotonen 580:
581: <PRE>
2.39 frystyk 582: extern BOOL HTBindAnchor PARAMS((HTAnchor *anchor, HTRequest *request));
2.24 luotonen 583: </PRE>
584:
2.39 frystyk 585: <A NAME="HomePage"><H3>Generate the Anchor for the Home Page</H3></A>
2.24 luotonen 586:
2.39 frystyk 587: As it involves file access, this should only be done once when the
588: program first runs. This is a default algorithm using the
589: <CODE>WWW_HOME</CODE> environment variable.
2.20 frystyk 590:
591: <PRE>
2.40 frystyk 592: extern HTParentAnchor * HTHomeAnchor NOPARAMS;
2.39 frystyk 593: </PRE>
594:
595: <H3>Find Related Name</H3>
596:
597: Creates a local file URI that can be used as a relative name when
598: calling HTParse() to expand a relative file name to an absolute
599: one. <P>
600:
601: The code for this routine originates from the Linemode browser and was
602: moved here by howcome@dxcern.cern.ch in order for all clients to take
603: advantage. <P>
604:
2.20 frystyk 605: <PRE>
2.39 frystyk 606: extern char * HTFindRelatedName NOPARAMS;
607: </PRE>
608:
609: <A NAME="PostDoc"><H2>Functions for Posting a Document</H2></A>
610:
611: This is not quite finished yet but more to come!
2.20 frystyk 612:
2.39 frystyk 613: <H3>Get a Save Stream</H3>
2.20 frystyk 614:
2.39 frystyk 615: <H4>On Entry,</H4>
2.5 timbl 616: <DL>
2.9 timbl 617: <DT>request->anchor
618: <DD> is valid anchor which
619: has previously beeing loaded
2.5 timbl 620: </DL>
621:
2.39 frystyk 622: <H4>On exit,</H4>
2.5 timbl 623: <DL>
624: <DT>returns
2.6 timbl 625: <DD> 0 if error else a stream
626: to save the object to.
2.5 timbl 627: </DL>
628:
629: <PRE>
2.40 frystyk 630: extern HTStream * HTSaveStream PARAMS((HTRequest * request));
2.39 frystyk 631: </PRE>
2.5 timbl 632:
1.1 timbl 633:
2.39 frystyk 634: <A NAME="ProtReg"><H2>Access Method Registration</H2></A>
1.1 timbl 635:
2.39 frystyk 636: An access method is defined by an HTProtocol structure which point to
637: the routines for performing the various logical operations on an
638: object: in HTTP terms, GET, PUT, and POST. The access methods
639: supported in the Library are initiated automaticly using the private
640: function <CODE>HTAccessInit()</CODE> <B>if not</B> defined
641: <CODE>NO_INIT</CODE> <P>
642:
643: Each of these routine takes as a parameter a <A NAME="z2"
644: HREF="#z1">request structure</A> containing details of the request.
645: When the protocol class routine is called, the anchor element in the
646: request is already valid (made valid by HTAccess).
647:
648: <PRE>
649: typedef enum _HTSocBlock {
650: SOC_BLOCK,
2.42 frystyk 651: SOC_NON_BLOCK
2.39 frystyk 652: } HTSocBlock;
653:
654: typedef struct _HTProtocol {
655: char * name;
656: HTSocBlock block;
657: int (*load) PARAMS((HTRequest * request));
658: HTStream* (*saveStream) PARAMS((HTRequest * request));
659: HTStream* (*postStream) PARAMS((HTRequest * request,
660: HTParentAnchor* postTo));
661: } HTProtocol;
1.1 timbl 662:
2.40 frystyk 663: extern BOOL HTRegisterProtocol PARAMS((HTProtocol * protocol));
2.42 frystyk 664: extern void HTDisposeProtocols NOPARAMS;
2.5 timbl 665: </PRE>
1.1 timbl 666:
2.39 frystyk 667: <H3>Uses Protocol Blocking IO</H3>
1.1 timbl 668:
2.39 frystyk 669: A small function to make life easier. Returns <CODE>YES</CODE> or
2.42 frystyk 670: <CODE>NO</CODE>. If the Library is run in NON-INTERACTIVE MODE then
671: the function always returns YES;
2.38 howcome 672:
673: <PRE>
2.40 frystyk 674: extern BOOL HTProtocolBlocking PARAMS((HTRequest * request));
2.38 howcome 675: </PRE>
676:
2.39 frystyk 677: end
2.25 luotonen 678:
679: <PRE>
1.1 timbl 680: #endif /* HTACCESS_H */
2.25 luotonen 681: </PRE>
682: end of HTAccess
683: </BODY>
2.9 timbl 684: </HTML>
Webmaster