~ chicken-core (chicken-5) 9bd14fe2e84a358de84d285e5353dac4a31f99ee
commit 9bd14fe2e84a358de84d285e5353dac4a31f99ee
Author: felix <felix@call-with-current-continuation.org>
AuthorDate: Mon Oct 25 02:53:14 2010 -0400
Commit: felix <felix@call-with-current-continuation.org>
CommitDate: Mon Oct 25 02:53:14 2010 -0400
basic proxy authorization (contributed by "iru")
diff --git a/chicken-install.scm b/chicken-install.scm
index 7b4d8230..e50e2d78 100644
--- a/chicken-install.scm
+++ b/chicken-install.scm
@@ -83,6 +83,7 @@
(define *windows-shell* (foreign-value "C_WINDOWS_SHELL" bool))
(define *proxy-host* #f)
(define *proxy-port* #f)
+ (define *proxy-user-pass* #f)
(define *running-test* #f)
(define *mappings* '())
(define *deploy* #f)
@@ -264,6 +265,7 @@
trunk: *trunk*
proxy-host: *proxy-host*
proxy-port: *proxy-port*
+ proxy-user-pass: *proxy-user-pass*
clean: (and (not *retrieve-only*) (not *keep*)))
[(exn net)
(print "TCP connect timeout")
@@ -623,13 +625,15 @@ EOF
(define (setup-proxy uri)
(if (string? uri)
- (cond ((irregex-match "(.+)\\:([0-9]+)" uri) =>
- (lambda (m)
- (set! *proxy-host* (irregex-match-substring m 1))
- (set! *proxy-port* (string->number (irregex-match-substring m 2))))
- (else
- (set! *proxy-host* uri)
- (set! *proxy-port* 80))))))
+ (begin
+ (set! *proxy-user-pass* (get-environment-variable "proxy_auth"))
+ (cond ((irregex-match "(.+)\\:([0-9]+)" uri) =>
+ (lambda (m)
+ (set! *proxy-host* (irregex-match-substring m 1))
+ (set! *proxy-port* (string->number (irregex-match-substring m 2))))
+ (else
+ (set! *proxy-host* uri)
+ (set! *proxy-port* 80)))))))
(define *short-options* '(#\h #\k #\l #\t #\s #\p #\r #\n #\v #\i #\u #\D))
diff --git a/setup-download.scm b/setup-download.scm
index 33a41899..1cb4d357 100644
--- a/setup-download.scm
+++ b/setup-download.scm
@@ -229,7 +229,7 @@
(if m (irregex-match-substring m 5) "/")) ) )
(define (locate-egg/http egg url #!optional version destination tests
- proxy-host proxy-port)
+ proxy-host proxy-port proxy-user-pass)
(let ([tmpdir (or destination (get-temporary-directory))])
(let-values ([(host port locn) (deconstruct-url url)])
(let ([locn (string-append
@@ -240,7 +240,7 @@
(if tests "&tests=yes" ""))]
[eggdir (make-pathname tmpdir egg) ] )
(unless (file-exists? eggdir) (create-directory eggdir))
- (http-fetch host port locn eggdir proxy-host proxy-port)
+ (http-fetch host port locn eggdir proxy-host proxy-port proxy-user-pass)
; If we get here then version of egg exists
(values eggdir (or version "")) ) ) ) )
@@ -259,7 +259,7 @@
(connection "close")
(accept "*")
(content-length 0)
- proxy-host proxy-port)
+ proxy-host proxy-port proxy-user-pass)
(conc
"GET "
(if proxy-host
@@ -270,6 +270,9 @@
"User-Agent: " user-agent "\r\n"
"Accept: " accept "\r\n"
"Host: " host #\: port "\r\n"
+ (if proxy-user-pass
+ (string-append "Proxy-Authorization: Basic " proxy-user-pass "\r\n")
+ "")
"Content-length: " content-length "\r\n"
"\r\n") )
@@ -283,12 +286,12 @@
(define (match-chunked-transfer-encoding ln)
(irregex-match "[Tt]ransfer-[Ee]ncoding:\\s*chunked.*" ln) )
- (define (http-fetch host port locn dest proxy-host proxy-port)
+ (define (http-fetch host port locn dest proxy-host proxy-port proxy-user-pass)
(d "connecting to host ~s, port ~a ~a...~%" host port
(if proxy-host
(sprintf "(via ~a:~a) " proxy-host proxy-port)
""))
- (let-values ([(in out) (tcp-connect (or proxy-host host) (or proxy-port port))])
+ (let-values (((in out) (tcp-connect (or proxy-host host) (or proxy-port port))))
(d "requesting ~s ...~%" locn)
(display
(make-HTTP-GET/1.1 locn *chicken-install-user-agent* host port: port accept: "*/*"
@@ -301,8 +304,17 @@
[response-match (match-http-response h1)])
(d "~a~%" h1)
;;*** handle redirects here
- (unless (response-match-code? response-match 200)
- (network-failure "invalid response from server" h1) )
+ (if (response-match-code? response-match 407)
+ (let-values (((inpx outpx) (tcp-connect proxy-host proxy-port)))
+ (set! in inpx) (set! out outpx)
+ (display
+ (make-HTTP-GET/1.1
+ locn *chicken-install-user-agent* host port: port accept: "*/*"
+ proxy-host: proxy-host proxy-port: proxy-port
+ proxy-user-pass: proxy-user-pass)
+ out))
+ (unless (response-match-code? response-match 200)
+ (network-failure "invalid response from server" h1)))
(let loop ()
(let ([ln (read-line in)])
(unless (string-null? ln)
@@ -361,7 +373,8 @@
(define (retrieve-extension name transport location
#!key version quiet destination username password tests
- proxy-host proxy-port trunk (mode 'default) clean)
+ proxy-host proxy-port proxy-user-pass
+ trunk (mode 'default) clean)
(fluid-let ((*quiet* quiet)
(*trunk* trunk)
(*mode* mode))
@@ -371,7 +384,7 @@
((svn)
(locate-egg/svn name location version destination username password) )
((http)
- (locate-egg/http name location version destination tests proxy-host proxy-port) )
+ (locate-egg/http name location version destination tests proxy-host proxy-port proxy-user-pass) )
(else
(error "cannot retrieve extension unsupported transport" transport) ) ) ) )
Trap