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 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.net.MalformedURLException;
|
||||||
import java.util.concurrent.ExecutionException;
|
import java.util.concurrent.ExecutionException;
|
||||||
import java.util.concurrent.TimeoutException;
|
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();
|
protected AtomicInteger postFailures = new AtomicInteger();
|
||||||
|
|
||||||
@BeforeTest
|
@BeforeTest
|
||||||
|
|
|
@ -39,6 +39,8 @@ import javax.ws.rs.core.HttpHeaders;
|
||||||
import org.jclouds.PropertiesBuilder;
|
import org.jclouds.PropertiesBuilder;
|
||||||
import org.jclouds.concurrent.internal.SyncProxy;
|
import org.jclouds.concurrent.internal.SyncProxy;
|
||||||
import org.jclouds.encryption.EncryptionService;
|
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.lifecycle.Closer;
|
||||||
import org.jclouds.rest.ConfiguresRestClient;
|
import org.jclouds.rest.ConfiguresRestClient;
|
||||||
import org.jclouds.rest.RestClientFactory;
|
import org.jclouds.rest.RestClientFactory;
|
||||||
|
@ -188,9 +190,20 @@ public abstract class BaseJettyTest {
|
||||||
if (failEveryTenRequests(request, response))
|
if (failEveryTenRequests(request, response))
|
||||||
return;
|
return;
|
||||||
if (request.getContentLength() > 0) {
|
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.setStatus(HttpServletResponse.SC_OK);
|
||||||
response.getWriter().println(
|
response.getWriter().println(
|
||||||
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
handleAction(request, response);
|
handleAction(request, response);
|
||||||
}
|
}
|
||||||
|
@ -227,9 +240,20 @@ public abstract class BaseJettyTest {
|
||||||
}
|
}
|
||||||
} else if (request.getMethod().equals("POST")) {
|
} else if (request.getMethod().equals("POST")) {
|
||||||
if (request.getContentLength() > 0) {
|
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.setStatus(HttpServletResponse.SC_OK);
|
||||||
response.getWriter().println(
|
response.getWriter().println(
|
||||||
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
Utils.toStringAndClose(request.getInputStream()) + "POST");
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
handleAction(request, response);
|
handleAction(request, response);
|
||||||
}
|
}
|
||||||
|
|
|
@ -18,7 +18,11 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.ws.rs.GET;
|
import javax.ws.rs.GET;
|
||||||
|
@ -28,9 +32,16 @@ import javax.ws.rs.POST;
|
||||||
import javax.ws.rs.PUT;
|
import javax.ws.rs.PUT;
|
||||||
import javax.ws.rs.Path;
|
import javax.ws.rs.Path;
|
||||||
import javax.ws.rs.PathParam;
|
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.functions.ParseSax;
|
||||||
import org.jclouds.http.options.HttpRequestOptions;
|
import org.jclouds.http.options.HttpRequestOptions;
|
||||||
|
import org.jclouds.rest.Binder;
|
||||||
import org.jclouds.rest.annotations.BinderParam;
|
import org.jclouds.rest.annotations.BinderParam;
|
||||||
import org.jclouds.rest.annotations.Endpoint;
|
import org.jclouds.rest.annotations.Endpoint;
|
||||||
import org.jclouds.rest.annotations.ExceptionParser;
|
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
|
@POST
|
||||||
@Path("objects/{id}")
|
@Path("objects/{id}")
|
||||||
@MapBinder(BindToJsonPayload.class)
|
@MapBinder(BindToJsonPayload.class)
|
||||||
|
|
|
@ -18,6 +18,7 @@
|
||||||
*/
|
*/
|
||||||
package org.jclouds.http;
|
package org.jclouds.http;
|
||||||
|
|
||||||
|
import java.io.File;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.TimeUnit;
|
import java.util.concurrent.TimeUnit;
|
||||||
|
@ -51,6 +52,8 @@ public interface IntegrationTestClient {
|
||||||
|
|
||||||
String postAsInputStream(String id, String toPut);
|
String postAsInputStream(String id, String toPut);
|
||||||
|
|
||||||
|
String postWithMd5(String id, File file);
|
||||||
|
|
||||||
String postJson(String id, String toPut);
|
String postJson(String id, String toPut);
|
||||||
|
|
||||||
String action(String id, String action, Map<String, String> options);
|
String action(String id, String action, Map<String, String> options);
|
||||||
|
|
Loading…
Reference in New Issue