[squid-dev] is this really an ICAP 206 response "protocol error", if so what?

Eliezer Croitoru eliezer at ngtech.co.il
Fri Nov 13 02:25:31 UTC 2015


OK now I get the issue I was having trouble with!!
I didn't captured\filtered\analyzed the right tcpdump!!!
It is indeed my bad!!

It seems like I need to add couple more tests to the service when it 
handles some more complex cases such as when there is a null body and 
the allowed method.

Thanks!!!
Eliezer

* sorry for the bzip2 file, z\j confusion, I fixed it and added the icap 
dump which shows the issue at:
http://ngtech.co.il/squid/icap_206_error/icap-206-14.pcap

* I will try to write the bug

* This ICAP service was kind of a hobby coding project to override the 
content caching ability. This code actually will help to write a StoreID 
ICAP enabled service.

On 13/11/2015 03:54, Alex Rousskov wrote:
> On 11/12/2015 05:27 PM, Eliezer Croitoru wrote:
>
>> What I have found is an exception in the logs which results in
>> "ICAP_ERR_OTHER" but I am unable to understand what the issue is.
>>
>> The lines from the log are:
>> 2015/11/13 01:47:22.072 kid1| 0,3| TextException.cc(87) Throw:
>> ModXact.cc:918: exception: state.allowedPostview206
>
>
> The code on that line is pretty clear IMO:
>
>> void Adaptation::Icap::ModXact::handle206PartialContent()
>> {
>> if (state.writing == State::writingPaused) {
>>      Must(preview.enabled());
>>      Must(state.allowedPreview206);
>>      debugs(93, 7, HERE << "206 inside preview");
>> } else {
>>      Must(state.writing > State::writingPaused);
>>      Must(state.allowedPostview206);
>>      debugs(93, 7, HERE << "206 outside preview");
>> }
>
>
> The state.allowedPostview206 exception means that Squid thinks that the
> following are all true:
>
> 1. Squid received ICAP 206 response;
> 2. Squid received a response outside of Preview; and
> 3. Squid did _not_ allow 206 outside of Preview.
>
> You need to figure out which of those three assumptions are false.
>
> If you start digging around, you may eventually find that Squid did not
> allow your service to send a 206 response in the first place:
>
>> RESPMOD icap://127.0.0.2:1344/allow_cache ICAP/1.0
>> Encapsulated: req-hdr=0, res-hdr=144, null-body=444
>> Allow: 204
>
> but your service did anyway:
>
>> ICAP/1.0 206 Partial Content
>> Encapsulated: res-hdr=0, res-body=331
>
> There are other problems with your service response. For example, it
> tells Squid to use a body (use-original-body=0) that Squid said does not
> exist (null-body).
>
> As I have mentioned before, writing a high-quality ICAP service is more
> difficult than it may seem. Correctly handling 206 transactions is even
> more so.
>
>
> As a consolation prize, consider reproducing and filing a bug report
> against Squid as well: AFAICT, the state.writing == State::writingPaused
> condition in handle206PartialContent() is wrong because when there is no
> HTTP message body at all, Squid may be in Preview state (from the ICAP
> point of view), but state.writing will not be State::writingPaused. It
> will be State::writingReallyDone AFAICT. Your logs seem to confirm that.
>
>
> HTH,
>
> Alex.
> P.S. Please do not use .gz extension for bzip2-compressed files.
>



More information about the squid-dev mailing list