Annotation of libwww/Library/src/HTNewsRq.c, revision 2.11
2.1 frystyk 1: /* HTNewsRq.c
2: ** NNTP MESSAGE GENERATION
3: **
2.11 ! frystyk 4: ** (c) COPYRIGHT MIT 1995.
! 5: ** Please first read the full copyright statement in the file COPYRIGH.
! 6: ** @(#) $Id: Date Author State $
! 7: **
2.1 frystyk 8: ** This module implements the output stream for MIME used for sending
9: ** requests with or without a entity body to HTTP, NEWS, etc.
10: **
11: ** History:
12: ** Jan 95 HFN Written
13: */
14:
15: /* Library Includes */
2.10 frystyk 16: #include "sysdep.h"
2.11 ! frystyk 17: #include "WWWUtil.h"
! 18: #include "WWWCore.h"
! 19:
2.1 frystyk 20: #include "HTReqMan.h"
21: #include "HTMIMERq.h"
22: #include "HTNewsRq.h" /* Implements */
23:
24: #define PUTBLOCK(b, l) (*me->target->isa->put_block)(me->target, b, l)
25:
26: struct _HTStream {
2.10 frystyk 27: const HTStreamClass * isa;
2.1 frystyk 28: HTStream * target;
29: HTRequest * request;
2.4 frystyk 30: SOCKET sockfd;
2.1 frystyk 31: HTChunk * buffer;
32: int version;
33: BOOL transparent;
34: };
35:
36: /* ------------------------------------------------------------------------- */
37: /* News Output Post Stream */
38: /* ------------------------------------------------------------------------- */
39:
40: /* NewsPost_start
41: ** --------------
42: ** NNTP needs two extra headers: "From" and "Newsgroups".
43: ** Take the newsgroups from the Postweb model as destinations for this
44: ** anchor.
45: ** Return YES if OK else NO
46: */
47: PRIVATE BOOL NewsPost_start (HTStream * me, HTRequest * request)
48: {
49: char linebuf[128]; /* @@@ */
50: HTChunk *header = me->buffer;
2.10 frystyk 51: const char *mailaddress = HTGetMailAddress();
2.1 frystyk 52: if (mailaddress) {
53: sprintf(linebuf, "From: %s%c%c", mailaddress, CR, LF);
2.6 frystyk 54: HTChunk_puts(header, linebuf);
2.1 frystyk 55: }
56:
57: /*
58: ** Find all the newsgroups we are posting to by looking at all the
59: ** destinations from the source of this request.
60: ** First the main link and then the sub links
61: */
2.6 frystyk 62: HTChunk_puts(header, "Newsgroups :");
2.1 frystyk 63: if (HTRequest_isDestination(request)) {
64: HTRequest *src_req = HTRequest_source(request);
65: HTParentAnchor *src_anchor = HTRequest_anchor(src_req);
2.5 frystyk 66: HTLink *link = HTAnchor_mainLink((HTAnchor *) src_anchor);
67: HTAnchor *dest = HTLink_destination(link);
68: HTMethod method = HTLink_method(link);
2.1 frystyk 69: if (link && method == METHOD_POST &&
2.5 frystyk 70: HTLink_result(link) == HT_LINK_NONE) {
2.1 frystyk 71: char *desturl = HTAnchor_physical((HTParentAnchor *) dest);
72: char *access = HTParse(desturl, "", PARSE_ACCESS);
73: if (!strcasecomp(access, "news") || !strcasecomp(access, "nntp")) {
74: char *newsgroup = HTParse(desturl, "", PARSE_PATH);
75: HTUnEscape(newsgroup);
76: HTCleanTelnetString(newsgroup);
2.6 frystyk 77: HTChunk_puts(header, newsgroup);
2.8 frystyk 78: HT_FREE(newsgroup);
2.1 frystyk 79: }
2.8 frystyk 80: HT_FREE(access);
2.1 frystyk 81: }
82:
83: /* DO FOR ALL SUB ANCHOR DESTINATION S AS WELL */
84:
85: }
2.9 eric 86: if (PROT_TRACE) HTTrace("News Tx..... %s", HTChunk_data(header));
2.1 frystyk 87: return YES;
88: }
89:
90: /* NewsPost_end
91: ** ------------
92: ** End the posting by CRLF.CRLF
93: ** returns whatever PUT_BLOCK returns
94: */
95: PRIVATE int NewsPost_end (HTStream * me)
96: {
97: char buf[6];
98: *buf = CR;
99: *(buf+1) = LF;
100: *(buf+2) = '.';
101: *(buf+3) = CR;
102: *(buf+4) = LF;
103: *(buf+5) = '\0';
104: return PUTBLOCK(buf, 5);
105: }
106:
2.10 frystyk 107: PRIVATE int NewsPost_put_block (HTStream * me, const char* b, int l)
2.1 frystyk 108: {
109: if (!me->target) {
110: return HT_WOULD_BLOCK;
111: } else if (me->transparent)
112: return b ? PUTBLOCK(b, l) : HT_OK;
113: else {
114: int status;
115: NewsPost_start(me, me->request);
2.6 frystyk 116: if ((status = PUTBLOCK(HTChunk_data(me->buffer),
117: HTChunk_size(me->buffer))) == HT_OK) {
2.1 frystyk 118: me->transparent = YES;
119: return b ? PUTBLOCK(b, l) : HT_OK;
120: }
121: return status;
122: }
123: }
124:
125: PRIVATE int NewsPost_put_character (HTStream * me, char c)
126: {
127: return NewsPost_put_block(me, &c, 1);
128: }
129:
2.10 frystyk 130: PRIVATE int NewsPost_put_string (HTStream * me, const char * s)
2.1 frystyk 131: {
132: return NewsPost_put_block(me, s, strlen(s));
133: }
134:
135: /*
136: ** Flushes header but doesn't free stream object
137: */
138: PRIVATE int NewsPost_flush (HTStream * me)
139: {
140: return NewsPost_put_block(me, NULL, 0);
141: }
142:
143: /*
144: ** Flushes data and frees stream object
145: */
146: PRIVATE int NewsPost_free (HTStream * me)
147: {
148: int status;
149: if ((status = NewsPost_flush(me)) != HT_OK ||
150: (status = NewsPost_end(me)) != HT_OK ||
151: (status = (*me->target->isa->_free)(me->target)) != HT_OK)
152: return status;
2.6 frystyk 153: HTChunk_delete(me->buffer);
2.8 frystyk 154: HT_FREE(me);
2.1 frystyk 155: return status;
156: }
157:
2.3 frystyk 158: PRIVATE int NewsPost_abort (HTStream * me, HTList * e)
2.1 frystyk 159: {
160: if (me->target) (*me->target->isa->abort)(me->target, e);
2.6 frystyk 161: HTChunk_delete(me->buffer);
2.8 frystyk 162: HT_FREE(me);
2.9 eric 163: if (PROT_TRACE) HTTrace("NewsPost.... ABORTING...\n");
2.1 frystyk 164: return HT_ERROR;
165: }
166:
167: /* NewsPost Stream
168: ** -----------------
169: */
2.10 frystyk 170: PRIVATE const HTStreamClass NewsPostClass =
2.1 frystyk 171: {
172: "NewsPost",
173: NewsPost_flush,
174: NewsPost_free,
175: NewsPost_abort,
176: NewsPost_put_character,
177: NewsPost_put_string,
178: NewsPost_put_block
179: };
180:
181: PUBLIC HTStream * HTNewsPost_new (HTRequest * request, HTStream * target)
182: {
2.8 frystyk 183: HTStream * me;
184: if ((me = (HTStream *) HT_CALLOC(1, sizeof(HTStream))) == NULL)
185: HT_OUTOFMEM("NewsPost_new");
2.1 frystyk 186: me->isa = &NewsPostClass;
187: me->target = target;
188: me->request = request;
2.6 frystyk 189: me->buffer = HTChunk_new(256);
2.1 frystyk 190: me->transparent = NO;
2.7 frystyk 191: return HTMIMERequest_new(request, me, YES);
2.1 frystyk 192: }
Webmaster