@@ -73,7 +73,7 @@ public data class AwsUserAgentMetadata(
7373 add(languageMetadata)
7474 execEnvMetadata?.let (::add)
7575 customMetadata?.typedExtras?.filterIsInstance<ConfigMetadata >()?.forEach(::add)
76- appId?.let { add(uaPair(" app" , it)) }
76+ appId?.let { add(uaPair(" app" , value = it)) }
7777 customMetadata?.typedExtras?.filterIsInstance<FeatureMetadata >()?.forEach(::add)
7878 frameworkMetadata?.let (::add)
7979
@@ -190,7 +190,7 @@ internal expect fun platformLanguageMetadata(): LanguageMetadata
190190 */
191191@InternalSdkApi
192192public data class ExecutionEnvMetadata (val name : String ) {
193- override fun toString (): String = uaPair(" exec-env" , name)
193+ override fun toString (): String = uaPair(" exec-env" , value = name)
194194}
195195
196196/* *
@@ -223,21 +223,28 @@ private fun detectExecEnv(platform: PlatformEnvironProvider): ExecutionEnvMetada
223223// tchar_no_hash = "!" / "$" / "%" / "&" / "'" / "*" / "+" / "-" / "." /
224224// "^" / "_" / "`" / "|" / "~" / DIGIT / ALPHA
225225private val VALID_TCHAR_NO_HASH = setOf (' !' , ' $' , ' %' , ' &' , ' \' ' , ' *' , ' +' , ' -' , ' .' , ' ^' , ' _' , ' `' , ' |' , ' ~' )
226+ private val VALID_TCHAR = VALID_TCHAR_NO_HASH + ' #'
226227
227- internal fun uaPair (category : String , key : String , value : String? = null): String =
228- if (value == null ) {
229- " ${category.encodeUaToken()} /${key.encodeUaToken()} "
230- } else {
231- " ${category.encodeUaToken()} /${key.encodeUaToken()} #${value.encodeUaToken()} "
232- }
228+ internal fun uaPair (category : String , key : String? = null, value : String? = null): String = when {
229+ key == null && value == null -> category.encodeUaName()
230+ value == null -> " ${category.encodeUaName()} /${key!! .encodeUaName()} "
231+ key == null -> " ${category.encodeUaName()} /${value.encodeUaValue()} "
232+ else -> " ${category.encodeUaName()} /${key.encodeUaName()} #${value.encodeUaValue()} "
233+ }
234+
235+ private fun String.encodeUaName () = encodeUaString(VALID_TCHAR_NO_HASH )
236+ private fun String.encodeUaValue () = encodeUaString(VALID_TCHAR )
233237
234- private fun String.encodeUaToken (): String {
238+ /* *
239+ * Encode a UA string, allowing only A-Z, a-z, 0-9, and characters in `charSet`.
240+ */
241+ private fun String.encodeUaString (charSet : Set <Char >): String {
235242 val str = this
236243 return buildString(str.length) {
237244 for (chr in str) {
238245 when (chr) {
239246 ' ' -> append(" _" )
240- in ' a' .. ' z' , in ' A' .. ' Z' , in ' 0' .. ' 9' , in VALID_TCHAR_NO_HASH -> append(chr)
247+ in ' a' .. ' z' , in ' A' .. ' Z' , in ' 0' .. ' 9' , in charSet -> append(chr)
241248 else -> continue
242249 }
243250 }
0 commit comments