check_chunked revision b8d55029467b9f139d081cf38c6d06ff45e742a9
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#!/usr/bin/perl -w
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# Copyright 2000-2004 Apache Software Foundation
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# Licensed under the Apache License, Version 2.0 (the "License");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# you may not use this file except in compliance with the License.
44faeccf479dbc70538c261f148f9ad6a8b5ed31artem# You may obtain a copy of the License at
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# http://www.apache.org/licenses/LICENSE-2.0
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# Unless required by applicable law or agreed to in writing, software
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# distributed under the License is distributed on an "AS IS" BASIS,
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# See the License for the specific language governing permissions and
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# limitations under the License.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# This is meant to be used on the raw output of an HTTP/1.1 connection
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# to check that the chunks are all correctly laid out. It's easiest
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# to use a tool like netcat to generate the output. This script
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# *insists* that \r exist in the output.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem#
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# You can find netcat at avian.org:/src/hacks/nc110.tgz.
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemuse strict;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemmy $is_chunked = 0;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem# must toss headers
18c2aff776a775d34a4c9893a4c72e0434d68e36artemwhile(<>) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem if (/^Transfer-Encoding:\s+chunked/i) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem $is_chunked = 1;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem }
18c2aff776a775d34a4c9893a4c72e0434d68e36artem last if ($_ eq "\r\n");
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem$is_chunked || die "wasn't chunked\n";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artemfor(;;) {
18c2aff776a775d34a4c9893a4c72e0434d68e36artem $_ = <> || die "unexpected end of file!\n";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem m#^([0-9a-f]+) *\r$#i || die "bogus chunklen: $_";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my $chunklen = hex($1);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem exit 0 if ($chunklen == 0);
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem chop; chop;
18c2aff776a775d34a4c9893a4c72e0434d68e36artem print "$_ ";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem my $data = '';
18c2aff776a775d34a4c9893a4c72e0434d68e36artem read(ARGV, $data, $chunklen) == $chunklen || die "short read!\n";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem $_ = <> || die "unexpected end of file!\n";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem
18c2aff776a775d34a4c9893a4c72e0434d68e36artem $_ eq "\r\n" || die "missing chunk trailer!\n";
18c2aff776a775d34a4c9893a4c72e0434d68e36artem}
18c2aff776a775d34a4c9893a4c72e0434d68e36artem