mirror of
https://github.com/owncloud/android-library.git
synced 2025-06-07 16:06:08 +00:00
Determine if a body is loggable based on its content-type
This commit is contained in:
parent
460f85f2e1
commit
5e86e9f0e4
@ -51,6 +51,14 @@ public class HttpConstants {
|
|||||||
public static final String ACCEPT_ENCODING_IDENTITY = "identity";
|
public static final String ACCEPT_ENCODING_IDENTITY = "identity";
|
||||||
public static final String OC_FILE_REMOTE_ID = "OC-FileId";
|
public static final String OC_FILE_REMOTE_ID = "OC-FileId";
|
||||||
|
|
||||||
|
/***********************************************************************************************************
|
||||||
|
************************************************ CONTENT TYPES ********************************************
|
||||||
|
***********************************************************************************************************/
|
||||||
|
|
||||||
|
public static final String CONTENT_TYPE_XML = "application/xml";
|
||||||
|
public static final String CONTENT_TYPE_JSON = "application/json";
|
||||||
|
public static final String CONTENT_TYPE_WWW_FORM = "application/x-www-form-urlencoded";
|
||||||
|
|
||||||
/***********************************************************************************************************
|
/***********************************************************************************************************
|
||||||
************************************************ STATUS CODES *********************************************
|
************************************************ STATUS CODES *********************************************
|
||||||
***********************************************************************************************************/
|
***********************************************************************************************************/
|
||||||
|
@ -22,6 +22,10 @@
|
|||||||
*/
|
*/
|
||||||
package com.owncloud.android.lib.common.http
|
package com.owncloud.android.lib.common.http
|
||||||
|
|
||||||
|
import com.owncloud.android.lib.common.http.HttpConstants.CONTENT_TYPE_JSON
|
||||||
|
import com.owncloud.android.lib.common.http.HttpConstants.CONTENT_TYPE_WWW_FORM
|
||||||
|
import com.owncloud.android.lib.common.http.HttpConstants.CONTENT_TYPE_XML
|
||||||
|
import okhttp3.MediaType
|
||||||
import timber.log.Timber
|
import timber.log.Timber
|
||||||
import java.util.Locale
|
import java.util.Locale
|
||||||
|
|
||||||
@ -45,3 +49,17 @@ enum class NetworkNode {
|
|||||||
|
|
||||||
override fun toString(): String = super.toString().toLowerCase(Locale.ROOT)
|
override fun toString(): String = super.toString().toLowerCase(Locale.ROOT)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Check whether a media type is loggable.
|
||||||
|
*
|
||||||
|
* @return true if its type is text, xml, json, or x-www-form-urlencoded.
|
||||||
|
*/
|
||||||
|
fun MediaType?.isLoggable(): Boolean =
|
||||||
|
this?.let { mediaType ->
|
||||||
|
val mediaTypeString = mediaType.toString()
|
||||||
|
(mediaType.type == "text" ||
|
||||||
|
mediaTypeString.contains(CONTENT_TYPE_XML) ||
|
||||||
|
mediaTypeString.contains(CONTENT_TYPE_JSON) ||
|
||||||
|
mediaTypeString.contains(CONTENT_TYPE_WWW_FORM))
|
||||||
|
} ?: false
|
||||||
|
@ -99,7 +99,7 @@ class LogInterceptor : Interceptor {
|
|||||||
logHttp(REQUEST, BODY, requestId, "Type: ${requestBody.contentType()}")
|
logHttp(REQUEST, BODY, requestId, "Type: ${requestBody.contentType()}")
|
||||||
logHttp(REQUEST, BODY, requestId, "--> Body start for request")
|
logHttp(REQUEST, BODY, requestId, "--> Body start for request")
|
||||||
|
|
||||||
if (buffer.isProbablyUtf8()) {
|
if (contentType.isLoggable()) {
|
||||||
if (requestBody.contentLength() < LIMIT_BODY_LOG) {
|
if (requestBody.contentLength() < LIMIT_BODY_LOG) {
|
||||||
logHttp(REQUEST, BODY, requestId, buffer.readString(charset))
|
logHttp(REQUEST, BODY, requestId, buffer.readString(charset))
|
||||||
} else {
|
} else {
|
||||||
@ -137,14 +137,7 @@ class LogInterceptor : Interceptor {
|
|||||||
source.request(LIMIT_BODY_LOG)
|
source.request(LIMIT_BODY_LOG)
|
||||||
val buffer = source.buffer
|
val buffer = source.buffer
|
||||||
|
|
||||||
if (!buffer.isProbablyUtf8()) {
|
if (contentType.isLoggable()) {
|
||||||
logHttp(
|
|
||||||
RESPONSE,
|
|
||||||
BODY,
|
|
||||||
requestId,
|
|
||||||
"<-- Body end for response -- Binary -- Omitted: ${responseBody.contentLength()} bytes"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (responseBody.contentLength() < LIMIT_BODY_LOG) {
|
if (responseBody.contentLength() < LIMIT_BODY_LOG) {
|
||||||
logHttp(RESPONSE, BODY, requestId, buffer.clone().readString(charset))
|
logHttp(RESPONSE, BODY, requestId, buffer.clone().readString(charset))
|
||||||
@ -155,8 +148,21 @@ class LogInterceptor : Interceptor {
|
|||||||
RESPONSE,
|
RESPONSE,
|
||||||
BODY,
|
BODY,
|
||||||
requestId,
|
requestId,
|
||||||
"<-- Body end for response -- Omitted: ${max(0, responseBody.contentLength() - LIMIT_BODY_LOG)} bytes"
|
"<-- Body end for response -- Omitted: ${
|
||||||
|
max(
|
||||||
|
0,
|
||||||
|
responseBody.contentLength() - LIMIT_BODY_LOG
|
||||||
)
|
)
|
||||||
|
} bytes"
|
||||||
|
)
|
||||||
|
} else {
|
||||||
|
logHttp(
|
||||||
|
RESPONSE,
|
||||||
|
BODY,
|
||||||
|
requestId,
|
||||||
|
"<-- Body end for response -- Binary -- Omitted: ${responseBody.contentLength()} bytes"
|
||||||
|
)
|
||||||
|
}
|
||||||
} ?: logHttp(RESPONSE, BODY, requestId, "Empty body")
|
} ?: logHttp(RESPONSE, BODY, requestId, "Empty body")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,44 +0,0 @@
|
|||||||
/*
|
|
||||||
* Copyright (C) 2015 Square, Inc.
|
|
||||||
*
|
|
||||||
* 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.
|
|
||||||
*/
|
|
||||||
package com.owncloud.android.lib.common.http
|
|
||||||
|
|
||||||
import java.io.EOFException
|
|
||||||
import okio.Buffer
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns true if the body in question probably contains human readable text. Uses a small
|
|
||||||
* sample of code points to detect unicode control characters commonly used in binary file
|
|
||||||
* signatures.
|
|
||||||
*/
|
|
||||||
internal fun Buffer.isProbablyUtf8(): Boolean {
|
|
||||||
try {
|
|
||||||
val prefix = Buffer()
|
|
||||||
val byteCount = size.coerceAtMost(64)
|
|
||||||
copyTo(prefix, 0, byteCount)
|
|
||||||
for (i in 0 until 16) {
|
|
||||||
if (prefix.exhausted()) {
|
|
||||||
break
|
|
||||||
}
|
|
||||||
val codePoint = prefix.readUtf8CodePoint()
|
|
||||||
if (Character.isISOControl(codePoint) && !Character.isWhitespace(codePoint)) {
|
|
||||||
return false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true
|
|
||||||
} catch (_: EOFException) {
|
|
||||||
return false // Truncated UTF-8 sequence.
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
x
Reference in New Issue
Block a user