--------------------- PatchSet 1325 Date: 2001/01/17 01:52:25 Author: rbcollins Branch: rbcollins_filters Tag: (none) Log: more stable now, also using dlink_list functions Members: src/http.c:1.1.1.3.4.1.4.12.2.2->1.1.1.3.4.1.4.12.2.3 src/structs.h:1.1.1.3.4.1.4.12.2.1->1.1.1.3.4.1.4.12.2.2 src/typedefs.h:1.1.1.3.8.7.4.1->1.1.1.3.8.7.4.2 Index: squid/src/http.c =================================================================== RCS file: /cvsroot/squid-sf//squid/src/http.c,v retrieving revision 1.1.1.3.4.1.4.12.2.2 retrieving revision 1.1.1.3.4.1.4.12.2.3 diff -u -r1.1.1.3.4.1.4.12.2.2 -r1.1.1.3.4.1.4.12.2.3 --- squid/src/http.c 16 Jan 2001 16:44:05 -0000 1.1.1.3.4.1.4.12.2.2 +++ squid/src/http.c 17 Jan 2001 01:52:25 -0000 1.1.1.3.4.1.4.12.2.3 @@ -1,6 +1,6 @@ /* - * $Id: http.c,v 1.1.1.3.4.1.4.12.2.2 2001/01/16 16:44:05 rbcollins Exp $ + * $Id: http.c,v 1.1.1.3.4.1.4.12.2.3 2001/01/17 01:52:25 rbcollins Exp $ * * DEBUG: section 11 Hypertext Transfer Protocol (HTTP) * AUTHOR: Harvest Derived @@ -552,40 +552,36 @@ comm_close(fd); } else { /* we have data */ -/* TODO: move the chain init hack to the request creation code! */ - if (!httpState->filters) { - FILTER_list *temp_filter; + FILTER_list *temp_filter; +/* TODO: move the chain init hack to the request creation code! & make it acl based */ + if (!httpState->filters.head) { /* the first entries added, end up being applied last */ /* Send the data to the store manager */ - httpState->filters=xmalloc(sizeof(FILTER_list)); - httpState->filters->filter=httpDoAppend; - httpState->filters->data=httpState; + temp_filter=xmalloc(sizeof(FILTER_list)); + temp_filter->filter=httpDoAppend; + temp_filter->data=httpState; /* cbDataLock(httpState); ? */ - httpState->filters->prev=NULL; - httpState->filters->next=NULL; + dlinkAdd(temp_filter, &temp_filter->node, &httpState->filters); + /* perform TE encoding */ - temp_filter=httpState->filters; - httpState->filters=xmalloc(sizeof(FILTER_list)); - httpState->filters->filter=httpPerformTE; - httpState->filters->data=httpState; + temp_filter=xmalloc(sizeof(FILTER_list)); + temp_filter->filter=httpPerformTE; + temp_filter->data=httpState; /* cbDataLock(httpState); ? */ - httpState->filters->prev=NULL; - httpState->filters->next=temp_filter; - temp_filter->prev=httpState->filters; + dlinkAdd(temp_filter, &temp_filter->node, &httpState->filters); + /* process the headers */ - temp_filter=httpState->filters; - httpState->filters=xmalloc(sizeof(FILTER_list)); - httpState->filters->filter=httpReplyHeaders; - httpState->filters->data=httpState; + temp_filter=xmalloc(sizeof(FILTER_list)); + temp_filter->filter=httpReplyHeaders; + temp_filter->data=httpState; /* cbDataLock(httpState); ? */ - httpState->filters->prev=NULL; - httpState->filters->next=temp_filter; - temp_filter->prev=httpState->filters; + dlinkAdd(temp_filter, &temp_filter->node, &httpState->filters); } /* call the first filter in our filter chain */ - /* we use a filter no matter what */ - assert(httpState->filters); - httpState->filters->filter(buf, len, httpState->filters->next, 0, httpState->filters->data); + /* we use a filter no matter what (DoAppend) */ + assert(httpState->filters.head); + temp_filter=httpState->filters.head->data; + temp_filter->filter(buf, len, &httpState->filters, temp_filter, 0, temp_filter->data); if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) { /* * the above storeAppend() call could ABORT this entry, @@ -631,11 +627,14 @@ /* A filter with no data to send for the moment, MAY call the filter chain but does not * NEED to */ -void httpReplyHeaders(char *buf, size_t len, FILTER_list *filters, unsigned int flags, void *data) +/* the calling pattern is (Buf, LEN, list_head, self_node, flags, statedata) */ +void httpReplyHeaders(char *buf, size_t len, dlink_list *filter_list, FILTER_list *filters, unsigned int flags, void *data) { HttpStateData *httpState = data; StoreEntry *entry = httpState->entry; const request_t *request = httpState->request; + FILTER_list *temp_filter; + debug(1,1)("handling response headers\n"); { if (httpState->reply_hdr_state < 2) { /* we haven't seen the full headers yet */ @@ -683,11 +682,13 @@ httpState->headerlength+=len; xfree(tempbuf); debug(1,1)("sending combined headers\n"); - if(filters->filter) - filters->filter(httpState->headerstore,httpState->headerlength,filters->next, flags, filters->data); + temp_filter=filters->node.next->data; + temp_filter->filter(httpState->headerstore,httpState->headerlength,filter_list, temp_filter, flags, temp_filter->data); xfree(httpState->headerstore); httpState->headerstore=NULL; httpState->headerlength=0; + dlinkDelete(&filters->node, filter_list); +#if 0 /* remove from filter chain */ { FILTER_list *temp; @@ -695,16 +696,18 @@ filters->prev=filters->prev->prev; if (temp->prev) temp->prev->next=filters; +#endif /* if I alloced data for _me_ free it */ /* free the list entry */ - xfree(temp); - } + xfree(filters); + } else if (httpState->reply_hdr_state == 2){ /* no partials headers, got them in one chunk */ debug(1,1)("headers in one packet... sending\n"); - if(filters->filter) - filters->filter(buf,len,filters->next, flags, filters->data); + temp_filter=filters->node.next->data; + temp_filter->filter(buf,len,filter_list, temp_filter, flags, temp_filter->data); debug(1,1)("headers written \n"); +#if 0 { FILTER_list *temp; temp=filters->prev; @@ -715,37 +718,38 @@ /* free the list entry */ xfree(temp); } +#endif + /* if I alloced data for _me_ free it */ + /* free the list entry */ + dlinkDelete(&filters->node, filter_list); + xfree(filters); } - } else + } else { /* headers have been seen. If we're still in the list for some reason, call the * next filter */ - filters->filter(buf,len,filters->next, flags, filters->data); + temp_filter=filters->node.next->data; + temp_filter->filter(buf,len,filter_list, temp_filter, flags, temp_filter->data); + } } } -void httpPerformTE(char *buf, size_t len, FILTER_list *filters, unsigned int flags, void *data) +void httpPerformTE(char *buf, size_t len, dlink_list *filter_list, FILTER_list *filters, unsigned int flags, void *data) { HttpStateData *httpState = data; StoreEntry *entry = httpState->entry; const request_t *request = httpState->request; + FILTER_list *temp_filter; debug(1,1)("httpPerformTE: len = %d\n",len); if (!entry->mem_obj->reply->decode_translations) { - if(filters->filter) - filters->filter(buf,len,filters->next, flags, filters->data); - { - /* why are we here? */ - FILTER_list *temp; - temp=filters->prev; - filters->prev=filters->prev->prev; - if (temp->prev) - temp->prev->next=filters; - /* if I alloced data for _me_ free it */ - /* free the list entry */ - xfree(temp); - } + temp_filter=filters->node.next->data; + temp_filter->filter(buf,len,filter_list, temp_filter, flags, temp_filter->data); + dlinkDelete(&filters->node, filter_list); + /* if I alloced data for _me_ free it */ + /* free the list entry */ + xfree(filters); return; } @@ -762,8 +766,8 @@ debug(1,1)("HttpReplyBody: First time, header length =%d\n",k); /* get the headers out of the system */ /* we _should filter the headers we don't want here. ah well */ - if(filters->filter) - filters->filter(buf,k,filters->next, flags, filters->data); + temp_filter=filters->node.next->data; + temp_filter->filter(buf,k,filter_list, temp_filter, flags, temp_filter->data); /* storeAppend(entry,buf,k); */ httpState->written+=k; @@ -783,8 +787,8 @@ if (te_body_len) { /* stuff to write */ /* storeAppend(entry, te_body_buf, te_body_len);*/ - if(filters->filter) - filters->filter(te_body_buf,te_body_len,filters->next, flags, filters->data); + temp_filter=filters->node.next->data; + temp_filter->filter(te_body_buf,te_body_len,filter_list, temp_filter, flags, temp_filter->data); httpState->bodysize+=te_body_len; debug(1,1)("interim content-length:%d\n",httpState->bodysize); httpState->written+=te_body_len; @@ -822,14 +826,14 @@ /* empty filter. Must be the last in the filter chain */ -void httpDoAppend(char *buf, size_t len, FILTER_list *filters, unsigned int flags, void * +void httpDoAppend(char *buf, size_t len, dlink_list * filter_list, FILTER_list *filters, unsigned int flags, void * data) { HttpStateData *httpState = data; StoreEntry *entry = httpState->entry; const request_t *request = httpState->request; - assert(filters==NULL); + assert(filters->node.next==NULL); storeAppend(entry,buf,len); Index: squid/src/structs.h =================================================================== RCS file: /cvsroot/squid-sf//squid/src/structs.h,v retrieving revision 1.1.1.3.4.1.4.12.2.1 retrieving revision 1.1.1.3.4.1.4.12.2.2 diff -u -r1.1.1.3.4.1.4.12.2.1 -r1.1.1.3.4.1.4.12.2.2 --- squid/src/structs.h 16 Jan 2001 15:31:59 -0000 1.1.1.3.4.1.4.12.2.1 +++ squid/src/structs.h 17 Jan 2001 01:52:25 -0000 1.1.1.3.4.1.4.12.2.2 @@ -1,6 +1,6 @@ /* - * $Id: structs.h,v 1.1.1.3.4.1.4.12.2.1 2001/01/16 15:31:59 rbcollins Exp $ + * $Id: structs.h,v 1.1.1.3.4.1.4.12.2.2 2001/01/17 01:52:25 rbcollins Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -907,10 +907,9 @@ }; struct _FILTER_list { + dlink_node node; DATAFILTER * filter; void *data; - FILTER_list *next; - FILTER_list *prev; }; struct _HttpStateData { @@ -927,7 +926,7 @@ int fd; http_state_flags flags; FwdState *fwd; - FILTER_list *filters; + dlink_list filters; /* this should be for the ReplyHeaders filter */ char *headerstore; size_t headerlength; Index: squid/src/typedefs.h =================================================================== RCS file: /cvsroot/squid-sf//squid/src/typedefs.h,v retrieving revision 1.1.1.3.8.7.4.1 retrieving revision 1.1.1.3.8.7.4.2 diff -u -r1.1.1.3.8.7.4.1 -r1.1.1.3.8.7.4.2 --- squid/src/typedefs.h 16 Jan 2001 15:32:07 -0000 1.1.1.3.8.7.4.1 +++ squid/src/typedefs.h 17 Jan 2001 01:52:25 -0000 1.1.1.3.8.7.4.2 @@ -1,6 +1,6 @@ /* - * $Id: typedefs.h,v 1.1.1.3.8.7.4.1 2001/01/16 15:32:07 rbcollins Exp $ + * $Id: typedefs.h,v 1.1.1.3.8.7.4.2 2001/01/17 01:52:25 rbcollins Exp $ * * * SQUID Internet Object Cache http://squid.nlanr.net/Squid/ @@ -355,6 +355,6 @@ /* filters.c */ typedef struct _FILTER_list FILTER_list; /* buffer, data length, remaining filters pointer, flags, state data */ -typedef void DATAFILTER(char *, size_t , FILTER_list *, unsigned int, void *); +typedef void DATAFILTER(char *, size_t , dlink_list *, FILTER_list *, unsigned int, void *); #endif /* _TYPEDEFS_H_ */