Skip to content

Commit 4d5b3e1

Browse files
sirpengignprice
authored andcommitted
api: Send simple User-Agent header
Fixes: #406 Fixes: #460 [chris: changed commit message; changed user-agent string; included in image requests]
1 parent 7cbb743 commit 4d5b3e1

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
@@ -853,6 +853,7 @@ class RealmContentNetworkImage extends StatelessWidget {
853853
if (src.origin == account.realmUrl.origin) ...authHeader(
854854
email: account.email, apiKey: account.apiKey,
855855
),
856+
...userAgentHeader(),
856857
},
857858
cacheWidth: cacheWidth,
858859
cacheHeight: cacheHeight,

test/api/core_test.dart

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,10 @@ void main() {
2222
check(connection.lastRequest!).isA<http.Request>()
2323
..method.equals('GET')
2424
..url.asString.equals('${eg.realmUrl.origin}$expectedRelativeUrl')
25-
..headers.deepEquals(authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey))
25+
..headers.deepEquals({
26+
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
27+
...userAgentHeader(),
28+
})
2629
..body.equals('');
2730
});
2831
}
@@ -52,6 +55,7 @@ void main() {
5255
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
5356
..headers.deepEquals({
5457
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
58+
...userAgentHeader(),
5559
if (expectContentType)
5660
'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
5761
})
@@ -82,7 +86,10 @@ void main() {
8286
check(connection.lastRequest!).isA<http.MultipartRequest>()
8387
..method.equals('POST')
8488
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
85-
..headers.deepEquals(authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey))
89+
..headers.deepEquals({
90+
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
91+
...userAgentHeader(),
92+
})
8693
..fields.deepEquals({})
8794
..files.single.which((it) => it
8895
..field.equals('file')
@@ -114,6 +121,7 @@ void main() {
114121
..url.asString.equals('${eg.realmUrl.origin}/api/v1/example/route')
115122
..headers.deepEquals({
116123
...authHeader(email: eg.selfAccount.email, apiKey: eg.selfAccount.apiKey),
124+
...userAgentHeader(),
117125
if (expectContentType)
118126
'content-type': 'application/x-www-form-urlencoded; charset=utf-8',
119127
})

test/widgets/content_test.dart

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

307307
testWidgets('includes auth header if `src` on-realm', (tester) async {
308308
check(await actualHeaders(tester, Uri.parse('https://chat.example/image.png')))
309-
.deepEquals({'Authorization': [authHeaders['Authorization']!]});
309+
.deepEquals({
310+
'Authorization': [authHeaders['Authorization']!],
311+
'User-Agent': [userAgentHeader()['User-Agent']!],
312+
});
310313
debugNetworkImageHttpClientProvider = null;
311314
});
312315

313316
testWidgets('excludes auth header if `src` off-realm', (tester) async {
314317
check(await actualHeaders(tester, Uri.parse('https://other.example/image.png')))
315-
.deepEquals({});
318+
.deepEquals({'User-Agent': [userAgentHeader()['User-Agent']!]});
316319
debugNetworkImageHttpClientProvider = null;
317320
});
318321

0 commit comments

Comments
 (0)