mirror of https://github.com/apache/jclouds.git
issue 214. test uploading a large file
This commit is contained in:
parent
9ea446ac9f
commit
a13fd648c9
|
@ -20,6 +20,10 @@ package org.jclouds.http;
|
|||
|
||||
import static org.testng.Assert.assertEquals;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileOutputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.OutputStream;
|
||||
import java.net.MalformedURLException;
|
||||
import java.util.concurrent.ExecutionException;
|
||||
import java.util.concurrent.TimeoutException;
|
||||
|
@ -125,6 +129,35 @@ public abstract class BaseHttpCommandExecutorServiceIntegrationTest extends Base
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Tests sending a big file to the server.
|
||||
* Note: this is a heavy test, takes several minutes to finish.
|
||||
* @throws java.io.IOException
|
||||
*/
|
||||
@Test
|
||||
public void testUploadBigFile() throws IOException {
|
||||
String filename = "jclouds";
|
||||
OutputStream os = null;
|
||||
File f = null;
|
||||
try {
|
||||
//create a file, twice big as free heap memory
|
||||
f = File.createTempFile(filename, "tmp");
|
||||
f.deleteOnExit();
|
||||
long length = Runtime.getRuntime().freeMemory() * 2;
|
||||
os = new FileOutputStream(f.getAbsolutePath());
|
||||
for(long i = 0; i < length; i++) os.write('a');
|
||||
os.flush();
|
||||
os.close();
|
||||
|
||||
//upload and verify the response
|
||||
assertEquals(client.postWithMd5("fileso", f).trim(), "created");
|
||||
|
||||
} finally {
|
||||
if(os != null) os.close();
|
||||
if(f != null && f.exists()) f.delete();
|
||||
}
|
||||
}
|
||||
|
||||
protected AtomicInteger postFailures = new AtomicInteger();
|
||||
|
||||
@BeforeTest
|
||||
|
|
|
@ -39,6 +39,8 @@ import javax.ws.rs.core.HttpHeaders;
|
|||
import org.jclouds.PropertiesBuilder;
|
||||
import org.jclouds.concurrent.internal.SyncProxy;
|
||||
import org.jclouds.encryption.EncryptionService;
|
||||
import org.jclouds.encryption.internal.Base64;
|
||||
import org.jclouds.encryption.internal.JCEEncryptionService;
|
||||
import org.jclouds.lifecycle.Closer;
|
||||
import org.jclouds.rest.ConfiguresRestClient;
|
||||
import org.jclouds.rest.RestClientFactory;
|
||||
|
@ -188,9 +190,20 @@ public abstract class BaseJettyTest {
|
|||
if (failEveryTenRequests(request, response))
|
||||
return;
|
||||
if (request.getContentLength() > 0) {
|
||||
if(request.getHeader("Content-MD5") != null) {
|
||||
String expectedMd5 = request.getHeader("Content-MD5");
|
||||
String realMd5FromRequest = Base64.encodeBytes(new JCEEncryptionService().md5(request.getInputStream()));
|
||||
boolean matched = expectedMd5.equals(realMd5FromRequest);
|
||||
if(matched) {
|
||||
response.setContentType("text/xml");
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
response.getWriter().println("created");
|
||||
}
|
||||
} else {
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
response.getWriter().println(
|
||||
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
||||
}
|
||||
} else {
|
||||
handleAction(request, response);
|
||||
}
|
||||
|
@ -227,9 +240,20 @@ public abstract class BaseJettyTest {
|
|||
}
|
||||
} else if (request.getMethod().equals("POST")) {
|
||||
if (request.getContentLength() > 0) {
|
||||
if(request.getHeader("Content-MD5") != null) {
|
||||
String expectedMd5 = request.getHeader("Content-MD5");
|
||||
String realMd5FromRequest = Base64.encodeBytes(new JCEEncryptionService().md5(request.getInputStream()));
|
||||
boolean matched = expectedMd5.equals(realMd5FromRequest);
|
||||
if(matched) {
|
||||
response.setContentType("text/xml");
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
response.getWriter().println("created");
|
||||
}
|
||||
} else {
|
||||
response.setStatus(HttpServletResponse.SC_OK);
|
||||
response.getWriter().println(
|
||||
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
||||
}
|
||||
} else {
|
||||
handleAction(request, response);
|
||||
}
|
||||
|
|
|
@ -18,7 +18,11 @@
|
|||
*/
|
||||
package org.jclouds.http;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
import java.util.Collections;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.ws.rs.GET;
|
||||
|
@ -28,9 +32,16 @@ import javax.ws.rs.POST;
|
|||
import javax.ws.rs.PUT;
|
||||
import javax.ws.rs.Path;
|
||||
import javax.ws.rs.PathParam;
|
||||
import javax.ws.rs.core.HttpHeaders;
|
||||
|
||||
import com.google.common.base.Charsets;
|
||||
import com.google.common.base.Throwables;
|
||||
import com.google.common.io.ByteStreams;
|
||||
import org.jclouds.encryption.internal.Base64;
|
||||
import org.jclouds.encryption.internal.JCEEncryptionService;
|
||||
import org.jclouds.http.functions.ParseSax;
|
||||
import org.jclouds.http.options.HttpRequestOptions;
|
||||
import org.jclouds.rest.Binder;
|
||||
import org.jclouds.rest.annotations.BinderParam;
|
||||
import org.jclouds.rest.annotations.Endpoint;
|
||||
import org.jclouds.rest.annotations.ExceptionParser;
|
||||
|
@ -113,6 +124,23 @@ public interface IntegrationTestAsyncClient {
|
|||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("objects/{id}")
|
||||
ListenableFuture<String> postWithMd5(@PathParam("id") String id,
|
||||
@BinderParam(BindToFilePayload.class) File file);
|
||||
|
||||
static class BindToFilePayload implements Binder {
|
||||
@Override
|
||||
public void bindToRequest(HttpRequest request, Object payload) {
|
||||
File f = (File) payload;
|
||||
if (request.getFirstHeaderOrNull(HttpHeaders.CONTENT_TYPE) == null)
|
||||
request.getHeaders().put(HttpHeaders.CONTENT_TYPE, "application/unknown");
|
||||
request.getHeaders().replaceValues(HttpHeaders.CONTENT_LENGTH, Collections.singletonList(f.length() + ""));
|
||||
request.getHeaders().replaceValues("Content-MD5", Collections.singletonList(Base64.encodeBytes(new JCEEncryptionService().md5(f))));
|
||||
request.setPayload(f);
|
||||
}
|
||||
}
|
||||
|
||||
@POST
|
||||
@Path("objects/{id}")
|
||||
@MapBinder(BindToJsonPayload.class)
|
||||
|
|
|
@ -18,6 +18,7 @@
|
|||
*/
|
||||
package org.jclouds.http;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
|
@ -51,6 +52,8 @@ public interface IntegrationTestClient {
|
|||
|
||||
String postAsInputStream(String id, String toPut);
|
||||
|
||||
String postWithMd5(String id, File file);
|
||||
|
||||
String postJson(String id, String toPut);
|
||||
|
||||
String action(String id, String action, Map<String, String> options);
|
||||
|
|
Loading…
Reference in New Issue