Annotation of libwww/Library/src/HTHeader.c, revision 2.4
2.1 frystyk 1: /* HTHeader.c
2: ** EXTRA HEADER MANAGER
3: **
4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
6: **
7: ** HISTORY:
8: ** 2 Nov 95 HFN Written on a rainy night
9: */
10:
11: /* Library Include files */
12: #include "tcp.h"
13: #include "HTUtils.h"
14: #include "HTString.h"
15: #include "HTParse.h"
16: #include "HTString.h"
17: #include "HTReq.h"
18: #include "HTHeader.h" /* Implemented here */
19:
20: typedef struct _HTParser {
21: char * token;
22: BOOL case_sensitive;
23: HTParserCallback *Pcbf;
24: } HTParser;
25:
26: PRIVATE HTList * HTParsers = NULL;
27: PRIVATE HTList * HTGenerators = NULL;
28:
29: /* --------------------------------------------------------------------------*/
30:
31: /*
32: ** Register a Header parser to be called
33: ** Tokens can contain a wildcard '*' which will match zero or more
34: ** arbritary chars.
35: */
36: PUBLIC BOOL HTParser_add (HTList * parsers,
37: CONST char * token,
38: BOOL case_sensitive,
39: HTParserCallback * callback)
40: {
41: if (token && callback) {
42: HTParser *me = (HTParser *) calloc(1, sizeof(HTParser));
43: if (me == NULL) outofmem(__FILE__, "HTParser_add");
44: StrAllocCopy(me->token, token);
45: me->case_sensitive = case_sensitive;
46: me->Pcbf = callback;
47: return HTList_addObject(parsers, (void *) me);
48: }
49: return NO;
50: }
51:
52: /*
53: ** Unregister a Header parser
54: */
55: PUBLIC BOOL HTParser_delete (HTList * parsers, CONST char * token)
56: {
57: if (parsers) {
58: HTList *cur = parsers;
59: HTParser *pres;
60: while ((pres = (HTParser *) HTList_nextObject(cur))) {
61: if (!strcmp(pres->token, token)) {
62: FREE(pres->token);
63: return HTList_removeObject(parsers, (void *) pres);
64: }
65: }
66: }
67: return NO;
68: }
69:
70: /*
71: ** Delete the list of registered header parsers.
72: */
73: PUBLIC BOOL HTParser_deleteAll (HTList * parsers)
74: {
75: if (parsers) {
76: HTList *cur = parsers;
77: HTParser *pres;
78: while ((pres = (HTParser *) HTList_nextObject(cur))) {
79: FREE(pres->token);
80: free(pres);
81: }
82: HTList_delete(parsers);
83: parsers = NULL;
84: return YES;
85: }
86: return NO;
87: }
88:
89: /*
90: ** Search registered parsers to find suitable one for this token
91: ** If a parser isn't found, the function returns NULL
92: */
93: PUBLIC HTParserCallback * HTParser_find (HTList *parsers, CONST char * token)
94: {
95: HTList * cur = parsers;
96: HTParser * pres;
97: if (token && cur) {
98: while ((pres = (HTParser *) HTList_nextObject(cur))) {
2.3 frystyk 99: char *match = pres->case_sensitive ?
2.2 frystyk 100: HTStrCaseMatch(pres->token, token) :
101: HTStrMatch(pres->token, token);
2.1 frystyk 102: if (match) return pres->Pcbf;
103: }
104: }
105: return NULL;
106: }
107:
108: /*
109: ** Register a Header generator to be called when we make request
110: */
111: PUBLIC BOOL HTGenerator_add (HTList * gens, HTPostCallback * callback)
112: {
113: return callback ? HTList_addObject(gens, (void *) callback) : NO;
114: }
115:
116: /*
117: ** Unregister a Header generator
118: */
119: PUBLIC BOOL HTGenerator_delete (HTList * gens, HTPostCallback * callback)
120: {
121: return callback ? HTList_removeObject(gens, (void *) callback) : NO;
122: }
123:
124: /*
125: ** Delete the list of registered header generators.
126: */
127: PUBLIC BOOL HTGenerator_deleteAll (HTList * gens)
128: {
129: return HTList_delete(gens);
130: }
131:
132: /* ------------------------------------------------------------------------- */
133: /* GLOBAL LIST OF PARSERS AND GENERATORS */
134: /* ------------------------------------------------------------------------- */
135:
136: /*
137: ** Global List of parsers. list can be NULL
138: */
139: PUBLIC void HTHeader_setParser (HTList * list)
140: {
141: HTParsers = list;
142: }
143:
144: PUBLIC HTList * HTHeader_parser (void)
145: {
146: return HTParsers;
147: }
148:
2.4 ! frystyk 149: PUBLIC BOOL HTHeader_addParser (CONST char * token, BOOL case_sensitive,
! 150: HTParserCallback * callback)
! 151: {
! 152: if (!HTParsers) HTParsers = HTList_new();
! 153: return HTParser_add(HTParsers, token, case_sensitive, callback);
! 154: }
! 155:
2.1 frystyk 156: /*
157: ** Global List of header generators. list can be NULL
158: */
159: PUBLIC void HTHeader_setGenerator (HTList * list)
160: {
161: HTGenerators = list;
162: }
163:
164: PUBLIC HTList * HTHeader_generator (void)
165: {
166: return HTGenerators;
2.4 ! frystyk 167: }
! 168:
! 169: PUBLIC BOOL HTHeader_addGenerator (CONST char * token, BOOL case_sensitive,
! 170: HTParserCallback * callback)
! 171: {
! 172: if (!HTGenerators) HTGenerators = HTList_new();
! 173: return HTParser_add(HTGenerators, token, case_sensitive, callback);
2.1 frystyk 174: }
175:
176: /*
177: ** Convenience function to clean up
178: */
179: PUBLIC void HTHeader_deleteAll (void)
180: {
181: if (HTParsers) {
182: HTParser_deleteAll(HTParsers);
183: HTParsers = NULL;
184: }
185: if (HTGenerators) {
186: HTGenerator_deleteAll(HTGenerators);
187: HTGenerators = NULL;
188: }
189: }
Webmaster