~squid/squid/3.2

« back to all changes in this revision

Viewing changes to src/client_side_reply.cc

  • Committer: Amos Jeffries
  • Author(s): Garri Djavadyan, Amos Jeffries
  • Date: 2016-12-17 10:24:02 UTC
  • Revision ID: squid3@treenet.co.nz-20161217102402-vbe31by79bp7y71q
Bug 3379: Combination of If-Match and a Cache Hit result in TCP Connection Failure

Show diffs side-by-side

added added

removed removed

Lines of Context:
525
525
       ) {
526
526
        http->logType = LOG_TCP_NEGATIVE_HIT;
527
527
        sendMoreData(result);
 
528
        return;
528
529
    } else if (!http->flags.internal && refreshCheckHTTP(e, r)) {
529
530
        debugs(88, 5, "clientCacheHit: in refreshCheck() block");
530
531
        /*
567
568
            http->logType = LOG_TCP_MISS;
568
569
            processMiss();
569
570
        }
570
 
    } else if (r->conditional())
571
 
        processConditional(result);
572
 
    else {
573
 
        /*
574
 
         * plain ol' cache hit
575
 
         */
 
571
        return;
 
572
    } else if (r->conditional()) {
 
573
        debugs(88, 5, "conditional HIT");
 
574
        if (processConditional(result))
 
575
            return;
 
576
    }
 
577
 
 
578
    /*
 
579
     * plain ol' cache hit
 
580
     */
 
581
    debugs(88, 5, "plain old HIT");
576
582
 
577
583
#if USE_DELAY_POOLS
578
 
        if (e->store_status != STORE_OK)
579
 
            http->logType = LOG_TCP_MISS;
580
 
        else
 
584
    if (e->store_status != STORE_OK)
 
585
        http->logType = LOG_TCP_MISS;
 
586
    else
581
587
#endif
582
 
            if (e->mem_status == IN_MEMORY)
583
 
                http->logType = LOG_TCP_MEM_HIT;
584
 
            else if (Config.onoff.offline)
585
 
                http->logType = LOG_TCP_OFFLINE_HIT;
 
588
        if (e->mem_status == IN_MEMORY)
 
589
            http->logType = LOG_TCP_MEM_HIT;
 
590
        else if (Config.onoff.offline)
 
591
            http->logType = LOG_TCP_OFFLINE_HIT;
586
592
 
587
 
        sendMoreData(result);
588
 
    }
 
593
    sendMoreData(result);
589
594
}
590
595
 
591
596
/**
684
689
}
685
690
 
686
691
/// process conditional request from client
687
 
void
 
692
bool
688
693
clientReplyContext::processConditional(StoreIOBuffer &result)
689
694
{
690
695
    StoreEntry *const e = http->storeEntry();
694
699
               e->getReply()->sline.status << " != 200");
695
700
        http->logType = LOG_TCP_MISS;
696
701
        processMiss();
697
 
        return;
 
702
        return true;
698
703
    }
699
704
 
700
705
    HttpRequest &r = *http->request;
702
707
    if (r.header.has(HDR_IF_MATCH) && !e->hasIfMatchEtag(r)) {
703
708
        // RFC 2616: reply with 412 Precondition Failed if If-Match did not match
704
709
        sendPreconditionFailedError();
705
 
        return;
 
710
        return true;
706
711
    }
707
712
 
708
713
    bool matchedIfNoneMatch = false;
715
720
            r.header.delById(HDR_IF_MODIFIED_SINCE);
716
721
            http->logType = LOG_TCP_MISS;
717
722
            sendMoreData(result);
718
 
            return;
 
723
            return true;
719
724
        }
720
725
 
721
726
        if (!r.flags.ims) {
722
727
            // RFC 2616: if If-None-Match matched and there is no IMS,
723
728
            // reply with 304 Not Modified or 412 Precondition Failed
724
729
            sendNotModifiedOrPreconditionFailedError();
725
 
            return;
 
730
            return true;
726
731
        }
727
732
 
728
733
        // otherwise check IMS below to decide if we reply with 304 or 412
734
739
        if (e->modifiedSince(&r)) {
735
740
            http->logType = LOG_TCP_IMS_HIT;
736
741
            sendMoreData(result);
737
 
            return;
738
 
        }
739
742
 
740
 
        if (matchedIfNoneMatch) {
 
743
        } else if (matchedIfNoneMatch) {
741
744
            // If-None-Match matched, reply with 304 Not Modified or
742
745
            // 412 Precondition Failed
743
746
            sendNotModifiedOrPreconditionFailedError();
744
 
            return;
 
747
 
 
748
        } else {
 
749
            // otherwise reply with 304 Not Modified
 
750
            sendNotModified();
745
751
        }
746
 
 
747
 
        // otherwise reply with 304 Not Modified
748
 
        sendNotModified();
 
752
        return true;
749
753
    }
 
754
 
 
755
    return false;
750
756
}
751
757
 
752
758
void