diff --git a/CHANGELOG.md b/CHANGELOG.md
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,9 @@
 # Revision history for wai-handler-hal
 
+## 0.1.2.0 -- 2022-06-03
+
+* Fix construction of `rawPathInfo`.
+
 ## 0.1.1.0 -- 2021-10-14
 
 * When API Gateway sends nonsense IPs during a test invocation, sub in
diff --git a/README.md b/README.md
new file mode 100644
--- /dev/null
+++ b/README.md
@@ -0,0 +1,19 @@
+# wai-handler-hal
+
+[![Haskell-CI](https://github.com/bellroy/wai-handler-hal/actions/workflows/haskell-ci.yml/badge.svg)](https://github.com/bellroy/wai-handler-hal/actions/workflows/haskell-ci.yml)
+
+This library lets you run `wai` `Application`s on AWS Lambda, which
+means you can now use mature web frameworks like
+[`servant`](https://hackage.haskell.org/package/servant).
+
+The main entry point is `Network.Wai.Handler.Hal.run`, which wraps an
+`Application` and returns a function that can be passed to `hal`'s
+`AWS.Lambda.Runtime.mRuntime`.
+
+**NOTE:** The function returned by `Network.Wai.Handler.Hal.run` is
+only for [Lambda Proxy
+Integrations](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html)
+of AWS API Gateway **REST APIs** (`AWS::ApiGateway::RestApi` in
+CloudFormation). If you try to use such a Lambda with an API Gateway
+**HTTP API** (`AWS::ApiGatewayV2::Api` in CloudFormation), it will
+return 500s.
diff --git a/src/Network/Wai/Handler/Hal.hs b/src/Network/Wai/Handler/Hal.hs
--- a/src/Network/Wai/Handler/Hal.hs
+++ b/src/Network/Wai/Handler/Hal.hs
@@ -209,7 +209,7 @@
             Wai.rawPathInfo =
               BL.toStrict
                 . Builder.toLazyByteString
-                $ encodePath pathSegments query,
+                $ encodePath pathSegments [],
             Wai.rawQueryString = case query of
               [] -> ""
               _ -> renderQuery True query,
diff --git a/test/Main.hs b/test/Main.hs
new file mode 100644
--- /dev/null
+++ b/test/Main.hs
@@ -0,0 +1,1 @@
+{-# OPTIONS_GHC -F -pgmF tasty-discover #-}
diff --git a/test/Network/Wai/Handler/HalTest.hs b/test/Network/Wai/Handler/HalTest.hs
new file mode 100644
--- /dev/null
+++ b/test/Network/Wai/Handler/HalTest.hs
@@ -0,0 +1,21 @@
+{-# LANGUAGE ScopedTypeVariables #-}
+
+module Network.Wai.Handler.HalTest where
+
+import AWS.Lambda.Events.ApiGateway.ProxyRequest
+import Data.Aeson (eitherDecodeFileStrict')
+import qualified Data.Text.Lazy.Encoding as T
+import Data.Void (Void)
+import Network.Wai.Handler.Hal
+import Test.Tasty
+import Test.Tasty.Golden
+import Text.Pretty.Simple
+
+test_ConvertProxyRequest :: TestTree
+test_ConvertProxyRequest =
+  goldenVsString "API Gateway Proxy Request" "test/golden/WaiRequest.txt" $ do
+    proxyRequest :: ProxyRequest Void <-
+      eitherDecodeFileStrict' "test/data/ProxyRequest.json"
+        >>= either fail pure
+    waiRequest <- toWaiRequest mempty 443 proxyRequest
+    pure . T.encodeUtf8 $ pShowNoColor waiRequest
diff --git a/test/data/ProxyRequest.json b/test/data/ProxyRequest.json
new file mode 100644
--- /dev/null
+++ b/test/data/ProxyRequest.json
@@ -0,0 +1,89 @@
+{
+    "resource": "/{proxy+}",
+    "path": "/foo/bar/baz",
+    "httpMethod": "GET",
+    "headers": {
+        "accept": "application/json",
+        "Host": "ffffffffff.execute-api.us-east-1.amazonaws.com",
+        "User-Agent": "curl/7.83.1",
+        "X-Amzn-Trace-Id": "Root=1-11111111-111111111111111111111111",
+        "X-Forwarded-For": "123.123.123.123",
+        "X-Forwarded-Port": "443",
+        "X-Forwarded-Proto": "https"
+    },
+    "multiValueHeaders": {
+        "accept": [
+            "application/json"
+        ],
+        "Host": [
+            "ffffffffff.execute-api.us-east-1.amazonaws.com"
+        ],
+        "User-Agent": [
+            "curl/7.83.1"
+        ],
+        "X-Amzn-Trace-Id": [
+            "Root=1-11111111-111111111111111111111111"
+        ],
+        "X-Forwarded-For": [
+            "123.123.123.123"
+        ],
+        "X-Forwarded-Port": [
+            "443"
+        ],
+        "X-Forwarded-Proto": [
+            "https"
+        ]
+    },
+    "queryStringParameters": {
+        "MaxResultsPerPage": "100",
+        "PostedAfter": "2022-05-31T22:16:43Z",
+        "PostedBefore": "2022-05-31T23:16:43Z"
+    },
+    "multiValueQueryStringParameters": {
+        "MaxResultsPerPage": [
+            "100"
+        ],
+        "PostedAfter": [
+            "2022-05-31T22:16:43Z"
+        ],
+        "PostedBefore": [
+            "2022-05-31T23:16:43Z"
+        ]
+    },
+    "pathParameters": {
+        "proxy": "foo/bar/baz"
+    },
+    "stageVariables": null,
+    "requestContext": {
+        "resourceId": "ffffff",
+        "resourcePath": "/{proxy+}",
+        "httpMethod": "GET",
+        "extendedRequestId": "AAAAAAAAAAAAAAA=",
+        "requestTime": "02/Jun/2022:08:01:41 +0000",
+        "path": "/test/foo/bar/baz",
+        "accountId": "123456789012",
+        "protocol": "HTTP/1.1",
+        "stage": "test",
+        "domainPrefix": "ffffffffff",
+        "requestTimeEpoch": 1654156901017,
+        "requestId": "0bb0f1d1-5063-45ab-a0dc-4d10279eb9e1",
+        "identity": {
+            "cognitoIdentityPoolId": null,
+            "accountId": null,
+            "cognitoIdentityId": null,
+            "caller": null,
+            "sourceIp": "123.123.123.123",
+            "principalOrgId": null,
+            "accessKey": null,
+            "cognitoAuthenticationType": null,
+            "cognitoAuthenticationProvider": null,
+            "userArn": null,
+            "userAgent": "curl/7.83.1",
+            "user": null
+        },
+        "domainName": "ffffffffff.execute-api.us-east-1.amazonaws.com",
+        "apiId": "ffffffffff"
+    },
+    "body": null,
+    "isBase64Encoded": false
+}
diff --git a/test/golden/WaiRequest.txt b/test/golden/WaiRequest.txt
new file mode 100644
--- /dev/null
+++ b/test/golden/WaiRequest.txt
@@ -0,0 +1,62 @@
+Request
+    { requestMethod = "GET"
+    , httpVersion = HTTP/1.1
+    , rawPathInfo = "/foo/bar/baz"
+    , rawQueryString = "?PostedBefore=2022-05-31T23%3A16%3A43Z&MaxResultsPerPage=100&PostedAfter=2022-05-31T22%3A16%3A43Z"
+    , requestHeaders =
+        [
+            ( "X-Forwarded-Port"
+            , "443"
+            )
+        ,
+            ( "Host"
+            , "ffffffffff.execute-api.us-east-1.amazonaws.com"
+            )
+        ,
+            ( "accept"
+            , "application/json"
+            )
+        ,
+            ( "X-Forwarded-Proto"
+            , "https"
+            )
+        ,
+            ( "User-Agent"
+            , "curl/7.83.1"
+            )
+        ,
+            ( "X-Amzn-Trace-Id"
+            , "Root=1-11111111-111111111111111111111111"
+            )
+        ,
+            ( "X-Forwarded-For"
+            , "123.123.123.123"
+            )
+        ]
+    , isSecure = True
+    , remoteHost = 123.123.123.123:443
+    , pathInfo =
+        [ "foo"
+        , "bar"
+        , "baz"
+        ]
+    , queryString =
+        [
+            ( "PostedBefore"
+            , Just "2022-05-31T23:16:43Z"
+            )
+        ,
+            ( "MaxResultsPerPage"
+            , Just "100"
+            )
+        ,
+            ( "PostedAfter"
+            , Just "2022-05-31T22:16:43Z"
+            )
+        ]
+    , requestBody = <IO ByteString>
+    , vault = <Vault>
+    , requestBodyLength = KnownLength 0
+    , requestHeaderHost = Just "ffffffffff.execute-api.us-east-1.amazonaws.com"
+    , requestHeaderRange = Nothing
+    }
diff --git a/wai-handler-hal.cabal b/wai-handler-hal.cabal
--- a/wai-handler-hal.cabal
+++ b/wai-handler-hal.cabal
@@ -1,6 +1,6 @@
 cabal-version:      2.2
 name:               wai-handler-hal
-version:            0.1.1.0
+version:            0.1.2.0
 synopsis:           Wrap WAI applications to run on AWS Lambda
 description:
   This library provides a function 'Network.Wai.Handler.Hal.run' to
@@ -21,8 +21,13 @@
 copyright:          Copyright (C) 2021 Bellroy Pty Ltd
 category:           AWS, Cloud
 build-type:         Simple
-extra-source-files: CHANGELOG.md
-tested-with:        GHC ==8.6.5 || ==8.8.4 || ==8.10.4
+extra-source-files:
+  CHANGELOG.md
+  README.md
+  test/data/ProxyRequest.json
+  test/golden/WaiRequest.txt
+tested-with:
+  GHC ==8.6.5 || ==8.8.4 || ==8.10.7 || ==9.0.2 || ==9.2.2
 
 common opts
   default-language: Haskell2010
@@ -35,14 +40,14 @@
 
 common deps
   build-depends:
-    , base                  >=4.12     && <4.16
+    , base                  >=4.12     && <4.17
     , base64-bytestring     >=1.0.0.0  && <1.3
     , bytestring            >=0.10.8   && <0.12
     , case-insensitive      ^>=1.2.0.0
-    , hal                   ^>=0.4.7
+    , hal                   >=0.4.7    && <0.4.11 || >=1.0.0 && <1.1
     , http-types            ^>=0.12.3
     , network               >=2.8.0.0  && <3.2
-    , text                  ^>=1.2.3
+    , text                  ^>=1.2.3 || ^>=2.0
     , unordered-containers  ^>=0.2.10.0
     , vault                 ^>=0.3.1.0
     , wai                   ^>=3.2.2
@@ -51,6 +56,22 @@
   import:          opts, deps
   exposed-modules: Network.Wai.Handler.Hal
   hs-source-dirs:  src
+
+test-suite wai-handler-hal-tests
+  import:             deps, opts
+  type:               exitcode-stdio-1.0
+  hs-source-dirs:     test
+  main-is:            Main.hs
+  ghc-options:        -threaded
+  other-modules:      Network.Wai.Handler.HalTest
+  build-tool-depends: tasty-discover:tasty-discover ^>=4.2.2
+  build-depends:
+    , aeson            ^>=1.5.6.0 || ^>=2.0
+    , pretty-simple    ^>=4.1.0.0
+    , tasty            >=1.3     && <1.5
+    , tasty-golden     ^>=2.3
+    , text
+    , wai-handler-hal
 
 source-repository head
   type:     git
