From 2b71e2f10b7fcac12a1c678360a528bec5a646f4 Mon Sep 17 00:00:00 2001
From: usbharu <i@usbharu.dev>
Date: Wed, 25 Sep 2024 14:10:16 +0900
Subject: [PATCH] =?UTF-8?q?feat:=20HttpRequest=E3=81=8B=E3=82=89Signature?=
 =?UTF-8?q?=20Base=E3=82=92=E7=94=9F=E6=88=90=E3=81=99=E3=82=8B=E5=87=A6?=
 =?UTF-8?q?=E7=90=86=E3=82=92=E7=B0=A1=E5=8D=98=E3=81=AB=E3=81=99=E3=82=8B?=
 =?UTF-8?q?=E3=82=84=E3=81=A4=E3=82=92=E8=BF=BD=E5=8A=A0?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

---
 .../common/SignatureBaseBuilder.kt            |  5 +++++
 .../AbstractHttpRequestComponentExtractor.kt  | 14 ++++++++++++
 .../httpsignature/utils/CoveredComponent.kt   |  3 +++
 .../httpsignature/utils/FieldProcessor.kt     |  7 ++++++
 .../utils/HttpRequestComponentExtractor.kt    |  8 +++++++
 .../utils/HttpRequestSignatureBaseUtils.kt    | 22 +++++++++++++++++++
 6 files changed, 59 insertions(+)
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/utils/AbstractHttpRequestComponentExtractor.kt
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/utils/CoveredComponent.kt
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/utils/FieldProcessor.kt
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestComponentExtractor.kt
 create mode 100644 src/main/kotlin/dev/usbharu/httpsignature/utils/HttpRequestSignatureBaseUtils.kt

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