-
Notifications
You must be signed in to change notification settings - Fork 141
/
HttpHeadersRule.kt
50 lines (38 loc) · 1.82 KB
/
HttpHeadersRule.kt
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
package de.zalando.zally.rule
import com.typesafe.config.Config
import de.zalando.zally.rule.api.Violation
import io.swagger.v3.oas.models.parameters.Parameter
import io.swagger.v3.oas.models.responses.ApiResponse
abstract class HttpHeadersRule(rulesConfig: Config) {
private val headersWhitelist = rulesConfig.getStringList(HttpHeadersRule::class.simpleName + ".whitelist").toSet()
abstract fun createViolation(context: Context, header: HeaderElement): Violation
abstract fun isViolation(header: HeaderElement): Boolean
data class HeaderElement(
val name: String,
val element: Any
)
open fun validate(context: Context): List<Violation> {
fun Collection<Parameter>?.extractHeaders() = orEmpty()
.filter { it.`in` == "header" }
.map { HeaderElement(it.name, it) }
.toSet()
fun Collection<ApiResponse>?.extractHeaders() = orEmpty()
.flatMap { it.headers.orEmpty().entries }
.map { HeaderElement(it.key, it.value) }
.toSet()
val fromParams = context.api.components.parameters.orEmpty().values.extractHeaders()
val fromPaths = context.api.paths.orEmpty().flatMap { (_, path) ->
val fromPathParameters = path.parameters.extractHeaders()
val fromOperations = path.readOperations().flatMap { operation ->
val fromOpParams = operation.parameters.extractHeaders()
val fromOpResponses = operation.responses.orEmpty().values.extractHeaders()
fromOpParams + fromOpResponses
}
fromPathParameters + fromOperations
}
val allHeaders = fromParams + fromPaths
return allHeaders
.filter { it.name !in headersWhitelist && isViolation(it) }
.map { createViolation(context, it) }
}
}