1
0
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:
Abel García de Prada 2020-10-28 09:04:17 +01:00
parent 460f85f2e1
commit 5e86e9f0e4
4 changed files with 46 additions and 58 deletions

View File

@ -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 *********************************************
***********************************************************************************************************/ ***********************************************************************************************************/

View File

@ -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

View File

@ -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")
} }

View File

@ -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.
}
}