diff --git a/src/main/kotlin/dev/usbharu/httpsignature/common/SignatureBaseBuilder.kt b/src/main/kotlin/dev/usbharu/httpsignature/common/SignatureBaseBuilder.kt index 6111e52..b7a45b2 100644 --- a/src/main/kotlin/dev/usbharu/httpsignature/common/SignatureBaseBuilder.kt +++ b/src/main/kotlin/dev/usbharu/httpsignature/common/SignatureBaseBuilder.kt @@ -11,6 +11,11 @@ class SignatureBaseBuilder { return signatureBase } + fun component(component: Component): SignatureBaseBuilder { + signatureBase.addComponent(component) + return this + } + fun method(method: String): SignatureBaseBuilder { signatureBase.addComponent(DerivedComponent(DerivedComponentConstants.METHOD, "", method)) return this diff --git a/src/main/kotlin/dev/usbharu/httpsignature/utils/AbstractHttpRequestComponentExtractor.kt b/src/main/kotlin/dev/usbharu/httpsignature/utils/AbstractHttpRequestComponentExtractor.kt new file mode 100644 index 0000000..cac3a22 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/utils/AbstractHttpRequestComponentExtractor.kt @@ -0,0 +1,14 @@ +package dev.usbharu.httpsignature.utils + +import dev.usbharu.httpsignature.common.Component +import dev.usbharu.httpsignature.common.HttpRequest + +abstract class AbstractHttpRequestComponentExtractor(protected val fieldProcessor: FieldProcessor) : + HttpRequestComponentExtractor { + override fun extract(name: String, request: HttpRequest): List<Component> { + val extractValue = extractValue(name, request) + return fieldProcessor.process(name, extractValue) + } + + abstract fun extractValue(name: String, request: HttpRequest): List<String> +} \ No newline at end of file diff --git a/src/main/kotlin/dev/usbharu/httpsignature/utils/CoveredComponent.kt b/src/main/kotlin/dev/usbharu/httpsignature/utils/CoveredComponent.kt new file mode 100644 index 0000000..9b74249 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/utils/CoveredComponent.kt @@ -0,0 +1,3 @@ +package dev.usbharu.httpsignature.utils + +data class CoveredComponent(val fieldName: String, val componentParameterType: String) diff --git a/src/main/kotlin/dev/usbharu/httpsignature/utils/FieldProcessor.kt b/src/main/kotlin/dev/usbharu/httpsignature/utils/FieldProcessor.kt new file mode 100644 index 0000000..74eedbf --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/utils/FieldProcessor.kt @@ -0,0 +1,7 @@ +package dev.usbharu.httpsignature.utils + +import dev.usbharu.httpsignature.common.Component + +fun interface FieldProcessor { + fun process(name: String, value: List<String>): List<Component> +} \ No newline at end of file diff --git a/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestComponentExtractor.kt b/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestComponentExtractor.kt new file mode 100644 index 0000000..886eddb --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestComponentExtractor.kt @@ -0,0 +1,8 @@ +package dev.usbharu.httpsignature.utils + +import dev.usbharu.httpsignature.common.Component +import dev.usbharu.httpsignature.common.HttpRequest + +interface HttpRequestComponentExtractor { + fun extract(name: String, request: HttpRequest): List<Component> +} \ No newline at end of file diff --git a/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestSignatureBaseUtils.kt b/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestSignatureBaseUtils.kt new file mode 100644 index 0000000..dd4bbe7 --- /dev/null +++ b/src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestSignatureBaseUtils.kt @@ -0,0 +1,22 @@ +package dev.usbharu.httpsignature.utils + +import dev.usbharu.httpsignature.common.HttpRequest +import dev.usbharu.httpsignature.common.SignatureBaseBuilder + +class HttpRequestSignatureBaseUtils { + + private val fieldProcessorMap = mutableMapOf<String, HttpRequestComponentExtractor>() + + fun from(httpRequest: HttpRequest, coveredComponents: List<CoveredComponent>): SignatureBaseBuilder { + val builder = SignatureBaseBuilder() + coveredComponents + .flatMap { + val extractor = (fieldProcessorMap[it.componentParameterType] + ?: throw IllegalArgumentException("HttpRequestComponentExtractor ${it.componentParameterType} not found.")) + extractor.extract(it.fieldName, httpRequest) + }.forEach { + builder.component(it) + } + return builder + } +} \ No newline at end of file