Annotation of libwww/Library/src/HTTPRes.c, revision 2.13
2.1 frystyk 1: /* HTTPRes.c
2.4 frystyk 2: ** HTTP RESPONSE GENERATION
2.1 frystyk 3: **
2.9 frystyk 4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.13 ! frystyk 6: ** @(#) $Id: HTTPRes.c,v 2.12 1996/10/07 02:05:28 frystyk Exp $
2.9 frystyk 7: **
2.1 frystyk 8: ** This module implements the output stream for HTTP used for sending
9: ** responces with or without a entity body. It is the server equivalent
10: ** to the HTTPReq module
11: **
12: ** History:
13: ** Dec 95 HFN Written from scratch
14: */
15:
16: /* Library Includes */
2.13 ! frystyk 17: #include "wwwsys.h"
2.11 frystyk 18: #include "WWWUtil.h"
19: #include "WWWCore.h"
2.1 frystyk 20: #include "HTNetMan.h"
2.4 frystyk 21: #include "HTTPGen.h"
2.1 frystyk 22: #include "HTTPUtil.h"
23: #include "HTTPRes.h" /* Implements */
24:
2.5 frystyk 25: #define PUTC(c) (*me->target->isa->put_character)(me->target, c)
26: #define PUTS(s) (*me->target->isa->put_string)(me->target, s)
2.1 frystyk 27: #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
28:
29: struct _HTStream {
2.8 frystyk 30: const HTStreamClass * isa;
2.1 frystyk 31: HTStream * target;
32: HTRequest * request;
33: BOOL transparent;
34: };
35:
36: /* ------------------------------------------------------------------------- */
37: /* HTTP Output Request Stream */
38: /* ------------------------------------------------------------------------- */
39:
40: /* HTTPMakeResponse
41: ** ----------------
42: ** Makes a HTTP/1.0-1.1 response header.
43: */
2.4 frystyk 44: PRIVATE int HTTPMakeResponse (HTStream * me, HTRequest * request)
2.1 frystyk 45: {
2.5 frystyk 46: char crlf[3];
2.11 frystyk 47: HTRsHd response_mask = HTRequest_rsHd(request);
2.5 frystyk 48: *crlf = CR; *(crlf+1) = LF; *(crlf+2) = '\0';
49:
2.11 frystyk 50: if (response_mask & HT_S_LOCATION) { /* @@@ */
2.5 frystyk 51:
52: }
2.11 frystyk 53: if (response_mask & HT_S_PROXY_AUTH) { /* @@@ */
2.5 frystyk 54:
55: }
2.11 frystyk 56: if (response_mask & HT_S_PUBLIC) { /* @@@ */
2.5 frystyk 57:
58: }
2.11 frystyk 59: if (response_mask & HT_S_RETRY_AFTER) { /* @@@ */
2.5 frystyk 60:
61: }
2.11 frystyk 62: if (response_mask & HT_S_SERVER) {
2.5 frystyk 63: PUTS("Server: ");
64: PUTS(HTLib_appName());
65: PUTC('/');
66: PUTS(HTLib_appVersion());
67: PUTC(' ');
68: PUTS(HTLib_name());
69: PUTC('/');
70: PUTS(HTLib_version());
71: PUTBLOCK(crlf, 2);
72: }
2.11 frystyk 73: if (response_mask & HT_S_WWW_AUTH) { /* @@@ */
2.1 frystyk 74:
75: }
2.7 eric 76: if(PROT_TRACE)HTTrace("HTTP........ Generating Response Headers\n");
2.4 frystyk 77: return HT_OK;
2.1 frystyk 78: }
79:
2.8 frystyk 80: PRIVATE int HTTPResponse_put_block (HTStream * me, const char * b, int l)
2.1 frystyk 81: {
2.4 frystyk 82: if (me->target) {
83: if (me->transparent)
84: return PUTBLOCK(b, l);
85: else {
86: HTTPMakeResponse(me, me->request); /* Generate header */
87: me->transparent = YES;
88: return b ? PUTBLOCK(b, l) : HT_OK;
89: }
2.1 frystyk 90: }
2.4 frystyk 91: return HT_WOULD_BLOCK;
2.1 frystyk 92: }
93:
94: PRIVATE int HTTPResponse_put_character (HTStream * me, char c)
95: {
96: return HTTPResponse_put_block(me, &c, 1);
97: }
98:
2.8 frystyk 99: PRIVATE int HTTPResponse_put_string (HTStream * me, const char * s)
2.1 frystyk 100: {
101: return HTTPResponse_put_block(me, s, strlen(s));
102: }
103:
104: /*
105: ** Flushes data but doesn't free stream object
106: */
107: PRIVATE int HTTPResponse_flush (HTStream * me)
108: {
2.4 frystyk 109: if (!me->transparent) {
110: int status = HTTPMakeResponse(me, me->request);
111: if (status != HT_OK) return status;
112: }
113: return (*me->target->isa->flush)(me->target);
2.1 frystyk 114: }
115:
116: /*
117: ** Flushes data and frees stream object
118: */
119: PRIVATE int HTTPResponse_free (HTStream * me)
120: {
2.4 frystyk 121: if (me->target) {
122: int status;
123: if (!me->transparent)
124: if ((status = HTTPMakeResponse(me, me->request)) != HT_OK)
125: return status;
126: if ((status = (*me->target->isa->_free)(me->target)) != HT_OK)
127: return status;
2.1 frystyk 128: }
2.4 frystyk 129: return HT_OK;
2.1 frystyk 130: }
131:
132: PRIVATE int HTTPResponse_abort (HTStream * me, HTList * e)
133: {
134: if (me->target) (*me->target->isa->abort)(me->target, e);
2.7 eric 135: if (PROT_TRACE) HTTrace("HTTPResponse ABORTING...\n");
2.1 frystyk 136: return HT_ERROR;
137: }
138:
139: /* HTTPResponse Stream
140: ** -----------------
141: */
2.8 frystyk 142: PRIVATE const HTStreamClass HTTPResponseClass =
2.1 frystyk 143: {
144: "HTTPResponse",
145: HTTPResponse_flush,
146: HTTPResponse_free,
147: HTTPResponse_abort,
148: HTTPResponse_put_character,
149: HTTPResponse_put_string,
150: HTTPResponse_put_block
151: };
152:
2.4 frystyk 153: /*
2.5 frystyk 154: ** This stream generates server specific headers
2.4 frystyk 155: */
2.5 frystyk 156: PUBLIC HTStream * HTTPResponse_new (HTRequest * request, HTStream * target,
2.12 frystyk 157: BOOL endHeader, int version)
2.5 frystyk 158: {
2.6 frystyk 159: HTStream * me;
160: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
161: HT_OUTOFMEM("HTTPResponse_new");
2.1 frystyk 162: me->isa = &HTTPResponseClass;
2.5 frystyk 163: me->target = target;
2.1 frystyk 164: me->request = request;
2.5 frystyk 165: me->transparent = NO;
2.12 frystyk 166: return HTTPGen_new(request, me, endHeader, version);
2.1 frystyk 167: }
Webmaster