Skip to content

Commit 2595de0

Browse files
authored
fix: media upload to have applicationName as User-Agent (#2227)
* Upload to have applicationName as User-Agent Test that fails * request initializer to set user-agent header
1 parent 0d1e5db commit 2595de0

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

google-api-client/src/main/java/com/google/api/client/googleapis/services/AbstractGoogleClientRequest.java

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -351,15 +351,42 @@ public final MediaHttpUploader getMediaHttpUploader() {
351351
*/
352352
protected final void initializeMediaUpload(AbstractInputStreamContent mediaContent) {
353353
HttpRequestFactory requestFactory = abstractGoogleClient.getRequestFactory();
354+
String applicationName = abstractGoogleClient.getApplicationName();
355+
HttpRequestInitializer requestInitializer =
356+
mediaUploadRequestUserAgentInitializer(applicationName, requestFactory.getInitializer());
354357
this.uploader =
355-
new MediaHttpUploader(
356-
mediaContent, requestFactory.getTransport(), requestFactory.getInitializer());
358+
new MediaHttpUploader(mediaContent, requestFactory.getTransport(), requestInitializer);
357359
this.uploader.setInitiationRequestMethod(requestMethod);
358360
if (httpContent != null) {
359361
this.uploader.setMetadata(httpContent);
360362
}
361363
}
362364

365+
private static HttpRequestInitializer mediaUploadRequestUserAgentInitializer(
366+
final String applicationName, final HttpRequestInitializer originalInitializer) {
367+
if (applicationName == null) {
368+
return originalInitializer;
369+
}
370+
if (originalInitializer == null) {
371+
return new HttpRequestInitializer() {
372+
@Override
373+
public void initialize(HttpRequest request) {
374+
HttpHeaders headers = request.getHeaders();
375+
headers.setUserAgent(applicationName);
376+
}
377+
};
378+
} else {
379+
return new HttpRequestInitializer() {
380+
@Override
381+
public void initialize(HttpRequest request) throws IOException {
382+
originalInitializer.initialize(request);
383+
HttpHeaders headers = request.getHeaders();
384+
headers.setUserAgent(applicationName);
385+
}
386+
};
387+
}
388+
}
389+
363390
/** Returns the media HTTP downloader or {@code null} for none. */
364391
public final MediaHttpDownloader getMediaHttpDownloader() {
365392
return downloader;

google-api-client/src/test/java/com/google/api/client/googleapis/services/AbstractGoogleClientTest.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import com.google.api.client.googleapis.testing.services.MockGoogleClient;
1717
import com.google.api.client.googleapis.testing.services.MockGoogleClientRequest;
1818
import com.google.api.client.http.EmptyContent;
19+
import com.google.api.client.http.GenericUrl;
1920
import com.google.api.client.http.HttpExecuteInterceptor;
2021
import com.google.api.client.http.HttpRequest;
2122
import com.google.api.client.http.HttpRequestInitializer;
@@ -33,6 +34,8 @@
3334
import com.google.api.client.util.Key;
3435
import java.io.ByteArrayInputStream;
3536
import java.io.InputStream;
37+
import java.util.ArrayList;
38+
import java.util.List;
3639
import junit.framework.TestCase;
3740

3841
/**
@@ -132,6 +135,7 @@ private static class MediaTransport extends MockHttpTransport {
132135
int bytesUploaded;
133136
int contentLength = MediaHttpUploader.DEFAULT_CHUNK_SIZE;
134137
boolean contentLengthNotSpecified;
138+
List<String> userAgentsRecorded = new ArrayList<>();
135139

136140
protected MediaTransport() {}
137141

@@ -169,6 +173,7 @@ public LowLevelHttpResponse execute() {
169173
String expectedContentRange = "bytes " + bytesRange + "/" + contentLength;
170174
assertEquals(expectedContentRange, getFirstHeaderValue("Content-Range"));
171175
bytesUploaded += MediaHttpUploader.DEFAULT_CHUNK_SIZE;
176+
userAgentsRecorded.add(getFirstHeaderValue("User-Agent"));
172177

173178
if (bytesUploaded == contentLength) {
174179
// Return 200 since the upload is complete.
@@ -207,6 +212,32 @@ public void testMediaUpload() throws Exception {
207212
assertEquals("somevalue", result.foo);
208213
}
209214

215+
public void testMediaUpload_applicationNameAsUserAgent() throws Exception {
216+
MediaTransport fakeTransport = new MediaTransport();
217+
String applicationName = "Foo/1.0 (BAR:Baz/1.0) XYZ/1.0";
218+
AbstractGoogleClient client =
219+
new MockGoogleClient.Builder(
220+
fakeTransport, TEST_RESUMABLE_REQUEST_URL, "", JSON_OBJECT_PARSER, null)
221+
.setApplicationName(applicationName)
222+
.build();
223+
InputStream is = new ByteArrayInputStream(new byte[MediaHttpUploader.DEFAULT_CHUNK_SIZE]);
224+
InputStreamContent mediaContent = new InputStreamContent(TEST_CONTENT_TYPE, is);
225+
mediaContent.setLength(MediaHttpUploader.DEFAULT_CHUNK_SIZE);
226+
MockGoogleClientRequest<A> rq =
227+
new MockGoogleClientRequest<A>(client, "POST", "", null, A.class);
228+
229+
rq.initializeMediaUpload(mediaContent);
230+
MediaHttpUploader mediaHttpUploader = rq.getMediaHttpUploader();
231+
mediaHttpUploader.upload(new GenericUrl(TEST_RESUMABLE_REQUEST_URL));
232+
233+
assertEquals(1, fakeTransport.userAgentsRecorded.size());
234+
for (String userAgent : fakeTransport.userAgentsRecorded) {
235+
assertTrue(
236+
"UserAgent header does not have expected value in requests",
237+
userAgent.contains(applicationName));
238+
}
239+
}
240+
210241
private static class GZipCheckerInitializer implements HttpRequestInitializer {
211242

212243
private boolean gzipDisabled;

0 commit comments

Comments
 (0)