/* * The Alluxio Open Foundation licenses this work under the Apache License, version 2.0 * (the "License"). You may not use this work except in compliance with the License, which is * available at www.apache.org/licenses/LICENSE-2.0 * * This software is distributed on an "AS IS" basis, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, * either express or implied, as more fully set forth in the License. * * See the NOTICE file distributed with this work for information regarding copyright ownership. */ package alluxio.underfs.swift.http; import alluxio.underfs.swift.SwiftOutputStream; import org.javaswift.joss.model.Access; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.IOException; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import javax.annotation.concurrent.ThreadSafe; /** * Makes direct calls to a Swift API backend. This is needed to bypass certain limitations in the * JOSS package. */ @ThreadSafe public class SwiftDirectClient { private static final Logger LOG = LoggerFactory.getLogger(SwiftDirectClient.class); private static final int HTTP_READ_TIMEOUT = 100 * 1000; private static final int HTTP_CHUNK_STREAMING = 8 * 1024 * 1024; /** * Constructs a new {@link SwiftDirectClient}. */ public SwiftDirectClient() {} /** * Swift HTTP PUT request. * * @param access JOSS access object * @param objectName name of the object to create * @return SwiftOutputStream that will be used to upload data to Swift */ public static SwiftOutputStream put(Access access, String objectName) throws IOException { LOG.debug("PUT method, object : {}", objectName); URL url = new URL(access.getPublicURL() + "/" + objectName); URLConnection connection = url.openConnection(); if (!(connection instanceof HttpURLConnection)) { throw new IOException("Connection is not an instance of HTTP URL Connection"); } HttpURLConnection httpCon = (HttpURLConnection) connection; httpCon.setRequestMethod("PUT"); httpCon.addRequestProperty("X-Auth-Token", access.getToken()); httpCon.addRequestProperty("Content-Type", "binary/octet-stream"); httpCon.setDoInput(true); httpCon.setRequestProperty("Connection", "close"); httpCon.setReadTimeout(HTTP_READ_TIMEOUT); httpCon.setRequestProperty("Transfer-Encoding", "chunked"); httpCon.setDoOutput(true); httpCon.setChunkedStreamingMode(HTTP_CHUNK_STREAMING); httpCon.connect(); return new SwiftOutputStream(httpCon); } }