summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrank Kimmlingen <frank.kimmlingen@telekom.de>2022-08-29 13:28:01 +0200
committerJozsef Csongvai <jozsef.csongvai@bell.ca>2022-09-01 14:20:03 +0000
commite679d838562ef6762852e8073844ad578d700a84 (patch)
tree402bf717892bccddf1be7759446aa5464f69ee4d
parent77891f46278488702aeed2fe970861a2f1b9a1a7 (diff)
Http 204 response results with exception in rest resolution
Issue-ID: CCSDK-3746 Signed-off-by: Frank Kimmlingen <frank.kimmlingen@telekom.de> Change-Id: I740c970de631e58902e6f92b9069aee8d3ae075b
-rw-r--r--ms/blueprintsprocessor/modules/commons/rest-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/BaseBlueprintWebClientService.kt21
-rw-r--r--ms/blueprintsprocessor/modules/commons/rest-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/RestClientServiceTest.kt74
2 files changed, 92 insertions, 3 deletions
diff --git a/ms/blueprintsprocessor/modules/commons/rest-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/BaseBlueprintWebClientService.kt b/ms/blueprintsprocessor/modules/commons/rest-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/BaseBlueprintWebClientService.kt
index bc1dc4e09..ccc2f92a1 100644
--- a/ms/blueprintsprocessor/modules/commons/rest-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/BaseBlueprintWebClientService.kt
+++ b/ms/blueprintsprocessor/modules/commons/rest-lib/src/main/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/BaseBlueprintWebClientService.kt
@@ -23,6 +23,9 @@ import com.fasterxml.jackson.databind.JsonNode
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.withContext
import org.apache.commons.io.IOUtils
+import org.apache.http.HttpEntity
+import org.apache.http.HttpResponse
+import org.apache.http.HttpStatus
import org.apache.http.client.ClientProtocolException
import org.apache.http.client.config.RequestConfig
import org.apache.http.client.methods.HttpDelete
@@ -164,11 +167,25 @@ abstract class BaseBlueprintWebClientService<out E : RestClientProperties> : Blu
BlueprintWebClientService.WebClientResponse<T> {
val httpResponse = httpClient().execute(httpUriRequest)
val statusCode = httpResponse.statusLine.statusCode
- httpResponse.entity.content.use {
- val body = getResponse(it, responseType)
+ val entity: HttpEntity? = httpResponse.entity
+ if (canResponseHaveBody(httpResponse)) {
+ entity!!.content.use {
+ val body = getResponse(it, responseType)
+ return BlueprintWebClientService.WebClientResponse(statusCode, body)
+ }
+ } else {
+ val constructor = responseType.getConstructor()
+ val body = constructor.newInstance()
return BlueprintWebClientService.WebClientResponse(statusCode, body)
}
}
+ fun canResponseHaveBody(response: HttpResponse): Boolean {
+ val status = response.statusLine.statusCode
+ return response.entity !== null &&
+ status != HttpStatus.SC_NO_CONTENT &&
+ status != HttpStatus.SC_NOT_MODIFIED &&
+ status != HttpStatus.SC_RESET_CONTENT
+ }
open suspend fun getNB(path: String): BlueprintWebClientService.WebClientResponse<String> {
return getNB(path, null, String::class.java)
diff --git a/ms/blueprintsprocessor/modules/commons/rest-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/RestClientServiceTest.kt b/ms/blueprintsprocessor/modules/commons/rest-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/RestClientServiceTest.kt
index 030996685..e865a0047 100644
--- a/ms/blueprintsprocessor/modules/commons/rest-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/RestClientServiceTest.kt
+++ b/ms/blueprintsprocessor/modules/commons/rest-lib/src/test/kotlin/org/onap/ccsdk/cds/blueprintsprocessor/rest/service/RestClientServiceTest.kt
@@ -39,6 +39,8 @@ import org.springframework.boot.web.reactive.server.ReactiveWebServerFactory
import org.springframework.boot.web.server.WebServer
import org.springframework.context.annotation.Bean
import org.springframework.http.HttpMethod
+import org.springframework.http.HttpStatus
+import org.springframework.http.ResponseEntity
import org.springframework.http.server.reactive.HttpHandler
import org.springframework.security.config.web.server.ServerHttpSecurity
import org.springframework.security.core.userdetails.MapReactiveUserDetailsService
@@ -184,7 +186,7 @@ class RestClientServiceTest {
assertEquals(res, "Basic request arrived successfully")
}
- // @Test
+ @Test
fun testSampleAaiReq() {
val restClientService = bluePrintRestLibPropertyService
.blueprintWebClientService("test")
@@ -282,6 +284,51 @@ class RestClientServiceTest {
assertEquals(res5, "The patch request is success")
assertEquals(res6, "The message is successfully deleted")
}
+ @Test
+ fun testDeleteWith204StatusAndResponseAsString() {
+ val restClientService = bluePrintRestLibPropertyService
+ .blueprintWebClientService("sample")
+ val headers = mutableMapOf<String, String>()
+ headers["X-Transaction-Id"] = "1234"
+ val response = restClientService.exchangeResource(
+ HttpMethod.DELETE.name,
+ "/sample/name", ""
+ )
+ assertEquals(response.status, 204)
+ assertEquals(response.body, "")
+ }
+
+ @Test
+ fun testDeleteWith204StatusAndResponseAsCustomerWithDefaultConstructor() {
+ val restClientService = bluePrintRestLibPropertyService
+ .blueprintWebClientService("sample")
+ val headers = mutableMapOf<String, String>()
+ headers["X-Transaction-Id"] = "1234"
+ runBlocking {
+ val response = restClientService.exchangeNB(
+ HttpMethod.DELETE.name,
+ "/sample/customersWithDefaultConstructor", "", headers, CustomerWithDefaultConstructor::class.java
+ )
+ assertEquals(response.status, 204)
+ assertEquals(response.body, CustomerWithDefaultConstructor())
+ }
+ }
+
+ // @Test
+ fun testDeleteWith204StatusAndResponseAsCustomerWithoutDefaultConstructor() {
+ val restClientService = bluePrintRestLibPropertyService
+ .blueprintWebClientService("sample")
+ val headers = mutableMapOf<String, String>()
+ headers["X-Transaction-Id"] = "1234"
+ runBlocking {
+ val response = restClientService.exchangeNB(
+ HttpMethod.DELETE.name,
+ "/sample/customersWithoutDefaultConstructor", "", headers, CustomerWithoutDefaultConstructor::class.java
+ )
+ assertEquals(response.status, 204)
+ assertEquals(response.body, CustomerWithoutDefaultConstructor(""))
+ }
+ }
}
/**
@@ -293,6 +340,10 @@ open class SampleController {
@GetMapping("/name")
fun getName(): String = "Sample Controller"
+ @DeleteMapping("/name")
+ fun deleteNameWith204StatusAndEmptyBody(): ResponseEntity<Unit> {
+ return ResponseEntity(HttpStatus.NO_CONTENT)
+ }
@GetMapping("/query")
fun getQuery(@RequestParam("id") id: String): String =
@@ -377,6 +428,17 @@ open class SampleController {
}
return "The message is successfully deleted"
}
+ @DeleteMapping("/customersWithDefaultConstructor")
+ fun deleteCustomersWith204StatusAndResponseAsCustomerWithDefaultConstructor():
+ ResponseEntity<CustomerWithDefaultConstructor> {
+ return ResponseEntity(CustomerWithDefaultConstructor(), HttpStatus.NO_CONTENT)
+ }
+
+ @DeleteMapping("/customersWithoutDefaultConstructor")
+ fun deleteCustomersWith204StatusAndResponseAsCustomerWithoutDefaultConstructor():
+ ResponseEntity<CustomerWithoutDefaultConstructor> {
+ return ResponseEntity(CustomerWithoutDefaultConstructor(""), HttpStatus.NO_CONTENT)
+ }
}
/**
@@ -414,3 +476,13 @@ data class Customer(
val type: String,
val resource: String
)
+
+data class CustomerWithoutDefaultConstructor(
+ val name: String
+)
+
+data class CustomerWithDefaultConstructor(
+ val name: String
+) {
+ constructor() : this("")
+}