Annotation of libwww/Library/src/HTTPRes.c, revision 2.11

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.11    ! frystyk     6: **     @(#) $Id: HTTPRes.c,v 2.10 1996/05/16 19:03:20 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.8       frystyk    17: #include "sysdep.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,
                    157:                                    BOOL endHeader)
                    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;
                    166:     return HTTPGen_new(request, me, endHeader);
2.1       frystyk   167: }

Webmaster