aboutsummaryrefslogtreecommitdiffstats
path: root/vid-app-common/src/main/java/org/onap/vid/client/UnirestPatch.kt
blob: 5730c11f16fe643568d1e6ec92a0151b961cb7ce (plain)
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
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*-
 * ============LICENSE_START=======================================================
 * VID
 * ================================================================================
 * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved.
 * ================================================================================
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * ============LICENSE_END=========================================================
 */

package org.onap.vid.client

import io.joshworks.restclient.http.Headers
import io.joshworks.restclient.http.HttpResponse
import org.apache.commons.io.IOUtils
import org.apache.http.HttpVersion
import org.apache.http.message.BasicHttpResponse
import java.io.InputStream
import java.nio.charset.StandardCharsets

/// Patch NPE in joshworks's Unirest HttpResponse::getBody when getRawBody is null
fun <T> patched(httpResponse: HttpResponse<T>) =
        if (willGetBodyTriggerNPE(httpResponse)) HttpResponsePatch(httpResponse) else httpResponse

private fun <T> willGetBodyTriggerNPE(httpResponse: HttpResponse<T>) =
        httpResponse.rawBody == null || httpResponse.rawBody.available() == 0

private val dummyHttpResponse = BasicHttpResponse(HttpVersion.HTTP_1_1, 200, "ok")

fun extractRawAsString(response: HttpResponse<*>?): String {
    try {
        if (response == null || response.rawBody==null) return ""
        response.rawBody.reset()
        return IOUtils.toString(response.rawBody, StandardCharsets.UTF_8.name())
    } catch (e: Exception) {
        //Nothing to do here
    }

    return ""
}
/**
 * This class inherits HttpResponse to have compatible interface,
 * but implementation is done through delegation to another
 * instance.
 * For that, it's enough to pass dummy values to HttpResponse's
 * constructor, as parent HttpResponse methods won't be used,
 * only overridden.
 */
private class HttpResponsePatch<T>(private val delegatee: HttpResponse<T>) : HttpResponse<T>(
        dummyHttpResponse, null, null
) {
    override fun getBody(): T? = if (willGetBodyTriggerNPE(delegatee)) null else delegatee.body
    override fun getHeaders(): Headers? = delegatee.headers
    override fun getStatus() = delegatee.status
    override fun isSuccessful() = delegatee.isSuccessful
    override fun getStatusText(): String? = delegatee.statusText
    override fun getRawBody(): InputStream? = delegatee.rawBody
}