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

浏览器

开发平台:

Unix_Linux

  1. /*       HTTPRes.c
  2. ** HTTP RESPONSE GENERATION
  3. **
  4. ** This module implements the output stream for HTTP used for sending
  5. ** responces with or without a entity body. It is the server equivalent
  6. ** to the HTTPReq module
  7. **
  8. ** History:
  9. ** Dec 95 HFN Written from scratch
  10. */
  11. /* Library Includes */
  12. #include "tcp.h"
  13. #include "HTUtils.h"
  14. #include "HTString.h"
  15. #include "HTWWWStr.h"
  16. #include "HTAccess.h"
  17. #include "HTWriter.h"
  18. #include "HTError.h"
  19. #include "HTFWrite.h"
  20. #include "HTEvntrg.h"
  21. #include "HTNetMan.h"
  22. #include "HTReqMan.h"
  23. #include "HTTPGen.h"
  24. #include "HTTPUtil.h"
  25. #include "HTTPRes.h"        /* Implements */
  26. #define PUTC(c) (*me->target->isa->put_character)(me->target, c)
  27. #define PUTS(s) (*me->target->isa->put_string)(me->target, s)
  28. #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
  29. struct _HTStream {
  30.     CONST HTStreamClass * isa;
  31.     HTStream *    target;
  32.     HTRequest * request;
  33.     BOOL transparent;
  34. };
  35. /* ------------------------------------------------------------------------- */
  36. /*      HTTP Output Request Stream      */
  37. /* ------------------------------------------------------------------------- */
  38. /* HTTPMakeResponse
  39. ** ----------------
  40. ** Makes a HTTP/1.0-1.1 response header.
  41. */
  42. PRIVATE int HTTPMakeResponse (HTStream * me, HTRequest * request)
  43. {
  44.     char crlf[3];
  45.     *crlf = CR; *(crlf+1) = LF; *(crlf+2) = '';
  46.     if (request->ResponseMask & HT_S_LOCATION) { /* @@@ */
  47.     }
  48.     if (request->ResponseMask & HT_S_PROXY_AUTH) { /* @@@ */
  49.     }
  50.     if (request->ResponseMask & HT_S_PUBLIC) { /* @@@ */
  51.     }
  52.     if (request->ResponseMask & HT_S_RETRY_AFTER) { /* @@@ */
  53.     }
  54.     if (request->ResponseMask & HT_S_SERVER) {
  55. PUTS("Server: ");
  56. PUTS(HTLib_appName());
  57. PUTC('/');
  58. PUTS(HTLib_appVersion());
  59. PUTC(' ');
  60. PUTS(HTLib_name());
  61. PUTC('/');
  62. PUTS(HTLib_version());
  63. PUTBLOCK(crlf, 2);
  64.     }
  65.     if (request->ResponseMask & HT_S_WWW_AUTH) { /* @@@ */
  66.     }
  67.     if(PROT_TRACE)TTYPrint(TDEST,"HTTP........ Generating Response Headersn");
  68.     return HT_OK;
  69. }
  70. PRIVATE int HTTPResponse_put_block (HTStream * me, CONST char * b, int l)
  71. {
  72.     if (me->target) {
  73. if (me->transparent)
  74.     return PUTBLOCK(b, l);
  75. else {
  76.     HTTPMakeResponse(me, me->request);   /* Generate header */
  77.     me->transparent = YES;
  78.     return b ? PUTBLOCK(b, l) : HT_OK;
  79. }
  80.     }
  81.     return HT_WOULD_BLOCK;
  82. }
  83. PRIVATE int HTTPResponse_put_character (HTStream * me, char c)
  84. {
  85.     return HTTPResponse_put_block(me, &c, 1);
  86. }
  87. PRIVATE int HTTPResponse_put_string (HTStream * me, CONST char * s)
  88. {
  89.     return HTTPResponse_put_block(me, s, strlen(s));
  90. }
  91. /*
  92. ** Flushes data but doesn't free stream object
  93. */
  94. PRIVATE int HTTPResponse_flush (HTStream * me)
  95. {
  96.     if (!me->transparent) {
  97. int status = HTTPMakeResponse(me, me->request);
  98. if (status != HT_OK) return status;
  99.     }
  100.     return (*me->target->isa->flush)(me->target);
  101. }
  102. /*
  103. ** Flushes data and frees stream object
  104. */
  105. PRIVATE int HTTPResponse_free (HTStream * me)
  106. {
  107.     if (me->target) {
  108. int status;
  109. if (!me->transparent)
  110.     if ((status = HTTPMakeResponse(me, me->request)) != HT_OK)
  111. return status;
  112. if ((status = (*me->target->isa->_free)(me->target)) != HT_OK)
  113.     return status;
  114.     }
  115.     return HT_OK;
  116. }
  117. PRIVATE int HTTPResponse_abort (HTStream * me, HTList * e)
  118. {
  119.     if (me->target) (*me->target->isa->abort)(me->target, e);
  120.     if (PROT_TRACE) TTYPrint(TDEST, "HTTPResponse ABORTING...n");
  121.     return HT_ERROR;
  122. }
  123. /* HTTPResponse Stream
  124. ** -----------------
  125. */
  126. PRIVATE CONST HTStreamClass HTTPResponseClass =
  127. {
  128.     "HTTPResponse",
  129.     HTTPResponse_flush,
  130.     HTTPResponse_free,
  131.     HTTPResponse_abort,
  132.     HTTPResponse_put_character,
  133.     HTTPResponse_put_string,
  134.     HTTPResponse_put_block
  135. };
  136. /*
  137. ** This stream generates server specific headers
  138. */
  139. PUBLIC HTStream * HTTPResponse_new (HTRequest * request, HTStream * target,
  140.     BOOL endHeader)
  141. {
  142.     HTStream * me;
  143.     if ((me = (HTStream  *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
  144.         HT_OUTOFMEM("HTTPResponse_new");
  145.     me->isa = &HTTPResponseClass;
  146.     me->target = target;
  147.     me->request = request;
  148.     me->transparent = NO;
  149.     return HTTPGen_new(request, me, endHeader);
  150. }