MyNixOS website logo
Description

Redirect to a normalized path.

Interprets dots and slashes and issues a redirect to a normalized path if the request target is not already in normal form.

Scotty path normalizer

This library provides a Scotty action that normalizes the HTTP request target as if it were a Unix file path. When the path normalization action detects a path that can be simplified in one of the following ways, it issues a redirect to a more canonical path.

  1. Remove trailing slashes: https://typeclasses.com/contravariance/ becomes https://typeclasses.com/contravariance
  2. Remove double slashes: https://typeclasses.com//web-servers////lesson-4 becomes https://typeclasses.com/web-servers/lesson-4
  3. Remove . segments, because . represents "the current directory": https://typeclasses.com/ghc/./scoped-type-variables becomes https://typeclasses.com/ghc/scoped-type-variables
  4. Remove segments of the form xyz/.., because .. represents "the parent directory": https://typeclasses.com/python/../javascript/monoidal-folds becomes https://typeclasses.com/javascript/monoidal-folds

The typical way to apply this to your Scotty server is to put addPathNormalizer at the top of your ScottyM app definition.

import qualified Web.Scotty as Scotty
import Web.Scotty.PathNormalizer (addPathNormalizer)

main :: IO ()
main =
    Scotty.scotty 3000 $
      do
        addPathNormalizer

        Scotty.get (Scotty.capture "/:word") $
          do
            beam <- Scotty.param (Data.Text.Lazy.pack "word")
            Scotty.html $ fold
                [ Data.Text.Lazy.pack "<h1>Scotty, "
                , beam
                , Data.Text.Lazy.pack " me up!</h1>"
                ]
Metadata

Version

0.1.0.0

License

Platforms (77)

    Darwin
    FreeBSD
    Genode
    GHCJS
    Linux
    MMIXware
    NetBSD
    none
    OpenBSD
    Redox
    Solaris
    WASI
    Windows
Show all
  • aarch64-darwin
  • aarch64-freebsd
  • aarch64-genode
  • aarch64-linux
  • aarch64-netbsd
  • aarch64-none
  • aarch64-windows
  • aarch64_be-none
  • arm-none
  • armv5tel-linux
  • armv6l-linux
  • armv6l-netbsd
  • armv6l-none
  • armv7a-darwin
  • armv7a-linux
  • armv7a-netbsd
  • armv7l-linux
  • armv7l-netbsd
  • avr-none
  • i686-cygwin
  • i686-darwin
  • i686-freebsd
  • i686-genode
  • i686-linux
  • i686-netbsd
  • i686-none
  • i686-openbsd
  • i686-windows
  • javascript-ghcjs
  • loongarch64-linux
  • m68k-linux
  • m68k-netbsd
  • m68k-none
  • microblaze-linux
  • microblaze-none
  • microblazeel-linux
  • microblazeel-none
  • mips-linux
  • mips-none
  • mips64-linux
  • mips64-none
  • mips64el-linux
  • mipsel-linux
  • mipsel-netbsd
  • mmix-mmixware
  • msp430-none
  • or1k-none
  • powerpc-netbsd
  • powerpc-none
  • powerpc64-linux
  • powerpc64le-linux
  • powerpcle-none
  • riscv32-linux
  • riscv32-netbsd
  • riscv32-none
  • riscv64-linux
  • riscv64-netbsd
  • riscv64-none
  • rx-none
  • s390-linux
  • s390-none
  • s390x-linux
  • s390x-none
  • vc4-none
  • wasm32-wasi
  • wasm64-wasi
  • x86_64-cygwin
  • x86_64-darwin
  • x86_64-freebsd
  • x86_64-genode
  • x86_64-linux
  • x86_64-netbsd
  • x86_64-none
  • x86_64-openbsd
  • x86_64-redox
  • x86_64-solaris
  • x86_64-windows