- From: olga <olga@goliath.eai.com>
- Date: Fri, 02 Jul 1999 10:18:11 -0500 (CDT)
- To: Yuval Krymolowski <yuvalk@macs.biu.ac.il>, www-lib@w3.org
Hi Yuval, Sorry I have not seen your email earlier. Maybe you already solved the problem... I had similar problem. There are some my emails in wwwlib mailing archives about it (February - March'99). If I recall correctly the problem was that afterfilters for the first request were called to service the next one (started from the first). That was tricky to fix. I do not remember exactly how I did it since I am not working on that application since March. But there are some snippets of the code that I have changed: ////////////////////////////////////////////// main() int terminate_handler (HTRequest * request, HTResponse * response, void * param, int status) { #ifdef EAI_DBG cerr << "\n******* GLOBAL terminate_handler" << endl; if (request) { if ((status == HT_LOADED) || (status == HT_NOT_MODIFIED)) { /* Delete all local after filters and call global after filters if any */ HTRequest_deleteAfterAll(request); HTNet_executeAfterAll(request, status); } /* We are done with this request */ HTRequest_markToDelete(request); } fclose (fp); if (!t) // t is socket listening to the client requests EnsureConnectionSocket(); memset(reqStr, 0, 2048); // now get the next client request strcpy(reqStr, GetRequestStr()); int result = DispatchRequest(reqStr); return HT_OK; } //////////////////////// HTNet.c PUBLIC int HTNetCall_executeAfter (HTList * list, HTRequest * request, int status) { int ret = HT_OK; static visit = 0; if (PROT_TRACE) HTTrace("Net After... ENTERING HTNetCall_executeAfter, visit No = %d\n", ++visit); /*olga: if enter the function normally - then reset nalue of newRequest */ HTRequest_resetIsNew(request); if (status != HT_IGNORE) { HTParentAnchor * anchor = HTRequest_anchor(request); char * url = HTAnchor_physical(anchor); char * addr = url ? url : HTAnchor_address((HTAnchor *) anchor); HTResponse * response = HTRequest_response(request); if (list && request && addr) { AfterFilter * pres; while ((pres = (AfterFilter *) HTList_nextObject(list))) { if ((pres->status == status || pres->status == HT_ALL) && (!pres->tmplate || (pres->tmplate && HTStrMatch(pres->tmplate, addr)))) { if (CORE_TRACE) HTTrace("Net After... calling %p (request %p, response %p, status %d, context %p), visit No = %d\n", pres->after, request, response, status, pres->param, visit); ret = (*pres->after)(request, response, pres->param, status); /* olga: there is where the request might become a new one - if so - break */ /*if (HTRequest_isNewRequest(request)) { ret = HT_OK; break; } */ if (HTRequest_shouldDelete(request)) { ret = HT_OK; break; } if (ret != HT_OK) break; /* ** Update the address to match against if the filter changed ** the physical address. */ if ((url = HTAnchor_physical(anchor))) addr = url; } } } if (!url) HT_FREE(addr); } if (PROT_TRACE) HTTrace("Net After... RETURNING from HTNetCall_executeAfter, ret = %d, visit No = %d\n", ret, visit); return ret; } PUBLIC int HTNet_executeAfterAll (HTRequest * request, int status) { int ret; BOOL override = NO; HTList * afters; if (PROT_TRACE) HTTrace("HTNet_executeAfterAll. Calling HTNetCall_executeAfter for locals\n"); if ((afters = HTRequest_after(request, &override))) { if ((ret = HTNetCall_executeAfter(afters, request, status)) != HT_OK) return ret; /*olga: check if new request, if so - reset and return */ /*if (HTRequest_isNewRequest(request)) { HTRequest_resetIsNew(request); not necessary, but... we are not interested in after filters of previous request - exit return HT_OK; } */ if (HTRequest_shouldDelete(request)) { HTRequest_delete(request); return HT_OK; } } if (PROT_TRACE && !override) HTTrace("HTNet_executeAfterAll. Calling HTNetCall_executeAfter for global filters, HTAfter = %d\n", HTAfter); else if (PROT_TRACE) HTTrace("HTNet_executeAfterAll. Returning HT_OK\n"); return override ? HT_OK : HTNetCall_executeAfter(HTAfter, request, status); } //////////////////////////////////// HTReqMan.c PUBLIC HTRequest * HTRequest_new (void) { HTRequest * me; if ((me = (HTRequest *) HT_CALLOC(1, sizeof(HTRequest))) == NULL) HT_OUTOFMEM("HTRequest_new()"); /* Force Reload */ me->reload = HT_CACHE_OK; /* Set the default user profile */ me->userprofile = HTLib_userProfile(); /* Format of output */ me->output_format = WWW_PRESENT; /* default it to present to user */ me->debug_format = WWW_DEBUG; /* default format of error messages */ /* HTTP headers */ me->GenMask = DEFAULT_GENERAL_HEADERS; me->RequestMask = DEFAULT_REQUEST_HEADERS; me->ResponseMask = DEFAULT_RESPONSE_HEADERS; me->EntityMask = DEFAULT_ENTITY_HEADERS; /* Default retry after value */ me->priority = HT_PRIORITY_MAX; /* Default max forward value */ me->max_forwards = -1; /* Content negotiation */ me->ContentNegotiation = YES; /* Do this by default */ /*olga - elliminating problems with after filters when new request is created in after filter of the previous request*/ me->newRequest = YES; me->shouldDelete = NO; if (CORE_TRACE) HTTrace("Request..... Created %p\n", me); return me; } /**************************************************************** olga: New functions. Elliminating problems with after filters when new request is created in after filter of the previous request *****************************************************************/ PUBLIC BOOL HTRequest_isNewRequest(HTRequest * request) { return request->newRequest; } PUBLIC void HTRequest_resetIsNew(HTRequest * request) { request->newRequest = NO; } PUBLIC BOOL HTRequest_shouldDelete(HTRequest * request) { return request->shouldDelete; } PUBLIC void HTRequest_markToDelete(HTRequest * request) { request->shouldDelete = YES; } //////////////////////////////////////////////////////////////// No guarantees... But maybe it will give you some ideas or at least places to look at. Probably you have it fixed already :-) Regards, Olga Antropova. On 09-Jun-99 Yuval Krymolowski wrote: > Hello, > > In the after filter of a request, I create a new request > and issue it using HTLoad. > > It doesn't work, although the HTLoad returns '1'. > The same code worked when I just issued the requests one after the > other. It runs on NT. > > Actually, one requests gets the HEAD (for last access date) and the other > gets the HTML data through the HTML parser. > Could some one please send a small example of such request nesting, or > a simpler way of getting HEAD+parsed HTML ? > > Thanks, > Yuval Krymolowski > Bar-Ilan University ------------------------------------------------- "Have the appropriate amount of fun" "Programming Perl", 2nd edition, Last phrase from the first chapter. L. Wall, T. Christiansen, R. L. Schwartz.
Received on Friday, 2 July 1999 11:20:02 UTC