HTHeader.c
上传用户:zlh9724
上传日期:2007-01-04
资源大小:1991k
文件大小:5k
源码类别:

浏览器

开发平台:

Unix_Linux

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