summaryrefslogtreecommitdiff
path: root/src/scm/webid-oidc/reverse-proxy.scm
diff options
context:
space:
mode:
Diffstat (limited to 'src/scm/webid-oidc/reverse-proxy.scm')
-rw-r--r--src/scm/webid-oidc/reverse-proxy.scm56
1 files changed, 16 insertions, 40 deletions
diff --git a/src/scm/webid-oidc/reverse-proxy.scm b/src/scm/webid-oidc/reverse-proxy.scm
index ee4878e..4221fa5 100644
--- a/src/scm/webid-oidc/reverse-proxy.scm
+++ b/src/scm/webid-oidc/reverse-proxy.scm
@@ -34,6 +34,8 @@
#:use-module (webid-oidc cache)
#:use-module (webid-oidc web-i18n)
#:use-module (web server)
+ #:use-module (webid-oidc server endpoint)
+ #:use-module (webid-oidc server endpoint reverse-proxy)
#:declarative? #t
#:export
(
@@ -56,6 +58,10 @@
#:server-uri server-uri))
(unless (and endpoint (uri? endpoint))
(fail (G_ "#:endpoint argument is not present or not an URI.")))
+ (define backend
+ (make <reverse-proxy>
+ #:backend-uri endpoint
+ #:authentication-header auth-header))
(lambda (request request-body)
(let ((agent
(catch #t
@@ -72,43 +78,13 @@
(request-time ((p:current-date))))
(parameterize ((p:current-date request-time)
(web-locale request))
- ;; The time is now set for the duration of the request
- (let ((raw-headers (request-headers request)))
- (let ((modified-headers
- (append
- (if agent
- (list (cons auth-header (uri->string agent)))
- '())
- (filter
- (lambda (h)
- (not (eq? (car h) auth-header)))
- raw-headers))))
- (let ((modified-request
- (build-request
- (request-uri request)
- #:method (request-method request)
- #:headers modified-headers)))
- (let ((port (open-socket-for-uri endpoint)))
- (let ((request-with-port
- (write-request modified-request port)))
- (when request-body
- (unless (bytevector? request-body)
- (set! request-body (string->utf8 request-body)))
- (write-request-body request-with-port request-body))
- (force-output (request-port request-with-port))
- (let ((response (read-response port)))
- (let ((response-body
- (or (response-must-not-include-body? response)
- (read-response-body response))))
- (let ((adapted-response
- (build-response
- #:code (response-code response)
- #:reason-phrase (response-reason-phrase response)
- #:headers
- (append
- (if (eqv? (response-code response) 401)
- (list (cons 'www-authenticate '((DPoP))))
- '())
- (response-headers response)))))
- (close-port port)
- (values adapted-response response-body)))))))))))))
+ (set! request
+ (build-request (request-uri request)
+ #:method (request-method request)
+ #:version (request-version request)
+ #:headers (request-headers request)
+ #:port (request-port request)
+ #:meta `((user . ,agent) ,@(request-meta request))))
+ (receive (response response-body response-meta)
+ (handle backend request request-body)
+ (values response response-body))))))