From 4baeabb263d34b388522dc17fe458bf1fcaeb2a2 Mon Sep 17 00:00:00 2001 From: Milo Turner Date: Fri, 10 Apr 2020 23:10:28 -0400 Subject: [PATCH] http-socket stuff --- smol-http/http-msg.rkt | 2 +- smol-http/main.rkt | 51 ++++++++++++++++++++++++++++++++++++++---- 2 files changed, 48 insertions(+), 5 deletions(-) diff --git a/smol-http/http-msg.rkt b/smol-http/http-msg.rkt index 35e9d3f..6a14015 100644 --- a/smol-http/http-msg.rkt +++ b/smol-http/http-msg.rkt @@ -143,7 +143,7 @@ (define (write-http-body bdy [port (current-output-port)]) (match bdy [#f (void)] - [(? bytes? bs) (write-bytes bs port)] + [(? bytes? bs) (void (write-bytes bs port))] [(? stream? bss) (error 'write-http-body "chunked is not implemented sorry. ;(")])) ;; (in-http-body-chunks bdy) -> (streamof bytes) diff --git a/smol-http/main.rkt b/smol-http/main.rkt index 27dd2b7..9173207 100644 --- a/smol-http/main.rkt +++ b/smol-http/main.rkt @@ -1,9 +1,52 @@ #lang racket/base -(require "./util.rkt" - "./http-msg.rkt") (provide (all-from-out "./http-msg.rkt") http-request-method? http-response-code? - http-response-code-name) + http-response-code-name -(module+ test) + http-socket? + http-connect) + +(require racket/tcp + racket/match + + "./util.rkt" + "./http-msg.rkt") + +;; --------------------------------------------------------------------------------------- + +(define DEFAULT-PORT 80) +(define DEFAULT-USER-AGENT "smol-http 0.0.1") + +(struct http-socket [extra-headers conn-pair]) + +;; (http-connect host [port]) -> http-socket? +;; host : string? +;; port : port-number? +(define (http-connect host [port DEFAULT-PORT] + #:headers [x-hdrs '()]) + (http-socket `([host . ,host] + [user-agent . ,DEFAULT-USER-AGENT] + ,@x-hdrs) + (let-values ([(in out) (tcp-connect host port)]) + (cons in out)))) + +;; (http-close sock) -> void? +;; sock : http-socket? +(define (http-close sock) + (match-define (cons in out) (http-socket-conn-pair sock)) + (tcp-abandon-port in) + (tcp-abandon-port out)) + +;; (http-request req [sock]) -> http-res? +;; sock : http-socket? +;; req : http-req? +(define (http-request sock req) + (define req* (http-set-headers req (http-socket-extra-headers sock))) + (match-define (cons in out) (http-socket-conn-pair sock)) + (write-http-msg req* out) + (flush-output out) + (read-http-msg in)) + +(module+ test + )