Skip to content

Commit f7805f8

Browse files
committed
use semaphores, fast-http to implement multithreaded request-parsing
1 parent 0d6ae93 commit f7805f8

File tree

6 files changed

+25
-26
lines changed

6 files changed

+25
-26
lines changed

src/http3/http3.lisp

+2-2
Original file line numberDiff line numberDiff line change
@@ -30,8 +30,8 @@
3030
:authority (lsquic:host client)
3131
:verb verb
3232
:body body))
33-
(pipe (lsquic:new-stream client request)))
34-
(lsquic:wait-for-response pipe)))
33+
(request-handler (lsquic:new-stream client request)))
34+
(lsquic::wait-for-response request-handler)))
3535

3636
(defmacro request-no-body (verb)
3737
(let* ((sym-name (symbol-name verb))

src/lsquic/client.lisp

+3-3
Original file line numberDiff line numberDiff line change
@@ -132,10 +132,10 @@
132132
(pop (request-queue client))))
133133

134134
(defmethod new-stream ((client client) request)
135-
(let ((pipe (make-instance 'pipe :request request)))
136-
(push-stream-ctx client pipe)
135+
(let ((handler (make-instance 'request-handler :request request)))
136+
(push-stream-ctx client handler)
137137
(conn-make-stream (quic-conn client))
138-
pipe))
138+
handler))
139139

140140
(defmethod get-fd ((client client))
141141
(sb-bsd-sockets:socket-file-descriptor (socket (socket client))))

src/lsquic/io.lisp

-18
This file was deleted.

src/lsquic/lsquic.asd

+2-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
(:file "sockets")
1212
(:file "lsquic")
1313
(:file "request")
14-
(:file "io")
14+
(:file "request-handler")
1515
(:file "ev")
1616
(:file "client"))
1717
:depends-on (:bordeaux-threads
@@ -20,5 +20,6 @@
2020
:cffi-helpers
2121
:lev
2222
:split-sequence
23+
:fast-http
2324
:weird-pointers
2425
:udp))

src/lsquic/lsquic.lisp

+5-2
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,11 @@
2828
(weird-pointers:save (pop-stream-ctx (weird-pointers:restore stream-ctx))))))
2929

3030
(defcallback stream-readf-cb :unsigned-int ((stream-ctx :pointer) (buf :pointer) (buf-len :unsigned-int) (fin :int))
31-
(format t "in stream-readf: ~A~%" (cffi:foreign-string-to-lisp buf))
32-
(force-output)
31+
(let* ((request-handler (weird-pointers:restore stream-ctx)))
32+
(multiple-value-bind (http header-completed-p completed-p)
33+
(funcall (response-parser request-handler) (babel:string-to-octets (cffi:foreign-string-to-lisp buf)))
34+
(when completed-p
35+
(signal-completed request-handler))))
3336
buf-len)
3437

3538
(defcallback cb-on-read :void ((stream :pointer) (stream-ctx :pointer))

src/lsquic/request-handler.lisp

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
(in-package :lsquic)
2+
3+
(defclass request-handler ()
4+
((request :initarg :request :accessor request)
5+
(response-parser :initform (fast-http:make-parser (fast-http:make-http-response)) :accessor response-parser)
6+
(completed-signal :initform (bt:make-semaphore) :accessor completed-signal)))
7+
8+
(defmethod signal-completed ((request-handler request-handler))
9+
(bt:signal-semaphore (completed-signal request-handler)))
10+
11+
(defmethod wait-for-response ((request-handler request-handler))
12+
(bt:wait-on-semaphore (completed-signal request-handler))
13+
(response-parser request-handler))

0 commit comments

Comments
 (0)