diff options
| author | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2024-07-13 18:04:05 -0400 |
|---|---|---|
| committer | Jakob L. Kreuze <zerodaysfordays@sdf.org> | 2024-07-13 18:11:42 -0400 |
| commit | 81c4d517735983a5afd6e9dc800257c761598527 (patch) | |
| tree | 6b924707914d385126e6d330d2c628fd26f23a27 /demux.scm | |
| parent | 7f37518e4792f040a753a5d8d68d51e76cc0b2be (diff) | |
The `org' directory is no longer necessary
Diffstat (limited to 'demux.scm')
| -rw-r--r-- | demux.scm | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/demux.scm b/demux.scm new file mode 100644 index 0000000..2de029d --- /dev/null +++ b/demux.scm @@ -0,0 +1,54 @@ +;;; Copyright © 2019 - 2023 Jakob L. Kreuze <zerodaysfordays@sdf.org> +;;; +;;; This program is free software; you can redistribute it and/or +;;; modify it under the terms of the GNU General Public License as +;;; published by the Free Software Foundation; either version 3 of the +;;; License, or (at your option) any later version. +;;; +;;; This program is distributed in the hope that it will be useful, +;;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +;;; General Public License for more details. +;;; +;;; You should have received a copy of the GNU General Public License +;;; along with this program. If not, see +;;; <http://www.gnu.org/licenses/>. + +(use-modules (srfi srfi-1) + (web request) + (web response) + (web server) + (web uri) + (web client)) + +(define static-url "http://localhost:8080") +(define dynamic-url "http://localhost:8081") + +(define (main-request-handler request body) + "Demuxer entry-point; parse `request' and forward to the correct local service" + (define (wrap-response response) + (if (response? response) + (build-response + #:version (response-version response) + #:code (response-code response) + #:reason-phrase (response-reason-phrase response) + #:headers (remove (lambda (hdr) (eqv? 'content-length (car hdr))) + (response-headers response)) + #:port (response-port response) + #:validate-headers? #f) + (cons '(Access-Control-Allow-Origin . "*") response))) + (let* ((path-encoded (uri-path (request-uri request))) + (path (split-and-decode-uri-path path-encoded))) + (define-values (response resp-body) + (let ((url (if (and (positive? (length path)) (string= "api" (first path))) + (string-concatenate (list dynamic-url path-encoded)) + (string-concatenate (list static-url path-encoded))))) + (http-request url + #:method (request-method request) + #:body body + #:version '(1 . 1) + #:keep-alive? #f + #:headers (request-headers request)))) + (values (wrap-response response) resp-body))) + +(run-server main-request-handler 'http '(#:port 8082)) |