2025-01-23 09:34:54 +01:00
|
|
|
(use-modules (srfi srfi-71)
|
2025-02-03 11:25:11 +01:00
|
|
|
(rnrs bytevectors)
|
|
|
|
(ice-9 binary-ports)
|
|
|
|
(ice-9 textual-ports)
|
2025-01-23 09:34:54 +01:00
|
|
|
(tests)
|
2024-11-19 18:43:43 +00:00
|
|
|
(fibers)
|
2025-01-23 09:34:54 +01:00
|
|
|
(fibers channels)
|
2024-11-19 18:43:43 +00:00
|
|
|
(unit-test)
|
|
|
|
(web uri)
|
|
|
|
(web client)
|
2025-01-23 09:34:54 +01:00
|
|
|
(web request)
|
2024-11-19 18:43:43 +00:00
|
|
|
(web response)
|
|
|
|
(knots web-server)
|
|
|
|
(knots non-blocking))
|
|
|
|
|
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(values '((content-type . (text/plain)))
|
|
|
|
"Hello, World!"))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(assert-equal
|
|
|
|
200
|
|
|
|
(response-code
|
|
|
|
(http-get
|
|
|
|
uri
|
2024-12-28 10:43:00 +00:00
|
|
|
#:port (non-blocking-open-socket-for-uri uri)))))))
|
2024-11-19 18:43:43 +00:00
|
|
|
|
2025-03-03 10:56:36 +00:00
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
"Hello, World!")
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(assert-equal
|
|
|
|
500
|
|
|
|
(response-code
|
|
|
|
(http-get
|
|
|
|
uri
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri)))))))
|
|
|
|
|
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
"Hello, World!")
|
|
|
|
#:port 0
|
|
|
|
#:exception-handler
|
|
|
|
(lambda (exn request)
|
|
|
|
"Error"))) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(assert-equal
|
|
|
|
500
|
|
|
|
(response-code
|
|
|
|
(http-get
|
|
|
|
uri
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri)))))))
|
|
|
|
|
2025-02-03 11:25:11 +01:00
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(values '((content-type . (text/plain))
|
|
|
|
(content-length . 3))
|
|
|
|
(lambda (port)
|
|
|
|
(display "foo" port))))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let ((response
|
|
|
|
body
|
|
|
|
(http-get
|
|
|
|
uri
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri))))
|
|
|
|
(assert-equal
|
|
|
|
"foo"
|
|
|
|
body)))))
|
|
|
|
|
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(values '((content-type . (text/plain
|
|
|
|
(charset . "utf-8"))))
|
|
|
|
(lambda (port)
|
|
|
|
(display "☺" port))))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let ((response
|
|
|
|
body
|
|
|
|
(http-get
|
|
|
|
uri
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri))))
|
|
|
|
(assert-equal
|
|
|
|
"☺"
|
|
|
|
body)))))
|
|
|
|
|
2025-02-07 16:09:42 +00:00
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(values '((content-type . (text/plain
|
|
|
|
(charset . "utf-8")))
|
|
|
|
(content-length . 3))
|
|
|
|
(lambda (port)
|
|
|
|
(display "☺" port))))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let ((response
|
|
|
|
body
|
|
|
|
(http-get
|
|
|
|
uri
|
|
|
|
;; TODO Remove once using Guile 3.0.10
|
|
|
|
#:streaming? #t
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri))))
|
|
|
|
(assert-equal
|
|
|
|
"☺"
|
|
|
|
(utf8->string
|
|
|
|
(get-bytevector-n body 3)))))))
|
|
|
|
|
2025-03-08 10:15:25 +00:00
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(if (string=? (utf8->string
|
|
|
|
(read-request-body/knots request))
|
|
|
|
"☺")
|
|
|
|
(values (build-response #:code 200)
|
|
|
|
"")
|
|
|
|
(values (build-response #:code 500)
|
|
|
|
"")))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let ((response
|
|
|
|
body
|
|
|
|
(http-post
|
|
|
|
uri
|
|
|
|
#:body "☺"
|
|
|
|
#:port (non-blocking-open-socket-for-uri uri))))
|
|
|
|
(assert-equal
|
|
|
|
200
|
|
|
|
(response-code response))))))
|
|
|
|
|
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((channel (make-channel))
|
|
|
|
(web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
(with-exception-handler
|
|
|
|
(lambda (exn)
|
|
|
|
(put-message channel exn))
|
|
|
|
(lambda ()
|
|
|
|
(read-request-body/knots request))
|
|
|
|
#:unwind? #t))
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let* ((port (non-blocking-open-socket-for-uri uri))
|
|
|
|
(request
|
|
|
|
(build-request
|
|
|
|
uri
|
|
|
|
#:method 'POST
|
|
|
|
#:version '(1 . 1)
|
|
|
|
#:headers `((connection close)
|
|
|
|
(content-length . 20)
|
|
|
|
(Content-Type . "application/octet-stream"))
|
|
|
|
#:port port)))
|
|
|
|
|
|
|
|
(set-port-encoding! port "ISO-8859-1")
|
|
|
|
(let ((request (write-request request port)))
|
|
|
|
(display "12")
|
|
|
|
(force-output port)
|
|
|
|
|
|
|
|
(close-port port)))
|
|
|
|
|
|
|
|
(assert-true
|
|
|
|
(request-body-ended-prematurely-error?
|
|
|
|
(get-message channel))))))
|
|
|
|
|
2025-02-03 11:25:11 +01:00
|
|
|
;; Test hanlding of exceptions when writing the response to a client
|
2025-01-23 09:34:54 +01:00
|
|
|
(run-fibers-for-tests
|
|
|
|
(lambda ()
|
|
|
|
(let* ((exception-handled-sucecssfully-channel
|
|
|
|
(make-channel))
|
|
|
|
(port-closed-channel (make-channel))
|
|
|
|
(web-server
|
|
|
|
(run-knots-web-server
|
|
|
|
(lambda (request)
|
|
|
|
;; TODO Not sure why buffering makes a difference here
|
|
|
|
(setvbuf (request-port request) 'none)
|
|
|
|
(get-message port-closed-channel)
|
|
|
|
(values '((content-type . (text/plain)))
|
|
|
|
"Hello, World!"))
|
|
|
|
#:write-response-exception-handler
|
2025-01-29 16:18:15 +00:00
|
|
|
(lambda (exn request)
|
2025-01-23 09:34:54 +01:00
|
|
|
(spawn-fiber
|
|
|
|
(lambda ()
|
|
|
|
(put-message exception-handled-sucecssfully-channel
|
|
|
|
#t)))
|
|
|
|
#f)
|
|
|
|
#:port 0)) ;; Bind to any port
|
|
|
|
(port
|
|
|
|
(web-server-port web-server))
|
|
|
|
(uri
|
|
|
|
(build-uri 'http #:host "127.0.0.1" #:port port)))
|
|
|
|
|
|
|
|
(let ((request-port (non-blocking-open-socket-for-uri uri)))
|
|
|
|
(write-request
|
|
|
|
(build-request uri)
|
|
|
|
request-port)
|
|
|
|
(close-port request-port))
|
|
|
|
(put-message port-closed-channel #t)
|
|
|
|
|
|
|
|
(assert-equal (get-message exception-handled-sucecssfully-channel)
|
|
|
|
#t))))
|
|
|
|
|
2024-11-19 18:43:43 +00:00
|
|
|
(display "web-server test finished successfully\n")
|