url.ss
#lang scheme
(require
 net/url-structs (only-in net/url string->url url->string))
  
(define (ws-url? v)
  (and (url? v)
       (member (url-scheme v) '("ws" "wss"))
       (url-path-absolute? v)
       (not (url-fragment v))))

(provide
 (all-from-out net/url-structs net/url)
 ws-url?)

(define (ws-url-secure? url)
  (equal? (url-scheme url) "wss"))

(define (ws-url-default-port url)
  (if (ws-url-secure? url) 443 80))

(define (ws-url-port url)
  (or (url-port url) (ws-url-default-port url)))

(define (ws-url-resource url)
  (url->string
   (make-url
    #f
    #f
    #f #f
    #t (url-path url) (url-query url) #f)))

(provide/contract
 [ws-url-secure? (-> ws-url? any)]
 [ws-url-default-port (-> ws-url? natural-number/c)]
 [ws-url-port (-> ws-url? natural-number/c)]
 [ws-url-resource (-> ws-url? string?)])