Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Support for manual transaction logging #853

Open
wants to merge 9 commits into
base: main
Choose a base branch
from
1 change: 1 addition & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ This file follows [Keepachangelog](https://keepachangelog.com/) format.
Please add your entries according to this format.

## Unreleased
* Added ability to log manual transactions. In order to do this call ChuckerCollector#saveTransaction(transaction: ManualHttpTransaction) method and pass ManualHttpTransaction entity to it.

### Added
* Decoding of request and response bodies can now be customized. In order to do this a `BodyDecoder` interface needs to be implemented and installed in the `ChuckerInterceptor` via `ChuckerInterceptor.addBinaryDecoder(decoder)` method. Decoded bodies are then displayed in the Chucker UI.
Expand Down
93 changes: 93 additions & 0 deletions library-no-op/api/library-no-op.api
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public final class com/chuckerteam/chucker/api/ChuckerCollector {
public fun <init> (Landroid/content/Context;ZLcom/chuckerteam/chucker/api/RetentionManager$Period;)V
public synthetic fun <init> (Landroid/content/Context;ZLcom/chuckerteam/chucker/api/RetentionManager$Period;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getShowNotification ()Z
public final fun saveTransaction (Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;)V
public final fun setShowNotification (Z)V
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;)Landroid/net/Uri;
}
Expand Down Expand Up @@ -55,3 +56,95 @@ public final class com/chuckerteam/chucker/api/RetentionManager$Period : java/la
public static fun values ()[Lcom/chuckerteam/chucker/api/RetentionManager$Period;
}

public final class com/chuckerteam/chucker/api/entity/ManualHttpTransaction {
public fun <init> ()V
public fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[B)V
public synthetic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[BILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/Long;
public final fun component10 ()Ljava/lang/String;
public final fun component11 ()Ljava/lang/String;
public final fun component12 ()Ljava/lang/Long;
public final fun component13 ()Ljava/lang/String;
public final fun component14 ()Ljava/lang/String;
public final fun component15 ()Ljava/lang/Long;
public final fun component16 ()Ljava/lang/String;
public final fun component17 ()Z
public final fun component18 ()Ljava/lang/Integer;
public final fun component19 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/Long;
public final fun component20 ()Ljava/lang/String;
public final fun component21 ()Ljava/lang/Long;
public final fun component22 ()Ljava/lang/String;
public final fun component23 ()Ljava/lang/String;
public final fun component24 ()Ljava/lang/Long;
public final fun component25 ()Ljava/lang/String;
public final fun component26 ()Z
public final fun component27 ()[B
public final fun component3 ()Ljava/lang/Long;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun component7 ()Ljava/lang/String;
public final fun component8 ()Ljava/lang/String;
public final fun component9 ()Ljava/lang/String;
public final fun copy (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[B)Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;
public static synthetic fun copy$default (Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[BILjava/lang/Object;)Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;
public fun equals (Ljava/lang/Object;)Z
public final fun getError ()Ljava/lang/String;
public final fun getHost ()Ljava/lang/String;
public final fun getMethod ()Ljava/lang/String;
public final fun getPath ()Ljava/lang/String;
public final fun getProtocol ()Ljava/lang/String;
public final fun getRequestBody ()Ljava/lang/String;
public final fun getRequestContentType ()Ljava/lang/String;
public final fun getRequestDate ()Ljava/lang/Long;
public final fun getRequestHeaders ()Ljava/lang/String;
public final fun getRequestHeadersSize ()Ljava/lang/Long;
public final fun getRequestPayloadSize ()Ljava/lang/Long;
public final fun getResponseBody ()Ljava/lang/String;
public final fun getResponseCipherSuite ()Ljava/lang/String;
public final fun getResponseCode ()Ljava/lang/Integer;
public final fun getResponseContentType ()Ljava/lang/String;
public final fun getResponseDate ()Ljava/lang/Long;
public final fun getResponseHeaders ()Ljava/lang/String;
public final fun getResponseHeadersSize ()Ljava/lang/Long;
public final fun getResponseImageData ()[B
public final fun getResponseMessage ()Ljava/lang/String;
public final fun getResponsePayloadSize ()Ljava/lang/Long;
public final fun getResponseTlsVersion ()Ljava/lang/String;
public final fun getScheme ()Ljava/lang/String;
public final fun getTookMs ()Ljava/lang/Long;
public final fun getUrl ()Ljava/lang/String;
public fun hashCode ()I
public final fun isRequestBodyEncoded ()Z
public final fun isResponseBodyEncoded ()Z
public final fun setError (Ljava/lang/String;)V
public final fun setHost (Ljava/lang/String;)V
public final fun setMethod (Ljava/lang/String;)V
public final fun setPath (Ljava/lang/String;)V
public final fun setProtocol (Ljava/lang/String;)V
public final fun setRequestBody (Ljava/lang/String;)V
public final fun setRequestBodyEncoded (Z)V
public final fun setRequestContentType (Ljava/lang/String;)V
public final fun setRequestDate (Ljava/lang/Long;)V
public final fun setRequestHeaders (Ljava/lang/String;)V
public final fun setRequestHeadersSize (Ljava/lang/Long;)V
public final fun setRequestPayloadSize (Ljava/lang/Long;)V
public final fun setResponseBody (Ljava/lang/String;)V
public final fun setResponseBodyEncoded (Z)V
public final fun setResponseCipherSuite (Ljava/lang/String;)V
public final fun setResponseCode (Ljava/lang/Integer;)V
public final fun setResponseContentType (Ljava/lang/String;)V
public final fun setResponseDate (Ljava/lang/Long;)V
public final fun setResponseHeaders (Ljava/lang/String;)V
public final fun setResponseHeadersSize (Ljava/lang/Long;)V
public final fun setResponseImageData ([B)V
public final fun setResponseMessage (Ljava/lang/String;)V
public final fun setResponsePayloadSize (Ljava/lang/Long;)V
public final fun setResponseTlsVersion (Ljava/lang/String;)V
public final fun setScheme (Ljava/lang/String;)V
public final fun setTookMs (Ljava/lang/Long;)V
public final fun setUrl (Ljava/lang/String;)V
public fun toString ()Ljava/lang/String;
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.chuckerteam.chucker.api

import android.content.Context
import com.chuckerteam.chucker.api.entity.ManualHttpTransaction
import android.net.Uri

/**
Expand All @@ -12,6 +13,14 @@ public class ChuckerCollector @JvmOverloads constructor(
public var showNotification: Boolean = true,
retentionPeriod: RetentionManager.Period = RetentionManager.Period.ONE_WEEK
) {

/**
* No-op implementation.
*/
public fun saveTransaction(transaction: ManualHttpTransaction) {
// Empty method for the library-no-op artifact
}

@Suppress("FunctionOnlyReturningConstant")
public fun writeTransactions(
context: Context,
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.chuckerteam.chucker.api.entity

/**
* No-op implementation.
*/
public data class ManualHttpTransaction(
public var requestDate: Long? = null,
public var responseDate: Long? = null,
public var tookMs: Long? = null,
public var protocol: String? = null,
public var method: String? = null,
public var url: String? = null,
public var host: String? = null,
public var path: String? = null,
public var scheme: String? = null,
public var responseTlsVersion: String? = null,
public var responseCipherSuite: String? = null,
public var requestPayloadSize: Long? = null,
public var requestContentType: String? = null,
public var requestHeaders: String? = null,
public var requestHeadersSize: Long? = null,
public var requestBody: String? = null,
public var isRequestBodyEncoded: Boolean = false,
public var responseCode: Int? = null,
public var responseMessage: String? = null,
public var error: String? = null,
public var responsePayloadSize: Long? = null,
public var responseContentType: String? = null,
public var responseHeaders: String? = null,
public var responseHeadersSize: Long? = null,
public var responseBody: String? = null,
public var isResponseBodyEncoded: Boolean = false,
public var responseImageData: ByteArray? = null
)
93 changes: 93 additions & 0 deletions library/api/library.api
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ public final class com/chuckerteam/chucker/api/ChuckerCollector {
public fun <init> (Landroid/content/Context;ZLcom/chuckerteam/chucker/api/RetentionManager$Period;)V
public synthetic fun <init> (Landroid/content/Context;ZLcom/chuckerteam/chucker/api/RetentionManager$Period;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun getShowNotification ()Z
public final fun saveTransaction (Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;)V
public final fun setShowNotification (Z)V
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;)Landroid/net/Uri;
}
Expand Down Expand Up @@ -54,3 +55,95 @@ public final class com/chuckerteam/chucker/api/RetentionManager$Period : java/la
public static fun values ()[Lcom/chuckerteam/chucker/api/RetentionManager$Period;
}

public final class com/chuckerteam/chucker/api/entity/ManualHttpTransaction {
public fun <init> ()V
public fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[B)V
public synthetic fun <init> (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[BILkotlin/jvm/internal/DefaultConstructorMarker;)V
public final fun component1 ()Ljava/lang/Long;
public final fun component10 ()Ljava/lang/String;
public final fun component11 ()Ljava/lang/String;
public final fun component12 ()Ljava/lang/Long;
public final fun component13 ()Ljava/lang/String;
public final fun component14 ()Ljava/lang/String;
public final fun component15 ()Ljava/lang/Long;
public final fun component16 ()Ljava/lang/String;
public final fun component17 ()Z
public final fun component18 ()Ljava/lang/Integer;
public final fun component19 ()Ljava/lang/String;
public final fun component2 ()Ljava/lang/Long;
public final fun component20 ()Ljava/lang/String;
public final fun component21 ()Ljava/lang/Long;
public final fun component22 ()Ljava/lang/String;
public final fun component23 ()Ljava/lang/String;
public final fun component24 ()Ljava/lang/Long;
public final fun component25 ()Ljava/lang/String;
public final fun component26 ()Z
public final fun component27 ()[B
public final fun component3 ()Ljava/lang/Long;
public final fun component4 ()Ljava/lang/String;
public final fun component5 ()Ljava/lang/String;
public final fun component6 ()Ljava/lang/String;
public final fun component7 ()Ljava/lang/String;
public final fun component8 ()Ljava/lang/String;
public final fun component9 ()Ljava/lang/String;
public final fun copy (Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[B)Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;
public static synthetic fun copy$default (Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;ZLjava/lang/Integer;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/String;Z[BILjava/lang/Object;)Lcom/chuckerteam/chucker/api/entity/ManualHttpTransaction;
public fun equals (Ljava/lang/Object;)Z
public final fun getError ()Ljava/lang/String;
public final fun getHost ()Ljava/lang/String;
public final fun getMethod ()Ljava/lang/String;
public final fun getPath ()Ljava/lang/String;
public final fun getProtocol ()Ljava/lang/String;
public final fun getRequestBody ()Ljava/lang/String;
public final fun getRequestContentType ()Ljava/lang/String;
public final fun getRequestDate ()Ljava/lang/Long;
public final fun getRequestHeaders ()Ljava/lang/String;
public final fun getRequestHeadersSize ()Ljava/lang/Long;
public final fun getRequestPayloadSize ()Ljava/lang/Long;
public final fun getResponseBody ()Ljava/lang/String;
public final fun getResponseCipherSuite ()Ljava/lang/String;
public final fun getResponseCode ()Ljava/lang/Integer;
public final fun getResponseContentType ()Ljava/lang/String;
public final fun getResponseDate ()Ljava/lang/Long;
public final fun getResponseHeaders ()Ljava/lang/String;
public final fun getResponseHeadersSize ()Ljava/lang/Long;
public final fun getResponseImageData ()[B
public final fun getResponseMessage ()Ljava/lang/String;
public final fun getResponsePayloadSize ()Ljava/lang/Long;
public final fun getResponseTlsVersion ()Ljava/lang/String;
public final fun getScheme ()Ljava/lang/String;
public final fun getTookMs ()Ljava/lang/Long;
public final fun getUrl ()Ljava/lang/String;
public fun hashCode ()I
public final fun isRequestBodyEncoded ()Z
public final fun isResponseBodyEncoded ()Z
public final fun setError (Ljava/lang/String;)V
public final fun setHost (Ljava/lang/String;)V
public final fun setMethod (Ljava/lang/String;)V
public final fun setPath (Ljava/lang/String;)V
public final fun setProtocol (Ljava/lang/String;)V
public final fun setRequestBody (Ljava/lang/String;)V
public final fun setRequestBodyEncoded (Z)V
public final fun setRequestContentType (Ljava/lang/String;)V
public final fun setRequestDate (Ljava/lang/Long;)V
public final fun setRequestHeaders (Ljava/lang/String;)V
public final fun setRequestHeadersSize (Ljava/lang/Long;)V
public final fun setRequestPayloadSize (Ljava/lang/Long;)V
public final fun setResponseBody (Ljava/lang/String;)V
public final fun setResponseBodyEncoded (Z)V
public final fun setResponseCipherSuite (Ljava/lang/String;)V
public final fun setResponseCode (Ljava/lang/Integer;)V
public final fun setResponseContentType (Ljava/lang/String;)V
public final fun setResponseDate (Ljava/lang/Long;)V
public final fun setResponseHeaders (Ljava/lang/String;)V
public final fun setResponseHeadersSize (Ljava/lang/Long;)V
public final fun setResponseImageData ([B)V
public final fun setResponseMessage (Ljava/lang/String;)V
public final fun setResponsePayloadSize (Ljava/lang/Long;)V
public final fun setResponseTlsVersion (Ljava/lang/String;)V
public final fun setScheme (Ljava/lang/String;)V
public final fun setTookMs (Ljava/lang/Long;)V
public final fun setUrl (Ljava/lang/String;)V
public fun toString ()Ljava/lang/String;
}

Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.chuckerteam.chucker.api

import android.content.Context
import com.chuckerteam.chucker.api.entity.ManualHttpTransaction
import android.net.Uri
import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider
Expand Down Expand Up @@ -67,6 +68,15 @@ public class ChuckerCollector @JvmOverloads constructor(
}
}

/**
* Call this method whenever you want to save a transaction that is not collected by Chucker interceptor
*
* @param transaction the manual transaction you want to save it manually
*/
public fun saveTransaction(transaction: ManualHttpTransaction) {
onRequestSent(transaction.convertToHttpTransaction())
}

/**
* Export the Chucker transactions to a file. Please note that this function is blocking
* and performs Disk I/O. Make sure you run it on a separate thread or coroutine.
Expand Down
Loading