Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions dd-sdk-android-core/api/apiSurface
Original file line number Diff line number Diff line change
Expand Up @@ -53,6 +53,7 @@ interface com.datadog.android.api.InternalLogger
fun logApiUsage(Float = DEFAULT_API_USAGE_TELEMETRY_SAMPLING_RATE, () -> com.datadog.android.internal.telemetry.InternalTelemetryEvent.ApiUsage)
companion object
val UNBOUND: InternalLogger
fun InternalLogger.logToUser(InternalLogger.Level, Boolean = false, () -> String)
interface com.datadog.android.api.SdkCore
val name: String
val time: com.datadog.android.api.context.TimeInfo
Expand Down Expand Up @@ -158,12 +159,21 @@ interface com.datadog.android.api.instrumentation.network.HttpRequestInfo
val contentType: String?
val method: String
fun contentLength(): Long?
interface com.datadog.android.api.instrumentation.network.HttpRequestInfoBuilder
fun setUrl(String): HttpRequestInfoBuilder
fun addHeader(String, String): HttpRequestInfoBuilder
fun removeHeader(String): HttpRequestInfoBuilder
fun replaceHeader(String, String): HttpRequestInfoBuilder
fun <T> addTag(Class<T>, T?): HttpRequestInfoBuilder
fun build(): HttpRequestInfo
interface com.datadog.android.api.instrumentation.network.HttpResponseInfo
val url: String
val statusCode: Int
val headers: Map<String, List<String>>
val contentType: String?
val contentLength: Long?
interface com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo
fun newBuilder(): HttpRequestInfoBuilder
data class com.datadog.android.api.net.Request
constructor(String, String, String, Map<String, String>, ByteArray, String? = null)
data class com.datadog.android.api.net.RequestExecutionContext
Expand Down
22 changes: 22 additions & 0 deletions dd-sdk-android-core/api/dd-sdk-android-core.api
Original file line number Diff line number Diff line change
Expand Up @@ -127,6 +127,11 @@ public final class com/datadog/android/api/InternalLogger$Target : java/lang/Enu
public static fun values ()[Lcom/datadog/android/api/InternalLogger$Target;
}

public final class com/datadog/android/api/InternalLoggerKt {
public static final fun logToUser (Lcom/datadog/android/api/InternalLogger;Lcom/datadog/android/api/InternalLogger$Level;ZLkotlin/jvm/functions/Function0;)V
public static synthetic fun logToUser$default (Lcom/datadog/android/api/InternalLogger;Lcom/datadog/android/api/InternalLogger$Level;ZLkotlin/jvm/functions/Function0;ILjava/lang/Object;)V
}

public abstract interface class com/datadog/android/api/SdkCore {
public abstract fun addAccountExtraInfo (Ljava/util/Map;)V
public abstract fun addUserProperties (Ljava/util/Map;)V
Expand Down Expand Up @@ -462,6 +467,19 @@ public abstract interface class com/datadog/android/api/instrumentation/network/
public abstract fun getUrl ()Ljava/lang/String;
}

public abstract interface class com/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder {
public abstract fun addHeader (Ljava/lang/String;[Ljava/lang/String;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
public abstract fun addTag (Ljava/lang/Class;Ljava/lang/Object;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
public abstract fun build ()Lcom/datadog/android/api/instrumentation/network/HttpRequestInfo;
public abstract fun removeHeader (Ljava/lang/String;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
public abstract fun replaceHeader (Ljava/lang/String;Ljava/lang/String;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
public abstract fun setUrl (Ljava/lang/String;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
}

public final class com/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder$DefaultImpls {
public static fun replaceHeader (Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;Ljava/lang/String;Ljava/lang/String;)Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
}

public abstract interface class com/datadog/android/api/instrumentation/network/HttpResponseInfo {
public abstract fun getContentLength ()Ljava/lang/Long;
public abstract fun getContentType ()Ljava/lang/String;
Expand All @@ -470,6 +488,10 @@ public abstract interface class com/datadog/android/api/instrumentation/network/
public abstract fun getUrl ()Ljava/lang/String;
}

public abstract interface class com/datadog/android/api/instrumentation/network/MutableHttpRequestInfo {
public abstract fun newBuilder ()Lcom/datadog/android/api/instrumentation/network/HttpRequestInfoBuilder;
}

public final class com/datadog/android/api/net/Request {
public fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;[BLjava/lang/String;)V
public synthetic fun <init> (Ljava/lang/String;Ljava/lang/String;Ljava/lang/String;Ljava/util/Map;[BLjava/lang/String;ILkotlin/jvm/internal/DefaultConstructorMarker;)V
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -192,3 +192,17 @@ interface InternalLogger {
val UNBOUND: InternalLogger = SdkInternalLogger(null)
}
}

/**
* Convenience extension function to log a message directly to the user via Logcat.
* This is equivalent to calling [InternalLogger.log] with [InternalLogger.Target.USER].
*
* @param level the severity level of the log.
* @param onlyOnce whether only one instance of the message should be sent per lifetime of the logger.
* @param messageBuilder the lambda building the log message.
*/
fun InternalLogger.logToUser(
level: InternalLogger.Level,
onlyOnce: Boolean = false,
messageBuilder: () -> String
) = log(level, InternalLogger.Target.USER, messageBuilder, onlyOnce = onlyOnce)
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2016-Present Datadog, Inc.
*/

package com.datadog.android.api.instrumentation.network

import com.datadog.android.lint.InternalApi

/**
* For internal usage only.
*
* A builder interface for modifying [com.datadog.android.api.instrumentation.network.HttpRequestInfo] instances.
* This interface allows to build new [com.datadog.android.api.instrumentation.network.HttpRequestInfo] with
* modified HTTP request properties such as URL, headers, and tags.
*
* Use [com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo.newBuilder] to obtain a builder instance.
*/
@InternalApi
interface HttpRequestInfoBuilder {

/**
* Sets the URL for this request.
* @param url the new URL to set.
* @return this modifier for chaining.
*/
fun setUrl(url: String): HttpRequestInfoBuilder

/**
* Adds a header with the specified key and values.
* If a header with the same key already exists, the new values are appended.
* @param key the header name.
* @param values the header values.
* @return this modifier for chaining.
*/
fun addHeader(key: String, vararg values: String): HttpRequestInfoBuilder

/**
* Removes a header with the specified key.
* @param key the header name to remove.
* @return this modifier for chaining.
*/
fun removeHeader(key: String): HttpRequestInfoBuilder

/**
* Replaces a header with the specified key and value.
* This is equivalent to removing the existing header and adding a new one.
* @param key the header name.
* @param value the new header value.
* @return this modifier for chaining.
*/
fun replaceHeader(key: String, value: String): HttpRequestInfoBuilder = apply {
removeHeader(key)
addHeader(key, value)
}

/**
* Adds a tag of the specified type to this request.
* Tags can be used to attach arbitrary metadata to requests for later retrieval.
* @param T the type of the tag.
* @param type the class representing the tag type.
* @param tag the tag value, or null to remove the tag.
* @return this modifier for chaining.
*/
fun <T> addTag(type: Class<in T>, tag: T?): HttpRequestInfoBuilder

/**
* Builds and returns the modified [com.datadog.android.api.instrumentation.network.HttpRequestInfo].
* @return the resulting [com.datadog.android.api.instrumentation.network.HttpRequestInfo] with all modifications applied.
*/
fun build(): HttpRequestInfo
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
/*
* Unless explicitly stated otherwise all files in this repository are licensed under the Apache License Version 2.0.
* This product includes software developed at Datadog (https://www.datadoghq.com/).
* Copyright 2016-Present Datadog, Inc.
*/

package com.datadog.android.api.instrumentation.network

import com.datadog.android.lint.InternalApi

/**
* For internal usage only.
*
* Represents an HTTP request info that can be modified.
*
* This interface allows instrumentation components to create a modified copy
* of the request info (e.g., to add tracing headers) while preserving the
* original request data.
*/
@InternalApi
interface MutableHttpRequestInfo {
/**
* Creates a modifier to modify this request info.
* @return a new [com.datadog.android.api.instrumentation.network.HttpRequestInfoBuilder] initialized with this request's data.
*/
fun newBuilder(): HttpRequestInfoBuilder
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,8 @@ package com.datadog.android.tests.elmyr

import com.datadog.android.api.instrumentation.network.ExtendedRequestInfo
import com.datadog.android.api.instrumentation.network.HttpRequestInfo
import com.datadog.android.api.instrumentation.network.HttpRequestInfoBuilder
import com.datadog.android.api.instrumentation.network.MutableHttpRequestInfo
import com.datadog.android.core.internal.net.HttpSpec
import fr.xgouchet.elmyr.Forge
import fr.xgouchet.elmyr.ForgeryFactory
Expand All @@ -29,13 +31,32 @@ class RequestInfoForgeryFactory : ForgeryFactory<HttpRequestInfo> {
override val headers: Map<String, List<String>>,
override val contentType: String?,
override val method: String,
private val contentLength: Long?,
private val tags: Map<Any, Any?>
) : HttpRequestInfo, ExtendedRequestInfo {
internal val contentLength: Long?,
internal val tags: Map<Any, Any?>
) : HttpRequestInfo, ExtendedRequestInfo, MutableHttpRequestInfo {

@Suppress("UNCHECKED_CAST")
override fun <T> tag(type: Class<out T>): T? = tags[type] as? T

override fun contentLength(): Long? = contentLength
override fun newBuilder(): HttpRequestInfoBuilder = StubHttpRequestInfoBuilder(this.copy())
}

private data class StubHttpRequestInfoBuilder(private var request: StubRequestInfo) : HttpRequestInfoBuilder {
override fun setUrl(url: String) = apply { request = request.copy(url = url) }

override fun addHeader(key: String, vararg values: String) = apply {
request = request.copy(headers = request.headers.toMutableMap().also { it[key] = values.asList() })
}

override fun removeHeader(key: String) = apply {
request = request.copy(headers = request.headers.toMutableMap().also { it.remove(key) })
}

override fun <T> addTag(type: Class<in T>, tag: T?) = apply {
request = request.copy(tags = request.tags.toMutableMap().also { it[type] = tag })
}

override fun build(): HttpRequestInfo = request.copy()
}
}
23 changes: 0 additions & 23 deletions dd-sdk-android-internal/api/apiSurface
Original file line number Diff line number Diff line change
Expand Up @@ -65,29 +65,6 @@ enum com.datadog.android.internal.network.GraphQLHeaders
- DD_GRAPHQL_VARIABLES_HEADER
- DD_GRAPHQL_TYPE_HEADER
- DD_GRAPHQL_PAYLOAD_HEADER
object com.datadog.android.internal.network.HttpSpec
object Method
const val GET: String
const val POST: String
const val PATCH: String
const val PUT: String
const val HEAD: String
const val DELETE: String
const val TRACE: String
const val OPTIONS: String
const val CONNECT: String
fun values()
object Headers
const val CONTENT_TYPE: String
const val CONTENT_LENGTH: String
const val WEBSOCKET_ACCEPT_HEADER: String
object ContentType
const val TEXT_PLAIN: String
const val TEXT_EVENT_STREAM: String
const val APPLICATION_GRPC: String
const val APPLICATION_GRPC_PROTO: String
const val APPLICATION_GRPC_JSON: String
fun isStream(String?): Boolean
interface com.datadog.android.internal.profiler.BenchmarkCounter
fun add(Long, Map<String, String>)
interface com.datadog.android.internal.profiler.BenchmarkMeter
Expand Down
35 changes: 0 additions & 35 deletions dd-sdk-android-internal/api/dd-sdk-android-internal.api
Original file line number Diff line number Diff line change
Expand Up @@ -131,41 +131,6 @@ public final class com/datadog/android/internal/network/GraphQLHeaders : java/la
public static fun values ()[Lcom/datadog/android/internal/network/GraphQLHeaders;
}

public final class com/datadog/android/internal/network/HttpSpec {
public static final field INSTANCE Lcom/datadog/android/internal/network/HttpSpec;
}

public final class com/datadog/android/internal/network/HttpSpec$ContentType {
public static final field APPLICATION_GRPC Ljava/lang/String;
public static final field APPLICATION_GRPC_JSON Ljava/lang/String;
public static final field APPLICATION_GRPC_PROTO Ljava/lang/String;
public static final field INSTANCE Lcom/datadog/android/internal/network/HttpSpec$ContentType;
public static final field TEXT_EVENT_STREAM Ljava/lang/String;
public static final field TEXT_PLAIN Ljava/lang/String;
public final fun isStream (Ljava/lang/String;)Z
}

public final class com/datadog/android/internal/network/HttpSpec$Headers {
public static final field CONTENT_LENGTH Ljava/lang/String;
public static final field CONTENT_TYPE Ljava/lang/String;
public static final field INSTANCE Lcom/datadog/android/internal/network/HttpSpec$Headers;
public static final field WEBSOCKET_ACCEPT_HEADER Ljava/lang/String;
}

public final class com/datadog/android/internal/network/HttpSpec$Method {
public static final field CONNECT Ljava/lang/String;
public static final field DELETE Ljava/lang/String;
public static final field GET Ljava/lang/String;
public static final field HEAD Ljava/lang/String;
public static final field INSTANCE Lcom/datadog/android/internal/network/HttpSpec$Method;
public static final field OPTIONS Ljava/lang/String;
public static final field PATCH Ljava/lang/String;
public static final field POST Ljava/lang/String;
public static final field PUT Ljava/lang/String;
public static final field TRACE Ljava/lang/String;
public final fun values ()Ljava/util/List;
}

public abstract interface class com/datadog/android/internal/profiler/BenchmarkCounter {
public abstract fun add (JLjava/util/Map;)V
}
Expand Down
Loading
Loading