Skip to content

Commit 732edf8

Browse files
authored
Merge pull request #27 from EvanHahn/fallback-referrer-policies
Add support for fallback referrer policies
2 parents c2bbfe0 + 6859a5c commit 732edf8

File tree

3 files changed

+29
-5
lines changed

3 files changed

+29
-5
lines changed

README.md

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -456,3 +456,15 @@ let securityHeadersFactory = SecurityHeadersFactory().with(referrerPolicy: refer
456456
```http
457457
referrer-policy: no-referrer
458458
```
459+
460+
You can also [set a fallback policy](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Referrer-Policy#specify_a_fallback_policy).
461+
462+
```swift
463+
let referrerPolicyConfig = ReferrerPolicyConfiguration([.noReferrer, .strictOriginWhenCrossOrigin])
464+
465+
let securityHeadersFactory = SecurityHeadersFactory().with(referrerPolicy: referrerPolicyConfig)
466+
```
467+
468+
```http
469+
referrer-policy: no-referrer, strict-origin-when-cross-origin
470+
```

Sources/VaporSecurityHeaders/Configurations/ReferrerPolicyConfiguration.swift

Lines changed: 9 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ import Vapor
22

33
public struct ReferrerPolicyConfiguration: SecurityHeaderConfiguration {
44

5-
public enum Options: String {
5+
public enum Directive: String {
66
case empty = ""
77
case noReferrer = "no-referrer"
88
case noReferrerWhenDowngrade = "no-referrer-when-downgrade"
@@ -14,13 +14,17 @@ public struct ReferrerPolicyConfiguration: SecurityHeaderConfiguration {
1414
case unsafeUrl = "unsafe-url"
1515
}
1616

17-
private let option: Options
17+
private let directives: [Directive]
1818

19-
public init(_ option: Options) {
20-
self.option = option
19+
public init(_ directive: Directive) {
20+
self.directives = [directive]
21+
}
22+
23+
public init(_ directives: [Directive]) {
24+
self.directives = directives
2125
}
2226

2327
func setHeader(on response: Response, from request: Request) {
24-
response.headers.replaceOrAdd(name: .referrerPolicy, value: option.rawValue)
28+
response.headers.replaceOrAdd(name: .referrerPolicy, value: directives.map({ $0.rawValue }).joined(separator: ", "))
2529
}
2630
}

Tests/VaporSecurityHeadersTests/HeaderTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -433,6 +433,14 @@ class HeaderTests: XCTestCase {
433433
XCTAssertEqual(expected, response.headers[.referrerPolicy].first)
434434
}
435435

436+
func testHeadersWithReferrerPolicyFallbacks() throws {
437+
let expected = "no-referrer, strict-origin-when-cross-origin"
438+
let referrerConfig = ReferrerPolicyConfiguration([.noReferrer, .strictOriginWhenCrossOrigin])
439+
let factory = SecurityHeadersFactory().with(referrerPolicy: referrerConfig)
440+
let response = try makeTestResponse(for: request, securityHeadersToAdd: factory)
441+
XCTAssertEqual(expected, response.headers[.referrerPolicy].first)
442+
}
443+
436444
func testApiPolicyWithAddedReferrerPolicy() throws {
437445
let expected = "strict-origin"
438446
let referrerConfig = ReferrerPolicyConfiguration(.strictOrigin)

0 commit comments

Comments
 (0)