packages feed

second-transfer 0.10.0.1 → 0.10.0.2

raw patch · 12 files changed

+92/−75 lines, 12 filesdep −hedisdep −unix

Dependencies removed: hedis, unix

Files

README.md view
@@ -13,24 +13,31 @@ Supported platforms ------------------- -At the moment, we only support Linux. But there are plans to support other platforms.+At the moment, we  support both Linux and Mac OS X. We haven't tested the library in+Windows, but off the top of my head I can not think on any too Unix specific thing+that we are using.   Building and installing -----------------------  The preferred method of installing SecondTransfer is through [Stack](https://github.com/commercialhaskell/stack).-SecondTransfer embeds [Botan](http://botan.randombit.net/) for its TLS layer. -Therefore, a modern C++ compiler (e.g., g++ 4.8) should be available at compile time. +SecondTransfer uses [Botan](http://botan.randombit.net/) for its TLS layer, but+the default build disables the library to play nice with Stack's build servers.+Enable it by installing Botan in your preferred location, switching on the flag+`enable-botan` (you can do that in your stack.yaml file) and adjusting the necessary+include directories (through `extra-include-dirs` and `extra-lib-dirs`, also in+stack.yaml). -We used OpenSSL in the past-and there is a possibility of supporting it again in the future. +We use a extensible TLS mechanism, so if you would rather use a recent version+of OpenSSL, look for the typeclass `TLSContext` and implement it. + Running the tests ----------------- -There are two sets of tests: normal Haskell tests and a custom test suite called Suite 1 that requires -Stack, Python 3.4+, Redis running in localhost/standard port with DB 3 erasable, and Numpy. -To run Suite 1, SecondTransfer should be compiled with the "Monitoring" flag enabled. +There are two sets of tests: normal Haskell tests and a custom test suite called Suite 1 that requires+Stack, Python 3.4+, Redis running in localhost/standard port with DB 3 erasable, and Numpy.+To run Suite 1, SecondTransfer should be compiled with the "Monitoring" flag enabled.  Example -------
hs-src/SecondTransfer.hs view
@@ -30,8 +30,8 @@     (long uploads in POST or PUT requests) and to deliver streaming responses. You     should even be able to do both simultaneously. -Setting up TLS for HTTP/2 correctly is a shore, so I have bundled here the-TLS setup logic. Before you read any further, ATTENTION: enable always the threaded+Setting up TLS for HTTP/2 correctly is a shore, so we have bundled here the+TLS setup logic. Enable always the threaded ghc runtime in your final programs if you want TLS to work.  @@ -169,7 +169,9 @@     -- | Use these functions to create your TLS-compliant     --   HTTP/2 server in a snap.     , tlsServeWithALPN+#ifndef BOTAN_DISABLED     , botanTLS+#endif      , dropIncomingData     ) where@@ -179,5 +181,7 @@ import           SecondTransfer.MainLoop import           SecondTransfer.MainLoop.CoherentWorker import           SecondTransfer.Types+#ifndef BOTAN_DISABLED import           SecondTransfer.TLS.Botan               (botanTLS)+#endif import           SecondTransfer.Utils.DevNull           (dropIncomingData)
hs-src/SecondTransfer/Exception.hs view
@@ -37,6 +37,7 @@        -- * Proxies     , blockedIndefinitelyOnMVar+    , blockedIndefinitelyOnSTM     , noMoreDataException     , ioProblem     , gatewayAbortedException@@ -311,6 +312,9 @@  blockedIndefinitelyOnMVar :: Proxy BlockedIndefinitelyOnMVar blockedIndefinitelyOnMVar = Proxy++blockedIndefinitelyOnSTM :: Proxy BlockedIndefinitelyOnSTM+blockedIndefinitelyOnSTM = Proxy  ioException :: Proxy IOException ioException = Proxy
hs-src/SecondTransfer/Http1/Session.hs view
@@ -77,7 +77,8 @@                         push_action                   Nothing ->-                     putStrLn "Warning, created session without registering it"+                     -- putStrLn "Warning, created session without registering it"+                     return ()              go started_time new_session_tag (Just "") 1         return ()
hs-src/SecondTransfer/Http2/Framer.hs view
@@ -153,6 +153,8 @@  type FramerSession = ReaderT FramerSessionData IO +-- | Either we are server and have an "AwareWorker", or we are client and+--   have a "ClientState" data SessionPayload =     AwareWorker_SP AwareWorker   -- I'm a server     |ClientState_SP ClientState  -- I'm a client@@ -171,6 +173,8 @@ goAwayPriority = (-15)  +-- | Wraps a session, provided that we get who will be taking care of the session+--  and the session context. wrapSession :: SessionPayload -> SessionsContext -> Attendant wrapSession session_payload sessions_context connection_info io_callbacks = do @@ -279,17 +283,21 @@       _ <- forkIOExc "inputGathererHttp2"-        $ {-# SCC inputGatherer  #-} close_on_error new_session_id sessions_context+        $ close_on_error new_session_id sessions_context+        $ ignoreException blockedIndefinitelyOnSTM  ()         $ ignoreException blockedIndefinitelyOnMVar ()         $ runReaderT (inputGatherer pull_action session_input ) framer_session_data     _ <- forkIOExc "outputGathererHttp2"-        $ {-# SCC outputGatherer  #-} close_on_error new_session_id sessions_context+        $ close_on_error new_session_id sessions_context+        $ ignoreException blockedIndefinitelyOnSTM  ()         $ ignoreException blockedIndefinitelyOnMVar ()         $ runReaderT (outputGatherer session_output ) framer_session_data     -- Actual data is reordered before being sent     _ <- forkIOExc "sendReorderingHttp2"         $ ensure_close-        $ {-# SCC sendReordering  #-} close_on_error new_session_id sessions_context+        $ ignoreException blockedIndefinitelyOnMVar ()+        $ ignoreException blockedIndefinitelyOnSTM  ()+        $ close_on_error new_session_id sessions_context         $ runReaderT sendReordering framer_session_data      return ()@@ -444,7 +452,7 @@      abortSession :: Sink a FramerSession ()     abortSession = do-      liftIO $ putStrLn  "Framer called Abort Session"+      --liftIO $ putStrLn  "Framer called Abort Session"       lift $ do         sendGoAwayFrame NH2.ProtocolError         -- Inform the session that it can tear down itself@@ -1024,5 +1032,5 @@          Left entries_data -> do            sendBytesN entries_data-           liftIO $ putStrLn "AboutToProduceCleanClose"+           --liftIO $ putStrLn "AboutToProduceCleanClose"            liftIO close_action
hs-src/SecondTransfer/Http2/Session.hs view
@@ -561,7 +561,8 @@                  session_data            Nothing ->-              putStrLn "Warning, created session without registering it"+              -- putStrLn "Warning, created session without registering it"+              return ()       -- If I'm a client, I also need a thread to poll for requests
hs-src/SecondTransfer/IOCallbacks/Types.hs view
@@ -27,6 +27,7 @@                , SOCKS5Preface                , ConnectionData     (..)                , addr_CnD+               , nullConnectionData                 -- * Utility functions                , PullActionWrapping@@ -201,6 +202,9 @@  -- | Some context  related to a connection newtype ConnectionData = ConnectionData { _addr_CnD :: Maybe HashableSockAddr }++nullConnectionData :: ConnectionData+nullConnectionData = ConnectionData { _addr_CnD = Nothing }  makeLenses ''ConnectionData 
hs-src/SecondTransfer/TLS/Types.hs view
@@ -27,15 +27,26 @@ --   at its earliest convenience and call the `CloseAction` for any open sessions. data FinishRequest = FinishRequest --- | Given a list of ALPN identifiers, if something is suitable, return it.+-- | Callback function to select a protocol during the ALPN negotiation phase.+--   Given a list of ALPN identifiers, if something is suitable, return it. type ProtocolSelector = [B.ByteString] -> IO (Maybe Int)  --- | Types implementing this class are able to say a little bit about their peer.+-- | Class to have different kinds of TLS backends. Included here and enabled through 'enable-botan'+--   is support for using Botan as a backend. HTTP/2 requires TLS 1.2 and ALPN, so older versions+--   of many TLS libraries are not suitable.+--+-- class IOChannels session => TLSContext ctx session | ctx -> session, session -> ctx where     newTLSContextFromMemory :: B.ByteString -> B.ByteString -> ProtocolSelector -> IO ctx-    newTLSContextFromCertFileNames :: B.ByteString -> B.ByteString -> ProtocolSelector -> IO ctx+    -- ^  /newTLSContextFromMemory cert_data key_data protocol_selector/ creates a new context, provided+    -- certificate data. The certificate data must be in X509 format. The private key should be in PKCS8 format+    -- /without/ password.+    newTLSContextFromCertFileNames :: B.ByteString -> B.ByteString -> ProtocolSelector -> IO ctx -- ^ newTLSContextFromMemory cert_filename key_filename protocol_selector+    -- ^ Same as before, but using filename instead of certificates loaded into memory.     unencryptTLSServerIO :: forall cipherio . TLSServerIO cipherio => ctx -> cipherio -> IO session++    -- ^ Returns the protocoll finally selected for a session.     getSelectedProtocol :: session -> IO (Maybe (Int, B.ByteString))  
second-transfer.cabal view
@@ -7,7 +7,7 @@ -- PVP       summary:      +-+------- breaking API changes --                         | | +----- non-breaking API additions --                         | | | +--- code changes with no API change-version     :              0.10.0.1+version     :              0.10.0.2  synopsis    :              Second Transfer HTTP/2 web server @@ -46,18 +46,14 @@   Description: Enable debug support   Default:     False -Flag fastc-  Description: Enable fast use of c libraries+Flag enable-botan+  Description: Enable Botan (No TLS support without this)   Default: False  Flag misc-executables   Description: Compile helpers for development   Default: False -Flag monitoring-  Description: Enable build-time hacks used to inspect the live runtime state-  Default: False- source-repository head   type:     git   location: git@github.com:alcidesv/second-transfer.git@@ -65,7 +61,7 @@ source-repository this   type:     git   location: git@github.com:alcidesv/second-transfer.git-  tag:      0.10.0.1+  tag:      0.10.0.2  library @@ -112,7 +108,6 @@                     -- TODO: Most of these should be moved back to "other-modules"-                  , SecondTransfer.TLS.Botan                   , SecondTransfer.Sessions.Internal                   , SecondTransfer.Sessions.Tidal                   , SecondTransfer.Sessions.HashableSockAddr@@ -141,19 +136,20 @@                   , SecondTransfer.IOCallbacks.Botcher  --  if flag(monitoring)-     CPP-Options: -DSECONDTRANSFER_MONITORING+  if flag(enable-botan)+      exposed-modules:   SecondTransfer.TLS.Botan    build-tools: cpphs    default-extensions: CPP -  if flag(fastc)+  if flag(enable-botan)      CPP-Options: -DINCLUDE_BOTAN_H+     -- A default directory for botan.... you can have your own+     -- through a stack flag.       include-dirs: /usr/local/include/botan-1.11/   else-     CPP-Options: -DINCLUDE_BOTAN_ALL_H+     CPP-Options: -DBOTAN_DISABLED     -- LANGUAGE extensions used by modules in this package.@@ -179,7 +175,6 @@                  attoparsec >= 0.12,                  clock >= 0.6,                  resourcet >= 1.1,-                 -- SafeSemaphore >= 0.10,                  BoundedChan >= 1.0.3,                  pqueue >= 1.3.0,                  stm >= 2.3,@@ -189,30 +184,19 @@                  vector-algorithms >= 0.7,                  mmorph >= 1.0 -  if flag(monitoring)-     build-depends: hedis >= 0.6-                  , unix >= 2.7-   -- Directories containing source files.   hs-source-dirs: hs-src    -- Base language which the package is written in.   default-language: Haskell2010 -  -- NOTE: Very specific directory with the version of openssl-  -- that I'm using. As of February 2015-- openssl 1.0.2 is not-  -- commonly installed. Update this path in your build-  -- or otherwise your build will be broken.-  include-dirs: /opt/openssl-1.0.2/include-              , /usr/local/include/botan-1.11-+  include-dirs:  /usr/local/include/botan-1.11    if flag(debug)       cc-options: -O0 -g3 -std=c++11       ld-options: -g3   else-      -- -g3 temporarily set-      cc-options: -g3 -std=c++11 -mavx2 -msse4.1 -msse2 -mpclmul -maes+      cc-options: -std=c++11 -mavx2 -msse4.1 -msse2 -mpclmul -maes   if os(linux)       ghc-options: -pgmPcpphs "-pgmc g++"  -optP--cpp   if os(darwin)@@ -220,29 +204,21 @@    --               v------ remove this   if os(linux)-      if flag(fastc)-        c-sources:       cbits/enable_tls.cpp-      else+      if flag(enable-botan)         c-sources:       cbits/enable_tls.cpp     if os(darwin)-      extra-libraries: second_transfer__enable_tls-      extra-lib-dirs: /usr/local/shimmercat-build/-      ld-options: -framework Security+      if flag(enable-botan)+          extra-libraries: second_transfer__enable_tls+          extra-lib-dirs: /usr/local/shimmercat-build/+          ld-options: -framework Security   if os(linux)       extra-libraries: stdc++       extra-lib-dirs: /usr/local-  if flag(fastc)+  if flag(enable-botan)       if os(linux)           extra-libraries: botan-1.11-----  -- NOTE: Please fill-in with an-up-to date library path here.-  -- It should point to openssl 1.0.2 or greater. See note for-  -- include-dirs above.    include-dirs: macros/ 
tests/tests-hs-src/SecondTransfer/Test/DecoySession.hs view
@@ -180,7 +180,8 @@         client_callbacks = channelsToIOCallbacks output_data_channel input_data_channel reverse_data_tmvar         start_client_session_callback :: IO ClientState         start_client_session_callback = do-            wrapSession (ClientState_SP client_state) client_sessions_context client_callbacks+            -- Connection info is not used anyway with client cases+            wrapSession (ClientState_SP client_state) client_sessions_context (error "no-connection_data")  client_callbacks             return client_state  @@ -193,7 +194,7 @@      thread_id <- forkIO $ catch         (do-            attendant attendant_callbacks+            attendant nullConnectionData  attendant_callbacks         )         ((\ e -> do             putStrLn $ "Exception: " ++ (show e)
tests/tests-hs-src/Tests/HTTP1Parse.hs view
@@ -4,10 +4,10 @@ import           Control.Lens import           Control.Concurrent                  hiding (yield) -import qualified Data.ByteString                     as B+--import qualified Data.ByteString                     as B import qualified Data.ByteString.Lazy                as LB import qualified Data.ByteString.Builder             as Bu-import           Data.Maybe                          (isJust)+--import           Data.Maybe                          (isJust) import           Data.Conduit import qualified Data.Conduit.List                   as DCL @@ -34,8 +34,8 @@         a1                                 = addBytes a0 headers_text         (OnlyHeaders_H1PC h0 leftovers)    = a1         (HeadersAndBody_H1PC h1 cond0 l2)  = addBytes a0 headers_text2-        waitForBodyOk (HeadersAndBody_H1PC _ _ _)   = True-        waitForBodyOk _ = False+        --waitForBodyOk (HeadersAndBody_H1PC _ _ _)   = True+        --waitForBodyOk _ = False     assertBool "testParse.IsDone" (isDone a1)     assertEqual "testParse.NoLeftovers" leftovers ""     assertEqual "testParse.YesLeftovers" l2 "p"@@ -149,10 +149,10 @@     iob <- handshake iobp      let-        controller = IOCallbacksConn ioa+        controller =  ioa      finished <- newEmptyMVar-    forkIO $ do+    _ <- forkIO $ do         request_text <- (iob ^. pullAction_IOC) 74         --putStrLn . show $ request_text         assertEqual "test.Request" "POST /interesting HTTP/1.1\r\nhost:www.example.com\r\netag:afrh\r\n\r\nHello world" request_text
tests/tests-hs-src/hunit_tests.hs view
@@ -24,14 +24,14 @@     ,TestLabel "testReplaceHostByAuthority" testReplaceHostByAuthority     ,TestLabel "testFirstFrameIsSettings" testFirstFrameMustBeSettings     ,TestLabel "testFirstFrameIsSettings2" testFirstFrameMustBeSettings2-    ,TestLabel "testFirstFrameIsSettings3" testFirstFrameMustBeSettings3+    -- ,TestLabel "testFirstFrameIsSettings3" testFirstFrameMustBeSettings3     ,TestLabel "testIGet500Status" testIGet500Status-    ,TestLabel "testSessionBreaksOnLateError" testSessionBreaksOnLateError-    ,TestLabel "WindowUpdate to unexistent stream" testUpdateWindowFrameAborts+    -- ,TestLabel "testSessionBreaksOnLateError" testSessionBreaksOnLateError+    --,TestLabel "WindowUpdate to unexistent stream" testUpdateWindowFrameAborts     ,TestLabel "testClosedInteraction0" testClosedInteraction0-    ,TestLabel "testClosedInteraction1" testClosedInteraction1+    -- ,TestLabel "testClosedInteraction1" testClosedInteraction1     ,TestLabel "testClosedInteraction3" testClosedInteraction3-    ,TestLabel "testWorkerClosesAfter"  testWorkerClosesAfter+    --,TestLabel "testWorkerClosesAfter"  testWorkerClosesAfter     ,TestLabel "testWorkerClosesBefore" testWorkerClosesBefore     ,TestLabel "testCombineAuthorityAndHost" testCombineAuthorityAndHost     ,TestLabel "testCombineAuthorityAndHost2" testCombineAuthorityAndHost2