@Override public <T, R extends ApiResponse<T>> PendingResult<T> handlePost( String hostName, String url, String payload, String userAgent, Class<R> clazz, FieldNamingPolicy fieldNamingPolicy, long errorTimeout, Integer maxRetries, ExceptionsAllowedToRetry exceptionsAllowedToRetry) { FetchOptions fetchOptions = FetchOptions.Builder.withDeadline(10); HTTPRequest req = null; try { req = new HTTPRequest(new URL(hostName + url), HTTPMethod.POST, fetchOptions); req.setHeader(new HTTPHeader("Content-Type", "application/json; charset=utf-8")); req.setPayload(payload.getBytes(UTF_8)); } catch (MalformedURLException e) { LOG.error("Request: {}{}", hostName, url, e); throw (new RuntimeException(e)); } return new GaePendingResult<>( req, client, clazz, fieldNamingPolicy, errorTimeout, maxRetries, exceptionsAllowedToRetry); }
HTTPRequest createPutRequest(final GcsRestCreationToken token, final ByteBuffer chunk, final boolean isFinalChunk, long timeoutMillis, final int length) { long offset = token.offset; Preconditions.checkArgument(offset % CHUNK_ALIGNMENT_BYTES == 0, "%s: Offset not aligned; offset=%s, length=%s, token=%s", this, offset, length, token); Preconditions.checkArgument(isFinalChunk || length % CHUNK_ALIGNMENT_BYTES == 0, "%s: Chunk not final and not aligned: offset=%s, length=%s, token=%s", this, offset, length, token); Preconditions.checkArgument(isFinalChunk || length > 0, "%s: Chunk empty and not final: offset=%s, length=%s, token=%s", this, offset, length, token); if (log.isLoggable(Level.FINEST)) { log.finest(this + ": About to write to " + token + " " + String.format("0x%x", length) + " bytes at offset " + String.format("0x%x", offset) + "; isFinalChunk: " + isFinalChunk + ")"); } long limit = offset + length; Map<String, String> queryStrings = Collections.singletonMap(UPLOAD_ID, token.uploadId); final HTTPRequest req = makeRequest(token.filename, queryStrings, PUT, timeoutMillis, chunk); req.setHeader( new HTTPHeader(CONTENT_RANGE, "bytes " + (length == 0 ? "*" : offset + "-" + (limit - 1)) + (isFinalChunk ? "/" + limit : "/*"))); return req; }
private void setContentTypeIfNotPresent(HttpRequestImpl request, HTTPRequest fetchRequest, ContentType contentType) { if (!request.getHeaders().containsKey(Header.ContentType)) { fetchRequest.setHeader(new HTTPHeader(Header.ContentType, contentType.value())); } }
private HTTPRequest createAuthorizeRequest(final HTTPRequest req) throws RetryHelperException { String token = RetryHelper.runWithRetries(new Callable<String>() { @Override public String call() { return getToken(); } }, RETRY_PARAMS, EXCEPTION_HANDLER); HTTPRequest request = URLFetchUtils.copyRequest(req); request.setHeader(new HTTPHeader("Authorization", "Bearer " + token)); return request; }
@Override public <T, R extends ApiResponse<T>> PendingResult<T> handlePost( String hostName, String url, String payload, String userAgent, Class<R> clazz, FieldNamingPolicy fieldNamingPolicy, long errorTimeout, Integer maxRetries, ExceptionsAllowedToRetry exceptionsAllowedToRetry) { FetchOptions fetchOptions = FetchOptions.Builder.withDeadline(10); HTTPRequest req = null; try { req = new HTTPRequest(new URL(hostName + url), HTTPMethod.POST, fetchOptions); req.setHeader(new HTTPHeader("Content-Type", "application/json; charset=utf-8")); req.setPayload(payload.getBytes(UTF_8)); } catch (MalformedURLException e) { LOG.error("Request: {}{}", hostName, url, e); throw (new RuntimeException(e)); } return new GaePendingResult<>( req, client, clazz, fieldNamingPolicy, errorTimeout, maxRetries, exceptionsAllowedToRetry); }
private void addOptionsHeaders(HTTPRequest req, GcsFileOptions options) { if (options == null) { return; } if (options.getMimeType() != null) { req.setHeader(new HTTPHeader(CONTENT_TYPE, options.getMimeType())); } if (options.getAcl() != null) { req.setHeader(new HTTPHeader(ACL, options.getAcl())); } if (options.getCacheControl() != null) { req.setHeader(new HTTPHeader(CACHE_CONTROL, options.getCacheControl())); } if (options.getContentDisposition() != null) { req.setHeader(new HTTPHeader(CONTENT_DISPOSITION, options.getContentDisposition())); } if (options.getContentEncoding() != null) { req.setHeader(new HTTPHeader(CONTENT_ENCODING, options.getContentEncoding())); } for (Entry<String, String> entry : options.getUserMetadata().entrySet()) { req.setHeader(new HTTPHeader(X_GOOG_META + entry.getKey(), entry.getValue())); } }
@VisibleForTesting HTTPRequest makeRequest(GcsFilename filename, @Nullable Map<String, String> queryStrings, HTTPMethod method, long timeoutMillis, byte[] payload) { HTTPRequest request = new HTTPRequest(makeUrl(filename, queryStrings), method, FetchOptions.Builder.disallowTruncate() .doNotFollowRedirects() .validateCertificate() .setDeadline(timeoutMillis / 1000.0)); for (HTTPHeader header : headers) { request.addHeader(header); } request.addHeader(USER_AGENT); if (payload != null && payload.length > 0) { request.setHeader(new HTTPHeader(CONTENT_LENGTH, String.valueOf(payload.length))); try { request.setHeader(new HTTPHeader(CONTENT_MD5, BaseEncoding.base64().encode(MessageDigest.getInstance("MD5").digest(payload)))); } catch (NoSuchAlgorithmException e) { log.severe( "Unable to get a MessageDigest instance, no Content-MD5 header sent.\n" + e.toString()); } request.setPayload(payload); } else { request.setHeader(ZERO_CONTENT_LENGTH); } return request; }
req.setHeader( new HTTPHeader(RANGE, "bytes=" + startOffsetBytes + "-" + (startOffsetBytes + want - 1))); final HTTPRequestInfo info = new HTTPRequestInfo(req);
@Override public RawGcsCreationToken beginObjectCreation( GcsFilename filename, GcsFileOptions options, long timeoutMillis) throws IOException { HTTPRequest req = makeRequest(filename, null, POST, timeoutMillis); req.setHeader(RESUMABLE_HEADER); addOptionsHeaders(req, options); HTTPResponse resp; try { resp = urlfetch.fetch(req); } catch (IOException e) { throw createIOException(new HTTPRequestInfo(req), e); } if (resp.getResponseCode() == 201) { String location = URLFetchUtils.getSingleHeader(resp, LOCATION); String queryString = new URL(location).getQuery(); Preconditions.checkState( queryString != null, LOCATION + " header," + location + ", witout a query string"); Map<String, String> params = Splitter.on('&').withKeyValueSeparator('=').split(queryString); Preconditions.checkState(params.containsKey(UPLOAD_ID), LOCATION + " header," + location + ", has a query string without " + UPLOAD_ID); return new GcsRestCreationToken(filename, params.get(UPLOAD_ID), 0); } else { throw HttpErrorHandler.error(new HTTPRequestInfo(req), resp); } }
private void addBody(HttpRequestImpl request, HTTPRequest fetchRequest, boolean createFormPostIfBodyIsEmpty) { byte[] data = null; try { Object body = request.getBody(); if (body == null && createFormPostIfBodyIsEmpty) { body = createFormPostBody(request); } if (isMultipart(request)) { HttpEntity multipart = prepareMultipart(request); ByteArrayOutputStream baos = new ByteArrayOutputStream(4096); multipart.writeTo(baos); data = baos.toByteArray(); fetchRequest.setHeader(new HTTPHeader(Header.ContentType, multipart.getContentType().getValue())); } else if (body != null) { InputStream is = convertOutgoing(body); data = Streams.readBytes(is); } } catch (Exception e) { throw new HttpException(e, "Failed to generate request body: %s", e.getMessage()); } if (data != null) { fetchRequest.setPayload(data); } }
@Override public void copyObject(GcsFilename source, GcsFilename dest, GcsFileOptions fileOptions, long timeoutMillis) throws IOException { HTTPRequest req = makeRequest(dest, null, PUT, timeoutMillis); req.setHeader(new HTTPHeader(X_GOOG_COPY_SOURCE, makePath(source))); if (fileOptions != null) { req.setHeader(REPLACE_METADATA_HEADER); addOptionsHeaders(req, fileOptions); } HTTPResponse resp; try { resp = urlfetch.fetch(req); } catch (IOException e) { throw createIOException(new HTTPRequestInfo(req), e); } if (resp.getResponseCode() != 200) { throw HttpErrorHandler.error(new HTTPRequestInfo(req), resp); } }
@Test public void testPayload() throws Exception { URLFetchService service = URLFetchServiceFactory.getURLFetchService(); URL url = getFetchUrl(); HTTPRequest req = new HTTPRequest(url, HTTPMethod.POST); req.setHeader(new HTTPHeader("Content-Type", "application/octet-stream")); req.setPayload("Tralala".getBytes(UTF_8)); HTTPResponse response = service.fetch(req); String content = new String(response.getContent()); Assert.assertEquals("Hopsasa", content); }
@Test public void testHeaders() throws Exception { URLFetchService service = URLFetchServiceFactory.getURLFetchService(); URL url = getFetchUrl(); HTTPRequest req = new HTTPRequest(url, HTTPMethod.POST); req.setHeader(new HTTPHeader("Content-Type", "application/octet-stream")); req.setPayload("Headers!".getBytes(UTF_8)); HTTPResponse response = service.fetch(req); boolean found = false; List<HTTPHeader> headers = response.getHeadersUncombined(); for (HTTPHeader h : headers) { if (h.getName().equals("ABC")) { Assert.assertEquals("123", h.getValue()); found = true; break; } } Assert.assertTrue("Cannot find matching header <ABC : 123>: " + headers, found); found = false; headers = response.getHeaders(); for (HTTPHeader h : headers) { if (h.getName().equals("XYZ")) { Assert.assertEquals("1, 2, 3", h.getValue()); found = true; break; } } Assert.assertTrue("Cannot find matching header <XYZ : 1,2,3>: " + headers, found); }