Annotation of libwww/Library/src/HTAccess.html, revision 2.43.2.1
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:
2.43.2.1! frystyk 237: This structure contains information about socket number, input buffer
! 238: for reading from the network etc. The structure is used through out
! 239: the protocol modules and is the refenrence point for introducing multi
! 240: threaded execution into the library, see specifications on <A
! 241: HREF="http://info.cern.ch/hypertext/WWW/Library/User/Features/multithread.html">Multiple
! 242: Threads</A>.
2.34 frystyk 243:
244: <PRE>
2.39 frystyk 245: struct _HTNetInfo {
246: int sockfd; /* Socket descripter */
247: SockA sock_addr; /* SockA is defined in tcp.h */
2.36 frystyk 248: HTInputSocket * isoc; /* Input buffer */
2.39 frystyk 249: HTStream * target; /* Output stream */
250: HTChunk * transmit; /* Line to be send */
2.36 frystyk 251: int addressCount; /* Attempts if multi-homed host */
2.39 frystyk 252: time_t connecttime; /* Used on multihomed hosts */
2.36 frystyk 253: struct _HTRequest * request; /* Link back to request structure */
2.39 frystyk 254: };
2.34 frystyk 255: </PRE>
256:
2.36 frystyk 257: <EM><B>Note:</B> The AddressCount varaible is used to count the number
258: of attempt to connect to a multi-homed host so we know when to stop
259: trying new IP-addresses.</EM>
260:
2.9 timbl 261: <H2><A
262: NAME="z1">The Request structure</A></H2>When a request is handled, all kinds
263: of things about it need to be passed
264: along. These are all put into a
2.31 frystyk 265: HTRequest structure. <P>
266:
2.35 frystyk 267: <B>Note 1:</B> There is also a <A NAME="z4" HREF="HTFormat.html#z17">global list of converters</A> <P>
268: <B>Note 2:</B> If you reuse the request structure for more than one
2.33 frystyk 269: request then make sure that the request is re-initialized, so that no `old'
270: data is reused, see <A HREF="#z100">functions to manipulate HTRequest
271: Structure</A>. The library handles its own internal information from request
2.39 frystyk 272: to request but the information set by the caller is untouched. <P>
2.31 frystyk 273:
2.39 frystyk 274: The elements of the request structure are as follows.
275:
276: <PRE>
277: struct _HTRequest {
278: </PRE>
2.19 timbl 279:
280: <H3>Set by the caller of HTaccess:</H3>
281:
2.39 frystyk 282: <PRE>
283: <A HREF="#Methods">HTMethod</A> method;
284: </PRE>
285:
286: An enum used to specify the HTTP <A NAME="z7"
287: HREF="../../Protocols/HTTP/Methods.html">method</A> used. The default
288: value is <CODE>GET</CODE>
289:
290: <PRE>
291: HTList * conversions;
292: </PRE>
293:
294: NULL, or a list of conversions which the format manager can do in
295: order to fulfill the request. It typically points to a list set up an
296: initialisation time for example by <A HREF="HTInit.html">HTInit().</A>
297:
298: <PRE>
299: HTList * encodings;
300: </PRE>
301:
302: The list of encodings acceptable in the output stream.
303:
304: <PRE>
305: HTList * languages;
306: </PRE>
307:
308: The list of (human) language values acceptable in the response. The default
309: is all languages.
310:
311: <PRE>
312: BOOL (*<A NAME="z9"> callback</A> ) PARAMS((struct _HTRequest* request,
313: void *param));
314: </PRE>
315:
316: A function to be called back in the event that a file has been saved
317: to disk by HTSaveAndCallBack for example.
318:
319: <PRE>
320: void * context;
321: </PRE>
322:
323: An arbitrary pointer passed to HTAccess and passed back as a parameter
324: to the <A NAME="z10" HREF="#z9">callback</A> .
325:
326: <PRE>
327: HTStream* output_stream;
328: </PRE>
329:
330: The output stream to be used to put data down to as they come in from the
331: network. The default value is <CODE>NULL</CODE> which means that the stream
332: goes to the user (display).
2.43.2.1! frystyk 333:
! 334: <PRE>
! 335: HTStream* output_flush;
! 336: </PRE>
! 337:
! 338: All object bodies sent from the server with status codes different
! 339: from <CODE>200 OK</CODE> will be put down this stream. This can be
! 340: used as a debug window etc. If the value is NULL (default) then the
! 341: stream used is <A HREF="HTFormat.html#BlackHole">HTBlackHole</A>.
2.39 frystyk 342:
343: <PRE>
344: HTAtom * output_format;
345: </PRE>
346:
347: The output format of the stream. This can be used to get unconverted
348: data etc. from the library. If <CODE>NULL</CODE>, then WWW_PRESENT is
349: default value.
350:
351: <PRE>
2.43 frystyk 352: BOOL BlockingIO;
353: </PRE>
354:
355: This flag can be set to override if a protocol module is registered as
356: using non-blocking IO.
357:
358: <PRE>
2.39 frystyk 359: HTParentAnchor *parentAnchor;
360: </PRE>
361:
362: If this parameter is set then a `Referer: <parent address> is
363: generated in the request to the server, see <A
364: HREF="http://info.cern.ch/hypertext/WWW/Protocols/HTTP/HTRQ_Headers.html#z14">
365: Referer field in a HTTP Request</A>
366:
367: <H3>Set by HTAccess</H3>
368:
369: None of the bits below may be looked at by a client application except
370: in the callback routine, when the anchor may be picked out.
371:
372: <PRE>
373: HTParentAnchor* anchor;
374: </PRE>
375:
376: The anchor for the object in question. Set immediately by HTAcesss.
377: Used by the protocol and parsing modules. Valid thoughout the access.
378:
379: <PRE>
380: HTChildAnchor * childAnchor; /* For element within the object */
381: </PRE>
382:
383: The anchor for the sub object if any. The object builder should
384: ensure that htis is selected, highlighted, etc when the object is
385: loaded.
386:
387: <PRE>
388: void * using_cache;
389: </PRE>
390:
391: Pointer to cache element if cache hit
2.19 timbl 392:
2.25 luotonen 393: <H3>Error Diagnostics</H3>
394: <PRE>
2.30 frystyk 395: BOOL error_block; /* YES if stream has been used */
2.29 luotonen 396: HTList * error_stack; /* List of errors */
2.25 luotonen 397:
2.34 frystyk 398: </PRE>
399: <H3>Library Side</H3>
400: <PRE>
401: HTNetInfo * net_info; /* Information about socket etc. */
2.36 frystyk 402: int redirections; /* Number of redirections */
2.25 luotonen 403: </PRE>
2.39 frystyk 404:
405: <H3>Temporary until we get a good MIME parser</H3>
406: <PRE>
407: char * redirect; /* Location or URI */
408: char * WWWAAScheme; /* WWW-Authenticate scheme */
409: char * WWWAARealm; /* WWW-Authenticate realm */
410: char * WWWprotection; /* WWW-Protection-Template */
411: </PRE>
412:
2.21 luotonen 413: <H3>Server Side</H3>
414: <PRE>
415: HTAtom * content_type; /* Content-Type: */
2.18 luotonen 416: HTAtom * content_language;/* Language */
417: HTAtom * content_encoding;/* Encoding */
2.16 luotonen 418: int content_length; /* Content-Length: */
2.21 luotonen 419: HTInputSocket * isoc; /* InputSocket object for reading */
2.14 luotonen 420: char * authorization; /* Authorization: field */
421: HTAAScheme scheme; /* Authentication scheme used */
2.19 timbl 422: </PRE>
2.21 luotonen 423: <H3>Client Side</H3>
2.19 timbl 424: <PRE>
2.14 luotonen 425: HTList * valid_schemes; /* Valid auth.schemes */
426: HTAssocList ** scheme_specifics;/* Scheme-specific parameters */
2.39 frystyk 427: char * authenticate; /* WWW-authenticate: field */
2.14 luotonen 428: char * prot_template; /* WWW-Protection-Template: field */
429: HTAASetup * setup; /* Doc protection info */
430: HTAARealm * realm; /* Password realm */
431: char * dialog_msg; /* Authentication prompt (client) */
2.10 timbl 432: };
2.9 timbl 433:
2.31 frystyk 434: </PRE>
435:
436: <H2><A NAME="z100">Functions to Manipulate a HTRequest Structure</A></H2>
437:
438: Just to make things easier especially for clients, here are some functions to
439: manipulate the request structure:
440:
441: <H3>Create blank request</H3>This request has defaults in -- in
2.9 timbl 442: most cases it will need some information
443: added before being passed to HTAccess,
444: but it will work as is for a simple
445: request.
2.14 luotonen 446: <PRE>
2.40 frystyk 447: extern HTRequest * HTRequest_new NOPARAMS;
2.31 frystyk 448: </PRE>
2.14 luotonen 449:
2.31 frystyk 450: <H3>Delete request structure</H3>Frees also conversion list hanging
2.19 timbl 451: from req->conversions.
2.14 luotonen 452: <PRE>
2.40 frystyk 453: extern void HTRequest_delete PARAMS((HTRequest * req));
2.31 frystyk 454: </PRE>
1.1 timbl 455:
2.31 frystyk 456: <H3>Clear a request structure</H3>
457: 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.
458: <PRE>
459: extern void HTRequest_clear PARAMS((HTRequest * req));
460: </PRE>
2.9 timbl 461:
2.39 frystyk 462: <A NAME="LoadDoc"><H2>Functions for Loading a Document</H2></A>
463:
464: There are several different ways of loading a document. However, the
465: major difference between them is whether the document is referenced by
466:
467: <UL>
468: <LI><A HREF="#Relative">Relative URI</A>
469: <LI><A HREF="#Absolute">Absolute URI</A>
470: <LI><A HREF="#Anchor">Anchor element</A> or
471: <LI>Contains keywords for <A HREF="#RelSearch">searching an relative URI</A>
472: <LI>Contains keywords for <A HREF="#AbsSearch">searching an absolute URI</A>
473: </UL>
474:
475: <B>NOTE:</B> From release 3.0 of the Library, the return codes from
476: the loading functions are no mode <CODE>BOOL</CODE>, that is
477: <CODE>YES</CODE> or <CODE>NO</CODE>. Insted they have been replaced
478: with the following set of return codes defined in the <A
479: HREF="HTUtils.html#ReturnCodes">Utility module</A>:
480:
2.5 timbl 481: <DL>
2.39 frystyk 482: <DT>HT_WOULD_BLOCK
483: <DD>An I/O operation would block
484:
485: <DT>HT_ERROR
486: <DD>Error has occured
487:
488: <DT>HT_LOADED
489: <DD>Success
490:
491: <DT>HT_NO_DATA
492: <DD>Success, but no document loaded. This might be the situation when a
493: telnet sesssion is started etc.
2.5 timbl 494: </DL>
495:
2.39 frystyk 496: However, a general rule about the return codes is that <B>ERRORS</B>
497: have a <EM>negative</EM> value whereas <B>SUCCESS</B> has a
498: <EM>positive</EM> value. <P>
1.1 timbl 499:
2.39 frystyk 500: There are also some functions to help the client getting started with
501: <A HREF="#ClientHelp">the first URI</A>.
1.1 timbl 502:
2.39 frystyk 503: <A NAME="Relative"><H3>Load a document from relative name</H3></A>
1.1 timbl 504:
2.39 frystyk 505: <PRE>
506: extern int HTLoadRelative PARAMS((CONST char * relative_name,
507: HTParentAnchor* here,
508: HTRequest * request));
2.5 timbl 509: </PRE>
2.39 frystyk 510:
511: <A NAME="Absolute"></A><H3>Load a document from absolute name</H3>
1.1 timbl 512:
2.5 timbl 513: <PRE>
2.39 frystyk 514: extern int HTLoadAbsolute PARAMS((CONST char * addr,
515: HTRequest * request));
2.5 timbl 516: </PRE>
2.39 frystyk 517:
518: <H3>Load a document from absolute name to a stream</H3>
519:
2.5 timbl 520: <PRE>
2.39 frystyk 521: extern int HTLoadToStream PARAMS((CONST char * addr,
522: BOOL filter,
523: HTRequest * request));
2.5 timbl 524: </PRE>
1.1 timbl 525:
2.39 frystyk 526: <A NAME="Anchor"><H3>Load if necessary, and select an anchor</H3></A>
1.1 timbl 527:
2.39 frystyk 528: The anchor parameter may be a child anchor. The anchor in the request
529: is set to the parent anchor. The recursive function keeps the error
530: stack in the request structure so that no information is lost having
531: more than one call. See also <A HREF="#BindAnchor">HTBindAnchor()</A>.
1.1 timbl 532:
2.39 frystyk 533: <PRE>
2.41 frystyk 534: extern int HTLoadAnchor PARAMS((HTAnchor * a,
535: HTRequest * request));
2.39 frystyk 536: extern int HTLoadAnchorRecursive PARAMS((HTAnchor * a,
537: HTRequest * request));
2.5 timbl 538: </PRE>
539:
2.39 frystyk 540: <H3>Load a Document</H3>
541:
2.41 frystyk 542: These are two internal routines fro loading a document which has an
543: address AND a matching anchor. (The public routines are called with
544: one OR the other.) This is recursively called from file load module
545: to try ftp (though this will be obsolete in the next major
546: release).<P>
1.1 timbl 547:
2.39 frystyk 548: If <CODE>keep_error_stack</CODE> is YES then the error (or info) stack
549: is not cleared from the previous call.
1.1 timbl 550:
2.39 frystyk 551: <PRE>
2.41 frystyk 552: extern int HTLoad PARAMS((HTRequest * request,
553: BOOL keep_error_stack));
554: </PRE>
555:
556: <PRE>
557: extern BOOL HTLoadTerminate PARAMS((HTRequest * request, int status));
2.5 timbl 558: </PRE>
559:
2.39 frystyk 560: <A NAME="RelSearch"><H3>Search Using Relative URI</H3></A>
561:
562: Performs a search on word given by the user. Adds the search words to
563: the end of the current address and attempts to open the new address.
564:
2.5 timbl 565: <PRE>
2.39 frystyk 566: extern int HTSearch PARAMS((CONST char * keywords,
567: HTParentAnchor* here,
568: HTRequest * request));
2.5 timbl 569: </PRE>
2.39 frystyk 570:
571: <A NAME="AbsSearch"><H3>Search using Absolute URI</H3></A>
572:
573: Performs a keyword search on word given by the user. Adds the keyword
574: to the end of the current address and attempts to open the new
575: address.
2.5 timbl 576:
2.33 frystyk 577: <PRE>
2.40 frystyk 578: extern int HTSearchAbsolute PARAMS((CONST char * keywords,
2.39 frystyk 579: CONST char * indexname,
580: HTRequest * request));
2.5 timbl 581: </PRE>
2.24 luotonen 582:
2.39 frystyk 583:
584: <A NAME="ClientHelp"><H2>Help Function for Clients to get started</H2></A>
585:
586: These function helps the client to load the first document. They are
587: not mandatory to use - but they make life easier!
588:
589: <A NAME="BindAnchor"><H3>Bind an anchor to a request structure without
590: loading</H3></A>
2.24 luotonen 591:
592: <PRE>
2.39 frystyk 593: extern BOOL HTBindAnchor PARAMS((HTAnchor *anchor, HTRequest *request));
2.24 luotonen 594: </PRE>
595:
2.39 frystyk 596: <A NAME="HomePage"><H3>Generate the Anchor for the Home Page</H3></A>
2.24 luotonen 597:
2.39 frystyk 598: As it involves file access, this should only be done once when the
599: program first runs. This is a default algorithm using the
600: <CODE>WWW_HOME</CODE> environment variable.
2.20 frystyk 601:
602: <PRE>
2.40 frystyk 603: extern HTParentAnchor * HTHomeAnchor NOPARAMS;
2.39 frystyk 604: </PRE>
605:
606: <H3>Find Related Name</H3>
607:
608: Creates a local file URI that can be used as a relative name when
609: calling HTParse() to expand a relative file name to an absolute
610: one. <P>
611:
612: The code for this routine originates from the Linemode browser and was
613: moved here by howcome@dxcern.cern.ch in order for all clients to take
614: advantage. <P>
615:
2.20 frystyk 616: <PRE>
2.39 frystyk 617: extern char * HTFindRelatedName NOPARAMS;
618: </PRE>
619:
620: <A NAME="PostDoc"><H2>Functions for Posting a Document</H2></A>
621:
622: This is not quite finished yet but more to come!
2.20 frystyk 623:
2.39 frystyk 624: <H3>Get a Save Stream</H3>
2.20 frystyk 625:
2.39 frystyk 626: <H4>On Entry,</H4>
2.5 timbl 627: <DL>
2.9 timbl 628: <DT>request->anchor
629: <DD> is valid anchor which
630: has previously beeing loaded
2.5 timbl 631: </DL>
632:
2.39 frystyk 633: <H4>On exit,</H4>
2.5 timbl 634: <DL>
635: <DT>returns
2.6 timbl 636: <DD> 0 if error else a stream
637: to save the object to.
2.5 timbl 638: </DL>
639:
640: <PRE>
2.40 frystyk 641: extern HTStream * HTSaveStream PARAMS((HTRequest * request));
2.39 frystyk 642: </PRE>
2.5 timbl 643:
1.1 timbl 644:
2.39 frystyk 645: <A NAME="ProtReg"><H2>Access Method Registration</H2></A>
1.1 timbl 646:
2.39 frystyk 647: An access method is defined by an HTProtocol structure which point to
648: the routines for performing the various logical operations on an
649: object: in HTTP terms, GET, PUT, and POST. The access methods
650: supported in the Library are initiated automaticly using the private
651: function <CODE>HTAccessInit()</CODE> <B>if not</B> defined
652: <CODE>NO_INIT</CODE> <P>
653:
654: Each of these routine takes as a parameter a <A NAME="z2"
655: HREF="#z1">request structure</A> containing details of the request.
656: When the protocol class routine is called, the anchor element in the
657: request is already valid (made valid by HTAccess).
658:
659: <PRE>
660: typedef enum _HTSocBlock {
661: SOC_BLOCK,
2.42 frystyk 662: SOC_NON_BLOCK
2.39 frystyk 663: } HTSocBlock;
664:
665: typedef struct _HTProtocol {
666: char * name;
667: HTSocBlock block;
668: int (*load) PARAMS((HTRequest * request));
669: HTStream* (*saveStream) PARAMS((HTRequest * request));
670: HTStream* (*postStream) PARAMS((HTRequest * request,
671: HTParentAnchor* postTo));
672: } HTProtocol;
1.1 timbl 673:
2.40 frystyk 674: extern BOOL HTRegisterProtocol PARAMS((HTProtocol * protocol));
2.42 frystyk 675: extern void HTDisposeProtocols NOPARAMS;
2.5 timbl 676: </PRE>
1.1 timbl 677:
2.39 frystyk 678: <H3>Uses Protocol Blocking IO</H3>
1.1 timbl 679:
2.39 frystyk 680: A small function to make life easier. Returns <CODE>YES</CODE> or
2.42 frystyk 681: <CODE>NO</CODE>. If the Library is run in NON-INTERACTIVE MODE then
682: the function always returns YES;
2.38 howcome 683:
684: <PRE>
2.40 frystyk 685: extern BOOL HTProtocolBlocking PARAMS((HTRequest * request));
2.38 howcome 686: </PRE>
687:
2.39 frystyk 688: end
2.25 luotonen 689:
690: <PRE>
1.1 timbl 691: #endif /* HTACCESS_H */
2.25 luotonen 692: </PRE>
693: end of HTAccess
694: </BODY>
2.9 timbl 695: </HTML>
Webmaster