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

Export To Har #880

Merged
merged 20 commits into from Sep 29, 2022
Merged
Show file tree
Hide file tree
Changes from 12 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion CHANGELOG.md
Expand Up @@ -11,7 +11,7 @@ Please add your entries according to this format.
* Brotli compression support
* Added ability to export list of transactions as .har file.
* Added ability to save single transaction as .har file.
* Added ability to export transactions to a file programmatically.
* Added ability to export transactions to a file programmatically, LOG or HAR.
* GraphlQL OperationName header to transaction title [#69], [#116]

### Fixed
Expand Down
9 changes: 8 additions & 1 deletion library-no-op/api/library-no-op.api
Expand Up @@ -17,7 +17,7 @@ public final class com/chuckerteam/chucker/api/ChuckerCollector {
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 setShowNotification (Z)V
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;)Landroid/net/Uri;
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;Lcom/chuckerteam/chucker/api/ExportFormat;)Landroid/net/Uri;
}

public final class com/chuckerteam/chucker/api/ChuckerInterceptor : okhttp3/Interceptor {
Expand All @@ -39,6 +39,13 @@ public final class com/chuckerteam/chucker/api/ChuckerInterceptor$Builder {
public final fun redactHeaders ([Ljava/lang/String;)Lcom/chuckerteam/chucker/api/ChuckerInterceptor$Builder;
}

public final class com/chuckerteam/chucker/api/ExportFormat : java/lang/Enum {
public static final field HAR Lcom/chuckerteam/chucker/api/ExportFormat;
public static final field LOG Lcom/chuckerteam/chucker/api/ExportFormat;
public static fun valueOf (Ljava/lang/String;)Lcom/chuckerteam/chucker/api/ExportFormat;
public static fun values ()[Lcom/chuckerteam/chucker/api/ExportFormat;
}

public final class com/chuckerteam/chucker/api/RetentionManager {
public fun <init> (Landroid/content/Context;)V
public fun <init> (Landroid/content/Context;Ljava/lang/Object;)V
Expand Down
Expand Up @@ -16,5 +16,6 @@ public class ChuckerCollector @JvmOverloads constructor(
public fun writeTransactions(
context: Context,
startTimestamp: Long?,
exportFormat: ExportFormat
BluestormDNA marked this conversation as resolved.
Show resolved Hide resolved
): Uri? = null
}
@@ -0,0 +1,6 @@
package com.chuckerteam.chucker.api

public enum class ExportFormat {
LOG,
HAR
BluestormDNA marked this conversation as resolved.
Show resolved Hide resolved
}
10 changes: 9 additions & 1 deletion library/api/library.api
Expand Up @@ -17,7 +17,8 @@ public final class com/chuckerteam/chucker/api/ChuckerCollector {
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 setShowNotification (Z)V
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;)Landroid/net/Uri;
public final fun writeTransactions (Landroid/content/Context;Ljava/lang/Long;Lcom/chuckerteam/chucker/api/ExportFormat;)Landroid/net/Uri;
public static synthetic fun writeTransactions$default (Lcom/chuckerteam/chucker/api/ChuckerCollector;Landroid/content/Context;Ljava/lang/Long;Lcom/chuckerteam/chucker/api/ExportFormat;ILjava/lang/Object;)Landroid/net/Uri;
}

public final class com/chuckerteam/chucker/api/ChuckerInterceptor : okhttp3/Interceptor {
Expand All @@ -39,6 +40,13 @@ public final class com/chuckerteam/chucker/api/ChuckerInterceptor$Builder {
public final fun redactHeaders ([Ljava/lang/String;)Lcom/chuckerteam/chucker/api/ChuckerInterceptor$Builder;
}

public final class com/chuckerteam/chucker/api/ExportFormat : java/lang/Enum {
public static final field HAR Lcom/chuckerteam/chucker/api/ExportFormat;
public static final field LOG Lcom/chuckerteam/chucker/api/ExportFormat;
public static fun valueOf (Ljava/lang/String;)Lcom/chuckerteam/chucker/api/ExportFormat;
public static fun values ()[Lcom/chuckerteam/chucker/api/ExportFormat;
}

public final class com/chuckerteam/chucker/api/RetentionManager {
public fun <init> (Landroid/content/Context;)V
public fun <init> (Landroid/content/Context;Lcom/chuckerteam/chucker/api/RetentionManager$Period;)V
Expand Down
Expand Up @@ -2,9 +2,14 @@ package com.chuckerteam.chucker.api

import android.content.Context
import android.net.Uri
import com.chuckerteam.chucker.R
import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
import com.chuckerteam.chucker.internal.data.har.log.Creator
import com.chuckerteam.chucker.internal.data.repository.RepositoryProvider
import com.chuckerteam.chucker.internal.support.HarUtils
import com.chuckerteam.chucker.internal.support.JsonConverter
import com.chuckerteam.chucker.internal.support.NotificationHelper
import com.chuckerteam.chucker.internal.support.TransactionDetailsHarSharable
import com.chuckerteam.chucker.internal.support.TransactionListDetailsSharable
import com.chuckerteam.chucker.internal.support.writeToFile
import kotlinx.coroutines.Dispatchers
Expand Down Expand Up @@ -74,22 +79,41 @@ public class ChuckerCollector @JvmOverloads constructor(
* @param context Application context
* @param startTimestamp The timestamp to read transactions from. Passing null means
* transactions will not be limited by timestamp
* @param exportFormat The export format: LOG or HAR
* @return The content uri of a file with the transactions in or null if the export failed.
*/
public fun writeTransactions(
context: Context,
startTimestamp: Long?,
exportFormat: ExportFormat = ExportFormat.LOG
): Uri? {
val transactions =
RepositoryProvider.transaction().getTransactionsInTimeRange(startTimestamp)
if (transactions.isEmpty()) {
return null
}

val sharableTransactions = TransactionListDetailsSharable(transactions, encodeUrls = false)
val (sharableTransactions, extension) = when (exportFormat) {
ExportFormat.LOG -> {
TransactionListDetailsSharable(transactions, encodeUrls = false) to "txt"
}
ExportFormat.HAR -> {
TransactionDetailsHarSharable(
JsonConverter.nonNullSerializerInstance
.toJson(
HarUtils.fromHttpTransactions(
transactions, Creator(
context.getString(R.string.chucker_name),
context.getString(R.string.chucker_version),
)
)
)
) to "har"
}
}
return sharableTransactions.writeToFile(
context = context,
fileName = "api_transactions.txt",
fileName = "api_transactions.$extension",
)
}

Expand Down
@@ -0,0 +1,6 @@
package com.chuckerteam.chucker.api

public enum class ExportFormat {
BluestormDNA marked this conversation as resolved.
Show resolved Hide resolved
LOG,
HAR
}
@@ -1,6 +1,5 @@
package com.chuckerteam.chucker.internal.support

import androidx.annotation.VisibleForTesting
import com.chuckerteam.chucker.internal.data.entity.HttpTransaction
import com.chuckerteam.chucker.internal.data.har.Har
import com.chuckerteam.chucker.internal.data.har.log.Creator
Expand All @@ -19,8 +18,7 @@ internal object HarUtils {
.toJson(fromHttpTransactions(transactions, Creator(name, version)))
}

@VisibleForTesting
fun fromHttpTransactions(transactions: List<HttpTransaction>, creator: Creator): Har {
internal fun fromHttpTransactions(transactions: List<HttpTransaction>, creator: Creator): Har {
return Har(transactions, creator)
}
}