Hi,

sorry, I've just forgotten to attach the patch content.
it's for squid-icap-2.5-200409161544-src
diff -Nabur ./old/icap_common.c ./new/icap_common.c
--- ./old/icap_common.c 2004-04-04 01:12:55.000000000 +0400
+++ ./new/icap_common.c 2004-12-08 14:16:29.000000000 +0300
@@ -282,9 +282,13 @@
 icapReadTimeout(int fd, void *data)
 {
     IcapStateData *icap = data;
-    debug(81, 3) ("icapReadTimeout: FD %d, unreachable=1\n", fd);
     assert(fd == icap->icap_fd);
+       //AI: Dmitry Adamushko mod
+       if (icap->flags.wait_for_preview_reply || icap->flags.http_server_eof) {
+               debug(81, 3) ("icapReadTimeout: FD %d, unreachable=1\n", fd);
     icapOptSetUnreachable(icap->current_service);
+       } else
+               debug(81, 3) ("icapReadTimeout: FD %d, still reachable\n", fd);
     comm_close(fd);
 }
 
diff -Nabur ./old/icap_respmod.c ./new/icap_respmod.c
--- ./old/icap_respmod.c        2004-08-04 21:20:24.000000000 +0400
+++ ./new/icap_respmod.c        2004-12-08 14:16:29.000000000 +0300
@@ -188,7 +188,7 @@
     if (theEnd) {
        if (icap->respmod.res_body_sz)
            icap->flags.send_zero_chunk = 1;
-       else
+       /*else*/ /*Why this "else" here? theEnd means http_server_eof=1!!! 
(Tsantilas) .... */ 
            icap->flags.http_server_eof = 1;
     }
     /*
@@ -230,7 +230,8 @@
        return;
     }
 #if ICAP_PREVIEW
-    if (preview_size < 0)      /* preview feature off */
+    if (preview_size < 0|| !Config.icapcfg.preview_enable)     /* preview 
feature off; AI add fix
+                                                                               
                           
http://sourceforge.net/mailarchive/forum.php?thread_id=5803119&forum_id=8678 */ 
        icap->flags.preview_done = 1;
 
     if (!icap->flags.preview_done) {
@@ -289,11 +290,13 @@
            memBufAppend(&icap->respmod.buffer, buf, len);
        /* do not send any data now while waiting for preview response */
        /* but prepare for read more data on the HTTP connection */
-       if (!icap->flags.http_server_eof) {
-           debug(81, 3) ("icapSendRespMod: FD %d: commSetSelect on read 
icapRespModReadReply waiting for preview response.\n", icap->icap_fd);
-           commSetSelect(icap->icap_fd, COMM_SELECT_READ, icapRespModReadReply,
-               icap, 0);
-       }
+
+       /*Here is not the right position for the commSetSelect. Better called 
in icapRespModReadReply. (Tsantilas) */
+       /* if (!icap->flags.http_server_eof) {*/
+       /* debug(81, 3) ("icapSendRespMod: FD %d: commSetSelect on read 
icapRespModReadReply waiting for preview response.\n", icap->icap_fd); */
+       /* commSetSelect(icap->icap_fd, COMM_SELECT_READ, icapRespModReadReply,
+          icap, 0); */
+       /* } */
        return;
     } else
 #endif
@@ -394,11 +397,16 @@
        if (status == 100) {
            debug(81, 5) ("icapRespModReadReply: 100 Continue received\n");
            icap->flags.wait_for_preview_reply = 0;
-           /*
+               /* if http_server_eof
             * call again icapSendRespMod to handle data that
-            * was received while waiting fot this ICAP response
+                * was received while waiting for this ICAP response
+                * else let http to call icapSendRespMod when new data arrived
             */
+               if(icap->flags.http_server_eof)
            icapSendRespMod(icap, NULL, 0, 0);
+               /* The following maybe needed ....(Tsantilas)*/
+               /*commSetSelect(fd, COMM_SELECT_READ, icapRespModReadReply, 
icap, 0);*/
+               
            /*
             * reset the header to send the rest of the preview
             */
@@ -409,18 +417,21 @@
        } else if (status == 204) {
            debug(81, 5) ("icapRespModReadReply: 204 No modification 
received\n");
            icap->flags.wait_for_preview_reply = 0;
-           if (icap->flags.http_server_eof) {
+               
+               /* if (icap->flags.http_server_eof) {*/ /*Comment out by 
Tsantilas*/
                /* Reset is required to avoid duplicate stmemFreeDataUpto ,
                 * but will I loose all info now ? */
                /* storeEntryReset(icap->respmod.entry); */
                /* stmemFreeDataUpto(&(entry->mem_obj->data_hdr), -icap->sc); */
-               fwdComplete(icap->httpState->fwd);
-           } else {
-               commSetSelect(fd, COMM_SELECT_READ, icapRespModReadReply,
-                   icap, 0);
-           }
-           comm_close(fd);
-           return;
+               /* fwdComplete(icap->httpState->fwd);*/ /*Comment out by 
Tsantilas*/
+               /* } else {*/ /*Comment out by Tsantilas*/
+               /* commSetSelect(fd, COMM_SELECT_READ, icapRespModReadReply,*/ 
/*Comment out by Tsantilas*/
+               /* icap, 0); */ /*Comment out by Tsantilas*/
+               /* }*/ /*Comment out by Tsantilas*/
+               /* comm_close(fd);*/ /*Comment out by Tsantilas*/
+               /* return; */ /*Comment out by Tsantilas*/
+               /*Previous region comment out because not needed!!!
+                 The following code handles better returned 204 status. 
(Tsantilas) */
 #endif
        }
     }
@@ -443,6 +454,8 @@
            icap->respmod.resp_copy.buf,
            icap->respmod.resp_copy.size);
        icap->respmod.resp_copy.size = 0;
+
+       
        if (icapReadReply2(icap) < 0)
            comm_close(fd);
        /*
@@ -704,16 +717,6 @@
 {
     debug(81, 3) ("icapPconnTransferDone: FD %d\n", fd);
     /*
-     * Did we request a persistent connection?
-     */
-    /*
-     * What does the reply have to say about keep-alive?
-     */
-    if (!icap->flags.keep_alive) {
-       debug(81, 5) ("icapPconnTransferDone: keep_alive not set, ret 0\n");
-       return 0;
-    }
-    /*
      * Be careful with 204 responses.  Normally we are done when we
      * see the zero-end chunk, but that won't happen for 204s, so we
      * use an EOF indicator on the HTTP side instead.
@@ -730,13 +733,23 @@
        debug(81, 5) ("icapPconnTransferDone: no message body, ret 1\n");
        return 1;
     }
-    if (icap->chunk_size != -2) {
+    if (icap->chunk_size == -2) {//AI: was != -2 ; and change content with 
bottom
        /* zero end chunk reached */
-       debug(81, 5) ("icapPconnTransferDone: didnt get zero end chunk yet\n");
-       return 0;
-    }
     debug(81, 5) ("icapPconnTransferDone: got zero end chunk\n");
     return 1;
+    }
+    /*
+     * Did we request a persistent connection?
+     */
+    /*
+     * What does the reply have to say about keep-alive?
+     */
+    if (!icap->flags.keep_alive) {//AI: move from top
+       debug(81, 5) ("icapPconnTransferDone: keep_alive not set, ret 0\n");
+       return 0;
+    }
+       debug(81, 5) ("icapPconnTransferDone: didnt get zero end chunk 
yet\n");//AI: change with second top condition
+       return 0;
 }
 
 static int
@@ -765,6 +778,10 @@
     const request_t *request = icap->request;
     int len;
     debug(81, 5) ("icapReadReply: FD %d: icap %p.\n", fd, data);
+       if(icap->flags.no_content && !icap->flags.http_server_eof) {//AI
+               return;
+       }
+       
     if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
        comm_close(fd);
        return;
@@ -879,12 +896,14 @@
     }
     debug(81, 3) ("%s:%d: icap->chunk_buf.size=%d\n", __FILE__, __LINE__, 
(int) icap->chunk_buf.size);
     debug(81, 3) ("%s:%d: flags.no_content=%d\n", __FILE__, __LINE__, 
icap->flags.no_content);
-    if (icap->flags.no_content) {
+       if (icap->flags.no_content ) {
        /* data from http.c is not chunked */
+        if(!EBIT_TEST(entry->flags, ENTRY_ABORTED)){
        debug(81, 3) ("copying %d bytes from chunk_buf to entry\n",
            icap->chunk_buf.size);
        storeAppend(entry, icap->chunk_buf.buf, icap->chunk_buf.size);
        icap->chunk_buf.size = 0;
+        }
     } else if (2 == icapHttpReplyHdrState(icap)) {
        if (icap->chunk_buf.size)
            icapParseChunkedBody(icap, storeAppend, entry);
@@ -907,7 +926,7 @@
        commSetTimeout(fd, -1, NULL, NULL);
        commSetSelect(fd, COMM_SELECT_READ, NULL, NULL, 0);
        comm_remove_close_handler(fd, icapStateFree, icap);
-       pconnPush(fd, fd_table[fd].pconn_name, fd_table[fd].remote_port);
+       //pconnPush(fd, fd_table[fd].pconn_name, 
fd_table[fd].remote_port);//comment by AI
        storeComplete(entry);
        icap->icap_fd = -1;
        icapStateFree(-1, icap);
-- 
Yours sincerely, Eugeny.
Doctor Web, Ltd. http://www.drweb.com

Reply via email to