[gitlab] populate User-Agent header for API requests

IDEA-320466 Fixed

GitOrigin-RevId: 0ffa97efbdf05b55593268b922cdeaaefa175710
This commit is contained in:
Ivan Semenov
2023-05-16 17:25:44 +02:00
committed by intellij-monorepo-bot
parent 1ca8b7cc81
commit c92e8c72b7
3 changed files with 36 additions and 11 deletions

View File

@@ -6,8 +6,8 @@ import java.net.http.HttpRequest
open class CommonHeadersConfigurer : HttpRequestConfigurer {
protected open val commonHeaders: Map<String, String> =
mapOf("Accept-Encoding" to "gzip",
"User-Agent" to "JetBrains IDE")
mapOf(HttpClientUtil.ACCEPT_ENCODING_HEADER to HttpClientUtil.CONTENT_ENCODING_GZIP,
HttpClientUtil.USER_AGENT_HEADER to "JetBrains IDE")
final override fun configure(builder: HttpRequest.Builder): HttpRequest.Builder = builder
.apply { commonHeaders.forEach(::header) }

View File

@@ -5,7 +5,10 @@ import com.intellij.collaboration.api.HttpStatusErrorException
import com.intellij.collaboration.api.httpclient.HttpClientUtil.CONTENT_ENCODING_GZIP
import com.intellij.collaboration.api.httpclient.HttpClientUtil.CONTENT_ENCODING_HEADER
import com.intellij.collaboration.api.logName
import com.intellij.openapi.application.ApplicationInfo
import com.intellij.openapi.application.ApplicationNamesInfo
import com.intellij.openapi.diagnostic.Logger
import com.intellij.openapi.util.SystemInfo
import java.io.InputStream
import java.io.Reader
import java.io.StringReader
@@ -18,12 +21,15 @@ import java.util.zip.GZIPInputStream
object HttpClientUtil {
const val ACCEPT_ENCODING_HEADER = "Accept-Encoding"
const val CONTENT_ENCODING_HEADER = "Content-Encoding"
const val CONTENT_ENCODING_GZIP = "gzip"
const val CONTENT_TYPE_HEADER = "Content-Type"
const val CONTENT_TYPE_JSON = "application/json"
const val USER_AGENT_HEADER = "User-Agent"
/**
* Checks the status code of the response and throws [HttpStatusErrorException] if status code is not a successful one
*
@@ -67,6 +73,20 @@ object HttpClientUtil {
checkStatusCodeWithLogging(logger, request.logName(), responseInfo.statusCode(), bodyStream)
return responseReaderWithLogging(logger, request.logName(), bodyStream).use(reader)
}
/**
* Build the User-Agent header value for the [agentName]
* Append product, java and OS data
*/
fun getUserAgentValue(agentName: String): String {
val ideName = ApplicationNamesInfo.getInstance().fullProductName.replace(' ', '-')
val ideBuild = ApplicationInfo.getInstance().build.asString()
val java = "JRE " + SystemInfo.JAVA_RUNTIME_VERSION
val os = SystemInfo.OS_NAME + " " + SystemInfo.OS_VERSION
val arch = SystemInfo.OS_ARCH
return "$agentName $ideName/$ideBuild ($java; $os; $arch)"
}
}

View File

@@ -3,15 +3,13 @@ package org.jetbrains.plugins.gitlab.api
import com.intellij.collaboration.api.HttpApiHelper
import com.intellij.collaboration.api.graphql.GraphQLApiHelper
import com.intellij.collaboration.api.httpclient.AuthorizationConfigurer
import com.intellij.collaboration.api.httpclient.CommonHeadersConfigurer
import com.intellij.collaboration.api.httpclient.CompoundRequestConfigurer
import com.intellij.collaboration.api.httpclient.RequestTimeoutConfigurer
import com.intellij.collaboration.api.httpclient.*
import com.intellij.collaboration.api.json.JsonHttpApiHelper
import com.intellij.collaboration.api.json.loadJsonList
import com.intellij.openapi.diagnostic.logger
import com.intellij.util.io.HttpSecurityUtil
import org.jetbrains.plugins.gitlab.api.dto.GitLabGraphQLMutationResultDTO
import java.net.http.HttpRequest
import java.net.http.HttpResponse
interface GitLabApi : HttpApiHelper, JsonHttpApiHelper, GraphQLApiHelper
@@ -39,19 +37,26 @@ class GitLabApiImpl private constructor(httpHelper: HttpApiHelper)
override val authorizationHeaderValue: String
get() = HttpSecurityUtil.createBearerAuthHeaderValue(tokenSupplier())
}
val requestConfigurer = CompoundRequestConfigurer(RequestTimeoutConfigurer(),
CommonHeadersConfigurer(),
authConfigurer)
val requestConfigurer = CompoundRequestConfigurer(RequestTimeoutConfigurer(), GitLabHeadersConfigurer, authConfigurer)
return HttpApiHelper(logger = logger<GitLabApi>(),
requestConfigurer = requestConfigurer)
}
private fun httpHelper(): HttpApiHelper {
val requestConfigurer = CompoundRequestConfigurer(RequestTimeoutConfigurer(),
CommonHeadersConfigurer())
val requestConfigurer = CompoundRequestConfigurer(RequestTimeoutConfigurer(), GitLabHeadersConfigurer)
return HttpApiHelper(logger = logger<GitLabApi>(),
requestConfigurer = requestConfigurer)
}
private const val PLUGIN_USER_AGENT_NAME = "IntelliJ-GitLab-Plugin"
private object GitLabHeadersConfigurer : HttpRequestConfigurer {
override fun configure(builder: HttpRequest.Builder): HttpRequest.Builder =
builder.apply {
header(HttpClientUtil.ACCEPT_ENCODING_HEADER, HttpClientUtil.CONTENT_ENCODING_GZIP)
header(HttpClientUtil.USER_AGENT_HEADER, HttpClientUtil.getUserAgentValue(PLUGIN_USER_AGENT_NAME))
}
}
}
}