From nobody@FreeBSD.org  Thu Jul 31 10:46:06 2008
Return-Path: <nobody@FreeBSD.org>
Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34])
	by hub.freebsd.org (Postfix) with ESMTP id 41BFF106567D
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 31 Jul 2008 10:46:06 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (www.freebsd.org [IPv6:2001:4f8:fff6::21])
	by mx1.freebsd.org (Postfix) with ESMTP id 3608D8FC17
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 31 Jul 2008 10:46:06 +0000 (UTC)
	(envelope-from nobody@FreeBSD.org)
Received: from www.freebsd.org (localhost [127.0.0.1])
	by www.freebsd.org (8.14.2/8.14.2) with ESMTP id m6VAk6vT070181
	for <freebsd-gnats-submit@FreeBSD.org>; Thu, 31 Jul 2008 10:46:06 GMT
	(envelope-from nobody@www.freebsd.org)
Received: (from nobody@localhost)
	by www.freebsd.org (8.14.2/8.14.1/Submit) id m6VAk5Gm070180;
	Thu, 31 Jul 2008 10:46:05 GMT
	(envelope-from nobody)
Message-Id: <200807311046.m6VAk5Gm070180@www.freebsd.org>
Date: Thu, 31 Jul 2008 10:46:05 GMT
From: Andrei Andreev <duke66@gmail.com>
To: freebsd-gnats-submit@FreeBSD.org
Subject: Portsnap fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
X-Send-Pr-Version: www-3.1
X-GNATS-Notify:

>Number:         126131
>Category:       bin
>Synopsis:       portsnap(8) fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
>Confidential:   no
>Severity:       non-critical
>Priority:       low
>Responsible:    cperciva
>State:          open
>Quarter:        
>Keywords:       
>Date-Required:  
>Class:          sw-bug
>Submitter-Id:   current-users
>Arrival-Date:   Thu Jul 31 10:50:01 UTC 2008
>Closed-Date:    
>Last-Modified:  Sun Apr 13 23:32:30 UTC 2014
>Originator:     Andrei Andreev
>Release:        STABLE 7
>Organization:
Fun Factory
>Environment:
FreeBSD support.nikitaonline.ru 7.0-STABLE FreeBSD 7.0-STABLE #0: Fri Apr 25 10:35:36 MSD 2008     alex@support.nikitaonline.ru:/usr/obj/usr/src/sys/GENERICwIPFWwPOLLING  i386

>Description:
[root@support ~]# portsnap --debug fetch
Looking up portsnap.FreeBSD.org mirrors... 3 mirrors found.
Fetching snapshot tag from portsnap2.FreeBSD.org...
latest.ssl                                    100% of  256  B 1082 kBps
done.
Fetching snapshot metadata...
f6d2271e6555c5167bdc87f31cbcb94777af6053dc0e78100% of  375  B 1387 kBps
done.
Updating from Wed Jul 30 04:37:53 MSD 2008 to Thu Jul 31 12:28:06 MSD
2008.
Fetching 3 metadata patches...
/usr/libexec/phttpget portsnap2.FreeBSD.org
tp/5b0b079d90037bef38609b9d6ce417995f8b694d4c3f6bfcff4ce6102f061606-a698e0a2cc5e28e0eba65ab99a4e37f6b927ddc1df0260a304cca1728686$
tp/f9e7903f981ae2e185a52207f67b432f018e9cbf4be65bdb3bdc9f03083742d3-b819f662863fbd58772f38bcc11d69a0652f7063a2abee65f5c60fe7d5ef$
tp/b22f354c2629801a71faf4ed0dfb6c20c213ca36309d3a3dcd265085c3eed14b-b1abb5b3e019278e635f86372d54621f8e12b7cf63c13989604dab6ba2b0$
phttpget: host = squid, port = 123456t@192.168.9.1:3128: servname not
supported for ai_socktype
 done.
Applying metadata patches... done.
Fetching 3 metadata files...
/usr/libexec/phttpget portsnap2.FreeBSD.org
f/a698e0a2cc5e28e0eba65ab99a4e37f6b927ddc1df0260a304cca17286864601.gz
f/b819f662863fbd58772f38bcc11d69a0652f7063a2abee65f5c60fe7d5ef9e97.gz
f/b1abb5b3e019278e635f86372d54621f8e12b7cf63c13989604dab6ba2b04f6d.gz
phttpget: host = squid, port = 123456@192.168.9.1:3128: servname not
supported for ai_socktype
/usr/sbin/portsnap: cannot open
a698e0a2cc5e28e0eba65ab99a4e37f6b927ddc1df0260a304cca17286864601.gz: No
such file or directory
metadata is corrupt.

>How-To-Repeat:
export HTTP_PROXY=http://squid:123456@192.168.9.1:3128
portsnap --debug fetch

or

export HTTP_PROXY_AUTH="basic:squid:123456"
portsnap --debug fetch

>Fix:
yes. i wrote patch for phttpget :-)
now phttpget can get authorization on proxy with HTTP_PROXY_AUTH or
HTTP_PROXY.


>Release-Note:
>Audit-Trail:
Responsible-Changed-From-To: freebsd-bugs->cperciva 
Responsible-Changed-By: edwin 
Responsible-Changed-When: Thu Jul 31 10:51:18 UTC 2008 
Responsible-Changed-Why:  
Over to maintainer 

http://www.freebsd.org/cgi/query-pr.cgi?pr=126131 

From: Colin Percival <cperciva@freebsd.org>
To: bug-followup@FreeBSD.org, duke66@gmail.com
Cc:  
Subject: Re: misc/126131: Portsnap fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
Date: Thu, 31 Jul 2008 12:38:30 -0700

 Can you provide the patch you wrote?
 
 Colin Percival

From: duke <duke66@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: misc/126131: Portsnap fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
Date: Fri, 1 Aug 2008 17:11:59 +0400

 ------=_Part_4301_22987983.1217596320157
 Content-Type: multipart/alternative; 
 	boundary="----=_Part_4302_17123141.1217596320157"
 
 ------=_Part_4302_17123141.1217596320157
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 2008/7/31 Colin Percival <cperciva@freebsd.org>
 
 > Can you provide the patch you wrote?
 >
 > Colin Percival
 >
 yes
 
 ------=_Part_4302_17123141.1217596320157
 Content-Type: text/html; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 <div dir="ltr"><br><br><div class="gmail_quote">2008/7/31 Colin Percival <span dir="ltr">&lt;<a href="mailto:cperciva@freebsd.org">cperciva@freebsd.org</a>&gt;</span><br><blockquote class="gmail_quote" style="border-left: 1px solid rgb(204, 204, 204); margin: 0pt 0pt 0pt 0.8ex; padding-left: 1ex;">
 Can you provide the patch you wrote?<br><font color="#888888">
 <br>
 Colin Percival<br>
 </font></blockquote></div>yes<br></div>
 
 ------=_Part_4302_17123141.1217596320157--
 
 ------=_Part_4301_22987983.1217596320157
 Content-Type: text/plain; name=new-patch.txt
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_fjcteygj0
 Content-Disposition: attachment; filename=new-patch.txt
 
 ZGlmZiAtTmF1ciBwaHR0cGdldC0wLjIvcGh0dHBnZXQuYyBteS1waHR0cGdldC0wLjIvcGh0dHBn
 ZXQuYwotLS0gcGh0dHBnZXQtMC4yL3BodHRwZ2V0LmMJMjAwNS0wNy0zMSAxMjoxNzoxNC4wMDAw
 MDAwMDAgKzA0MDAKKysrIG15LXBodHRwZ2V0LTAuMi9waHR0cGdldC5jCTIwMDgtMDctMzEgMTM6
 NDk6NTUuMDAwMDAwMDAwICswNDAwCkBAIC00NSw3ICs0NSwxNCBAQAogCiBjaGFyICoJZW52X0hU
 VFBfUFJPWFk7CiBjaGFyICoJZW52X0hUVFBfVVNFUl9BR0VOVDsKK2NoYXIgKgllbnZfSFRUUF9Q
 Uk9YWV9BVVRIOwogY2hhciAqCXByb3h5cG9ydDsKK2NoYXIgKiAgcHJveHlfYXV0aF91c2VyOwor
 Y2hhciAqICBwcm94eV9hdXRoX3Bhc3M7CitjaGFyICphdXRoaGRyLCBhdXRoYnVmWzEwMjRdOwor
 Y2hhciAqYXV0aCwgYXV0aGJ1ZlsxMDI0XTsKKworCiAKIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbAl0
 aW1vID0geyAxNSwgMH07CiAKQEAgLTU3LDI4ICs2NCw5NCBAQAogCWV4aXQoRVhfVVNBR0UpOwog
 fQogCitzdGF0aWMgY2hhciAqYmFzZTY0X2VuY29kZShjb25zdCBjaGFyICpidWYsIGludCBsZW4p
 Cit7CisgICAgICAgIGNvbnN0IGNoYXIgKmI2NCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ
 WmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKyAgICAgICAgaW50IGJp
 dF9vZmZzZXQsIGJ5dGVfb2Zmc2V0LCBpZHgsIGk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNo
 YXIgKmQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWJ1ZjsKKyAgICAgICAgaW50IGJ5dGVzID0g
 KGxlbio4ICsgNSkvNiwgcGFkX2J5dGVzID0gKGJ5dGVzICUgNCkgPyA0IC0gKGJ5dGVzICUgNCkg
 OiAwOworICAgICAgICBjaGFyICpvdXQ7CisKKyAgICAgICAgb3V0ID0gY2FsbG9jKDEsIGJ5dGVz
 K3BhZF9ieXRlcysxKTsKKyAgICAgICAgaWYgKCFvdXQpIHJldHVybiBOVUxMOworCisgICAgICAg
 IGZvciAoaT0wO2k8Ynl0ZXM7aSsrKSB7CisgICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSAo
 aSo2KS84OworICAgICAgICAgICAgICAgIGJpdF9vZmZzZXQgPSAoaSo2KSU4OworICAgICAgICAg
 ICAgICAgIGlmIChiaXRfb2Zmc2V0IDwgMykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWR4
 ID0gKGRbYnl0ZV9vZmZzZXRdID4+ICgyLWJpdF9vZmZzZXQpKSAmIDB4M0Y7CisgICAgICAgICAg
 ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChkW2J5dGVfb2Zm
 c2V0XSA8PCAoYml0X29mZnNldC0yKSkgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAg
 aWYgKGJ5dGVfb2Zmc2V0KzEgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
 ICAgaWR4IHw9IChkW2J5dGVfb2Zmc2V0KzFdID4+ICg4LShiaXRfb2Zmc2V0LTIpKSk7CisgICAg
 ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
 IG91dFtpXSA9IGI2NFtpZHhdOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7aTxieXRlcytw
 YWRfYnl0ZXM7aSsrKQorICAgICAgICAgICAgICAgIG91dFtpXSA9ICc9JzsKKyAgICAgICAgb3V0
 W2ldID0gMDsKKworICAgICAgICByZXR1cm4gb3V0OworfQorCiBzdGF0aWMgdm9pZAogcmVhZGVu
 dih2b2lkKQogewotCWNoYXIgKiBwOwotCi0JZW52X0hUVFBfUFJPWFkgPSBnZXRlbnYoIkhUVFBf
 UFJPWFkiKTsKLQlpZiAoZW52X0hUVFBfUFJPWFkpIHsKLQkJaWYgKHN0cm5jbXAoZW52X0hUVFBf
 UFJPWFksICJodHRwOi8vIiwgNykgPT0gMCkKLQkJCWVudl9IVFRQX1BST1hZICs9IDc7Ci0JCXAg
 PSBzdHJjaHIoZW52X0hUVFBfUFJPWFksICc6Jyk7Ci0JCWlmIChwICE9IE5VTEwpIHsKLQkJCSpw
 ID0gMDsKLQkJCXByb3h5cG9ydCA9IHAgKyAxOwotCQl9IGVsc2UKLQkJCXByb3h5cG9ydCA9ICIz
 MTI4IjsKKyAgICAgICBjaGFyICogcDsKKwljaGFyICp0bXA7CisJaW50IGw7CisJaW50IGxlbjsK
 KwljaGFyIHRbMTAyNF09ezB9OwkKKworICAgICAgICBlbnZfSFRUUF9QUk9YWSA9IGdldGVudigi
 SFRUUF9QUk9YWSIpOworCWVudl9IVFRQX1BST1hZX0FVVEggPSBnZXRlbnYoIkhUVFBfUFJPWFlf
 QVVUSCIpOworCisJY2hhciAqKnNwID0gJmVudl9IVFRQX1BST1hZOworCisgICAgICAgIGlmIChl
 bnZfSFRUUF9QUk9YWSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGVudl9IVFRQX1BS
 T1hZLCAiaHR0cDovLyIsIDcpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfSFRU
 UF9QUk9YWSArPSA3OworCisJICAgICAgIHRtcCA9IHN0cmR1cChlbnZfSFRUUF9QUk9YWSk7CisJ
 ICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeyBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOyBleGl0
 OyB9CisJICAgICAgIHNwID0gJnRtcDsKKwkgICAgICAgcHJveHlfYXV0aF91c2VyID0gc3Ryc2Vw
 KHNwLCAiQCIpOworCQlsID0gc3RybGVuKHNwKTsJCQorICAgICAgICAgICAgICAgaWYgKHByb3h5
 X2F1dGhfdXNlciAhPSBOVUxMICYmIGwgIT0gMCkgeworCQlwcm94eV9hdXRoX3VzZXIgPSBzdHJz
 ZXAoJmVudl9IVFRQX1BST1hZLCAiQCIpOworCQlzc2NhbmYocHJveHlfYXV0aF91c2VyLCIlcyIs
 dCk7CisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHQpOworICAgICAgICAgICAgICAgIGF1
 dGhoZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgIjsKKyAgICAgICAgICAgICAgICBh
 dXRoID0gYmFzZTY0X2VuY29kZSh0LCBsZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgIHBy
 b3h5X2F1dGhfcGFzcyA9IHN0cmNocihwcm94eV9hdXRoX3VzZXIsICc6Jyk7CisgICAgICAgICAg
 ICAgICAgICAgICAgIGlmIChwcm94eV9hdXRoX3Bhc3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAg
 ICAgICAgICAgICAgICAgICAqcHJveHlfYXV0aF9wYXNzKysgPSAnXDAnOworICAgICAgICAgICAg
 ICAgfQorICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIoZW52X0hUVFBfUFJPWFksICc6Jyk7Cisg
 ICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
 KnAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlwb3J0ID0gcCArIDE7CisgICAg
 ICAgICAgICAgICAgfSBlbHNlICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5cG9ydCA9
 ICIzMTI4IjsKKyAgICAgICAgfQorCQorCWlmIChlbnZfSFRUUF9QUk9YWV9BVVRIKSB7CisJaWYg
 KHN0cm5jbXAoZW52X0hUVFBfUFJPWFlfQVVUSCwgImJhc2ljOiIsIDYpID09IDApCisgICAgICAg
 ICAgICAgICAgICAgICAgICBlbnZfSFRUUF9QUk9YWV9BVVRIICs9IDY7CisJbGVuID0gc3RybGVu
 KGVudl9IVFRQX1BST1hZX0FVVEgpOworCWF1dGhoZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbjog
 QmFzaWMgIjsKKwlhdXRoID0gYmFzZTY0X2VuY29kZShlbnZfSFRUUF9QUk9YWV9BVVRILCBsZW4p
 OwogCX0KIAotCWVudl9IVFRQX1VTRVJfQUdFTlQgPSBnZXRlbnYoIkhUVFBfVVNFUl9BR0VOVCIp
 OwotCWlmIChlbnZfSFRUUF9VU0VSX0FHRU5UID09IE5VTEwpCi0JCWVudl9IVFRQX1VTRVJfQUdF
 TlQgPSAicGh0dHBnZXQvMC4xIjsKKyAgICAgICAgZW52X0hUVFBfVVNFUl9BR0VOVCA9IGdldGVu
 digiSFRUUF9VU0VSX0FHRU5UIik7CisgICAgICAgIGlmIChlbnZfSFRUUF9VU0VSX0FHRU5UID09
 IE5VTEwpCisgICAgICAgICAgICAgICAgZW52X0hUVFBfVVNFUl9BR0VOVCA9ICJwaHR0cGdldC8w
 LjEiOwogfQogCisKIHN0YXRpYyBpbnQKIG1ha2VyZXF1ZXN0KGNoYXIgKiogYnVmLCBjaGFyICog
 cGF0aCwgY2hhciAqIHNlcnZlciwgaW50IGNvbm5jbG9zZSkKIHsKQEAgLTg3LDEyICsxNjAsMTUg
 QEAKIAlidWZsZW4gPSBhc3ByaW50ZihidWYsCiAJICAgICJHRVQgJXMlcy8lcyBIVFRQLzEuMVxy
 XG4iCiAJICAgICJIb3N0OiAlc1xyXG4iCisJICAgICIlcyVzXHJcbiIKIAkgICAgIlVzZXItQWdl
 bnQ6ICVzXHJcbiIKIAkgICAgIiVzIgogCSAgICAiXHJcbiIsCiAJICAgIGVudl9IVFRQX1BST1hZ
 ID8gImh0dHA6Ly8iIDogIiIsCiAJICAgIGVudl9IVFRQX1BST1hZID8gc2VydmVyIDogIiIsCi0J
 ICAgIHBhdGgsIHNlcnZlciwgZW52X0hUVFBfVVNFUl9BR0VOVCwKKwkgICAgcGF0aCwgc2VydmVy
 LAorCSAgICBhdXRoaGRyLCBhdXRoLAorCSAgICBlbnZfSFRUUF9VU0VSX0FHRU5ULAogCSAgICBj
 b25uY2xvc2UgPyAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIiA6ICIiKTsKIAlpZiAoYnVmbGVuID09
 IC0xKQogCQllcnIoMSwgImFzcHJpbnRmIik7Cg==
 ------=_Part_4301_22987983.1217596320157--

From: Andreev Andrey <a.andreev@nikitaonline.ru>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: misc/126131: Portsnap fetch error with HTTP_PROXY or
 HTTP_PROXY_AUTH
Date: Fri, 1 Aug 2008 18:17:01 +0400

 This is a multi-part message in MIME format.
 
 --Multipart=_Fri__1_Aug_2008_18_17_01_+0400_Bm=1xU_KD1jGP0lq
 Content-Type: text/plain; charset=US-ASCII
 Content-Transfer-Encoding: 7bit
 
 sorry... 
 
 --Multipart=_Fri__1_Aug_2008_18_17_01_+0400_Bm=1xU_KD1jGP0lq
 Content-Type: text/plain;
  name="new-patch.txt"
 Content-Disposition: attachment;
  filename="new-patch.txt"
 Content-Transfer-Encoding: 7bit
 
 diff -Naur phttpget-0.2/phttpget.c my-phttpget-0.2/phttpget.c
 --- phttpget-0.2/phttpget.c	2005-07-31 12:17:14.000000000 +0400
 +++ my-phttpget-0.2/phttpget.c	2008-07-31 13:49:55.000000000 +0400
 @@ -45,7 +45,14 @@
  
  char *	env_HTTP_PROXY;
  char *	env_HTTP_USER_AGENT;
 +char *	env_HTTP_PROXY_AUTH;
  char *	proxyport;
 +char *  proxy_auth_user;
 +char *  proxy_auth_pass;
 +char *authhdr, authbuf[1024];
 +char *auth, authbuf[1024];
 +
 +
  
  static struct timeval	timo = { 15, 0};
  
 @@ -57,28 +64,94 @@
  	exit(EX_USAGE);
  }
  
 +static char *base64_encode(const char *buf, int len)
 +{
 +        const char *b64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 +        int bit_offset, byte_offset, idx, i;
 +        const unsigned char *d = (const unsigned char *)buf;
 +        int bytes = (len*8 + 5)/6, pad_bytes = (bytes % 4) ? 4 - (bytes % 4) : 0;
 +        char *out;
 +
 +        out = calloc(1, bytes+pad_bytes+1);
 +        if (!out) return NULL;
 +
 +        for (i=0;i<bytes;i++) {
 +                byte_offset = (i*6)/8;
 +                bit_offset = (i*6)%8;
 +                if (bit_offset < 3) {
 +                        idx = (d[byte_offset] >> (2-bit_offset)) & 0x3F;
 +                } else {
 +                        idx = (d[byte_offset] << (bit_offset-2)) & 0x3F;
 +                        if (byte_offset+1 < len) {
 +                                idx |= (d[byte_offset+1] >> (8-(bit_offset-2)));
 +                        }
 +                }
 +                out[i] = b64[idx];
 +        }
 +
 +        for (;i<bytes+pad_bytes;i++)
 +                out[i] = '=';
 +        out[i] = 0;
 +
 +        return out;
 +}
 +
  static void
  readenv(void)
  {
 -	char * p;
 -
 -	env_HTTP_PROXY = getenv("HTTP_PROXY");
 -	if (env_HTTP_PROXY) {
 -		if (strncmp(env_HTTP_PROXY, "http://", 7) == 0)
 -			env_HTTP_PROXY += 7;
 -		p = strchr(env_HTTP_PROXY, ':');
 -		if (p != NULL) {
 -			*p = 0;
 -			proxyport = p + 1;
 -		} else
 -			proxyport = "3128";
 +       char * p;
 +	char *tmp;
 +	int l;
 +	int len;
 +	char t[1024]={0};	
 +
 +        env_HTTP_PROXY = getenv("HTTP_PROXY");
 +	env_HTTP_PROXY_AUTH = getenv("HTTP_PROXY_AUTH");
 +
 +	char **sp = &env_HTTP_PROXY;
 +
 +        if (env_HTTP_PROXY) {
 +                if (strncmp(env_HTTP_PROXY, "http://", 7) == 0)
 +                        env_HTTP_PROXY += 7;
 +
 +	       tmp = strdup(env_HTTP_PROXY);
 +	       if (tmp == NULL) { printf("out of memory\n"); exit; }
 +	       sp = &tmp;
 +	       proxy_auth_user = strsep(sp, "@");
 +		l = strlen(sp);		
 +               if (proxy_auth_user != NULL && l != 0) {
 +		proxy_auth_user = strsep(&env_HTTP_PROXY, "@");
 +		sscanf(proxy_auth_user,"%s",t);
 +                len = strlen(t);
 +                authhdr = "Proxy-Authorization: Basic ";
 +                auth = base64_encode(t, len);
 +
 +                       proxy_auth_pass = strchr(proxy_auth_user, ':');
 +                       if (proxy_auth_pass != NULL)
 +                               *proxy_auth_pass++ = '\0';
 +               }
 +                p = strchr(env_HTTP_PROXY, ':');
 +                if (p != NULL) {
 +                        *p = 0;
 +                        proxyport = p + 1;
 +                } else  
 +                        proxyport = "3128";
 +        }
 +	
 +	if (env_HTTP_PROXY_AUTH) {
 +	if (strncmp(env_HTTP_PROXY_AUTH, "basic:", 6) == 0)
 +                        env_HTTP_PROXY_AUTH += 6;
 +	len = strlen(env_HTTP_PROXY_AUTH);
 +	authhdr = "Proxy-Authorization: Basic ";
 +	auth = base64_encode(env_HTTP_PROXY_AUTH, len);
  	}
  
 -	env_HTTP_USER_AGENT = getenv("HTTP_USER_AGENT");
 -	if (env_HTTP_USER_AGENT == NULL)
 -		env_HTTP_USER_AGENT = "phttpget/0.1";
 +        env_HTTP_USER_AGENT = getenv("HTTP_USER_AGENT");
 +        if (env_HTTP_USER_AGENT == NULL)
 +                env_HTTP_USER_AGENT = "phttpget/0.1";
  }
  
 +
  static int
  makerequest(char ** buf, char * path, char * server, int connclose)
  {
 @@ -87,12 +160,15 @@
  	buflen = asprintf(buf,
  	    "GET %s%s/%s HTTP/1.1\r\n"
  	    "Host: %s\r\n"
 +	    "%s%s\r\n"
  	    "User-Agent: %s\r\n"
  	    "%s"
  	    "\r\n",
  	    env_HTTP_PROXY ? "http://" : "",
  	    env_HTTP_PROXY ? server : "",
 -	    path, server, env_HTTP_USER_AGENT,
 +	    path, server,
 +	    authhdr, auth,
 +	    env_HTTP_USER_AGENT,
  	    connclose ? "Connection: Close\r\n" : "");
  	if (buflen == -1)
  		err(1, "asprintf");
 
 --Multipart=_Fri__1_Aug_2008_18_17_01_+0400_Bm=1xU_KD1jGP0lq--

From: duke <duke66@gmail.com>
To: bug-followup@freebsd.org
Cc:  
Subject: Re: misc/126131: Portsnap fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
Date: Fri, 1 Aug 2008 19:10:38 +0400

 ------=_Part_5524_2878236.1217603438497
 Content-Type: text/plain; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 sorry.
 im try again
 
 diff -Naur phttpget-0.2/phttpget.c my-phttpget-0.2/phttpget.c
 --- phttpget-0.2/phttpget.c     2005-07-31 12:17:14.000000000 +0400
 +++ my-phttpget-0.2/phttpget.c  2008-07-31 13:49:55.000000000 +0400
 @@ -45,7 +45,14 @@
 
  char * env_HTTP_PROXY;
  char * env_HTTP_USER_AGENT;
 +char * env_HTTP_PROXY_AUTH;
  char * proxyport;
 +char *  proxy_auth_user;
 +char *  proxy_auth_pass;
 +char *authhdr, authbuf[1024];
 +char *auth, authbuf[1024];
 +
 +
 
  static struct timeval  timo = { 15, 0};
 
 @@ -57,28 +64,94 @@
         exit(EX_USAGE);
  }
 
 +static char *base64_encode(const char *buf, int len)
 +{
 +        const char *b64 =
 "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 +        int bit_offset, byte_offset, idx, i;
 +        const unsigned char *d = (const unsigned char *)buf;
 +        int bytes = (len*8 + 5)/6, pad_bytes = (bytes % 4) ? 4 - (bytes %
 4) : 0;
 +        char *out;
 +
 +        out = calloc(1, bytes+pad_bytes+1);
 +        if (!out) return NULL;
 +
 +        for (i=0;i<bytes;i++) {
 +                byte_offset = (i*6)/8;
 +                bit_offset = (i*6)%8;
 +                if (bit_offset < 3) {
 +                        idx = (d[byte_offset] >> (2-bit_offset)) & 0x3F;
 +                } else {
 +                        idx = (d[byte_offset] << (bit_offset-2)) & 0x3F;
 +                        if (byte_offset+1 < len) {
 +                                idx |= (d[byte_offset+1] >>
 (8-(bit_offset-2)));
 +                        }
 +                }
 +                out[i] = b64[idx];
 +        }
 +
 +        for (;i<bytes+pad_bytes;i++)
 +                out[i] = '=';
 +        out[i] = 0;
 +
 +        return out;
 +}
 +
  static void
  readenv(void)
  {
 -       char * p;
 -
 -       env_HTTP_PROXY = getenv("HTTP_PROXY");
 -       if (env_HTTP_PROXY) {
 -               if (strncmp(env_HTTP_PROXY, "http://", 7) == 0)
 -                       env_HTTP_PROXY += 7;
 -               p = strchr(env_HTTP_PROXY, ':');
 -               if (p != NULL) {
 -                       *p = 0;
 -                       proxyport = p + 1;
 -               } else
 -                       proxyport = "3128";
 +       char * p;
 +       char *tmp;
 +       int l;
 +       int len;
 +       char t[1024]={0};
 +
 +        env_HTTP_PROXY = getenv("HTTP_PROXY");
 +       env_HTTP_PROXY_AUTH = getenv("HTTP_PROXY_AUTH");
 +
 +       char **sp = &env_HTTP_PROXY;
 +
 +        if (env_HTTP_PROXY) {
 +                if (strncmp(env_HTTP_PROXY, "http://", 7) == 0)
 +                        env_HTTP_PROXY += 7;
 +
 +              tmp = strdup(env_HTTP_PROXY);
 +              if (tmp == NULL) { printf("out of memory\n"); exit; }
 +              sp = &tmp;
 +              proxy_auth_user = strsep(sp, "@");
 +               l = strlen(sp);
 +               if (proxy_auth_user != NULL && l != 0) {
 +               proxy_auth_user = strsep(&env_HTTP_PROXY, "@");
 +               sscanf(proxy_auth_user,"%s",t);
 +                len = strlen(t);
 +                authhdr = "Proxy-Authorization: Basic ";
 +                auth = base64_encode(t, len);
 +
 +                       proxy_auth_pass = strchr(proxy_auth_user, ':');
 +                       if (proxy_auth_pass != NULL)
 +                               *proxy_auth_pass++ = '\0';
 +               }
 +                p = strchr(env_HTTP_PROXY, ':');
 +                if (p != NULL) {
 +                        *p = 0;
 +                        proxyport = p + 1;
 +                } else
 +                        proxyport = "3128";
 +        }
 +
 +       if (env_HTTP_PROXY_AUTH) {
 +       if (strncmp(env_HTTP_PROXY_AUTH, "basic:", 6) == 0)
 +                        env_HTTP_PROXY_AUTH += 6;
 +       len = strlen(env_HTTP_PROXY_AUTH);
 +       authhdr = "Proxy-Authorization: Basic ";
 +       auth = base64_encode(env_HTTP_PROXY_AUTH, len);
         }
 
 -       env_HTTP_USER_AGENT = getenv("HTTP_USER_AGENT");
 -       if (env_HTTP_USER_AGENT == NULL)
 -               env_HTTP_USER_AGENT = "phttpget/0.1";
 +        env_HTTP_USER_AGENT = getenv("HTTP_USER_AGENT");
 +        if (env_HTTP_USER_AGENT == NULL)
 +                env_HTTP_USER_AGENT = "phttpget/0.1";
  }
 
 +
  static int
  makerequest(char ** buf, char * path, char * server, int connclose)
  {
 @@ -87,12 +160,15 @@
         buflen = asprintf(buf,
             "GET %s%s/%s HTTP/1.1\r\n"
             "Host: %s\r\n"
 +           "%s%s\r\n"
             "User-Agent: %s\r\n"
             "%s"
             "\r\n",
             env_HTTP_PROXY ? "http://" : "",
             env_HTTP_PROXY ? server : "",
 -           path, server, env_HTTP_USER_AGENT,
 +           path, server,
 +           authhdr, auth,
 +           env_HTTP_USER_AGENT,
             connclose ? "Connection: Close\r\n" : "");
         if (buflen == -1)
                 err(1, "asprintf");
 
 ------=_Part_5524_2878236.1217603438497
 Content-Type: text/html; charset=ISO-8859-1
 Content-Transfer-Encoding: 7bit
 Content-Disposition: inline
 
 <div dir="ltr">sorry.<br>im try again<br><br>diff -Naur phttpget-0.2/phttpget.c my-phttpget-0.2/phttpget.c<br>--- phttpget-0.2/phttpget.c&nbsp;&nbsp;&nbsp;&nbsp; 2005-07-31 12:17:14.000000000 +0400<br>+++ my-phttpget-0.2/phttpget.c&nbsp; 2008-07-31 13:49:55.000000000 +0400<br>
 @@ -45,7 +45,14 @@<br>&nbsp;<br>&nbsp;char * env_HTTP_PROXY;<br>&nbsp;char * env_HTTP_USER_AGENT;<br>+char * env_HTTP_PROXY_AUTH;<br>&nbsp;char * proxyport;<br>+char *&nbsp; proxy_auth_user;<br>+char *&nbsp; proxy_auth_pass;<br>+char *authhdr, authbuf[1024];<br>
 +char *auth, authbuf[1024];<br>+<br>+<br>&nbsp;<br>&nbsp;static struct timeval&nbsp; timo = { 15, 0};<br>&nbsp;<br>@@ -57,28 +64,94 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(EX_USAGE);<br>&nbsp;}<br>&nbsp;<br>+static char *base64_encode(const char *buf, int len)<br>+{<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const char *b64 = &quot;ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/&quot;;<br>
 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bit_offset, byte_offset, idx, i;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; const unsigned char *d = (const unsigned char *)buf;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int bytes = (len*8 + 5)/6, pad_bytes = (bytes % 4) ? 4 - (bytes % 4) : 0;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *out;<br>
 +<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out = calloc(1, bytes+pad_bytes+1);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (!out) return NULL;<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (i=0;i&lt;bytes;i++) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; byte_offset = (i*6)/8;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bit_offset = (i*6)%8;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (bit_offset &lt; 3) {<br>
 +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = (d[byte_offset] &gt;&gt; (2-bit_offset)) &amp; 0x3F;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx = (d[byte_offset] &lt;&lt; (bit_offset-2)) &amp; 0x3F;<br
From: Sergey Matveychuk <sem@FreeBSD.org>
To: bug-followup@FreeBSD.org
Cc: duke66@gmail.com, Colin Percival <cperciva@freebsd.org>
Subject: Re: misc/126131: portsnap(8) fetch error with HTTP_PROXY or HTTP_PROXY_AUTH
Date: Wed, 27 Jan 2010 21:01:06 +0300

 Hi.
 
 phttpget still don't understand full syntax of HTTP_PROXY (how described 
 in fetch(3)): <scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)
 
 It splits it as:
 phttpget: host = user, port = pwd@host:port: servname not
 supported for ai_socktype
 
 -- 
 Dixi.
 Sem.

From: duke <duke66@gmail.com>
To: Sergey Matveychuk <sem@freebsd.org>, cperciva@daemonology.net
Cc: bug-followup@freebsd.org, Colin Percival <cperciva@freebsd.org>
Subject: Re: misc/126131: portsnap(8) fetch error with HTTP_PROXY or 
	HTTP_PROXY_AUTH
Date: Fri, 29 Jan 2010 13:47:50 +0300

 --0016364d25fd1ac285047e4b5f93
 Content-Type: multipart/alternative; boundary=0016364d25fd1ac27f047e4b5f91
 
 --0016364d25fd1ac27f047e4b5f91
 Content-Type: text/plain; charset=ISO-8859-1
 
 2010/1/27 Sergey Matveychuk <sem@freebsd.org>
 
 > Hi.
 >
 > phttpget still don't understand full syntax of HTTP_PROXY (how described in
 > fetch(3)): <scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)
 >
 > It splits it as:
 > phttpget: host = user, port = pwd@host:port: servname not
 > supported for ai_socktype
 >
 
 http://www.freebsd.org/cgi/query-pr.cgi?pr=126131 contains a patch to
 support this)
 
 >
 > --
 > Dixi.
 > Sem.
 >
 
 --0016364d25fd1ac27f047e4b5f91
 Content-Type: text/html; charset=ISO-8859-1
 Content-Transfer-Encoding: quoted-printable
 
 <br><br><div class=3D"gmail_quote">2010/1/27 Sergey Matveychuk <span dir=3D=
 "ltr">&lt;<a href=3D"mailto:sem@freebsd.org">sem@freebsd.org</a>&gt;</span>=
 <br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-lef=
 t:1px #ccc solid;padding-left:1ex;">
 
 Hi.<br>
 <br>
 phttpget still don&#39;t understand full syntax of HTTP_PROXY (how describe=
 d in fetch(3)): &lt;scheme&gt;:(//(&lt;user&gt;(:&lt;pwd&gt;)?@)?&lt;host&g=
 t;(:&lt;port&gt;)?)<br>
 <br>
 It splits it as:<br>
 phttpget: host =3D user, port =3D pwd@host:port: servname not<br>
 supported for ai_socktype<br></blockquote><div><br></div><div><a href=3D"ht=
 tp://www.freebsd.org/cgi/query-pr.cgi?pr=3D126131">http://www.freebsd.org/c=
 gi/query-pr.cgi?pr=3D126131</a> contains a patch to support this)</div><blo=
 ckquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #c=
 cc solid;padding-left:1ex;">
 
 <font color=3D"#888888">
 <br>
 -- <br>
 Dixi.<br>
 Sem.<br>
 </font></blockquote></div><br>
 
 --0016364d25fd1ac27f047e4b5f91--
 --0016364d25fd1ac285047e4b5f93
 Content-Type: text/x-patch; charset=US-ASCII; name="patch.diff"
 Content-Disposition: attachment; filename="patch.diff"
 Content-Transfer-Encoding: base64
 X-Attachment-Id: f_g50uncbz0
 
 ZGlmZiAtTmF1ciBwaHR0cGdldC0wLjIvcGh0dHBnZXQuYyBteS1waHR0cGdldC0wLjIvcGh0dHBn
 ZXQuYwotLS0gcGh0dHBnZXQtMC4yL3BodHRwZ2V0LmMJMjAwNS0wNy0zMSAxMjoxNzoxNC4wMDAw
 MDAwMDAgKzA0MDAKKysrIG15LXBodHRwZ2V0LTAuMi9waHR0cGdldC5jCTIwMDgtMDctMzEgMTM6
 NDk6NTUuMDAwMDAwMDAwICswNDAwCkBAIC00NSw3ICs0NSwxNCBAQAogCiBjaGFyICoJZW52X0hU
 VFBfUFJPWFk7CiBjaGFyICoJZW52X0hUVFBfVVNFUl9BR0VOVDsKK2NoYXIgKgllbnZfSFRUUF9Q
 Uk9YWV9BVVRIOwogY2hhciAqCXByb3h5cG9ydDsKK2NoYXIgKiAgcHJveHlfYXV0aF91c2VyOwor
 Y2hhciAqICBwcm94eV9hdXRoX3Bhc3M7CitjaGFyICphdXRoaGRyLCBhdXRoYnVmWzEwMjRdOwor
 Y2hhciAqYXV0aCwgYXV0aGJ1ZlsxMDI0XTsKKworCiAKIHN0YXRpYyBzdHJ1Y3QgdGltZXZhbAl0
 aW1vID0geyAxNSwgMH07CiAKQEAgLTU3LDI4ICs2NCw5NCBAQAogCWV4aXQoRVhfVVNBR0UpOwog
 fQogCitzdGF0aWMgY2hhciAqYmFzZTY0X2VuY29kZShjb25zdCBjaGFyICpidWYsIGludCBsZW4p
 Cit7CisgICAgICAgIGNvbnN0IGNoYXIgKmI2NCA9ICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZ
 WmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKyAgICAgICAgaW50IGJp
 dF9vZmZzZXQsIGJ5dGVfb2Zmc2V0LCBpZHgsIGk7CisgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNo
 YXIgKmQgPSAoY29uc3QgdW5zaWduZWQgY2hhciAqKWJ1ZjsKKyAgICAgICAgaW50IGJ5dGVzID0g
 KGxlbio4ICsgNSkvNiwgcGFkX2J5dGVzID0gKGJ5dGVzICUgNCkgPyA0IC0gKGJ5dGVzICUgNCkg
 OiAwOworICAgICAgICBjaGFyICpvdXQ7CisKKyAgICAgICAgb3V0ID0gY2FsbG9jKDEsIGJ5dGVz
 K3BhZF9ieXRlcysxKTsKKyAgICAgICAgaWYgKCFvdXQpIHJldHVybiBOVUxMOworCisgICAgICAg
 IGZvciAoaT0wO2k8Ynl0ZXM7aSsrKSB7CisgICAgICAgICAgICAgICAgYnl0ZV9vZmZzZXQgPSAo
 aSo2KS84OworICAgICAgICAgICAgICAgIGJpdF9vZmZzZXQgPSAoaSo2KSU4OworICAgICAgICAg
 ICAgICAgIGlmIChiaXRfb2Zmc2V0IDwgMykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWR4
 ID0gKGRbYnl0ZV9vZmZzZXRdID4+ICgyLWJpdF9vZmZzZXQpKSAmIDB4M0Y7CisgICAgICAgICAg
 ICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlkeCA9IChkW2J5dGVfb2Zm
 c2V0XSA8PCAoYml0X29mZnNldC0yKSkgJiAweDNGOworICAgICAgICAgICAgICAgICAgICAgICAg
 aWYgKGJ5dGVfb2Zmc2V0KzEgPCBsZW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAg
 ICAgaWR4IHw9IChkW2J5dGVfb2Zmc2V0KzFdID4+ICg4LShiaXRfb2Zmc2V0LTIpKSk7CisgICAg
 ICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAg
 IG91dFtpXSA9IGI2NFtpZHhdOworICAgICAgICB9CisKKyAgICAgICAgZm9yICg7aTxieXRlcytw
 YWRfYnl0ZXM7aSsrKQorICAgICAgICAgICAgICAgIG91dFtpXSA9ICc9JzsKKyAgICAgICAgb3V0
 W2ldID0gMDsKKworICAgICAgICByZXR1cm4gb3V0OworfQorCiBzdGF0aWMgdm9pZAogcmVhZGVu
 dih2b2lkKQogewotCWNoYXIgKiBwOwotCi0JZW52X0hUVFBfUFJPWFkgPSBnZXRlbnYoIkhUVFBf
 UFJPWFkiKTsKLQlpZiAoZW52X0hUVFBfUFJPWFkpIHsKLQkJaWYgKHN0cm5jbXAoZW52X0hUVFBf
 UFJPWFksICJodHRwOi8vIiwgNykgPT0gMCkKLQkJCWVudl9IVFRQX1BST1hZICs9IDc7Ci0JCXAg
 PSBzdHJjaHIoZW52X0hUVFBfUFJPWFksICc6Jyk7Ci0JCWlmIChwICE9IE5VTEwpIHsKLQkJCSpw
 ID0gMDsKLQkJCXByb3h5cG9ydCA9IHAgKyAxOwotCQl9IGVsc2UKLQkJCXByb3h5cG9ydCA9ICIz
 MTI4IjsKKyAgICAgICBjaGFyICogcDsKKwljaGFyICp0bXA7CisJaW50IGw7CisJaW50IGxlbjsK
 KwljaGFyIHRbMTAyNF09ezB9OwkKKworICAgICAgICBlbnZfSFRUUF9QUk9YWSA9IGdldGVudigi
 SFRUUF9QUk9YWSIpOworCWVudl9IVFRQX1BST1hZX0FVVEggPSBnZXRlbnYoIkhUVFBfUFJPWFlf
 QVVUSCIpOworCisJY2hhciAqKnNwID0gJmVudl9IVFRQX1BST1hZOworCisgICAgICAgIGlmIChl
 bnZfSFRUUF9QUk9YWSkgeworICAgICAgICAgICAgICAgIGlmIChzdHJuY21wKGVudl9IVFRQX1BS
 T1hZLCAiaHR0cDovLyIsIDcpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfSFRU
 UF9QUk9YWSArPSA3OworCisJICAgICAgIHRtcCA9IHN0cmR1cChlbnZfSFRUUF9QUk9YWSk7CisJ
 ICAgICAgIGlmICh0bXAgPT0gTlVMTCkgeyBwcmludGYoIm91dCBvZiBtZW1vcnlcbiIpOyBleGl0
 OyB9CisJICAgICAgIHNwID0gJnRtcDsKKwkgICAgICAgcHJveHlfYXV0aF91c2VyID0gc3Ryc2Vw
 KHNwLCAiQCIpOworCQlsID0gc3RybGVuKHNwKTsJCQorICAgICAgICAgICAgICAgaWYgKHByb3h5
 X2F1dGhfdXNlciAhPSBOVUxMICYmIGwgIT0gMCkgeworCQlwcm94eV9hdXRoX3VzZXIgPSBzdHJz
 ZXAoJmVudl9IVFRQX1BST1hZLCAiQCIpOworCQlzc2NhbmYocHJveHlfYXV0aF91c2VyLCIlcyIs
 dCk7CisgICAgICAgICAgICAgICAgbGVuID0gc3RybGVuKHQpOworICAgICAgICAgICAgICAgIGF1
 dGhoZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbjogQmFzaWMgIjsKKyAgICAgICAgICAgICAgICBh
 dXRoID0gYmFzZTY0X2VuY29kZSh0LCBsZW4pOworCisgICAgICAgICAgICAgICAgICAgICAgIHBy
 b3h5X2F1dGhfcGFzcyA9IHN0cmNocihwcm94eV9hdXRoX3VzZXIsICc6Jyk7CisgICAgICAgICAg
 ICAgICAgICAgICAgIGlmIChwcm94eV9hdXRoX3Bhc3MgIT0gTlVMTCkKKyAgICAgICAgICAgICAg
 ICAgICAgICAgICAgICAgICAqcHJveHlfYXV0aF9wYXNzKysgPSAnXDAnOworICAgICAgICAgICAg
 ICAgfQorICAgICAgICAgICAgICAgIHAgPSBzdHJjaHIoZW52X0hUVFBfUFJPWFksICc6Jyk7Cisg
 ICAgICAgICAgICAgICAgaWYgKHAgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAg
 KnAgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlwb3J0ID0gcCArIDE7CisgICAg
 ICAgICAgICAgICAgfSBlbHNlICAKKyAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5cG9ydCA9
 ICIzMTI4IjsKKyAgICAgICAgfQorCQorCWlmIChlbnZfSFRUUF9QUk9YWV9BVVRIKSB7CisJaWYg
 KHN0cm5jbXAoZW52X0hUVFBfUFJPWFlfQVVUSCwgImJhc2ljOiIsIDYpID09IDApCisgICAgICAg
 ICAgICAgICAgICAgICAgICBlbnZfSFRUUF9QUk9YWV9BVVRIICs9IDY7CisJbGVuID0gc3RybGVu
 KGVudl9IVFRQX1BST1hZX0FVVEgpOworCWF1dGhoZHIgPSAiUHJveHktQXV0aG9yaXphdGlvbjog
 QmFzaWMgIjsKKwlhdXRoID0gYmFzZTY0X2VuY29kZShlbnZfSFRUUF9QUk9YWV9BVVRILCBsZW4p
 OwogCX0KIAotCWVudl9IVFRQX1VTRVJfQUdFTlQgPSBnZXRlbnYoIkhUVFBfVVNFUl9BR0VOVCIp
 OwotCWlmIChlbnZfSFRUUF9VU0VSX0FHRU5UID09IE5VTEwpCi0JCWVudl9IVFRQX1VTRVJfQUdF
 TlQgPSAicGh0dHBnZXQvMC4xIjsKKyAgICAgICAgZW52X0hUVFBfVVNFUl9BR0VOVCA9IGdldGVu
 digiSFRUUF9VU0VSX0FHRU5UIik7CisgICAgICAgIGlmIChlbnZfSFRUUF9VU0VSX0FHRU5UID09
 IE5VTEwpCisgICAgICAgICAgICAgICAgZW52X0hUVFBfVVNFUl9BR0VOVCA9ICJwaHR0cGdldC8w
 LjEiOwogfQogCisKIHN0YXRpYyBpbnQKIG1ha2VyZXF1ZXN0KGNoYXIgKiogYnVmLCBjaGFyICog
 cGF0aCwgY2hhciAqIHNlcnZlciwgaW50IGNvbm5jbG9zZSkKIHsKQEAgLTg3LDEyICsxNjAsMTUg
 QEAKIAlidWZsZW4gPSBhc3ByaW50ZihidWYsCiAJICAgICJHRVQgJXMlcy8lcyBIVFRQLzEuMVxy
 XG4iCiAJICAgICJIb3N0OiAlc1xyXG4iCisJICAgICIlcyVzXHJcbiIKIAkgICAgIlVzZXItQWdl
 bnQ6ICVzXHJcbiIKIAkgICAgIiVzIgogCSAgICAiXHJcbiIsCiAJICAgIGVudl9IVFRQX1BST1hZ
 ID8gImh0dHA6Ly8iIDogIiIsCiAJICAgIGVudl9IVFRQX1BST1hZID8gc2VydmVyIDogIiIsCi0J
 ICAgIHBhdGgsIHNlcnZlciwgZW52X0hUVFBfVVNFUl9BR0VOVCwKKwkgICAgcGF0aCwgc2VydmVy
 LAorCSAgICBhdXRoaGRyLCBhdXRoLAorCSAgICBlbnZfSFRUUF9VU0VSX0FHRU5ULAogCSAgICBj
 b25uY2xvc2UgPyAiQ29ubmVjdGlvbjogQ2xvc2VcclxuIiA6ICIiKTsKIAlpZiAoYnVmbGVuID09
 IC0xKQogCQllcnIoMSwgImFzcHJpbnRmIik7Cg==
 --0016364d25fd1ac285047e4b5f93--

From: Sergey Matveychuk <sem@FreeBSD.org>
To: duke <duke66@gmail.com>
Cc: cperciva@daemonology.net, bug-followup@freebsd.org, 
 Colin Percival <cperciva@freebsd.org>
Subject: Re: misc/126131: portsnap(8) fetch error with HTTP_PROXY or 	HTTP_PROXY_AUTH
Date: Mon, 01 Feb 2010 17:04:38 +0300

 duke wrote:
 > 
 > 
 > 2010/1/27 Sergey Matveychuk <sem@freebsd.org <mailto:sem@freebsd.org>>
 > 
 >     Hi.
 > 
 >     phttpget still don't understand full syntax of HTTP_PROXY (how
 >     described in fetch(3)): <scheme>:(//(<user>(:<pwd>)?@)?<host>(:<port>)?)
 > 
 >     It splits it as:
 >     phttpget: host = user, port = pwd@host:port: servname not
 >     supported for ai_socktype
 > 
 > 
 > http://www.freebsd.org/cgi/query-pr.cgi?pr=126131 contains a patch to 
 > support this)
 
 I see. But does it outdated?
 How I can see phttpget.c already has b64enc() function. Why did you 
 write own base64_encode()? I'm sure only one should be stay.
 
 -- 
 Dixi.
 Sem.
>Unformatted:
 >+&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (byte_offset+1 &lt; len) {<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; idx |= (d[byte_offset+1] &gt;&gt; (8-(bit_offset-2)));<br>+&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+&nbsp;&nbsp;&nbsp; &nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out[i] = b64[idx];<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for (;i&lt;bytes+pad_bytes;i++)<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out[i] = &#39;=&#39;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; out[i] = 0;<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return out;<br>+}<br>+<br>&n bsp;static void<br>&nbsp;readenv(void)<br>&nbsp;{<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char * p;<br>-<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY = getenv(&quot;HTTP_PROXY&quot;);<br>
  -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (env_HTTP_PROXY) {<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strncmp(env_HTTP_PROXY, &quot;http://&quot;, 7) == 0)<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY += 7;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = strchr(env_HTTP_PROXY, &#39;:&#39;);<br>-&nbsp;&n bsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p != NULL) {<br>
  -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p = 0;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp; proxyport = p + 1;<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& nbsp ;&nbsp;&nbsp;&nbsp; proxyport = &quot;3128&quot;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char * p;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char *tmp;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int l;<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int len;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char t[1024]={0};<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY = getenv(&quot;HTTP_PROXY&quot;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_H TTP_PROXY_AUTH = getenv(&quot;HTTP_PROXY_AUTH&quot;);<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; char **sp = &amp;env_HTTP_PROXY;<br>
  +<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (env_HTTP_PROXY) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strncmp(env_HTTP_PROXY, &quot;http://&quot;, 7) == 0)<br>+&nbsp;&nbsp;&nbsp;&nbsp;& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY += 7;<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; tmp = strdup(env_HTTP_PROXY);<b r>+& nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (tmp == NULL) { printf(&quot;out of memory\n&quot;); exit; }<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sp = &amp;tmp;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_auth_user = strsep(sp, &quot;@&quot;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; l = strlen(sp);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (proxy_auth_user != NULL &amp;&amp; l != 0) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;& nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_auth_user = strsep(&amp;env_HTTP_PROXY, &quot;@&quot;);<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sscanf(proxy_auth_user,&quot;%s&quot;,t);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = strlen(t);<br>+&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authhdr = &quot;Proxy-Authorization: Basic &quot;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth = base64_encode(t, le n);< br>+<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxy_auth_pass = strchr(proxy_auth_user, &#39;:&#39;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (proxy_auth_pass != NULL)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;& nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *proxy_auth_pass++ = &#39;\0&#39;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; p = strchr(env_HTTP_PROXY, &#39;:&#39;);<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (p != NULL) {<br>+&nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *p = 0;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp; proxyport = p + 1;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } else&nbsp; <br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp ;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; proxyport = &quot;3128&quot;;<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>+<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (env_HTTP_PROXY_AUTH) {<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (strncmp(env_HTTP_PROXY_AUTH, &quot;basic:&quot;, 6) == 0)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY_AUTH += 6;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; len = strlen(env_HTTP_PROXY_AUTH);<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authhdr = &quot;Proxy-Authorization: Basic &quot;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; auth = base64_encode(env_HTTP_PROXY_AUTH, len);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br>&nbsp;<br>-&nbsp;&nbsp;& nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_USER_AGENT = getenv(&quot;HTTP_USER_AGENT&quot;);<br>-&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (env_HTTP_USER_AGENT == NULL)<br>
  -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_USER_AGENT = &quot;phttpget/0.1&quot;;<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_USER_AGENT = getenv(&quot;HTTP_USER_AGENT&quot;);<br>+&nbsp;&nb sp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (env_HTTP_USER_AGENT == NULL)<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_USER_AGENT = &quot;phttpget/0.1&quot;;<br>
  &nbsp;}<br>&nbsp;<br>+<br>&nbsp;static int<br>&nbsp;makerequest(char ** buf, char * path, char * server, int connclose)<br>&nbsp;{<br>@@ -87,12 +160,15 @@<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; buflen = asprintf(buf,<br>&nbsp;&nbsp;&nbsp;&nbsp;&n bsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;GET %s%s/%s HTTP/1.1\r\n&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;Host: %s\r\n&quot;<br>
  +&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;%s%s\r\n&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;User-Agent: %s\r\n&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  &quot;%s&quot;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &quot;\r\n&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY ? &quot;http://&quot; : &quot;&quot;,<br>&nbsp;&nbsp;&nbsp;&nbsp; &nbs p;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_PROXY ? server : &quot;&quot;,<br>
  -&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path, server, env_HTTP_USER_AGENT,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; path, server,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; authhdr, aut h,<br>+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; env_HTTP_USER_AGENT,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; connclose ? &quot;Connection: Close\r\n&quot; : &quot;&quot;);<br>
  &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (buflen == -1)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; err(1, &quot;asprintf&quot;);<br><br></div>
  
  ------=_Part_5524_2878236.1217603438497--
