Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:43711 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 61057 invoked from network); 15 Apr 2009 11:51:17 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 15 Apr 2009 11:51:17 -0000 Authentication-Results: pb1.pair.com header.from=dmitry@zend.com; sender-id=pass Authentication-Results: pb1.pair.com smtp.mail=dmitry@zend.com; spf=pass; sender-id=pass Received-SPF: pass (pb1.pair.com: domain zend.com designates 212.25.124.185 as permitted sender) X-PHP-List-Original-Sender: dmitry@zend.com X-Host-Fingerprint: 212.25.124.185 il-mr1.zend.com Received: from [212.25.124.185] ([212.25.124.185:36303] helo=il-mr1.zend.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id C6/F0-55480-43AC5E94 for ; Wed, 15 Apr 2009 07:51:17 -0400 Received: from il-gw1.zend.com (unknown [10.1.1.21]) by il-mr1.zend.com (Postfix) with ESMTP id 32CE15044E; Wed, 15 Apr 2009 15:15:45 +0300 (IDT) Received: from ws.home ([10.1.10.36]) by il-gw1.zend.com with Microsoft SMTPSVC(6.0.3790.3959); Wed, 15 Apr 2009 14:50:58 +0300 Message-ID: <49E5CA2E.2050706@zend.com> Date: Wed, 15 Apr 2009 15:51:10 +0400 User-Agent: Thunderbird 2.0.0.21 (X11/20090320) MIME-Version: 1.0 To: Sara Golemon CC: PHP Internals , Lukas Kahwe Smith , =?UTF-8?B?Sm9oYW5uZXMgU2NobMO8dGVy?= , Stas Malyshev , Andi Gutmans References: <49E4A4CD.5010809@zend.com> <3cf130880904141904h23d11d44p9bf988dee6a86027@mail.gmail.com> In-Reply-To: <3cf130880904141904h23d11d44p9bf988dee6a86027@mail.gmail.com> Content-Type: multipart/mixed; boundary="------------050803090404050708020503" X-OriginalArrivalTime: 15 Apr 2009 11:50:58.0373 (UTC) FILETIME=[70FC6750:01C9BDC0] Subject: Re: Support for "Transfer-Encoding: chunked" in http stream wrapper From: dmitry@zend.com (Dmitry Stogov) --------------050803090404050708020503 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Hi, Thanks for comments. The updated patch fixes RFC incompatibilities. It just ignores extensions and trailer. The patch also exports "chunked" filter into user space so now it can be used with any streams (see test in the patch). In case user opens http stream and server responds with "Transfer-Encoding: chunked" header, php applies chunked filter automatically and doesn't bypass "Transfer-Encoding" header to user. The automatic decoding may be disabled using stream_context. stream_context_create(array("http"=>array("auto_decode"=>0))); Any objections against applying it into 5.3? I think it's very easy to add automatic decompression of HTTP responses with HTTP headers "Content-Encoding: gzip" (and others) using similar patch (except for filters are already implemented and the patch will need to update only http_fopen_wrapper.c). Thanks. Dmitry. Sara Golemon wrote: >> The attached patch implements automatic decoding of chunked >> transfer-encoding. >> >> Any objections against committing the patch into PHP_5_3? >> > I didn't have objections when I offered this filter several years ago, > and I still don't. I do recall Andi (or perhaps it was someone else) > saying it was adding unnecessary complexity to the http wrapper and > such things should be left for cURL though, and this is why it didn't > go into 5.1 > >> Maybe someone has ideas about patch improvements? >> > I'd add a context option to disable automatic application of the > filter, and register the filter with the streams layer so that it can > be applied manually. (And of course, I'd second Stas' comment wrt > chunk-header length) > > The issue wrt 1.0 versus 1.1 is fairly moot. If the caller doesn't > override the version then the server won't send chunked encoding. > They are capable of doing so however, and they may already be doing it > (e.g. for a streaming client). So the concern about potential BC > breakage for apps still exists, it's just less severe (since I doubt > many apps *are* explicitly setting the version to 1.1) > > -Sara --------------050803090404050708020503 Content-Type: text/plain; name="chunked.diff.txt" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="chunked.diff.txt" SW5kZXg6IGV4dC9zdGFuZGFyZC9maWx0ZXJzLmMKPT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTog L3JlcG9zaXRvcnkvcGhwLXNyYy9leHQvc3RhbmRhcmQvZmlsdGVycy5jLHYKcmV0cmlldmlu ZyByZXZpc2lvbiAxLjQ0LjIuNi4yLjQuMi4zCmRpZmYgLXUgLXAgLWQgLXIxLjQ0LjIuNi4y LjQuMi4zIGZpbHRlcnMuYwotLS0gZXh0L3N0YW5kYXJkL2ZpbHRlcnMuYwkzMSBEZWMgMjAw OCAxMToxNTo0NSAtMDAwMAkxLjQ0LjIuNi4yLjQuMi4zCisrKyBleHQvc3RhbmRhcmQvZmls dGVycy5jCTE1IEFwciAyMDA5IDExOjM1OjA3IC0wMDAwCkBAIC0xODk3LDYgKzE4OTcsMjIw IEBAIHBocF9zdHJlYW1fZmlsdGVyX2ZhY3RvcnkgY29uc3VtZWRfZmlsdGUKIAogLyogfX19 ICovCiAKKy8qIHt7eyBjaHVua2VkIGZpbHRlciBpbXBsZW1lbnRhdGlvbiAqLwordHlwZWRl ZiBlbnVtIF9waHBfY2h1bmtlZF9maWx0ZXJfc3RhdGUgeworCUNIVU5LX1NJWkVfU1RBUlQs CisJQ0hVTktfU0laRSwKKwlDSFVOS19TSVpFX0VYVF9TVEFSVCwKKwlDSFVOS19TSVpFX0VY VCwKKwlDSFVOS19TSVpFX0NSLAorCUNIVU5LX1NJWkVfTEYsCisJQ0hVTktfQk9EWSwKKwlD SFVOS19CT0RZX0NSLAorCUNIVU5LX0JPRFlfTEYsCisJQ0hVTktfVFJBSUxFUiwKKwlDSFVO S19FUlJPUgorfSBwaHBfY2h1bmtlZF9maWx0ZXJfc3RhdGU7CisKK3R5cGVkZWYgc3RydWN0 IF9waHBfY2h1bmtlZF9maWx0ZXJfZGF0YSB7CisJcGhwX2NodW5rZWRfZmlsdGVyX3N0YXRl IHN0YXRlOworCWludCBjaHVua19zaXplOworCWludCBwZXJzaXN0ZW50OworfSBwaHBfY2h1 bmtlZF9maWx0ZXJfZGF0YTsKKworc3RhdGljIGludCBwaHBfZGVjaHVuayhjaGFyICpidWYs IGludCBsZW4sIHBocF9jaHVua2VkX2ZpbHRlcl9kYXRhICpkYXRhKQoreworCWNoYXIgKnAg PSBidWY7CisJY2hhciAqZW5kID0gcCArIGxlbjsKKwljaGFyICpvdXQgPSBidWY7CisJaW50 IG91dF9sZW4gPSAwOworCisJd2hpbGUgKHAgPCBlbmQpIHsKKwkJc3dpdGNoIChkYXRhLT5z dGF0ZSkgeworCQkJY2FzZSBDSFVOS19TSVpFX1NUQVJUOgorCQkJCWRhdGEtPmNodW5rX3Np emUgPSAwOworCQkJY2FzZSBDSFVOS19TSVpFOgorCQkJCXdoaWxlIChwIDwgZW5kKSB7CisJ CQkJCWlmICgqcCA+PSAnMCcgJiYgKnAgPD0gJzknKSB7CisJCQkJCQlkYXRhLT5jaHVua19z aXplID0gKGRhdGEtPmNodW5rX3NpemUgKiAxNikgKyAoKnAgLSAnMCcpOworCQkJCQl9IGVs c2UgaWYgKCpwID49ICdBJyAmJiAqcCA8PSAnRicpIHsKKwkJCQkJCWRhdGEtPmNodW5rX3Np emUgPSAoZGF0YS0+Y2h1bmtfc2l6ZSAqIDE2KSArICgqcCAtICdBJyArIDEwKTsKKwkJCQkJ fSBlbHNlIGlmICgqcCA+PSAnYScgJiYgKnAgPD0gJ2YnKSB7CisJCQkJCQlkYXRhLT5jaHVu a19zaXplID0gKGRhdGEtPmNodW5rX3NpemUgKiAxNikgKyAoKnAgLSAnYScgKyAxMCk7CisJ CQkJCX0gZWxzZSBpZiAoZGF0YS0+c3RhdGUgPT0gQ0hVTktfU0laRV9TVEFSVCkgeworCQkJ CQkJZGF0YS0+c3RhdGUgPSBDSFVOS19FUlJPUjsKKwkJCQkJCWJyZWFrOworCQkJCQl9IGVs c2UgeworCQkJCQkJZGF0YS0+c3RhdGUgPSBDSFVOS19TSVpFX0VYVF9TVEFSVDsKKwkJCQkJ CWJyZWFrOworCQkJCQl9CisJCQkJCWRhdGEtPnN0YXRlID0gQ0hVTktfU0laRTsKKwkJCQkJ cCsrOworCQkJCX0KKwkJCQlpZiAoZGF0YS0+c3RhdGUgPT0gQ0hVTktfRVJST1IpIHsKKwkJ CQkJY29udGludWU7CisJCQkJfSBlbHNlIGlmIChwID09IGVuZCkgeworCQkJCQlyZXR1cm4g b3V0X2xlbjsKKwkJCQl9CisJCQljYXNlIENIVU5LX1NJWkVfRVhUX1NUQVJUOgorCQkJCWlm ICgqcCA9PSAnOyd8fCAqcCA9PSAnXHInIHx8ICpwID09ICdcbicpIHsKKwkJCQkJZGF0YS0+ c3RhdGUgPSBDSFVOS19TSVpFX0VYVDsKKyAJCQkJfSBlbHNlIHsKKwkJCQkJZGF0YS0+c3Rh dGUgPSBDSFVOS19FUlJPUjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJY2FzZSBDSFVO S19TSVpFX0VYVDoKKwkJCQkvKiBza2lwIGV4dGVuc2lvbiAqLworCQkJCXdoaWxlIChwIDwg ZW5kICYmICpwICE9ICdccicgJiYgKnAgIT0gJ1xuJykgeworCQkJCQlwKys7CisJCQkJfQor CQkJCWlmIChwID09IGVuZCkgeworCQkJCQlyZXR1cm4gb3V0X2xlbjsKKwkJCQl9CisJCQlj YXNlIENIVU5LX1NJWkVfQ1I6CisJCQkJaWYgKCpwID09ICdccicpIHsKKwkJCQkJcCsrOwor CQkJCQlpZiAocCA9PSBlbmQpIHsKKwkJCQkJCWRhdGEtPnN0YXRlID0gQ0hVTktfU0laRV9M RjsKKwkJCQkJCXJldHVybiBvdXRfbGVuOworCQkJCQl9CisJCQkJfQorCQkJY2FzZSBDSFVO S19TSVpFX0xGOgorCQkJCWlmICgqcCA9PSAnXG4nKSB7CisJCQkJCXArKzsKKwkJCQkJaWYg KGRhdGEtPmNodW5rX3NpemUgPT0gMCkgeworCQkJCQkJLyogbGFzdCBjaHVuayAqLworCQkJ CQkJZGF0YS0+c3RhdGUgPSBDSFVOS19UUkFJTEVSOworCQkJCQkJY29udGludWU7CisJCQkJ CX0gZWxzZSBpZiAocCA9PSBlbmQpIHsKKwkJCQkJCWRhdGEtPnN0YXRlID0gQ0hVTktfQk9E WTsKKwkJCQkJCXJldHVybiBvdXRfbGVuOworCQkJCQl9CisJCQkJfSBlbHNlIHsKKwkJCQkJ ZGF0YS0+c3RhdGUgPSBDSFVOS19FUlJPUjsKKwkJCQkJY29udGludWU7CisJCQkJfQorCQkJ Y2FzZSBDSFVOS19CT0RZOgorCQkJCWlmIChlbmQgLSBwID49IGRhdGEtPmNodW5rX3NpemUp IHsKKwkJCQkJaWYgKHAgIT0gb3V0KSB7CisJCQkJCQltZW1tb3ZlKG91dCwgcCwgZGF0YS0+ Y2h1bmtfc2l6ZSk7CisJCQkJCX0KKwkJCQkJb3V0ICs9IGRhdGEtPmNodW5rX3NpemU7CisJ CQkJCW91dF9sZW4gKz0gZGF0YS0+Y2h1bmtfc2l6ZTsKKwkJCQkJcCArPSBkYXRhLT5jaHVu a19zaXplOworCQkJCQlpZiAocCA9PSBlbmQpIHsKKwkJCQkJCWRhdGEtPnN0YXRlID0gQ0hV TktfQk9EWV9DUjsKKwkJCQkJCXJldHVybiBvdXRfbGVuOworCQkJCQl9CisJCQkJfSBlbHNl IHsKKwkJCQkJaWYgKHAgIT0gb3V0KSB7CisJCQkJCQltZW1tb3ZlKG91dCwgcCwgZW5kIC0g cCk7CisJCQkJCX0KKwkJCQkJZGF0YS0+Y2h1bmtfc2l6ZSAtPSBlbmQgLSBwOworCQkJCQlv dXRfbGVuICs9IGVuZCAtIHA7CisJCQkJCXJldHVybiBvdXRfbGVuOworCQkJCX0KKwkJCWNh c2UgQ0hVTktfQk9EWV9DUjoKKwkJCQlpZiAoKnAgPT0gJ1xyJykgeworCQkJCQlwKys7CisJ CQkJCWlmIChwID09IGVuZCkgeworCQkJCQkJZGF0YS0+c3RhdGUgPSBDSFVOS19CT0RZX0xG OworCQkJCQkJcmV0dXJuIG91dF9sZW47CisJCQkJCX0KKwkJCQl9CisJCQljYXNlIENIVU5L X0JPRFlfTEY6CisJCQkJaWYgKCpwID09ICdcbicpIHsKKwkJCQkJcCsrOworCQkJCQlkYXRh LT5zdGF0ZSA9IENIVU5LX1NJWkVfU1RBUlQ7CisJCQkJCWNvbnRpbnVlOworCQkJCX0gZWxz ZSB7CisJCQkJCWRhdGEtPnN0YXRlID0gQ0hVTktfRVJST1I7CisJCQkJCWNvbnRpbnVlOwor CQkJCX0KKwkJCWNhc2UgQ0hVTktfVFJBSUxFUjoKKwkJCQkvKiBpZ25vcmUgdHJhaWxlciAq LworCQkJCXAgPSBlbmQ7CisJCQkJY29udGludWU7CisJCQljYXNlIENIVU5LX0VSUk9SOgor CQkJCWlmIChwICE9IG91dCkgeworCQkJCQltZW1tb3ZlKG91dCwgcCwgZW5kIC0gcCk7CisJ CQkJfQorCQkJCW91dF9sZW4gKz0gZW5kIC0gcDsKKwkJCQlyZXR1cm4gb3V0X2xlbjsJCisJ CX0KKwl9CisJcmV0dXJuIG91dF9sZW47Cit9CisKK3N0YXRpYyBwaHBfc3RyZWFtX2ZpbHRl cl9zdGF0dXNfdCBwaHBfY2h1bmtlZF9maWx0ZXIoCisJcGhwX3N0cmVhbSAqc3RyZWFtLAor CXBocF9zdHJlYW1fZmlsdGVyICp0aGlzZmlsdGVyLAorCXBocF9zdHJlYW1fYnVja2V0X2Jy aWdhZGUgKmJ1Y2tldHNfaW4sCisJcGhwX3N0cmVhbV9idWNrZXRfYnJpZ2FkZSAqYnVja2V0 c19vdXQsCisJc2l6ZV90ICpieXRlc19jb25zdW1lZCwKKwlpbnQgZmxhZ3MKKwlUU1JNTFNf REMpCit7CisJcGhwX3N0cmVhbV9idWNrZXQgKmJ1Y2tldDsKKwlzaXplX3QgY29uc3VtZWQg PSAwOworCXBocF9jaHVua2VkX2ZpbHRlcl9kYXRhICpkYXRhID0gKHBocF9jaHVua2VkX2Zp bHRlcl9kYXRhICopIHRoaXNmaWx0ZXItPmFic3RyYWN0OworCisJd2hpbGUgKGJ1Y2tldHNf aW4tPmhlYWQpIHsKKwkJYnVja2V0ID0gcGhwX3N0cmVhbV9idWNrZXRfbWFrZV93cml0ZWFi bGUoYnVja2V0c19pbi0+aGVhZCBUU1JNTFNfQ0MpOworCQljb25zdW1lZCArPSBidWNrZXQt PmJ1ZmxlbjsKKwkJYnVja2V0LT5idWZsZW4gPSBwaHBfZGVjaHVuayhidWNrZXQtPmJ1Ziwg YnVja2V0LT5idWZsZW4sIGRhdGEpOwkKKwkJcGhwX3N0cmVhbV9idWNrZXRfYXBwZW5kKGJ1 Y2tldHNfb3V0LCBidWNrZXQgVFNSTUxTX0NDKTsKKwl9CisKKwlpZiAoYnl0ZXNfY29uc3Vt ZWQpIHsKKwkJKmJ5dGVzX2NvbnN1bWVkID0gY29uc3VtZWQ7CisJfQorCQorCXJldHVybiBQ U0ZTX1BBU1NfT047Cit9CisKK3N0YXRpYyB2b2lkIHBocF9jaHVua2VkX2R0b3IocGhwX3N0 cmVhbV9maWx0ZXIgKnRoaXNmaWx0ZXIgVFNSTUxTX0RDKQoreworCWlmICh0aGlzZmlsdGVy ICYmIHRoaXNmaWx0ZXItPmFic3RyYWN0KSB7CisJCXBocF9jaHVua2VkX2ZpbHRlcl9kYXRh ICpkYXRhID0gKHBocF9jaHVua2VkX2ZpbHRlcl9kYXRhICopIHRoaXNmaWx0ZXItPmFic3Ry YWN0OworCQlwZWZyZWUoZGF0YSwgZGF0YS0+cGVyc2lzdGVudCk7CisJfQorfQorCitzdGF0 aWMgcGhwX3N0cmVhbV9maWx0ZXJfb3BzIGNodW5rZWRfZmlsdGVyX29wcyA9IHsKKwlwaHBf Y2h1bmtlZF9maWx0ZXIsCisJcGhwX2NodW5rZWRfZHRvciwKKwkiY2h1bmtlZCIKK307CisK K3N0YXRpYyBwaHBfc3RyZWFtX2ZpbHRlciAqY2h1bmtlZF9maWx0ZXJfY3JlYXRlKGNvbnN0 IGNoYXIgKmZpbHRlcm5hbWUsIHp2YWwgKmZpbHRlcnBhcmFtcywgaW50IHBlcnNpc3RlbnQg VFNSTUxTX0RDKQoreworCXBocF9zdHJlYW1fZmlsdGVyX29wcyAqZm9wcyA9IE5VTEw7CisJ cGhwX2NodW5rZWRfZmlsdGVyX2RhdGEgKmRhdGE7CisKKwlpZiAoc3RyY2FzZWNtcChmaWx0 ZXJuYW1lLCAiY2h1bmtlZCIpKSB7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIENyZWF0 ZSB0aGlzIGZpbHRlciAqLworCWRhdGEgPSAocGhwX2NodW5rZWRfZmlsdGVyX2RhdGEgKilw ZWNhbGxvYygxLCBzaXplb2YocGhwX2NodW5rZWRfZmlsdGVyX2RhdGEpLCBwZXJzaXN0ZW50 KTsKKwlpZiAoIWRhdGEpIHsKKwkJcGhwX2Vycm9yX2RvY3JlZihOVUxMIFRTUk1MU19DQywg RV9XQVJOSU5HLCAiRmFpbGVkIGFsbG9jYXRpbmcgJXpkIGJ5dGVzIiwgc2l6ZW9mKHBocF9j aHVua2VkX2ZpbHRlcl9kYXRhKSk7CisJCXJldHVybiBOVUxMOworCX0KKwlkYXRhLT5zdGF0 ZSA9IENIVU5LX1NJWkVfU1RBUlQ7CisJZGF0YS0+Y2h1bmtfc2l6ZSA9IDA7CisJZGF0YS0+ cGVyc2lzdGVudCA9IHBlcnNpc3RlbnQ7CisJZm9wcyA9ICZjaHVua2VkX2ZpbHRlcl9vcHM7 CisKKwlyZXR1cm4gcGhwX3N0cmVhbV9maWx0ZXJfYWxsb2MoZm9wcywgZGF0YSwgcGVyc2lz dGVudCk7Cit9CisKK3N0YXRpYyBwaHBfc3RyZWFtX2ZpbHRlcl9mYWN0b3J5IGNodW5rZWRf ZmlsdGVyX2ZhY3RvcnkgPSB7CisJY2h1bmtlZF9maWx0ZXJfY3JlYXRlCit9OworLyogfX19 ICovCisKIHN0YXRpYyBjb25zdCBzdHJ1Y3QgewogCXBocF9zdHJlYW1fZmlsdGVyX29wcyAq b3BzOwogCXBocF9zdHJlYW1fZmlsdGVyX2ZhY3RvcnkgKmZhY3Rvcnk7CkBAIC0xOTA3LDYg KzIxMjEsNyBAQCBzdGF0aWMgY29uc3Qgc3RydWN0IHsKIAl7ICZzdHJmaWx0ZXJfc3RyaXBf dGFnc19vcHMsICZzdHJmaWx0ZXJfc3RyaXBfdGFnc19mYWN0b3J5IH0sCiAJeyAmc3RyZmls dGVyX2NvbnZlcnRfb3BzLCAmc3RyZmlsdGVyX2NvbnZlcnRfZmFjdG9yeSB9LAogCXsgJmNv bnN1bWVkX2ZpbHRlcl9vcHMsICZjb25zdW1lZF9maWx0ZXJfZmFjdG9yeSB9LAorCXsgJmNo dW5rZWRfZmlsdGVyX29wcywgJmNodW5rZWRfZmlsdGVyX2ZhY3RvcnkgfSwKIAkvKiBhZGRp dGlvbmFsIGZpbHRlcnMgdG8gZ28gaGVyZSAqLwogCXsgTlVMTCwgTlVMTCB9CiB9OwpJbmRl eDogZXh0L3N0YW5kYXJkL2h0dHBfZm9wZW5fd3JhcHBlci5jCj09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KUkNT IGZpbGU6IC9yZXBvc2l0b3J5L3BocC1zcmMvZXh0L3N0YW5kYXJkL2h0dHBfZm9wZW5fd3Jh cHBlci5jLHYKcmV0cmlldmluZyByZXZpc2lvbiAxLjk5LjIuMTIuMi45LjIuMTIKZGlmZiAt dSAtcCAtZCAtcjEuOTkuMi4xMi4yLjkuMi4xMiBodHRwX2ZvcGVuX3dyYXBwZXIuYwotLS0g ZXh0L3N0YW5kYXJkL2h0dHBfZm9wZW5fd3JhcHBlci5jCTMxIERlYyAyMDA4IDExOjE1OjQ1 IC0wMDAwCTEuOTkuMi4xMi4yLjkuMi4xMgorKysgZXh0L3N0YW5kYXJkL2h0dHBfZm9wZW5f d3JhcHBlci5jCTE1IEFwciAyMDA5IDExOjM1OjA3IC0wMDAwCkBAIC0xMTEsNiArMTExLDcg QEAgcGhwX3N0cmVhbSAqcGhwX3N0cmVhbV91cmxfd3JhcF9odHRwX2V4KAogCWNoYXIgKnVz ZXJfaGVhZGVycyA9IE5VTEw7CiAJaW50IGhlYWRlcl9pbml0ID0gKChmbGFncyAmIEhUVFBf V1JBUFBFUl9IRUFERVJfSU5JVCkgIT0gMCk7CiAJaW50IHJlZGlyZWN0ZWQgPSAoKGZsYWdz ICYgSFRUUF9XUkFQUEVSX1JFRElSRUNURUQpICE9IDApOworCXBocF9zdHJlYW1fZmlsdGVy ICp0cmFuc2Zlcl9lbmNvZGluZyA9IE5VTEw7CiAKIAl0bXBfbGluZVswXSA9ICdcMCc7CiAK QEAgLTU5Nyw2ICs1OTgsMjUgQEAgcGhwX3N0cmVhbSAqcGhwX3N0cmVhbV91cmxfd3JhcF9o dHRwX2V4KAogCQkJfSBlbHNlIGlmICghc3RybmNhc2VjbXAoaHR0cF9oZWFkZXJfbGluZSwg IkNvbnRlbnQtTGVuZ3RoOiAiLCAxNikpIHsKIAkJCQlmaWxlX3NpemUgPSBhdG9pKGh0dHBf aGVhZGVyX2xpbmUgKyAxNik7CiAJCQkJcGhwX3N0cmVhbV9ub3RpZnlfZmlsZV9zaXplKGNv bnRleHQsIGZpbGVfc2l6ZSwgaHR0cF9oZWFkZXJfbGluZSwgMCk7CisJCQl9IGVsc2UgaWYg KCFzdHJuY2FzZWNtcChodHRwX2hlYWRlcl9saW5lLCAiVHJhbnNmZXItRW5jb2Rpbmc6IGNo dW5rZWQiLCBzaXplb2YoIlRyYW5zZmVyLUVuY29kaW5nOiBjaHVua2VkIikpKSB7CisKKwkJ CQkvKiBjcmVhdGUgZmlsdGVyIHRvIGRlY29kZSByZXNwb25zZSBib2R5ICovCisJCQkJaWYg KCEob3B0aW9ucyAmIFNUUkVBTV9PTkxZX0dFVF9IRUFERVJTKSkgeworCQkJCQlsb25nIGRl Y29kZSA9IDE7CisKKwkJCQkJaWYgKGNvbnRleHQgJiYgcGhwX3N0cmVhbV9jb250ZXh0X2dl dF9vcHRpb24oY29udGV4dCwgImh0dHAiLCAiYXV0b19kZWNvZGUiLCAmdG1wenZhbCkgPT0g U1VDQ0VTUykgeworCQkJCQkJU0VQQVJBVEVfWlZBTCh0bXB6dmFsKTsKKwkJCQkJCWNvbnZl cnRfdG9fYm9vbGVhbigqdG1wenZhbCk7CisJCQkJCQlkZWNvZGUgPSBaX0xWQUxfUFAodG1w enZhbCk7CisJCQkJCX0KKwkJCQkJaWYgKGRlY29kZSkgeworCQkJCQkJdHJhbnNmZXJfZW5j b2RpbmcgPSBwaHBfc3RyZWFtX2ZpbHRlcl9jcmVhdGUoImNodW5rZWQiLCBOVUxMLCBwaHBf c3RyZWFtX2lzX3BlcnNpc3RlbnQoc3RyZWFtKSBUU1JNTFNfQ0MpOworCQkJCQkJaWYgKHRy YW5zZmVyX2VuY29kaW5nKSB7CisJCQkJCQkJLyogZG9uJ3Qgc3RvcmUgdHJhbnNmZXItZW5j b2RlaW5nIGhlYWRlciAqLworCQkJCQkJCWNvbnRpbnVlOworCQkJCQkJfQorCQkJCQl9CisJ CQkJfQogCQkJfQogCiAJCQlpZiAoaHR0cF9oZWFkZXJfbGluZVswXSA9PSAnXDAnKSB7CkBA IC03NDAsNiArNzYwLDExIEBAIG91dDoKIAkJICogdGhlIHN0cmVhbSAqLwogCQlzdHJlYW0t PnBvc2l0aW9uID0gMDsKIAorCQlpZiAodHJhbnNmZXJfZW5jb2RpbmcpIHsKKwkJCXBocF9z dHJlYW1fZmlsdGVyX2FwcGVuZCgmc3RyZWFtLT5yZWFkZmlsdGVycywgdHJhbnNmZXJfZW5j b2RpbmcpOworCQl9CisJfSBlbHNlIGlmICh0cmFuc2Zlcl9lbmNvZGluZykgeworCQlwaHBf c3RyZWFtX2ZpbHRlcl9mcmVlKHRyYW5zZmVyX2VuY29kaW5nIFRTUk1MU19DQyk7CiAJfQog CiAJcmV0dXJuIHN0cmVhbTsKSW5kZXg6IGV4dC9zdGFuZGFyZC90ZXN0cy9maWx0ZXJzL2No dW5rZWRfMDAxLnBocHQKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpSQ1MgZmlsZTogZXh0L3N0YW5kYXJkL3Rl c3RzL2ZpbHRlcnMvY2h1bmtlZF8wMDEucGhwdApkaWZmIC1OIGV4dC9zdGFuZGFyZC90ZXN0 cy9maWx0ZXJzL2NodW5rZWRfMDAxLnBocHQKLS0tIC9kZXYvbnVsbAkxIEphbiAxOTcwIDAw OjAwOjAwIC0wMDAwCisrKyBleHQvc3RhbmRhcmQvdGVzdHMvZmlsdGVycy9jaHVua2VkXzAw MS5waHB0CTE1IEFwciAyMDA5IDExOjM1OjA3IC0wMDAwCkBAIC0wLDAgKzEsMzMgQEAKKy0t VEVTVC0tCitDaHVua2VkIGVuY29kaW5nCistLVNLSVBJRi0tCis8P3BocAorJGZpbHRlcnMg PSBzdHJlYW1fZ2V0X2ZpbHRlcnMoKTsKK2lmKCEgaW5fYXJyYXkoICJjaHVua2VkIiwgJGZp bHRlcnMgKSkgZGllKCAiY2h1bmtlZCBmaWx0ZXIgbm90IGF2YWlsYWJsZS4iICk7Cis/Pgor LS1GSUxFLS0KKzw/cGhwCiskc3RyZWFtcyA9IGFycmF5KAorCSJkYXRhOi8vdGV4dC9wbGFp biwwXHJcbiIsCisJImRhdGE6Ly90ZXh0L3BsYWluLDJcclxudGVcclxuMlxyXG5zdFxyXG4w XHJcbiIsCisJImRhdGE6Ly90ZXh0L3BsYWluLDJcbnRlXG4yXG5zdFxuMFxuIiwKKwkiZGF0 YTovL3RleHQvcGxhaW4sMjthPTFcbnRlXG4yO2E9MjtiPTNcclxuc3RcbjBcbiIsCisJImRh dGE6Ly90ZXh0L3BsYWluLDJcbnRlXG4yXG5zdFxuMFxuYT1iXHJcbmM9ZFxuXHJcbiIsCisJ ImRhdGE6Ly90ZXh0L3BsYWluLDFmXG4wMTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2Rl XG4xXG5mXG4wXG4iLAorCSJkYXRhOi8vdGV4dC9wbGFpbiwxRVxuMDEyMzQ1Njc4OWFiY2Rl ZjAxMjM0NTY3ODlhYmNkXG4yXG5lZlxuMFxuIiwKKyk7Citmb3JlYWNoICgkc3RyZWFtcyBh cyAkbmFtZSkgeworCSRmcCA9IGZvcGVuKCRuYW1lLCAiciIpOworCXN0cmVhbV9maWx0ZXJf YXBwZW5kKCRmcCwgImNodW5rZWQiLCBTVFJFQU1fRklMVEVSX1JFQUQpOworCXZhcl9kdW1w KHN0cmVhbV9nZXRfY29udGVudHMoJGZwKSk7CisJZmNsb3NlKCRmcCk7Cit9Cis/PgorLS1F WFBFQ1QtLQorc3RyaW5nKDApICIiCitzdHJpbmcoNCkgInRlc3QiCitzdHJpbmcoNCkgInRl c3QiCitzdHJpbmcoNCkgInRlc3QiCitzdHJpbmcoNCkgInRlc3QiCitzdHJpbmcoMzIpICIw MTIzNDU2Nzg5YWJjZGVmMDEyMzQ1Njc4OWFiY2RlZiIKK3N0cmluZygzMikgIjAxMjM0NTY3 ODlhYmNkZWYwMTIzNDU2Nzg5YWJjZGVmIgo= --------------050803090404050708020503--