Skip to content

Commit 06d45e3

Browse files
Populate GMPID header
1 parent 6366776 commit 06d45e3

File tree

6 files changed

+68
-8
lines changed

6 files changed

+68
-8
lines changed

packages/storage/CHANGELOG.md

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,5 @@
1+
#Unreleased
2+
- [Changed] Added an additional header to all network requests that propagates the Firebase App ID.
3+
4+
# 6.1.0
15
- [Feature] Added the support for List API.
2-

packages/storage/package.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,8 @@
1616
"dev": "rollup -c -w",
1717
"test": "run-p test:browser lint",
1818
"test:browser": "karma start --single-run",
19-
"prepare": "yarn build"
19+
"prepare": "yarn build",
20+
"prettier": "prettier --write 'src/**/*.ts' 'test/**/*.ts'"
2021
},
2122
"license": "Apache-2.0",
2223
"dependencies": {

packages/storage/src/implementation/authwrapper.ts

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ export class AuthWrapper {
4444
private app_: FirebaseApp | null;
4545
private authProvider_: Provider<FirebaseAuthInternalName>;
4646
private bucket_: string | null = null;
47+
private appId_: string | null = null;
4748

4849
private storageRefMaker_: (p1: AuthWrapper, p2: Location) => Reference;
4950
private requestMaker_: requestMaker;
@@ -67,6 +68,7 @@ export class AuthWrapper {
6768
const options = this.app_.options;
6869
if (type.isDef(options)) {
6970
this.bucket_ = AuthWrapper.extractBucket_(options);
71+
this.appId_ = options.appId ?? null;
7072
}
7173
}
7274
this.authProvider_ = authProvider;
@@ -138,7 +140,12 @@ export class AuthWrapper {
138140
authToken: string | null
139141
): Request<T> {
140142
if (!this.deleted_) {
141-
const request = this.requestMaker_(requestInfo, authToken, this.pool_);
143+
const request = this.requestMaker_(
144+
requestInfo,
145+
authToken,
146+
this.appId_,
147+
this.pool_
148+
);
142149
this.requestMap_.addRequest(request);
143150
return request;
144151
} else {

packages/storage/src/implementation/request.ts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -280,18 +280,26 @@ export function addVersionHeader_(headers: Headers): void {
280280
headers['X-Firebase-Storage-Version'] = 'webjs/' + version;
281281
}
282282

283+
export function addGmpidHeader_(headers: Headers, appId: string | null): void {
284+
if (appId) {
285+
headers['X-Firebase-GMPID'] = appId;
286+
}
287+
}
288+
283289
/**
284290
* @template T
285291
*/
286292
export function makeRequest<T>(
287293
requestInfo: RequestInfo<T>,
288294
authToken: string | null,
295+
appId: string | null,
289296
pool: XhrIoPool
290297
): Request<T> {
291298
const queryPart = UrlUtils.makeQueryString(requestInfo.urlParams);
292299
const url = requestInfo.url + queryPart;
293300
const headers = Object.assign({}, requestInfo.headers);
294301
addAuthHeader_(headers, authToken);
302+
addGmpidHeader_(headers, appId);
295303
addVersionHeader_(headers);
296304
return new NetworkRequest<T>(
297305
url,

packages/storage/src/implementation/requestmaker.ts

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import { XhrIoPool } from './xhriopool';
2121
type requestMaker = <T>(
2222
requestInfo: RequestInfo<T>,
2323
authToken: string | null,
24+
appId: string | null,
2425
pool: XhrIoPool
2526
) => Request<T>;
2627

packages/storage/test/request.test.ts

Lines changed: 45 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ describe('Firebase Storage > Request', () => {
5858
requestInfo.headers[requestHeader] = requestValue;
5959
requestInfo.successCodes = [200, 234];
6060

61-
return makeRequest(requestInfo, null, makePool(spiedSend))
61+
return makeRequest(requestInfo, null, null, makePool(spiedSend))
6262
.getPromise()
6363
.then(
6464
result => {
@@ -71,6 +71,7 @@ describe('Firebase Storage > Request', () => {
7171
const expectedHeaders: { [key: string]: string } = {};
7272
expectedHeaders[requestHeader] = requestValue;
7373
expectedHeaders[versionHeaderName] = versionHeaderValue;
74+
expectedHeaders[versionHeaderName] = versionHeaderValue;
7475
assert.deepEqual(args[4], expectedHeaders);
7576
},
7677
() => {
@@ -100,7 +101,7 @@ describe('Firebase Storage > Request', () => {
100101
requestInfo.urlParams[p1] = v1;
101102
requestInfo.urlParams[p2] = v2;
102103
requestInfo.body = 'thisistherequestbody';
103-
return makeRequest(requestInfo, null, makePool(spiedSend))
104+
return makeRequest(requestInfo, null, null, makePool(spiedSend))
104105
.getPromise()
105106
.then(
106107
() => {
@@ -143,7 +144,7 @@ describe('Firebase Storage > Request', () => {
143144
timeout
144145
);
145146

146-
return makeRequest(requestInfo, null, makePool(newSend))
147+
return makeRequest(requestInfo, null, null, makePool(newSend))
147148
.getPromise()
148149
.then(
149150
() => {
@@ -165,7 +166,7 @@ describe('Firebase Storage > Request', () => {
165166
handler,
166167
timeout
167168
);
168-
const request = makeRequest(requestInfo, null, makePool(null));
169+
const request = makeRequest(requestInfo, null, null, makePool(null));
169170
const promise = request.getPromise().then(
170171
() => {
171172
assert.fail('Succeeded when handler gave error');
@@ -192,7 +193,12 @@ describe('Firebase Storage > Request', () => {
192193
handler,
193194
timeout
194195
);
195-
const request = makeRequest(requestInfo, authToken, makePool(spiedSend));
196+
const request = makeRequest(
197+
requestInfo,
198+
authToken,
199+
null,
200+
makePool(spiedSend)
201+
);
196202
return request.getPromise().then(
197203
() => {
198204
assert.isTrue(spiedSend.calledOnce);
@@ -208,4 +214,38 @@ describe('Firebase Storage > Request', () => {
208214
}
209215
);
210216
});
217+
218+
it('Sends APP ID along properly', () => {
219+
const appId = 'myFirebaseApp';
220+
221+
function newSend(xhrio: TestingXhrIo): void {
222+
xhrio.simulateResponse(200, '', {});
223+
}
224+
const spiedSend = sinon.spy(newSend);
225+
226+
function handler(): boolean {
227+
return true;
228+
}
229+
const requestInfo = new RequestInfo(
230+
'http://my-url.com/',
231+
'GET',
232+
handler,
233+
timeout
234+
);
235+
const request = makeRequest(requestInfo, null, appId, makePool(spiedSend));
236+
return request.getPromise().then(
237+
() => {
238+
assert.isTrue(spiedSend.calledOnce);
239+
const args: unknown[] = spiedSend.getCall(0).args;
240+
const expectedHeaders: { [key: string]: string } = {
241+
'X-Firebase-GMPID': appId
242+
};
243+
expectedHeaders[versionHeaderName] = versionHeaderValue;
244+
assert.deepEqual(args[4], expectedHeaders);
245+
},
246+
() => {
247+
assert.fail('Request failed unexpectedly');
248+
}
249+
);
250+
});
211251
});

0 commit comments

Comments
 (0)