Skip to content

Commit 5938119

Browse files
sirpengichrisbobbe
authored andcommitted
api: Send simple User-Agent header
Fixes: zulip#406 Fixes: zulip#460 [chris: changed commit message; changed user-agent string; included in image requests]
1 parent 49bd287 commit 5938119

File tree

4 files changed

+24
-4
lines changed

4 files changed

+24
-4
lines changed

lib/api/core.dart

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ class ApiConnection {
8080
assert(debugLog("${request.method} ${request.url}"));
8181

8282
addAuth(request);
83+
request.headers.addAll(userAgentHeader());
8384

8485
final http.StreamedResponse response;
8586
try {
@@ -201,6 +202,13 @@ Map<String, String> authHeader({required String email, required String apiKey})
201202
};
202203
}
203204

205+
Map<String, String> userAgentHeader() {
206+
return {
207+
// TODO(#467) include platform, platform version, and app version
208+
'User-Agent': 'ZulipFlutter',
209+
};
210+
}
211+
204212
Map<String, String>? encodeParameters(Map<String, dynamic>? params) {
205213
return params?.map((k, v) =>
206214
MapEntry(k, v is RawParameter ? v.value : jsonEncode(v)));

lib/widgets/content.dart

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -837,6 +837,7 @@ class RealmContentNetworkImage extends StatelessWidget {
837837
if (src.origin == account.realmUrl.origin) ...authHeader(
838838
email: account.email, apiKey: account.apiKey,
839839
),
840+
...userAgentHeader(),
840841
},
841842
cacheWidth: cacheWidth,
842843
cacheHeight: cacheHeight,

test/api/core_test.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,10 @@ void main() {
2323
check(connection.lastRequest!).isA<http.Request>()
2424
..method.equals('GET')
2525
..url.asString.equals('${eg.realmUrl.origin}$expectedRelativeUrl')
26-
..headers.deepEquals(authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey))
26+
..headers.deepEquals({
27+
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
28+
...userAgentHeader(),
29+
})
2730
..body.equals('');
2831
});
2932
}
@@ -53,6 +56,7 @@ void main() {
5356
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
5457
..headers.deepEquals({
5558
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
59+
...userAgentHeader(),
5660
if (expectContentType)
5761
'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
5862
})
@@ -83,7 +87,10 @@ void main() {
8387
check(connection.lastRequest!).isA<http.MultipartRequest>()
8488
..method.equals('POST')
8589
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
86-
..headers.deepEquals(authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey))
90+
..headers.deepEquals({
91+
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
92+
...userAgentHeader(),
93+
})
8794
..fields.deepEquals({})
8895
..files.single.which(it()
8996
..field.equals('file')
@@ -115,6 +122,7 @@ void main() {
115122
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
116123
..headers.deepEquals({
117124
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
125+
...userAgentHeader(),
118126
if (expectContentType)
119127
'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
120128
})

test/widgets/content_test.dart

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -286,13 +286,16 @@ void main() {
286286

287287
testWidgets('includes auth header if `src` on-realm', (tester) async {
288288
check(await actualHeaders(tester, Uri.parse('https://chat.example/image.png')))
289-
.deepEquals({'Authorization': [authHeaders['Authorization']!]});
289+
.deepEquals({
290+
'Authorization': [authHeaders['Authorization']!],
291+
'User-Agent': [userAgentHeader()['User-Agent']!],
292+
});
290293
debugNetworkImageHttpClientProvider = null;
291294
});
292295

293296
testWidgets('excludes auth header if `src` off-realm', (tester) async {
294297
check(await actualHeaders(tester, Uri.parse('https://other.example/image.png')))
295-
.deepEquals({});
298+
.deepEquals({'User-Agent': [userAgentHeader()['User-Agent']!]});
296299
debugNetworkImageHttpClientProvider = null;
297300
});
298301

0 commit comments

Comments
 (0)