/* Ċ Ġ* ĠCopyright Ġ 2 0 1 4 - 2 0 1 9 ĠJetBrains Ġs . r . o Ġand Ġcontributors . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense . Ċ Ġ*/ Ċ Ċ package Ġio . ktor . tests . server . plugins Ċ Ċ import Ġio . ktor . client . request .* Ċ import Ġio . ktor . http .* Ċ import Ġio . ktor . http . content .* Ċ import Ġio . ktor . server . application .* Ċ import Ġio . ktor . server . plugins . for warded headers .* Ċ import Ġio . ktor . server . plugins . h sts .* Ċ import Ġio . ktor . server . response .* Ċ import Ġio . ktor . server . routing .* Ċ import Ġio . ktor . server . testing .* Ċ import Ġkotlin . test .* Ċ Ċ class ĠH ST ST est Ġ{ ĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Http () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertNull ( client . get ("/ "). headers [ HttpHeaders . Strict Transport Security ]) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Https () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Host , Ġ" some ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max - age = 1 0 ; Ġinclude Sub Domains ; Ġpreload ; Ġsome =\" va = l ue \"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . headers [ HttpHeaders . Strict Transport Security ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max - age = 1 0 ; Ġinclude Sub Domains ; Ġpreload ; Ġsome =\" va = l ue \"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . headers [ HttpHeaders . Strict Transport Security ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Sub route Install () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( X Forwarded Headers ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġroute ("/ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinstall ( H STS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmax Age InSeconds Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Sub Domains Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreload Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives [" some "] Ġ= Ġ" va = l ue " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaching Ġ= ĠC aching Options ( Cache Control . No Cache ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/ 2 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond Text (" test ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcaching Ġ= ĠC aching Options ( Cache Control . No Cache ( null )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/ 1 ") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Host , Ġ" some ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max - age = 1 0 ; Ġinclude Sub Domains ; Ġpreload ; Ġsome =\" va = l ue \"", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . headers [ HttpHeaders . Strict Transport Security ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/ 2 "). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it . headers [ HttpHeaders . Strict Transport Security ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Custom Port () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Host , Ġ" some : 8 4 4 3 ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertNull ( it . headers [ HttpHeaders . Strict Transport Security ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Https Custom Directive No Value () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives [" some "] Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max - age = 1 0 ; Ġinclude Sub Domains ; Ġpreload ; Ġsome ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . headers [ HttpHeaders . Strict Transport Security ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Https No Custom Directives () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives . clear () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" max - age = 1 0 ; Ġinclude Sub Domains ; Ġpreload ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . headers [ HttpHeaders . Strict Transport Security ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġtest Https Max Age Only () Ġ= Ġtest Application Ġ{ ĊĠĠĠĠĠĠĠ Ġapplication Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtest App Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives . clear () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Sub Domains Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpreload Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġclient . get ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġheader ( HttpHeaders . X Forwarded Proto , Ġ" https ") ĊĠĠĠĠĠĠĠ Ġ}. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠassertEquals (" max - age = 1 0 ", Ġit . headers [ HttpHeaders . Strict Transport Security ]) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠApplication . test App ( block : ĠH STS Config . () Ġ-> ĠUnit Ġ= Ġ{}) Ġ{ ĊĠĠĠĠĠĠĠ Ġinstall ( X Forwarded Headers ) ĊĠĠĠĠĠĠĠ Ġinstall ( H STS ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmax Age InSeconds Ġ= Ġ 1 0 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Sub Domains Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpreload Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcustom Directives [" some "] Ġ= Ġ" va = l ue " ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġblock () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġrouting Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget ("/") Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcall . respond (" ok ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ