Skip to content

Commit 9b4ec9c

Browse files
author
Ryan Trinkle
committed
Canonicalize destination URLs.
1 parent 4692ced commit 9b4ec9c

2 files changed

Lines changed: 19 additions & 5 deletions

File tree

memoise.cabal

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
Name: memoise
2-
Version: 0.9
2+
Version: 0.10
33
License: BSD3
44
Author: Ryan Trinkle
55
Maintainer: ryan.trinkle@gmail.com
@@ -21,6 +21,7 @@ Executable memoise
2121
, heist >= 0.12 && < 0.13
2222
, lens >= 3.9 && < 3.10
2323
, text >= 0.11 && < 0.12
24+
, network >= 2.4 && < 2.5
2425
, snaplet-postgresql-simple >= 0.4 && < 0.5
2526
GHC-options: -threaded -O2
2627
Extensions: OverloadedStrings

src/Main.hs

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import Data.Text.Encoding
1010
import Data.Monoid
1111
import Heist
1212
import Heist.Interpreted
13+
import Network.URI hiding (query)
1314

1415
data Memoise
1516
= Memoise { _heist :: Snaplet (Heist Memoise)
@@ -24,8 +25,17 @@ instance HasHeist Memoise where
2425
instance HasPostgres (Handler Memoise Memoise) where
2526
getPostgresState = with db get
2627

27-
getUrlId :: Text -> Handler Memoise Memoise Integer
28-
getUrlId url = do
28+
canonicalizeUrl :: Text -> Maybe URI
29+
canonicalizeUrl rawUrl =
30+
let url = unpack rawUrl
31+
url' = if isAbsoluteURI url
32+
then url
33+
else "http://" <> url
34+
in parseURI $ normalizeCase $ normalizePathSegments $ normalizeEscape url'
35+
36+
getUrlId :: URI -> Handler Memoise Memoise Integer
37+
getUrlId uri = do
38+
let url = showT uri
2939
existingResults <- query "SELECT id FROM urls WHERE url = ?" (Only url)
3040
case existingResults of
3141
(Only urlId) : _ -> return urlId
@@ -38,8 +48,11 @@ indexHandler = do
3848
mUrl <- getParam "url"
3949
case mUrl of
4050
Just url -> do
41-
urlId <- getUrlId $ decodeUtf8 url
42-
mainTextboxContents .= Just ("http://memoi.se/" <> showT urlId)
51+
case canonicalizeUrl (decodeUtf8 url) of
52+
Just uri -> do
53+
urlId <- getUrlId uri
54+
mainTextboxContents .= Just ("http://memoi.se/" <> showT urlId)
55+
Nothing -> mainTextboxContents .= Just "Invalid URL"
4356
render "index"
4457
Nothing -> render "index"
4558

0 commit comments

Comments
 (0)