Annotation of libwww/Library/src/HTReqMan.c, revision 2.59.2.2
2.1 frystyk 1: /* HTReqMan.c
2: ** REQUEST MANAGER
3: **
4: ** (c) COPYRIGHT MIT 1995.
5: ** Please first read the full copyright statement in the file COPYRIGH.
2.59.2.2! eric 6: ** @(#) $Id: HTReqMan.c,v 2.59.2.1 1996/10/29 21:27:15 eric Exp $
2.1 frystyk 7: **
8: ** Authors
9: ** TBL Tim Berners-Lee timbl@w3.org
10: ** JFG Jean-Francois Groff jfg@dxcern.cern.ch
11: ** DD Denis DeLaRoca (310) 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
12: ** HFN Henrik Frystyk, frystyk@w3.org
13: ** History
14: ** 8 Jun 92 Telnet hopping prohibited as telnet is not secure TBL
15: ** 26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. JFG
16: ** 6 Oct 92 Moved HTClientHost and HTlogfile into here. TBL
17: ** 17 Dec 92 Tn3270 added, bug fix. DD
18: ** 4 Feb 93 Access registration, Search escapes bad chars TBL
19: ** PARAMETERS TO HTSEARCH AND HTLOADRELATIVE CHANGED
20: ** 28 May 93 WAIS gateway explicit if no WAIS library linked in.
21: ** Dec 93 Bug change around, more reentrant, etc
22: ** 09 May 94 logfile renamed to HTlogfile to avoid clash with WAIS
23: ** 8 Jul 94 Insulate free() from _free structure element.
24: ** 02 Sep 95 Rewritten and spawned from HTAccess.c, HFN
25: */
26:
27: #if !defined(HT_DIRECT_WAIS) && !defined(HT_DEFAULT_WAIS_GATEWAY)
28: #define HT_DEFAULT_WAIS_GATEWAY "http://www.w3.org:8001/"
29: #endif
30:
31: /* Library include files */
2.32 frystyk 32: #include "sysdep.h"
2.40 frystyk 33: #include "WWWUtil.h"
2.1 frystyk 34: #include "HTParse.h"
35: #include "HTAlert.h"
36: #include "HTError.h"
2.2 frystyk 37: #include "HTNetMan.h"
2.39 frystyk 38: #include "HTEvent.h"
2.1 frystyk 39: #include "HTProt.h"
2.43 eric 40: #include "HTHeader.h"
2.46 frystyk 41: #include "HTLib.h"
2.1 frystyk 42: #include "HTReqMan.h" /* Implemented here */
43:
44: #ifndef HT_MAX_RELOADS
45: #define HT_MAX_RELOADS 6
46: #endif
2.13 frystyk 47:
2.1 frystyk 48: PRIVATE int HTMaxRetry = HT_MAX_RELOADS;
49:
50: struct _HTStream {
51: HTStreamClass * isa;
52: /* ... */
53: };
54:
55: /* --------------------------------------------------------------------------*/
2.59 frystyk 56: /* Create and delete the HTRequest Object */
2.1 frystyk 57: /* --------------------------------------------------------------------------*/
58:
2.3 frystyk 59: PUBLIC HTRequest * HTRequest_new (void)
2.1 frystyk 60: {
2.29 frystyk 61: HTRequest * me;
62: if ((me = (HTRequest *) HT_CALLOC(1, sizeof(HTRequest))) == NULL)
63: HT_OUTOFMEM("HTRequest_new()");
2.1 frystyk 64:
2.7 frystyk 65: /* Force Reload */
2.56 frystyk 66: me->reload = HT_CACHE_OK;
2.1 frystyk 67:
2.40 frystyk 68: /* Set the default user profile */
69: me->userprofile = HTLib_userProfile();
70:
2.1 frystyk 71: /* Format of output */
72: me->output_format = WWW_PRESENT; /* default it to present to user */
2.21 frystyk 73: me->debug_format = WWW_DEBUG; /* default format of error messages */
2.1 frystyk 74:
75: /* HTTP headers */
76: me->GenMask = DEFAULT_GENERAL_HEADERS;
77: me->RequestMask = DEFAULT_REQUEST_HEADERS;
2.22 frystyk 78: me->ResponseMask = DEFAULT_RESPONSE_HEADERS;
2.1 frystyk 79: me->EntityMask = DEFAULT_ENTITY_HEADERS;
80:
81: /* Default retry after value */
2.19 frystyk 82: me->priority = HT_PRIORITY_MAX;
2.1 frystyk 83:
2.54 frystyk 84: /* Default max forward value */
85: me->max_forwards = -1;
86:
2.1 frystyk 87: /* Content negotiation */
2.45 frystyk 88: me->ContentNegotiation = YES; /* Do this by default */
2.1 frystyk 89:
2.47 frystyk 90: if (CORE_TRACE) HTTrace("Request..... Created %p\n", me);
91:
2.1 frystyk 92: return me;
93: }
94:
2.28 frystyk 95: /* HTRequest_clear
96: ** ---------------
97: ** Clears all protocol specific information so that the request object
98: ** can be used for another request.
99: ** Returns YES if OK, else NO
100: */
101: PUBLIC BOOL HTRequest_clear (HTRequest * me)
102: {
103: if (me) {
104: me->error_stack = NULL;
105: me->net = NULL;
2.49 frystyk 106: me->realm = NULL;
2.31 frystyk 107: me->credentials = NULL;
2.47 frystyk 108: me->connected = NO;
2.59 frystyk 109: if (me->response) {
110: HTResponse_delete(me->response);
111: me->response = NULL;
112: }
2.28 frystyk 113: return YES;
114: }
115: return NO;
116: }
117:
2.18 frystyk 118: /* HTRequest_dup
119: ** -------------
120: ** Creates a new HTRequest object as a duplicate of the src request.
121: ** Returns YES if OK, else NO
122: */
123: PUBLIC HTRequest * HTRequest_dup (HTRequest * src)
124: {
125: HTRequest * me;
2.47 frystyk 126: if (!src) return NULL;
2.29 frystyk 127: if ((me = (HTRequest *) HT_MALLOC(sizeof(HTRequest))) == NULL)
128: HT_OUTOFMEM("HTRequest_dup");
2.18 frystyk 129: memcpy(me, src, sizeof(HTRequest));
2.47 frystyk 130: if (CORE_TRACE) HTTrace("Request..... Duplicated %p to %p\n", src, me);
2.18 frystyk 131: return me;
132: }
2.1 frystyk 133:
2.23 frystyk 134: /* HTRequest_dupInternal
135: ** ---------------------
136: ** Creates a new HTRequest object as a duplicate of the src request.
137: ** The difference to the HTRequest_dup function is that we don't copy the
138: ** error_stack and other information that the application keeps in its
139: ** copy of the request object. Otherwise it will be freed multiple times
140: ** Returns YES if OK, else NO
141: */
142: PUBLIC HTRequest * HTRequest_dupInternal (HTRequest * src)
143: {
144: HTRequest * me;
2.33 eric 145: if (!src) return 0;
2.29 frystyk 146: if ((me = (HTRequest *) HT_MALLOC(sizeof(HTRequest))) == NULL)
147: HT_OUTOFMEM("HTRequest_dup");
2.23 frystyk 148: memcpy(me, src, sizeof(HTRequest));
2.28 frystyk 149: HTRequest_clear(me);
2.23 frystyk 150: return me;
151: }
152:
2.59 frystyk 153: PUBLIC void HTRequest_delete (HTRequest * me)
2.1 frystyk 154: {
2.59 frystyk 155: if (me) {
156: if (CORE_TRACE) HTTrace("Request..... Delete %p\n", me);
157: if (me->net) HTNet_setRequest(me->net, NULL);
2.47 frystyk 158:
159: /* Should we delete the output stream? */
2.59 frystyk 160: if (!me->connected && me->output_stream) {
2.47 frystyk 161: if (CORE_TRACE)
162: HTTrace("Request..... Deleting dangling output stream\n");
2.59 frystyk 163: (*me->output_stream->isa->_free)(me->output_stream);
164: me->output_stream = NULL;
2.47 frystyk 165: }
166:
167: /* Clean up the error stack */
2.59 frystyk 168: if (me->error_stack) HTError_deleteAll(me->error_stack);
2.13 frystyk 169:
2.51 frystyk 170: /* Before and After Filters */
2.59 frystyk 171: if (me->afters) HTList_delete(me->afters);
172: if (me->befores) HTList_delete(me->befores);
2.51 frystyk 173:
2.49 frystyk 174: /* Access Authentication */
2.59 frystyk 175: HT_FREE(me->realm);
176: if (me->credentials) HTAssocList_delete(me->credentials);
2.49 frystyk 177:
2.56 frystyk 178: /* Cache control headers */
2.59 frystyk 179: if (me->cache_control)
180: HTAssocList_delete(me->cache_control);
2.57 frystyk 181:
2.59 frystyk 182: /* Byte ranges */
183: if (me->byte_ranges) HTAssocList_delete(me->byte_ranges);
2.56 frystyk 184:
185: /* Connection headers */
2.59 frystyk 186: if (me->connection) HTAssocList_delete(me->connection);
2.56 frystyk 187:
2.53 frystyk 188: /* Proxy information */
2.59 frystyk 189: HT_FREE(me->proxy);
2.53 frystyk 190:
2.49 frystyk 191: /* PEP Information */
2.59 frystyk 192: if (me->protocol) HTAssocList_delete(me->protocol);
193: if (me->protocol_request) HTAssocList_delete(me->protocol_request);
194: if (me->protocol_info) HTAssocList_delete(me->protocol_info);
2.49 frystyk 195:
2.59 frystyk 196: /* Any response object */
197: if (me->response) HTResponse_delete(me->response);
2.55 frystyk 198:
2.59 frystyk 199: HT_FREE(me);
2.1 frystyk 200: }
201: }
202:
203: /*
2.59 frystyk 204: ** Kill this request
2.1 frystyk 205: */
2.59 frystyk 206: PUBLIC BOOL HTRequest_kill(HTRequest * me)
2.1 frystyk 207: {
2.59 frystyk 208: return me ? HTNet_kill(me->net) : NO;
2.1 frystyk 209: }
210:
2.59 frystyk 211: /* --------------------------------------------------------------------------*/
212: /* Methods on the HTRequest Object */
213: /* --------------------------------------------------------------------------*/
2.1 frystyk 214:
215: /*
2.59 frystyk 216: ** Internal request object
2.1 frystyk 217: */
2.59 frystyk 218: PUBLIC BOOL HTRequest_setInternal (HTRequest * me, BOOL mode)
2.1 frystyk 219: {
2.59 frystyk 220: if (me) {
221: me->internal = mode;
222: return YES;
223: }
224: return NO;
2.1 frystyk 225: }
226:
2.59 frystyk 227: PUBLIC BOOL HTRequest_internal (HTRequest * me)
2.1 frystyk 228: {
2.59 frystyk 229: return (me ? me->internal : NO);
2.1 frystyk 230: }
231:
232: /*
2.59 frystyk 233: ** Date/time stamp when then request was issued
234: ** This is normally set when generating the request headers.
2.1 frystyk 235: */
2.59 frystyk 236: PUBLIC time_t HTRequest_date (HTRequest * me)
2.1 frystyk 237: {
2.59 frystyk 238: return me ? me->date : -1;
2.1 frystyk 239: }
240:
2.59 frystyk 241: PUBLIC BOOL HTRequest_setDate (HTRequest * me, time_t date)
2.1 frystyk 242: {
2.59 frystyk 243: if (me) {
244: me->date = date;
245: return YES;
2.1 frystyk 246: }
2.59 frystyk 247: return NO;
2.1 frystyk 248: }
249:
2.37 frystyk 250: /*
2.59 frystyk 251: ** Method
2.37 frystyk 252: */
2.59 frystyk 253: PUBLIC void HTRequest_setMethod (HTRequest * me, HTMethod method)
2.37 frystyk 254: {
2.59 frystyk 255: if (me) me->method = method;
2.37 frystyk 256: }
257:
2.59 frystyk 258: PUBLIC HTMethod HTRequest_method (HTRequest * me)
2.37 frystyk 259: {
2.59 frystyk 260: return me ? me->method : METHOD_INVALID;
2.37 frystyk 261: }
262:
2.1 frystyk 263: /*
2.59 frystyk 264: ** Priority to be inherited by all HTNet object hanging off this request
265: ** The priority can later be chaned by calling the HTNet object directly
2.1 frystyk 266: */
2.59 frystyk 267: PUBLIC BOOL HTRequest_setPriority (HTRequest * me, HTPriority priority)
2.1 frystyk 268: {
2.59 frystyk 269: if (me) {
270: me->priority = priority;
271: return YES;
2.1 frystyk 272: }
2.59 frystyk 273: return NO;
2.1 frystyk 274: }
275:
2.59 frystyk 276: PUBLIC HTPriority HTRequest_priority (HTRequest * me)
2.1 frystyk 277: {
2.59 frystyk 278: return (me ? me->priority : HT_PRIORITY_INV);
2.1 frystyk 279: }
280:
281: /*
2.59 frystyk 282: ** User Profile
2.1 frystyk 283: */
2.59 frystyk 284: PUBLIC BOOL HTRequest_setUserProfile (HTRequest * me, HTUserProfile * up)
2.1 frystyk 285: {
2.59 frystyk 286: if (me) {
287: me->userprofile = up;
288: return YES;
2.1 frystyk 289: }
2.59 frystyk 290: return NO;
2.1 frystyk 291: }
292:
2.59 frystyk 293: PUBLIC HTUserProfile * HTRequest_userProfile (HTRequest * me)
2.1 frystyk 294: {
2.59 frystyk 295: return me ? me->userprofile : NULL;
2.1 frystyk 296: }
297:
298: /*
2.59 frystyk 299: ** Net Object
2.9 frystyk 300: */
2.59 frystyk 301: PUBLIC BOOL HTRequest_setNet (HTRequest * me, HTNet * net)
2.9 frystyk 302: {
2.59 frystyk 303: if (me) {
304: me->net = net;
305: return YES;
2.9 frystyk 306: }
2.59 frystyk 307: return NO;
2.9 frystyk 308: }
309:
2.59 frystyk 310: PUBLIC HTNet * HTRequest_net (HTRequest * me)
2.9 frystyk 311: {
2.59 frystyk 312: return me ? me->net : NULL;
2.9 frystyk 313: }
314:
315: /*
2.59 frystyk 316: ** Response Object. If the object does not exist then create it at the
317: ** same time it is asked for.
2.9 frystyk 318: */
2.59 frystyk 319: PUBLIC HTResponse * HTRequest_response (HTRequest * me)
2.9 frystyk 320: {
2.43 eric 321: if (me) {
2.59 frystyk 322: if (!me->response)
323: me->response = HTResponse_new();
324: return me->response;
2.9 frystyk 325: }
2.59 frystyk 326: return NULL;
2.9 frystyk 327: }
328:
2.59 frystyk 329: PUBLIC BOOL HTRequest_setResponse (HTRequest * me, HTResponse * response)
2.9 frystyk 330: {
2.43 eric 331: if (me) {
2.59 frystyk 332: me->response = response;
333: return YES;
2.9 frystyk 334: }
2.59 frystyk 335: return NO;
2.43 eric 336: }
337:
2.59 frystyk 338: /* Error Management
339: ** ----------------
340: ** Returns the error stack if a stream is
2.1 frystyk 341: */
2.59 frystyk 342: PUBLIC HTList * HTRequest_error (HTRequest * me)
2.1 frystyk 343: {
2.59 frystyk 344: return me ? me->error_stack : NULL;
2.1 frystyk 345: }
346:
2.59 frystyk 347: PUBLIC void HTRequest_setError (HTRequest * me, HTList * list)
2.1 frystyk 348: {
2.59 frystyk 349: if (me) me->error_stack = list;
2.1 frystyk 350: }
351:
2.59 frystyk 352: PUBLIC BOOL HTRequest_addError (HTRequest * me,
353: HTSeverity severity,
354: BOOL ignore,
355: int element,
356: void * par,
357: unsigned int length,
358: char * where)
2.1 frystyk 359: {
2.59 frystyk 360: if (me) {
361: if (!me->error_stack) me->error_stack = HTList_new();
362: return HTError_add(me->error_stack, severity, ignore, element,
363: par, length, where);
364: }
365: return NO;
2.1 frystyk 366: }
367:
2.59 frystyk 368: PUBLIC BOOL HTRequest_addSystemError (HTRequest * me,
369: HTSeverity severity,
370: int errornumber,
371: BOOL ignore,
372: char * syscall)
2.1 frystyk 373: {
2.59 frystyk 374: if (me) {
375: if (!me->error_stack) me->error_stack = HTList_new();
376: return HTError_addSystem(me->error_stack, severity, errornumber,
377: ignore, syscall);
378: }
379: return NO;
2.22 frystyk 380: }
381:
382: /*
2.59 frystyk 383: ** Set max number of automatic reload. Default is HT_MAX_RELOADS
2.22 frystyk 384: */
2.59 frystyk 385: PUBLIC BOOL HTRequest_setMaxRetry (int newmax)
2.22 frystyk 386: {
2.59 frystyk 387: if (newmax > 0) {
388: HTMaxRetry = newmax;
389: return YES;
390: }
391: return NO;
2.22 frystyk 392: }
393:
2.59 frystyk 394: PUBLIC int HTRequest_maxRetry (void)
2.22 frystyk 395: {
2.59 frystyk 396: return HTMaxRetry;
2.22 frystyk 397: }
398:
2.59 frystyk 399: PUBLIC int HTRequest_retrys (HTRequest * me)
2.22 frystyk 400: {
2.59 frystyk 401: return me ? me->retrys : 0;
2.1 frystyk 402: }
403:
2.59 frystyk 404: PUBLIC BOOL HTRequest_addRetry (HTRequest * me)
2.1 frystyk 405: {
2.59 frystyk 406: return (me && me->retrys++);
2.1 frystyk 407: }
408:
2.18 frystyk 409: /*
2.59 frystyk 410: ** Should we try again?
411: ** --------------------
412: ** Returns YES if we are to retry the load, NO otherwise. We check
413: ** this so that we don't go into an infinte loop
2.1 frystyk 414: */
2.59 frystyk 415: PUBLIC BOOL HTRequest_doRetry (HTRequest * me)
2.1 frystyk 416: {
2.59 frystyk 417: return (me && me->retrys < HTMaxRetry-1);
2.56 frystyk 418: }
419:
2.1 frystyk 420: /*
2.59 frystyk 421: ** Socket mode: preemptive or non-preemptive (blocking or non-blocking)
2.40 frystyk 422: */
2.59 frystyk 423: PUBLIC void HTRequest_setPreemptive (HTRequest * me, BOOL mode)
2.40 frystyk 424: {
2.59 frystyk 425: if (me) me->preemptive = mode;
2.40 frystyk 426: }
427:
2.59 frystyk 428: PUBLIC BOOL HTRequest_preemptive (HTRequest * me)
2.40 frystyk 429: {
2.59 frystyk 430: return me ? me->preemptive : NO;
2.40 frystyk 431: }
432:
433: /*
2.59 frystyk 434: ** Should we use content negotiation?
2.40 frystyk 435: */
2.59 frystyk 436: PUBLIC void HTRequest_setNegotiation (HTRequest * me, BOOL mode)
2.40 frystyk 437: {
2.59 frystyk 438: if (me) me->ContentNegotiation = mode;
2.40 frystyk 439: }
440:
2.59 frystyk 441: PUBLIC BOOL HTRequest_negotiation (HTRequest * me)
2.40 frystyk 442: {
2.59 frystyk 443: return me ? me->ContentNegotiation : NO;
2.40 frystyk 444: }
445:
446: /*
2.59 frystyk 447: ** Set General Headers
2.1 frystyk 448: */
2.59 frystyk 449: PUBLIC void HTRequest_setGnHd (HTRequest * me, HTGnHd gnhd)
2.1 frystyk 450: {
2.59 frystyk 451: if (me) me->GenMask = gnhd;
2.1 frystyk 452: }
453:
2.59 frystyk 454: PUBLIC void HTRequest_addGnHd (HTRequest * me, HTGnHd gnhd)
2.1 frystyk 455: {
2.59 frystyk 456: if (me) me->GenMask |= gnhd;
2.1 frystyk 457: }
458:
2.59 frystyk 459: PUBLIC HTGnHd HTRequest_gnHd (HTRequest * me)
2.1 frystyk 460: {
2.59 frystyk 461: return me ? me->GenMask : 0;
2.1 frystyk 462: }
463:
464: /*
2.59 frystyk 465: ** Set Request Headers
2.1 frystyk 466: */
2.59 frystyk 467: PUBLIC void HTRequest_setRqHd (HTRequest * me, HTRqHd rqhd)
2.1 frystyk 468: {
2.59 frystyk 469: if (me) me->RequestMask = rqhd;
2.1 frystyk 470: }
471:
2.59 frystyk 472: PUBLIC void HTRequest_addRqHd (HTRequest * me, HTRqHd rqhd)
2.1 frystyk 473: {
2.59 frystyk 474: if (me) me->RequestMask |= rqhd;
2.1 frystyk 475: }
476:
2.59 frystyk 477: PUBLIC HTRqHd HTRequest_rqHd (HTRequest * me)
2.1 frystyk 478: {
2.59 frystyk 479: return me ? me->RequestMask : 0;
2.1 frystyk 480: }
481:
482: /*
2.59 frystyk 483: ** Set Response Headers
2.1 frystyk 484: */
2.59 frystyk 485: PUBLIC void HTRequest_setRsHd (HTRequest * me, HTRsHd rshd)
2.1 frystyk 486: {
2.59 frystyk 487: if (me) me->ResponseMask = rshd;
2.1 frystyk 488: }
489:
2.59 frystyk 490: PUBLIC void HTRequest_addRsHd (HTRequest * me, HTRsHd rshd)
2.35 frystyk 491: {
2.59 frystyk 492: if (me) me->ResponseMask |= rshd;
2.35 frystyk 493: }
494:
2.59 frystyk 495: PUBLIC HTRsHd HTRequest_rsHd (HTRequest * me)
2.35 frystyk 496: {
2.59 frystyk 497: return me ? me->ResponseMask : 0;
2.35 frystyk 498: }
499:
2.1 frystyk 500: /*
2.59 frystyk 501: ** Set Entity Headers (for the object)
2.34 hallam 502: */
2.59 frystyk 503: PUBLIC void HTRequest_setEnHd (HTRequest * me, HTEnHd enhd)
2.34 hallam 504: {
2.59 frystyk 505: if (me) me->EntityMask = enhd;
2.51 frystyk 506: }
507:
2.59 frystyk 508: PUBLIC void HTRequest_addEnHd (HTRequest * me, HTEnHd enhd)
2.51 frystyk 509: {
2.59 frystyk 510: if (me) me->EntityMask |= enhd;
2.51 frystyk 511: }
512:
2.59 frystyk 513: PUBLIC HTEnHd HTRequest_enHd (HTRequest * me)
2.51 frystyk 514: {
2.59 frystyk 515: return me ? me->EntityMask : 0;
2.34 hallam 516: }
517:
2.59 frystyk 518: /*
519: ** Extra Header Generators. list can be NULL
520: */
521: PUBLIC void HTRequest_setGenerator (HTRequest * me, HTList *generator,
522: BOOL override)
2.34 hallam 523: {
2.59 frystyk 524: if (me) {
525: me->generators = generator;
526: me->gens_local = override;
2.34 hallam 527: }
528: }
529:
2.59 frystyk 530: PUBLIC HTList * HTRequest_generator (HTRequest * me, BOOL *override)
2.34 hallam 531: {
2.59 frystyk 532: if (me) {
533: *override = me->gens_local;
534: return me->generators;
2.34 hallam 535: }
2.59 frystyk 536: return NULL;
2.51 frystyk 537: }
538:
2.59 frystyk 539: /*
540: ** Extra Header Parsers. list can be NULL
541: */
542: PUBLIC void HTRequest_setMIMEParseSet (HTRequest * me,
543: HTMIMEParseSet * parseSet, BOOL local)
2.51 frystyk 544: {
2.59 frystyk 545: if (me) {
546: me->parseSet = parseSet;
547: me->pars_local = local;
2.51 frystyk 548: }
2.34 hallam 549: }
550:
2.59 frystyk 551: PUBLIC HTMIMEParseSet * HTRequest_MIMEParseSet (HTRequest * me, BOOL * pLocal)
2.34 hallam 552: {
2.59 frystyk 553: if (me) {
554: if (pLocal) *pLocal = me->pars_local;
555: return me->parseSet;
2.34 hallam 556: }
557: return NULL;
558: }
559:
560: /*
2.59 frystyk 561: ** Accept Format Types
562: ** list can be NULL
2.1 frystyk 563: */
2.59 frystyk 564: PUBLIC void HTRequest_setConversion (HTRequest * me, HTList *type,
565: BOOL override)
2.1 frystyk 566: {
2.59 frystyk 567: if (me) {
568: me->conversions = type;
569: me->conv_local = override;
570: }
2.1 frystyk 571: }
572:
2.59 frystyk 573: PUBLIC HTList * HTRequest_conversion (HTRequest * me)
2.1 frystyk 574: {
2.59 frystyk 575: return me ? me->conversions : NULL;
2.1 frystyk 576: }
577:
578: /*
2.59 frystyk 579: ** Accept Encoding
580: ** list can be NULL
2.1 frystyk 581: */
2.59 frystyk 582: PUBLIC void HTRequest_setEncoding (HTRequest * me, HTList *enc,
583: BOOL override)
2.1 frystyk 584: {
2.59 frystyk 585: if (me) {
586: me->encodings = enc;
587: me->enc_local = override;
588: }
2.1 frystyk 589: }
590:
2.59 frystyk 591: PUBLIC HTList * HTRequest_encoding (HTRequest * me)
2.1 frystyk 592: {
2.59 frystyk 593: return me ? me->encodings : NULL;
2.1 frystyk 594: }
595:
596: /*
2.59 frystyk 597: ** Accept Transfer Encoding
598: ** list can be NULL
2.1 frystyk 599: */
2.59 frystyk 600: PUBLIC void HTRequest_setTransfer (HTRequest * me,
601: HTList * cte, BOOL override)
2.1 frystyk 602: {
2.59 frystyk 603: if (me) {
604: me->ctes = cte;
605: me->cte_local = override;
606: }
2.1 frystyk 607: }
608:
2.59 frystyk 609: PUBLIC HTList * HTRequest_transfer (HTRequest * me)
2.1 frystyk 610: {
2.59 frystyk 611: return me ? me->ctes : NULL;
2.47 frystyk 612: }
613:
614: /*
2.59 frystyk 615: ** Accept Language
616: ** list can be NULL
2.47 frystyk 617: */
2.59 frystyk 618: PUBLIC void HTRequest_setLanguage (HTRequest * me, HTList *lang,
619: BOOL override)
2.47 frystyk 620: {
2.59 frystyk 621: if (me) {
622: me->languages = lang;
623: me->lang_local = override;
624: }
2.47 frystyk 625: }
626:
2.59 frystyk 627: PUBLIC HTList * HTRequest_language (HTRequest * me)
2.47 frystyk 628: {
2.59 frystyk 629: return me ? me->languages : NULL;
2.1 frystyk 630: }
631:
632: /*
2.59 frystyk 633: ** Accept Charset
634: ** list can be NULL
2.1 frystyk 635: */
2.59 frystyk 636: PUBLIC void HTRequest_setCharset (HTRequest * me, HTList *charset,
637: BOOL override)
2.1 frystyk 638: {
2.59 frystyk 639: if (me) {
640: me->charsets = charset;
641: me->char_local = override;
642: }
2.1 frystyk 643: }
644:
2.59 frystyk 645: PUBLIC HTList * HTRequest_charset (HTRequest * me)
2.1 frystyk 646: {
2.59 frystyk 647: return me ? me->charsets : NULL;
2.40 frystyk 648: }
649:
650: /*
2.53 frystyk 651: ** Are we using the full URL in the request or not?
2.40 frystyk 652: */
2.59 frystyk 653: PUBLIC void HTRequest_setFullURI (HTRequest * me, BOOL mode)
2.40 frystyk 654: {
2.59 frystyk 655: if (me) me->full_uri = mode;
2.40 frystyk 656: }
657:
2.59 frystyk 658: PUBLIC BOOL HTRequest_fullURI (HTRequest * me)
2.40 frystyk 659: {
2.59 frystyk 660: return me ? me->full_uri : NO;
2.53 frystyk 661: }
662:
663: /*
664: ** Are we using a proxy or not and in that case, which one?
665: */
2.59 frystyk 666: PUBLIC BOOL HTRequest_setProxy (HTRequest * me, const char * proxy)
2.53 frystyk 667: {
2.59 frystyk 668: if (me && proxy) {
669: StrAllocCopy(me->proxy, proxy);
2.53 frystyk 670: return YES;
671: }
672: return NO;
673: }
674:
2.59 frystyk 675: PUBLIC char * HTRequest_proxy (HTRequest * me)
2.53 frystyk 676: {
2.59 frystyk 677: return me ? me->proxy : NULL;
2.1 frystyk 678: }
679:
2.59 frystyk 680: PUBLIC BOOL HTRequest_deleteProxy (HTRequest * me)
2.54 frystyk 681: {
2.59 frystyk 682: if (me) {
683: HT_FREE(me->proxy);
2.54 frystyk 684: return YES;
685: }
686: return NO;
687: }
688:
2.1 frystyk 689: /*
2.59 frystyk 690: ** Reload Mode
2.1 frystyk 691: */
2.59 frystyk 692: PUBLIC void HTRequest_setReloadMode (HTRequest * me, HTReload mode)
2.1 frystyk 693: {
2.59 frystyk 694: if (me) me->reload = mode;
2.1 frystyk 695: }
696:
2.59 frystyk 697: PUBLIC HTReload HTRequest_reloadMode (HTRequest * me)
2.23 frystyk 698: {
2.59 frystyk 699: return me ? me->reload : HT_CACHE_OK;
2.23 frystyk 700: }
701:
702: /*
2.59 frystyk 703: ** Cache control directives. The cache control can be initiated by both
704: ** the server and the client which is the reason for keeping two lists
2.1 frystyk 705: */
2.59 frystyk 706: PUBLIC BOOL HTRequest_addCacheControl (HTRequest * me,
707: char * token, char * value)
2.1 frystyk 708: {
2.59 frystyk 709: if (me) {
710: if (!me->cache_control) me->cache_control = HTAssocList_new();
711: return HTAssocList_replaceObject(me->cache_control, token, value);
712: }
713: return NO;
2.1 frystyk 714: }
715:
2.59 frystyk 716: PUBLIC BOOL HTRequest_deleteCacheControl (HTRequest * me)
2.1 frystyk 717: {
2.59 frystyk 718: if (me && me->cache_control) {
719: HTAssocList_delete(me->cache_control);
720: me->cache_control = NULL;
721: return YES;
722: }
723: return NO;
2.1 frystyk 724: }
725:
2.59 frystyk 726: PUBLIC HTAssocList * HTRequest_cacheControl (HTRequest * me)
2.11 frystyk 727: {
2.59 frystyk 728: return (me ? me->cache_control : NULL);
2.11 frystyk 729: }
730:
2.59 frystyk 731: /*
732: ** Byte ranges
733: */
734: PUBLIC BOOL HTRequest_deleteRange (HTRequest * me)
2.11 frystyk 735: {
2.59 frystyk 736: if (me && me->byte_ranges) {
737: HTAssocList_delete(me->byte_ranges);
738: me->byte_ranges = NULL;
739: return YES;
2.11 frystyk 740: }
741: return NO;
742: }
743:
2.59 frystyk 744: PUBLIC BOOL HTRequest_addRange (HTRequest * me, char * unit, char * range)
2.11 frystyk 745: {
2.59 frystyk 746: if (me) {
747: if (!me->byte_ranges) me->byte_ranges = HTAssocList_new();
748: return HTAssocList_replaceObject(me->byte_ranges, unit, range);
2.11 frystyk 749: }
750: return NO;
751: }
752:
2.59 frystyk 753: PUBLIC HTAssocList * HTRequest_range (HTRequest * me)
754: {
755: return (me ? me->byte_ranges : NULL);
756: }
757:
2.1 frystyk 758: /*
2.59 frystyk 759: ** Connection directives. The connection directies can be initiated by
760: ** both the server and the client which is the reason for keeping two
761: ** lists
2.1 frystyk 762: */
2.59 frystyk 763: PUBLIC BOOL HTRequest_addConnection (HTRequest * me,
764: char * token, char * value)
2.1 frystyk 765: {
2.59 frystyk 766: if (me) {
767: if (!me->connection) me->connection = HTAssocList_new();
768: return HTAssocList_replaceObject(me->connection, token, value);
769: }
770: return NO;
2.1 frystyk 771: }
772:
2.59 frystyk 773: PUBLIC BOOL HTRequest_deleteConnection (HTRequest * me)
2.57 frystyk 774: {
2.59 frystyk 775: if (me && me->connection) {
776: HTAssocList_delete(me->connection);
777: me->connection = NULL;
2.57 frystyk 778: return YES;
779: }
780: return NO;
781: }
782:
2.59 frystyk 783: PUBLIC HTAssocList * HTRequest_connection (HTRequest * me)
2.57 frystyk 784: {
2.59 frystyk 785: return (me ? me->connection : NULL);
2.57 frystyk 786: }
787:
2.59 frystyk 788: /*
789: ** Access Authentication Credentials
790: */
791: PUBLIC BOOL HTRequest_deleteCredentialsAll (HTRequest * me)
2.57 frystyk 792: {
2.59 frystyk 793: if (me && me->credentials) {
794: HTAssocList_delete(me->credentials);
795: me->credentials = NULL;
2.57 frystyk 796: return YES;
797: }
798: return NO;
799: }
800:
2.59 frystyk 801: PUBLIC BOOL HTRequest_addCredentials (HTRequest * me,
802: char * token, char * value)
2.23 frystyk 803: {
2.59 frystyk 804: if (me) {
805: if (!me->credentials) me->credentials = HTAssocList_new();
806: return HTAssocList_addObject(me->credentials, token, value);
807: }
808: return NO;
2.46 frystyk 809: }
810:
2.59 frystyk 811: PUBLIC HTAssocList * HTRequest_credentials (HTRequest * me)
2.46 frystyk 812: {
2.59 frystyk 813: return (me ? me->credentials : NULL);
2.23 frystyk 814: }
815:
816: /*
2.59 frystyk 817: ** Access Authentication Realms
2.1 frystyk 818: */
2.59 frystyk 819: PUBLIC BOOL HTRequest_setRealm (HTRequest * me, char * realm)
2.1 frystyk 820: {
2.59 frystyk 821: if (me && realm) {
822: StrAllocCopy(me->realm, realm);
2.1 frystyk 823: return YES;
824: }
825: return NO;
826: }
827:
2.59 frystyk 828: PUBLIC const char * HTRequest_realm (HTRequest * me)
2.1 frystyk 829: {
2.59 frystyk 830: return (me ? me->realm : NULL);
2.1 frystyk 831: }
832:
2.59 frystyk 833: /*
834: ** PEP Protocol header
835: */
836: PUBLIC BOOL HTRequest_addProtocol (HTRequest * me,
837: char * token, char * value)
2.52 frystyk 838: {
2.59 frystyk 839: if (me) {
840: if (!me->protocol) me->protocol = HTAssocList_new();
841: return HTAssocList_addObject(me->protocol, token,value);
842: }
843: return NO;
2.52 frystyk 844: }
845:
2.59 frystyk 846: PUBLIC BOOL HTRequest_deleteProtocolAll (HTRequest * me)
2.55 frystyk 847: {
2.59 frystyk 848: if (me && me->protocol) {
849: HTAssocList_delete(me->protocol);
850: me->protocol = NULL;
851: return YES;
852: }
853: return NO;
2.55 frystyk 854: }
855:
2.59 frystyk 856: PUBLIC HTAssocList * HTRequest_protocol (HTRequest * me)
2.1 frystyk 857: {
2.59 frystyk 858: return (me ? me->protocol : NULL);
2.54 frystyk 859: }
860:
861: /*
2.59 frystyk 862: ** PEP Protocol Info header
2.54 frystyk 863: */
2.59 frystyk 864: PUBLIC BOOL HTRequest_addProtocolInfo (HTRequest * me,
865: char * token, char * value)
2.54 frystyk 866: {
2.59 frystyk 867: if (me) {
868: if (!me->protocol_info) me->protocol_info = HTAssocList_new();
869: return HTAssocList_addObject(me->protocol_info, token,value);
2.54 frystyk 870: }
871: return NO;
872: }
873:
2.59 frystyk 874: PUBLIC BOOL HTRequest_deleteProtocolInfoAll (HTRequest * me)
2.9 frystyk 875: {
2.59 frystyk 876: if (me && me->protocol_info) {
877: HTAssocList_delete(me->protocol_info);
878: me->protocol_info = NULL;
2.9 frystyk 879: return YES;
880: }
881: return NO;
882: }
883:
2.59 frystyk 884: PUBLIC HTAssocList * HTRequest_protocolInfo (HTRequest * me)
2.9 frystyk 885: {
2.59 frystyk 886: return (me ? me->protocol_info : NULL);
2.9 frystyk 887: }
888:
2.18 frystyk 889: /*
2.59 frystyk 890: ** PEP Protocol request header
2.31 frystyk 891: */
2.59 frystyk 892: PUBLIC BOOL HTRequest_addProtocolRequest (HTRequest * me,
893: char * token, char * value)
2.49 frystyk 894: {
2.59 frystyk 895: if (me) {
896: if (!me->protocol_request) me->protocol_request = HTAssocList_new();
897: return HTAssocList_addObject(me->protocol_request, token,value);
2.49 frystyk 898: }
899: return NO;
900: }
901:
2.59 frystyk 902: PUBLIC BOOL HTRequest_deleteProtocolRequestAll (HTRequest * me)
2.31 frystyk 903: {
2.59 frystyk 904: if (me && me->protocol_request) {
905: HTAssocList_delete(me->protocol_request);
906: me->protocol_request = NULL;
907: return YES;
2.31 frystyk 908: }
909: return NO;
910: }
911:
2.59 frystyk 912: PUBLIC HTAssocList * HTRequest_protocolRequest (HTRequest * me)
2.31 frystyk 913: {
2.59 frystyk 914: return (me ? me->protocol_request : NULL);
2.31 frystyk 915: }
916:
917: /*
2.59 frystyk 918: ** Anchor
2.31 frystyk 919: */
2.59 frystyk 920: PUBLIC void HTRequest_setAnchor (HTRequest * me, HTAnchor *anchor)
2.31 frystyk 921: {
2.59 frystyk 922: if (me) {
923: me->anchor = HTAnchor_parent(anchor);
924: me->childAnchor = ((HTAnchor *) me->anchor != anchor) ?
925: (HTChildAnchor *) anchor : NULL;
2.49 frystyk 926: }
927: }
928:
2.59 frystyk 929: PUBLIC HTParentAnchor * HTRequest_anchor (HTRequest * me)
2.49 frystyk 930: {
2.59 frystyk 931: return me ? me->anchor : NULL;
2.31 frystyk 932: }
933:
2.59 frystyk 934: PUBLIC HTChildAnchor * HTRequest_childAnchor (HTRequest * me)
2.31 frystyk 935: {
2.59 frystyk 936: return me ? me->childAnchor : NULL;
2.31 frystyk 937: }
938:
939: /*
2.59 frystyk 940: ** Parent anchor for Referer field
2.18 frystyk 941: */
2.59 frystyk 942: PUBLIC void HTRequest_setParent (HTRequest * me, HTParentAnchor *parent)
2.18 frystyk 943: {
2.59 frystyk 944: if (me) me->parentAnchor = parent;
2.18 frystyk 945: }
946:
2.59 frystyk 947: PUBLIC HTParentAnchor * HTRequest_parent (HTRequest * me)
2.18 frystyk 948: {
2.59 frystyk 949: return me ? me->parentAnchor : NULL;
2.42 frystyk 950: }
951:
952: /*
2.59 frystyk 953: ** Output stream
2.49 frystyk 954: */
2.59 frystyk 955: PUBLIC void HTRequest_setOutputStream (HTRequest * me, HTStream *output)
2.49 frystyk 956: {
2.59 frystyk 957: if (me) me->output_stream = output;
2.49 frystyk 958: }
959:
2.59 frystyk 960: PUBLIC HTStream *HTRequest_outputStream (HTRequest * me)
2.49 frystyk 961: {
2.59 frystyk 962: return me ? me->output_stream : NULL;
2.49 frystyk 963: }
964:
965: /*
2.59 frystyk 966: ** Output format
2.42 frystyk 967: */
2.59 frystyk 968: PUBLIC void HTRequest_setOutputFormat (HTRequest * me, HTFormat format)
2.42 frystyk 969: {
2.59 frystyk 970: if (me) me->output_format = format;
971: }
972:
973: PUBLIC HTFormat HTRequest_outputFormat (HTRequest * me)
974: {
975: return me ? me->output_format : NULL;
2.42 frystyk 976: }
977:
2.59 frystyk 978: /*
979: ** Debug stream
980: */
981: PUBLIC void HTRequest_setDebugStream (HTRequest * me, HTStream *debug)
2.42 frystyk 982: {
2.59 frystyk 983: if (me) me->debug_stream = debug;
2.42 frystyk 984: }
985:
2.59 frystyk 986: PUBLIC HTStream *HTRequest_debugStream (HTRequest * me)
2.42 frystyk 987: {
2.59 frystyk 988: return me ? me->debug_stream : NULL;
2.42 frystyk 989: }
990:
991: /*
2.59 frystyk 992: ** Debug Format
2.42 frystyk 993: */
2.59 frystyk 994: PUBLIC void HTRequest_setDebugFormat (HTRequest * me, HTFormat format)
2.42 frystyk 995: {
2.59 frystyk 996: if (me) me->debug_format = format;
2.42 frystyk 997: }
998:
2.59 frystyk 999: PUBLIC HTFormat HTRequest_debugFormat (HTRequest * me)
2.42 frystyk 1000: {
2.59 frystyk 1001: return me ? me->debug_format : NULL;
2.42 frystyk 1002: }
1003:
1004: /*
2.59 frystyk 1005: ** Input stream
2.42 frystyk 1006: */
2.59 frystyk 1007: PUBLIC void HTRequest_setInputStream (HTRequest * me, HTStream *input)
2.42 frystyk 1008: {
2.59 frystyk 1009: if (me) me->input_stream = input;
2.42 frystyk 1010: }
1011:
2.59 frystyk 1012: PUBLIC HTStream *HTRequest_inputStream (HTRequest * me)
2.42 frystyk 1013: {
2.59 frystyk 1014: return me ? me->input_stream : NULL;
2.18 frystyk 1015: }
1016:
2.50 frystyk 1017: /*
2.59 frystyk 1018: ** Net before and after callbacks
2.50 frystyk 1019: */
2.59 frystyk 1020: PUBLIC BOOL HTRequest_addBefore (HTRequest * me, HTNetBefore * filter,
1021: const char * tmplate, void * param,
1022: int order, BOOL override)
2.50 frystyk 1023: {
2.59 frystyk 1024: if (me) {
1025: me->befores_local = override;
1026: if (filter) {
1027: if (!me->befores) me->befores = HTList_new();
1028: return HTNetCall_addBefore(me->befores, filter,
1029: tmplate, param, order);
1030: }
1031: return YES; /* It's OK to register a NULL filter */
2.50 frystyk 1032: }
1033: return NO;
1034: }
1035:
2.59 frystyk 1036: PUBLIC BOOL HTRequest_deleteBefore (HTRequest * me, HTNetBefore * filter)
2.50 frystyk 1037: {
2.59 frystyk 1038: if (me && me->befores)
1039: return HTNetCall_deleteBefore(me->befores, filter);
1040: return NO;
2.55 frystyk 1041: }
1042:
2.59 frystyk 1043: PUBLIC BOOL HTRequest_deleteBeforeAll (HTRequest * me)
2.57 frystyk 1044: {
2.59 frystyk 1045: if (me && me->befores) {
1046: HTNetCall_deleteBeforeAll(me->befores);
1047: me->befores = NULL;
1048: me->befores_local = NO;
1049: return YES;
2.57 frystyk 1050: }
1051: return NO;
1052: }
1053:
2.59 frystyk 1054: PUBLIC HTList * HTRequest_before (HTRequest * me, BOOL *override)
2.57 frystyk 1055: {
2.59 frystyk 1056: if (me) {
1057: *override = me->befores_local;
1058: return me->befores;
1059: }
1060: return NULL;
1061: }
1062:
1063: PUBLIC BOOL HTRequest_addAfter (HTRequest * me, HTNetAfter * filter,
1064: const char * tmplate, void * param,
1065: int status, int order, BOOL override)
1066: {
1067: if (me) {
1068: me->afters_local = override;
1069: if (filter) {
1070: if (!me->afters) me->afters = HTList_new();
1071: return HTNetCall_addAfter(me->afters, filter,
1072: tmplate, param, status, order);
1073: }
1074: return YES; /* It's OK to register a NULL filter */
2.57 frystyk 1075: }
1076: return NO;
1077: }
1078:
2.59 frystyk 1079: PUBLIC BOOL HTRequest_deleteAfter (HTRequest * me, HTNetAfter * filter)
1080: {
1081: return (me && me->afters) ?
1082: HTNetCall_deleteAfter(me->afters, filter) : NO;
1083: }
1084:
1085: PUBLIC BOOL HTRequest_deleteAfterStatus (HTRequest * me, int status)
2.57 frystyk 1086: {
2.59 frystyk 1087: return (me && me->afters) ?
1088: HTNetCall_deleteAfterStatus(me->afters, status) : NO;
2.57 frystyk 1089: }
1090:
2.59 frystyk 1091: PUBLIC BOOL HTRequest_deleteAfterAll (HTRequest * me)
2.55 frystyk 1092: {
2.59 frystyk 1093: if (me && me->afters) {
1094: HTNetCall_deleteAfterAll(me->afters);
1095: me->afters = NULL;
1096: me->afters_local = NO;
1097: return YES;
2.55 frystyk 1098: }
1099: return NO;
1100: }
1101:
2.59 frystyk 1102: PUBLIC HTList * HTRequest_after (HTRequest * me, BOOL *override)
2.55 frystyk 1103: {
2.59 frystyk 1104: if (me) {
1105: *override = me->afters_local;
1106: return me->afters;
2.55 frystyk 1107: }
2.59 frystyk 1108: return NULL;
1109: }
1110:
1111: /*
1112: ** Call back function for context swapping
1113: */
1114: PUBLIC void HTRequest_setCallback (HTRequest * me, HTRequestCallback *cbf)
1115: {
1116: if (me) me->callback = cbf;
2.55 frystyk 1117: }
1118:
2.59 frystyk 1119: PUBLIC HTRequestCallback *HTRequest_callback (HTRequest * me)
2.55 frystyk 1120: {
2.59 frystyk 1121: return me ? me->callback : NULL;
2.56 frystyk 1122: }
1123:
1124: /*
2.59 frystyk 1125: ** Context pointer to be used in context call back function
2.56 frystyk 1126: */
2.59 frystyk 1127: PUBLIC void HTRequest_setContext (HTRequest * me, void *context)
2.56 frystyk 1128: {
2.59 frystyk 1129: if (me) me->context = context;
2.56 frystyk 1130: }
1131:
2.59 frystyk 1132: PUBLIC void *HTRequest_context (HTRequest * me)
2.56 frystyk 1133: {
2.59 frystyk 1134: return me ? me->context : NULL;
1135: }
1136:
1137: /*
1138: ** Has output stream been connected to the channel? If not then we
1139: ** must free it explicitly when deleting the request object
1140: */
1141: PUBLIC void HTRequest_setOutputConnected (HTRequest * me, BOOL mode)
1142: {
1143: if (me) me->connected = mode;
2.56 frystyk 1144: }
1145:
2.59 frystyk 1146: PUBLIC BOOL HTRequest_outputConnected (HTRequest * me)
2.56 frystyk 1147: {
2.59 frystyk 1148: return me ? me->connected : NO;
2.56 frystyk 1149: }
1150:
1151: /*
2.59 frystyk 1152: ** Bytes read in this request
2.56 frystyk 1153: */
2.59.2.1 eric 1154: PUBLIC long HTRequest_bodyRead(HTRequest * me)
2.57 frystyk 1155: {
2.59.2.1 eric 1156: return me ? HTNet_bytesRead(me->net) - HTNet_headerLength(me->net) : -1;
2.57 frystyk 1157: }
1158:
2.59 frystyk 1159: /*
1160: ** Bytes written in this request
1161: */
1162: PUBLIC long HTRequest_bytesWritten (HTRequest * me)
2.57 frystyk 1163: {
2.59 frystyk 1164: return me ? HTNet_bytesWritten(me->net) : -1;
1165: }
1166:
1167: /*
1168: ** Handle the max forward header value
1169: */
1170: PUBLIC BOOL HTRequest_setMaxForwards (HTRequest * me, int maxforwards)
1171: {
1172: if (me && maxforwards >= 0) {
1173: me->max_forwards = maxforwards;
1174: HTRequest_addRqHd(me, HT_C_MAX_FORWARDS); /* Turn it on */
2.57 frystyk 1175: return YES;
1176: }
1177: return NO;
1178: }
1179:
2.59 frystyk 1180: PUBLIC int HTRequest_maxForwards (HTRequest * me)
2.57 frystyk 1181: {
2.59 frystyk 1182: return me ? me->max_forwards : -1;
2.57 frystyk 1183: }
1184:
1185: /*
2.59 frystyk 1186: ** Source request
2.57 frystyk 1187: */
2.59 frystyk 1188: PUBLIC BOOL HTRequest_setSource (HTRequest * me, HTRequest * source)
2.57 frystyk 1189: {
2.59 frystyk 1190: if (me) {
1191: me->source = source;
1192: return YES;
2.57 frystyk 1193: }
1194: return NO;
1195: }
1196:
2.59 frystyk 1197: PUBLIC HTRequest * HTRequest_source (HTRequest * me)
2.57 frystyk 1198: {
2.59 frystyk 1199: return (me ? me->source : NULL);
1200: }
1201:
1202: PUBLIC BOOL HTRequest_isPostWeb (HTRequest * me)
1203: {
1204: return (me ? me->source != NULL: NO);
2.57 frystyk 1205: }
1206:
2.59 frystyk 1207: /*
1208: ** POST Call back function for sending data to the destination
1209: */
1210: PUBLIC void HTRequest_setPostCallback (HTRequest * me, HTPostCallback *cbf)
2.57 frystyk 1211: {
2.59 frystyk 1212: if (me) me->PostCallback = cbf;
2.57 frystyk 1213: }
1214:
2.59 frystyk 1215: PUBLIC HTPostCallback * HTRequest_postCallback (HTRequest * me)
2.56 frystyk 1216: {
2.59 frystyk 1217: return me ? me->PostCallback : NULL;
2.56 frystyk 1218: }
1219:
2.59 frystyk 1220: /*
1221: ** Entity Anchor
1222: */
1223: PUBLIC BOOL HTRequest_setEntityAnchor (HTRequest * me,
1224: HTParentAnchor * anchor)
2.56 frystyk 1225: {
2.59 frystyk 1226: if (me) {
1227: me->source_anchor = anchor;
2.56 frystyk 1228: return YES;
1229: }
1230: return NO;
1231: }
1232:
2.59 frystyk 1233: PUBLIC HTParentAnchor * HTRequest_entityAnchor (HTRequest * me)
2.56 frystyk 1234: {
2.59 frystyk 1235: return me ? me->source_anchor ? me->source_anchor :
1236: me->anchor : NULL;
2.50 frystyk 1237: }
1238:
2.1 frystyk 1239: /* ------------------------------------------------------------------------- */
1240: /* POST WEB METHODS */
1241: /* ------------------------------------------------------------------------- */
1242:
1243: /*
1244: ** Add a destination request to this source request structure so that we
1245: ** build the internal request representation of the POST web
1246: ** Returns YES if OK, else NO
1247: */
2.23 frystyk 1248: PUBLIC BOOL HTRequest_addDestination (HTRequest * src, HTRequest * dest)
2.1 frystyk 1249: {
1250: if (src && dest) {
2.23 frystyk 1251: dest->source = src->source = src;
2.1 frystyk 1252: if (!src->mainDestination) {
1253: src->mainDestination = dest;
1254: src->destRequests = 1;
2.36 frystyk 1255: if (CORE_TRACE)
2.30 eric 1256: HTTrace("POSTWeb..... Adding dest %p to src %p\n",
2.23 frystyk 1257: dest, src);
2.1 frystyk 1258: return YES;
1259: } else {
2.23 frystyk 1260: if (!src->destinations) src->destinations = HTList_new();
2.1 frystyk 1261: if (HTList_addObject(src->destinations, (void *) dest)==YES) {
1262: src->destRequests++;
2.36 frystyk 1263: if (CORE_TRACE)
2.30 eric 1264: HTTrace("POSTWeb..... Adding dest %p to src %p\n",
2.23 frystyk 1265: dest, src);
2.1 frystyk 1266: return YES;
1267: }
1268: }
1269: }
1270: return NO;
1271: }
1272:
1273: /*
1274: ** Remove a destination request from this source request structure
2.23 frystyk 1275: ** Remember only to delete the internal request objects as the other
1276: ** comes from the application!
2.1 frystyk 1277: ** Returns YES if OK, else NO
1278: */
2.23 frystyk 1279: PUBLIC BOOL HTRequest_removeDestination (HTRequest * dest)
2.1 frystyk 1280: {
1281: BOOL found=NO;
1282: if (dest && dest->source) {
1283: HTRequest *src = dest->source;
1284: if (src->mainDestination == dest) {
1285: dest->source = NULL;
1286: src->mainDestination = NULL;
1287: src->destRequests--;
1288: found = YES;
2.23 frystyk 1289: } else if (src->destinations) {
2.1 frystyk 1290: if (HTList_removeObject(src->destinations, (void *) dest)) {
1291: src->destRequests--;
1292: found = YES;
1293: }
1294: }
1295: if (found) {
2.23 frystyk 1296: if (dest->internal) HTRequest_delete(dest);
2.36 frystyk 1297: if (CORE_TRACE)
2.30 eric 1298: HTTrace("POSTWeb..... Deleting dest %p from src %p\n",
2.23 frystyk 1299: dest, src);
2.1 frystyk 1300: }
2.23 frystyk 1301: if (src->destRequests <= 0) {
2.36 frystyk 1302: if (CORE_TRACE)
2.30 eric 1303: HTTrace("POSTWeb..... terminated\n");
2.23 frystyk 1304: if (src->internal) HTRequest_delete(src);
2.1 frystyk 1305: }
1306: }
1307: return found;
1308: }
1309:
1310: /*
2.23 frystyk 1311: ** Check to see whether all destinations are ready. If so then enable the
1312: ** source as ready for reading.
1313: ** Returns YES if all dests are ready, NO otherwise
1314: */
1315: PUBLIC BOOL HTRequest_destinationsReady (HTRequest * me)
1316: {
1317: HTRequest * source = me ? me->source : NULL;
1318: if (source) {
1319: if (source->destStreams == source->destRequests) {
1320: HTNet * net = source->net;
2.36 frystyk 1321: if (CORE_TRACE)
2.30 eric 1322: HTTrace("POSTWeb..... All destinations are ready!\n");
2.23 frystyk 1323: if (net) /* Might already have finished */
2.59.2.1 eric 1324: HTEvent_register(HTNet_socket(net), HTEvent_READ, &net->event);
2.23 frystyk 1325: return YES;
1326: }
1327: }
1328: return NO;
1329: }
1330:
1331: /*
1332: ** Find the source request object and make the link between the
2.1 frystyk 1333: ** source output stream and the destination input stream. There can be
1334: ** a conversion between the two streams!
1335: ** Returns YES if link is made, NO otherwise
1336: */
2.3 frystyk 1337: PUBLIC BOOL HTRequest_linkDestination (HTRequest *dest)
2.1 frystyk 1338: {
1339: if (dest && dest->input_stream && dest->source && dest!=dest->source) {
1340: HTRequest *source = dest->source;
1341: HTStream *pipe = HTStreamStack(source->output_format,
1342: dest->input_format,
1343: dest->input_stream,
1344: dest, YES);
1345:
1346: /* Check if we are the only one - else spawn off T streams */
1347: /* @@@ We don't do this yet @@@ */
1348:
2.23 frystyk 1349: /* Now set up output stream of the source */
1350: if (source->output_stream)
1351: (*source->output_stream->isa->_free)(source->output_stream);
2.1 frystyk 1352: source->output_stream = pipe ? pipe : dest->input_stream;
1353:
2.36 frystyk 1354: if (CORE_TRACE)
2.30 eric 1355: HTTrace("POSTWeb..... Linking dest %p to src %p\n",
2.23 frystyk 1356: dest, source);
2.1 frystyk 1357: if (++source->destStreams == source->destRequests) {
1358: HTNet *net = source->net;
2.36 frystyk 1359: if (CORE_TRACE)
2.30 eric 1360: HTTrace("POSTWeb..... All destinations ready!\n");
2.1 frystyk 1361: if (net) /* Might already have finished */
2.59.2.1 eric 1362: HTEvent_register(HTNet_socket(net), HTEvent_READ, &net->event);
2.1 frystyk 1363: return YES;
1364: }
1365: }
1366: return NO;
1367: }
1368:
1369: /*
1370: ** Remove a feed stream to a destination request from this source
1371: ** request structure. When all feeds are removed the request tree is
1372: ** ready to take down and the operation can be terminated.
1373: ** Returns YES if removed, else NO
1374: */
2.3 frystyk 1375: PUBLIC BOOL HTRequest_unlinkDestination (HTRequest *dest)
2.1 frystyk 1376: {
1377: BOOL found = NO;
1378: if (dest && dest->source && dest != dest->source) {
1379: HTRequest *src = dest->source;
1380: if (src->mainDestination == dest) {
1381: src->output_stream = NULL;
1382: if (dest->input_stream)
1383: (*dest->input_stream->isa->_free)(dest->input_stream);
1384: found = YES;
1385: } else if (src->destinations) {
1386:
1387: /* LOOK THROUGH THE LIST AND FIND THE RIGHT ONE */
1388:
1389: }
1390: if (found) {
1391: src->destStreams--;
2.36 frystyk 1392: if (CORE_TRACE)
2.30 eric 1393: HTTrace("POSTWeb..... Unlinking dest %p from src %p\n",
2.23 frystyk 1394: dest, src);
2.1 frystyk 1395: return YES;
1396: }
1397: }
1398: return NO;
1399: }
1400:
1401: /*
1402: ** Removes all request structures in this PostWeb.
1403: */
2.3 frystyk 1404: PUBLIC BOOL HTRequest_removePostWeb (HTRequest *me)
2.1 frystyk 1405: {
1406: if (me && me->source) {
1407: HTRequest *source = me->source;
1408:
1409: /* Kill main destination */
1410: if (source->mainDestination)
1411: HTRequest_removeDestination(source->mainDestination);
1412:
1413: /* Kill all other destinations */
1414: if (source->destinations) {
1415: HTList *cur = source->destinations;
1416: HTRequest *pres;
1417: while ((pres = (HTRequest *) HTList_nextObject(cur)) != NULL)
1418: HTRequest_removeDestination(pres);
1419: }
1420:
1421: /* Remove source request */
1422: HTRequest_removeDestination(source);
1423: return YES;
1424: }
1425: return NO;
1426: }
1427:
1428: /*
1429: ** Kills all threads in a POST WEB connected to this request but
2.23 frystyk 1430: ** NOT this request itself. We also keep the request structures.
1431: ** Some requests might be preemptive, for example a SMTP request (when
2.1 frystyk 1432: ** that has been implemented). However, this will be handled internally
1433: ** in the load function.
1434: */
2.3 frystyk 1435: PUBLIC BOOL HTRequest_killPostWeb (HTRequest *me)
2.1 frystyk 1436: {
1437: if (me && me->source) {
1438: HTRequest *source = me->source;
2.36 frystyk 1439: if (CORE_TRACE) HTTrace("POSTWeb..... Killing\n");
2.1 frystyk 1440:
2.23 frystyk 1441: /*
1442: ** Kill source. The stream tree is now freed so we have to build
1443: ** that again. This is done in HTRequest_linkDestination()
1444: */
1445: if (me != source) {
1446: HTNet_kill(source->net);
1447: source->output_stream = NULL;
1448: }
2.1 frystyk 1449:
1450: /* Kill all other destinations */
1451: if (source->destinations) {
1452: HTList *cur = source->destinations;
1453: HTRequest *pres;
1454: while ((pres = (HTRequest *) HTList_nextObject(cur)) != NULL)
2.23 frystyk 1455: if (me != pres) HTNet_kill(pres->net);
2.1 frystyk 1456: }
2.23 frystyk 1457:
1458: /* Kill main destination */
1459: if (source->mainDestination && me != source->mainDestination)
1460: HTNet_kill(source->mainDestination->net);
2.1 frystyk 1461: return YES;
1462: }
1463: return NO;
2.59.2.2! eric 1464: }
! 1465:
! 1466: PUBLIC int HTRequest_forceFlush (HTRequest * request)
! 1467: {
! 1468: HTHost * host = HTNet_host(request->net);
! 1469: if (host == NULL) return HT_ERROR;
! 1470: return HTHost_forceFlush(host);
2.1 frystyk 1471: }
1472:
1473: /* --------------------------------------------------------------------------*/
1474: /* Document Loader */
1475: /* --------------------------------------------------------------------------*/
1476:
1477: /* Request a resource
1478: ** ------------------
1479: ** This is an internal routine, which has an address AND a matching
1480: ** anchor. (The public routines are called with one OR the other.)
1481: ** Returns:
1482: ** YES if request has been registered (success)
1483: ** NO an error occured
1484: */
2.59 frystyk 1485: PUBLIC BOOL HTLoad (HTRequest * me, BOOL recursive)
2.1 frystyk 1486: {
2.59 frystyk 1487: if (!me || !me->anchor) {
2.36 frystyk 1488: if (CORE_TRACE) HTTrace("Load Start.. Bad argument\n");
2.1 frystyk 1489: return NO;
1490: }
2.57 frystyk 1491:
1492: /* Make sure that we don't carry over any old physical address */
2.59 frystyk 1493: HTAnchor_clearPhysical(me->anchor);
2.57 frystyk 1494:
2.59 frystyk 1495: /* Set the default method if not already done */
1496: if (me->method == METHOD_INVALID) me->method = METHOD_GET;
2.57 frystyk 1497:
1498: /* Should we keep the error stack or not? */
2.59 frystyk 1499: if (!recursive && me->error_stack) {
1500: HTError_deleteAll(me->error_stack);
1501: me->error_stack = NULL;
1502: }
1503:
1504: /* Delete any old Response Object */
1505: if (me->response) {
1506: HTResponse_delete(me->response);
1507: me->response = NULL;
2.16 frystyk 1508: }
2.57 frystyk 1509:
1510: /*
1511: ** We set the start point of handling a request to here.
1512: ** This time will be used by the cache
1513: */
2.59 frystyk 1514: HTRequest_setDate(me, time(NULL));
2.57 frystyk 1515:
1516: /* Now start the Net Manager */
2.59 frystyk 1517: return HTNet_newClient(me);
2.1 frystyk 1518: }
1519:
Webmaster