about summary refs log tree commit diff
diff options
context:
space:
mode:
authorsternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>2021-03-16 21:27:13 +0100
committersternenseemann <0rpkxez4ksa01gb3typccl0i@systemli.org>2021-03-16 21:27:13 +0100
commiteedce1a242c3c18681a1446464ea9d8ff016e6a1 (patch)
tree1b28021c0979a172fce17af71935abc7836a8903
parent77fb1cef6a1f68ece5d8b755b495a05d529dedcf (diff)
feat(Network.Gopher): always return a Builder from response
This allows us to use sendAllBuilder which should make MenuResponses
more efficient as less conversions and passing around are required.
-rw-r--r--src/Network/Gopher.hs12
1 files changed, 5 insertions, 7 deletions
diff --git a/src/Network/Gopher.hs b/src/Network/Gopher.hs
index 7feeffe..2c7e0f0 100644
--- a/src/Network/Gopher.hs
+++ b/src/Network/Gopher.hs
@@ -99,12 +99,11 @@ import Data.Bifunctor (second)
 import Data.ByteString (ByteString ())
 import qualified Data.ByteString as B
 import qualified Data.ByteString.Builder as BB
-import qualified Data.ByteString.Lazy as BL
 import Data.Maybe (fromMaybe)
 import Data.Word (Word16 ())
 import System.Socket hiding (Error (..))
 import System.Socket.Family.Inet6
-import System.Socket.Type.Stream
+import System.Socket.Type.Stream (Stream, sendAllBuilder)
 import System.Socket.Protocol.TCP
 
 -- | Necessary information to handle gopher requests
@@ -379,7 +378,7 @@ handleIncoming clientSock addr@(SocketAddressInet6 cIpv6 _ _ _) = do
 
   rawResponse <- response intermediateResponse
 
-  liftIO $ void (sendAll clientSock rawResponse msgNoSignal) `catch` \e ->
+  liftIO $ void (sendAllBuilder clientSock 10240 rawResponse msgNoSignal) `catch` \e ->
     logException logger "Exception while sending response to client: " (e :: SocketException)
 
 acceptAndHandle :: Socket Inet6 Stream TCP -> GopherM ()
@@ -396,8 +395,8 @@ acceptAndHandle sock = do
 runGopherPure :: GopherConfig -> (GopherRequest -> GopherResponse) -> IO ()
 runGopherPure cfg f = runGopher cfg (fmap pure f)
 
-response :: GopherResponse -> GopherM ByteString
-response (FileResponse str) = pure str
+response :: GopherResponse -> GopherM BB.Builder
+response (FileResponse str) = pure $ BB.byteString str
 response (ErrorResponse reason) = response . MenuResponse $
     [ Item Error reason "Err" Nothing Nothing ]
 response (MenuResponse items) =
@@ -414,5 +413,4 @@ response (MenuResponse items) =
           ]
    in do
   cfg <- serverConfig <$> ask
-  pure . BL.toStrict . BB.toLazyByteString
-    $ foldl (appendItem cfg) mempty items
+  pure $ foldl (appendItem cfg) mempty items