@@ -84,7 +84,6 @@ import Control.Exception
8484 , bracketOnError
8585 )
8686import Control.Concurrent (forkIO)
87−import qualified Data.Char as C
8887import Data.Maybe (fromMaybe, isJust)
8988
9089import Data.Typeable (Typeable)
@@ -114,9 +113,8 @@ import Control.Monad (forever, when)
114113import qualified Network.HTTP.Types as H
115114import qualified Data.CaseInsensitive as CI
116115import System.IO (hPutStrLn, stderr)
117−import Data.Int (Int64)
118−import GHC.Prim
119−import GHC.Types
116+import ReadInt (readInt64)
117+
120118
121119#if WINDOWS
122120import Control.Concurrent (threadDelay)
@@ -651,48 +649,10 @@ checkCR bs pos =
651649 else pos
652650{-# INLINE checkCR #-}
653651
654−-- This function is used to parse the Content-Length field of HTTP headers and
655−-- is a performance hot spot. It should only be replaced with something
656−-- significantly and provably faster.
657−-- It needs to be able work correctly on 32 bit CPUs for file sizes > 2G so we
658−-- use Int64 here and then make a generic 'readInt' that allows conversion to
659−-- Int and Integer.
660652readInt :: Integral a => ByteString -> a
661−readInt s = fromIntegral $ readInt64MH s
662− where
663− readInt64MH :: ByteString -> Int64
664− readInt64MH bs =
665− B.foldl' (\i c -> i * 10 + fromIntegral (mhDigitToInt c)) 0
666− $ B.takeWhile C.isDigit bs
653+readInt bs = fromIntegral $ readInt64 bs
667654{-# INLINE readInt #-}
668655
669−data Table = Table !Addr#
670−
671−mhDigitToInt :: Char -> Int
672−mhDigitToInt (C# i) = I# (word2Int# $ indexWord8OffAddr# addr (ord# i))
673− where
674− !(Table addr) = table
675− table :: Table
676− table = Table
677− "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
678− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
679− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
680− \\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x00\x00\x00\x00\x00\x00\
681− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
682− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
683− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
684− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
685− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
686− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
687− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
688− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
689− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
690− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
691− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\
692− \\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"#
693−
694−
695−
696656
697657-- | Call the inner function with a timeout manager.
698658withManager :: Int -- ^ timeout in microseconds