Stop double-encoding CMCD query parameters

`Uri.appendQueryParameter` is documented to encode its arguments, so
calling `Uri.encode` beforehand results in double-encoding.

Issue: androidx/media#1075

#minor-release

PiperOrigin-RevId: 604995441
(cherry picked from commit 7ebfed505c5ac42cb6e614a3dd9b7755af3e92b2)
This commit is contained in:
ibaker 2024-02-07 08:41:45 -08:00 committed by SheenaChhabra
parent 245e6231d9
commit 1dc4377a4b
6 changed files with 12 additions and 15 deletions

View File

@ -10,6 +10,8 @@
* Fix the regex used for validating custom Common Media Client Data (CMCD) * Fix the regex used for validating custom Common Media Client Data (CMCD)
key names by modifying it to only check for hyphen key names by modifying it to only check for hyphen
([#1028](https://github.com/androidx/media/issues/1028)). ([#1028](https://github.com/androidx/media/issues/1028)).
* Stop double-encoding CMCD query parameters
([#1075](https://github.com/androidx/media/issues/1075)).
* Transformer: * Transformer:
* Track Selection: * Track Selection:
* Extractors: * Extractors:

View File

@ -417,8 +417,7 @@ public final class CmcdData {
.uri .uri
.buildUpon() .buildUpon()
.appendQueryParameter( .appendQueryParameter(
CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY, CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY, COMMA_JOINER.join(keyValuePairs));
Uri.encode(COMMA_JOINER.join(keyValuePairs)));
return dataSpec.buildUpon().setUri(uriBuilder.build()).build(); return dataSpec.buildUpon().setUri(uriBuilder.build()).build();
} }
} }

View File

@ -108,7 +108,7 @@ public class CmcdDataTest {
getCustomData() { getCustomData() {
return new ImmutableListMultimap.Builder<String, String>() return new ImmutableListMultimap.Builder<String, String>()
.put("CMCD-Object", "key-1=1") .put("CMCD-Object", "key-1=1")
.put("CMCD-Request", "key-2=\"stringValue1,stringValue2\"") .put("CMCD-Request", "key-2=\"stringVälue1,stringVälue2\"")
.build(); .build();
} }
@ -143,11 +143,13 @@ public class CmcdDataTest {
dataSpec = cmcdData.addToDataSpec(dataSpec); dataSpec = cmcdData.addToDataSpec(dataSpec);
assertThat( // Confirm that the values above are URL-encoded
Uri.decode(dataSpec.uri.getQueryParameter(CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY))) assertThat(dataSpec.uri.toString()).doesNotContain("ä");
assertThat(dataSpec.uri.toString()).contains(Uri.encode("ä"));
assertThat(dataSpec.uri.getQueryParameter(CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY))
.isEqualTo( .isEqualTo(
"bl=1800,br=840,bs,cid=\"mediaId\",d=3000,dl=900,key-1=1," "bl=1800,br=840,bs,cid=\"mediaId\",d=3000,dl=900,key-1=1,"
+ "key-2=\"stringValue1,stringValue2\",mtp=500,pr=2.00,rtp=1700,sf=d," + "key-2=\"stringVälue1,stringVälue2\",mtp=500,pr=2.00,rtp=1700,sf=d,"
+ "sid=\"sessionId\",st=l,su,tb=1000"); + "sid=\"sessionId\",st=l,su,tb=1000");
} }

View File

@ -532,9 +532,7 @@ public class DefaultDashChunkSourceTest {
output); output);
assertThat( assertThat(
Uri.decode( output.chunk.dataSpec.uri.getQueryParameter(CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY))
output.chunk.dataSpec.uri.getQueryParameter(
CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY)))
.isEqualTo( .isEqualTo(
"bl=0,br=700,cid=\"mediaId\",com.example.test-key-1=1,d=4000,dl=0," "bl=0,br=700,cid=\"mediaId\",com.example.test-key-1=1,d=4000,dl=0,"
+ "key-2=\"stringValue\",mtp=1000,nor=\"..%2Fvideo_4000_700000.m4s\",nrr=\"0-\"," + "key-2=\"stringValue\",mtp=1000,nor=\"..%2Fvideo_4000_700000.m4s\",nrr=\"0-\","

View File

@ -442,9 +442,7 @@ public class HlsChunkSourceTest {
output); output);
assertThat( assertThat(
Uri.decode( output.chunk.dataSpec.uri.getQueryParameter(CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY))
output.chunk.dataSpec.uri.getQueryParameter(
CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY)))
.isEqualTo( .isEqualTo(
"bl=0,br=800,cid=\"mediaId\",com.example.test-key-1=1,d=4000,dl=0," "bl=0,br=800,cid=\"mediaId\",com.example.test-key-1=1,d=4000,dl=0,"
+ "key-2=\"stringValue\",nor=\"..%2F3.mp4\",nrr=\"0-\",ot=v,sf=h," + "key-2=\"stringValue\",nor=\"..%2F3.mp4\",nrr=\"0-\",ot=v,sf=h,"

View File

@ -283,9 +283,7 @@ public class DefaultSsChunkSourceTest {
output); output);
assertThat( assertThat(
Uri.decode( output.chunk.dataSpec.uri.getQueryParameter(CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY))
output.chunk.dataSpec.uri.getQueryParameter(
CmcdConfiguration.CMCD_QUERY_PARAMETER_KEY)))
.isEqualTo( .isEqualTo(
"bl=0,br=308,cid=\"mediaId\",com.example.test-key-1=1,d=1968,dl=0," "bl=0,br=308,cid=\"mediaId\",com.example.test-key-1=1,d=1968,dl=0,"
+ "key-2=\"stringValue\",mtp=1000,nor=\"..%2FFragments(video%3D19680000)\",ot=v," + "key-2=\"stringValue\",mtp=1000,nor=\"..%2FFragments(video%3D19680000)\",ot=v,"