Skip to content

Commit a4871b4

Browse files
committed
Fixes #106 - validate that PUT requests contain valid JSON
1 parent 72357e6 commit a4871b4

File tree

2 files changed

+22
-20
lines changed

2 files changed

+22
-20
lines changed

src/main/kotlin/jsonblob/api/http/ApiController.kt

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -169,17 +169,21 @@ class ApiController(
169169
}
170170

171171
private fun update(blobId: String, json: String): JsonBlob? {
172-
val resolver = idResolvers.firstOrNull { it.handles(blobId) }
173-
return if (resolver != null) {
174-
val created = resolver.resolveTimestamp(blobId)
175-
val jsonBlob = JsonBlob(
176-
id = blobId,
177-
json = json,
178-
created = created
179-
)
180-
jsonBlobStore.write(jsonBlob)
172+
if (JsonCleaner.validJson(json)) {
173+
val resolver = idResolvers.firstOrNull { it.handles(blobId) }
174+
return if (resolver != null) {
175+
val created = resolver.resolveTimestamp(blobId)
176+
val jsonBlob = JsonBlob(
177+
id = blobId,
178+
json = json,
179+
created = created
180+
)
181+
jsonBlobStore.write(jsonBlob)
182+
} else {
183+
null
184+
}
181185
} else {
182-
null
186+
throw HttpStatusException(HttpStatus.BAD_REQUEST, "Invalid JSON")
183187
}
184188
}
185189

src/test/kotlin/jsonblob/api/http/ApiTest.kt

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,19 @@ import io.micronaut.http.HttpResponse
88
import io.micronaut.http.MediaType
99
import io.micronaut.http.client.HttpClient
1010
import io.micronaut.http.client.annotation.Client
11+
import io.micronaut.http.client.exceptions.HttpClientResponseException
1112
import io.micronaut.test.extensions.junit5.annotation.MicronautTest
1213
import io.micronaut.test.support.TestPropertyProvider
13-
import jsonblob.config.S3ClientBuilderListener
1414
import jsonblob.core.compression.compressor.GZIPBlobCompressor
1515
import jsonblob.core.id.Type1UUIDJsonBlobHandler
1616
import jsonblob.core.store.JsonBlobStore
1717
import mu.KotlinLogging
1818
import org.assertj.core.api.Assertions.assertThat
19-
import org.junit.jupiter.api.AfterAll
20-
import org.junit.jupiter.api.BeforeAll
19+
import org.assertj.core.api.Assertions.assertThatThrownBy
2120
import org.junit.jupiter.api.Test
2221
import org.junit.jupiter.api.TestInstance
2322
import org.skyscreamer.jsonassert.JSONAssert.assertEquals
24-
import org.testcontainers.containers.localstack.LocalStackContainer
2523
import org.testcontainers.shaded.com.google.common.io.Files
26-
import org.testcontainers.utility.DockerImageName
27-
import software.amazon.awssdk.services.s3.S3Client
2824
import java.util.UUID
2925
import javax.inject.Inject
3026

@@ -140,10 +136,12 @@ class ApiTest: TestPropertyProvider {
140136

141137
@Test
142138
fun `blob is not created on bad API PUT`() {
143-
val resp = client
144-
.toBlocking()
145-
.exchange(PUT("/api/jsonBlob/${UUID.randomUUID()}", json).contentType(MediaType.APPLICATION_JSON_TYPE), String::class.java)
146-
assertThat(resp.code()).isEqualTo(400)
139+
assertThatThrownBy {
140+
client
141+
.toBlocking()
142+
.exchange(PUT("/api/jsonBlob/${UUID.randomUUID()}", json).contentType(MediaType.APPLICATION_JSON_TYPE), String::class.java)
143+
144+
}.isInstanceOf(HttpClientResponseException::class.java)
147145
}
148146

149147
@Test

0 commit comments

Comments
 (0)