List of usage examples for io.netty.handler.codec.http.multipart HttpPostRequestEncoder readChunk
@Override public HttpContent readChunk(ByteBufAllocator allocator) throws Exception
From source file:com.github.ambry.rest.NettyMessageProcessorTest.java
License:Open Source License
/** * Tests the case where multipart upload is used. * @throws Exception// w ww .j a v a 2 s . com */ @Test public void multipartPostTest() throws Exception { Random random = new Random(); ByteBuffer content = ByteBuffer.wrap(RestTestUtils.getRandomBytes(random.nextInt(128) + 128)); HttpRequest httpRequest = RestTestUtils.createRequest(HttpMethod.POST, "/", null); HttpHeaders.setHeader(httpRequest, RestUtils.Headers.SERVICE_ID, "rawBytesPostTest"); HttpHeaders.setHeader(httpRequest, RestUtils.Headers.BLOB_SIZE, content.remaining()); HttpPostRequestEncoder encoder = createEncoder(httpRequest, content); HttpRequest postRequest = encoder.finalizeRequest(); List<ByteBuffer> contents = new ArrayList<ByteBuffer>(); while (!encoder.isEndOfInput()) { // Sending null for ctx because the encoder is OK with that. contents.add(encoder.readChunk(null).content().nioBuffer()); } ByteBuffer receivedContent = doPostTest(postRequest, contents); compareContent(receivedContent, Collections.singletonList(content)); }
From source file:com.github.ambry.rest.NettyMultipartRequestTest.java
License:Open Source License
/** * Tests different scenarios with {@link NettyMultipartRequest#prepare()}. * Currently tests:// ww w .ja v a 2 s. c o m * 1. Idempotency of {@link NettyMultipartRequest#prepare()}. * 2. Exception scenarios of {@link NettyMultipartRequest#prepare()}. * @throws Exception */ @Test public void prepareTest() throws Exception { // prepare half baked data HttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/"); HttpPostRequestEncoder encoder = createEncoder(httpRequest, null); NettyMultipartRequest request = new NettyMultipartRequest(encoder.finalizeRequest(), nettyMetrics); assertTrue("Request channel is not open", request.isOpen()); // insert random data HttpContent httpContent = new DefaultHttpContent(Unpooled.wrappedBuffer(RestTestUtils.getRandomBytes(10))); request.addContent(httpContent); // prepare should fail try { request.prepare(); fail("Preparing request should have failed"); } catch (HttpPostRequestDecoder.NotEnoughDataDecoderException e) { assertEquals("Reference count is not as expected", 1, httpContent.refCnt()); } finally { closeRequestAndValidate(request); } // more than one blob part HttpHeaders httpHeaders = new DefaultHttpHeaders(); httpHeaders.set(RestUtils.Headers.BLOB_SIZE, 256); InMemoryFile[] files = new InMemoryFile[2]; files[0] = new InMemoryFile(RestUtils.MultipartPost.BLOB_PART, ByteBuffer.wrap(RestTestUtils.getRandomBytes(256))); files[1] = new InMemoryFile(RestUtils.MultipartPost.BLOB_PART, ByteBuffer.wrap(RestTestUtils.getRandomBytes(256))); request = createRequest(httpHeaders, files); assertEquals("Request size does not match", 256, request.getSize()); try { request.prepare(); fail("Prepare should have failed because there was more than one " + RestUtils.MultipartPost.BLOB_PART); } catch (RestServiceException e) { assertEquals("Unexpected RestServiceErrorCode", RestServiceErrorCode.MalformedRequest, e.getErrorCode()); } finally { closeRequestAndValidate(request); } // more than one part named "part-1" files = new InMemoryFile[2]; files[0] = new InMemoryFile("Part-1", ByteBuffer.wrap(RestTestUtils.getRandomBytes(256))); files[1] = new InMemoryFile("Part-1", ByteBuffer.wrap(RestTestUtils.getRandomBytes(256))); request = createRequest(null, files); try { request.prepare(); fail("Prepare should have failed because there was more than one part named Part-1"); } catch (RestServiceException e) { assertEquals("Unexpected RestServiceErrorCode", RestServiceErrorCode.MalformedRequest, e.getErrorCode()); } finally { closeRequestAndValidate(request); } // size of blob does not match the advertized size httpHeaders = new DefaultHttpHeaders(); httpHeaders.set(RestUtils.Headers.BLOB_SIZE, 256); files = new InMemoryFile[1]; files[0] = new InMemoryFile(RestUtils.MultipartPost.BLOB_PART, ByteBuffer.wrap(RestTestUtils.getRandomBytes(128))); request = createRequest(httpHeaders, files); try { request.prepare(); fail("Prepare should have failed because there was more than one " + RestUtils.MultipartPost.BLOB_PART); } catch (RestServiceException e) { assertEquals("Unexpected RestServiceErrorCode", RestServiceErrorCode.BadRequest, e.getErrorCode()); } finally { closeRequestAndValidate(request); } // non fileupload (file attribute present) httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/"); HttpHeaders.setHeader(httpRequest, RestUtils.Headers.BLOB_SIZE, 256); files = new InMemoryFile[1]; files[0] = new InMemoryFile(RestUtils.MultipartPost.BLOB_PART, ByteBuffer.wrap(RestTestUtils.getRandomBytes(256))); encoder = createEncoder(httpRequest, files); encoder.addBodyAttribute("dummyKey", "dummyValue"); request = new NettyMultipartRequest(encoder.finalizeRequest(), nettyMetrics); assertTrue("Request channel is not open", request.isOpen()); while (!encoder.isEndOfInput()) { // Sending null for ctx because the encoder is OK with that. request.addContent(encoder.readChunk(null)); } try { request.prepare(); fail("Prepare should have failed because there was non fileupload"); } catch (RestServiceException e) { assertEquals("Unexpected RestServiceErrorCode", RestServiceErrorCode.BadRequest, e.getErrorCode()); } finally { closeRequestAndValidate(request); } }
From source file:com.github.ambry.rest.NettyMultipartRequestTest.java
License:Open Source License
/** * Creates a {@link NettyMultipartRequest} with the given {@code headers} and {@code parts}. * @param headers the {@link HttpHeaders} that need to be added to the request. * @param parts the files that will form the parts of the request. * @return a {@link NettyMultipartRequest} containing all the {@code headers} and {@code parts}. * @throws Exception//from w w w. ja v a 2 s. com */ private NettyMultipartRequest createRequest(HttpHeaders headers, InMemoryFile[] parts) throws Exception { HttpRequest httpRequest = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, HttpMethod.POST, "/"); if (headers != null) { httpRequest.headers().set(headers); } HttpPostRequestEncoder encoder = createEncoder(httpRequest, parts); NettyMultipartRequest request = new NettyMultipartRequest(encoder.finalizeRequest(), nettyMetrics); assertTrue("Request channel is not open", request.isOpen()); while (!encoder.isEndOfInput()) { // Sending null for ctx because the encoder is OK with that. request.addContent(encoder.readChunk(null)); } return request; }
From source file:io.vertx.ext.web.client.impl.HttpRequestImpl.java
License:Open Source License
private void send(String contentType, Object body, Handler<AsyncResult<HttpResponse<T>>> handler) { Future<HttpClientResponse> responseFuture = Future.<HttpClientResponse>future().setHandler(ar -> { if (ar.succeeded()) { HttpClientResponse resp = ar.result(); Future<HttpResponse<T>> fut = Future.future(); fut.setHandler(handler);//from ww w .j ava 2 s . c o m resp.exceptionHandler(err -> { if (!fut.isComplete()) { fut.fail(err); } }); resp.pause(); codec.create(ar2 -> { resp.resume(); if (ar2.succeeded()) { BodyStream<T> stream = ar2.result(); stream.exceptionHandler(err -> { if (!fut.isComplete()) { fut.fail(err); } }); resp.endHandler(v -> { if (!fut.isComplete()) { stream.end(); if (stream.result().succeeded()) { fut.complete(new HttpResponseImpl<>(resp, null, stream.result().result())); } else { fut.fail(stream.result().cause()); } } }); Pump responsePump = Pump.pump(resp, stream); responsePump.start(); } else { handler.handle(Future.failedFuture(ar2.cause())); } }); } else { handler.handle(Future.failedFuture(ar.cause())); } }); HttpClientRequest req; String requestURI; if (params != null && params.size() > 0) { QueryStringEncoder enc = new QueryStringEncoder(uri); params.forEach(param -> { enc.addParam(param.getKey(), param.getValue()); }); requestURI = enc.toString(); } else { requestURI = uri; } if (ssl != options.isSsl()) { req = client.request(method, new RequestOptions().setSsl(ssl).setHost(host).setPort(port).setURI(requestURI)); } else { req = client.request(method, port, host, requestURI); } req.setFollowRedirects(followRedirects); if (headers != null) { req.headers().addAll(headers); } req.exceptionHandler(err -> { if (!responseFuture.isComplete()) { responseFuture.fail(err); } }); req.handler(resp -> { if (!responseFuture.isComplete()) { responseFuture.complete(resp); } }); if (timeout > 0) { req.setTimeout(timeout); } if (body != null) { if (contentType != null) { String prev = req.headers().get(HttpHeaders.CONTENT_TYPE); if (prev == null) { req.putHeader(HttpHeaders.CONTENT_TYPE, contentType); } else { contentType = prev; } } if (body instanceof ReadStream<?>) { ReadStream<Buffer> stream = (ReadStream<Buffer>) body; if (headers == null || !headers.contains(HttpHeaders.CONTENT_LENGTH)) { req.setChunked(true); } Pump pump = Pump.pump(stream, req); stream.exceptionHandler(err -> { req.reset(); if (!responseFuture.isComplete()) { responseFuture.fail(err); } }); stream.endHandler(v -> { pump.stop(); req.end(); }); pump.start(); } else { Buffer buffer; if (body instanceof Buffer) { buffer = (Buffer) body; } else if (body instanceof MultiMap) { try { MultiMap attributes = (MultiMap) body; boolean multipart = "multipart/form-data".equals(contentType); DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, io.netty.handler.codec.http.HttpMethod.POST, "/"); HttpPostRequestEncoder encoder = new HttpPostRequestEncoder(request, multipart); for (Map.Entry<String, String> attribute : attributes) { encoder.addBodyAttribute(attribute.getKey(), attribute.getValue()); } encoder.finalizeRequest(); for (String headerName : request.headers().names()) { req.putHeader(headerName, request.headers().get(headerName)); } if (encoder.isChunked()) { buffer = Buffer.buffer(); while (true) { HttpContent chunk = encoder.readChunk(new UnpooledByteBufAllocator(false)); ByteBuf content = chunk.content(); if (content.readableBytes() == 0) { break; } buffer.appendBuffer(Buffer.buffer(content)); } } else { ByteBuf content = request.content(); buffer = Buffer.buffer(content); } } catch (Exception e) { throw new VertxException(e); } } else if (body instanceof JsonObject) { buffer = Buffer.buffer(((JsonObject) body).encode()); } else { buffer = Buffer.buffer(Json.encode(body)); } req.end(buffer); } } else { req.end(); } }
From source file:io.vertx.webclient.impl.HttpRequestImpl.java
License:Open Source License
private <R> void send(String contentType, Object body, BodyCodec<R> codec, Handler<AsyncResult<HttpResponse<R>>> handler) { Future<HttpClientResponse> responseFuture = Future.<HttpClientResponse>future().setHandler(ar -> { if (ar.succeeded()) { HttpClientResponse resp = ar.result(); Future<HttpResponse<R>> fut = Future.future(); fut.setHandler(handler);/*from ww w . j a v a 2s . c o m*/ resp.exceptionHandler(err -> { if (!fut.isComplete()) { fut.fail(err); } }); resp.pause(); codec.create(ar2 -> { resp.resume(); if (ar2.succeeded()) { BodyStream<R> stream = ar2.result(); stream.exceptionHandler(err -> { if (!fut.isComplete()) { fut.fail(err); } }); resp.endHandler(v -> { if (!fut.isComplete()) { stream.end(); if (stream.result().succeeded()) { fut.complete(new HttpResponseImpl<>(resp, null, stream.result().result())); } else { fut.fail(stream.result().cause()); } } }); Pump responsePump = Pump.pump(resp, stream); responsePump.start(); } else { handler.handle(Future.failedFuture(ar2.cause())); } }); } else { handler.handle(Future.failedFuture(ar.cause())); } }); HttpClientRequest req; String requestURI; if (params != null && params.size() > 0) { QueryStringEncoder enc = new QueryStringEncoder(uri); params.forEach(param -> { enc.addParam(param.getKey(), param.getValue()); }); requestURI = enc.toString(); } else { requestURI = uri; } if (port != -1) { if (host != null) { req = client.request(method, port, host, requestURI); } else { throw new IllegalStateException("Both host and port must be set with an explicit port"); } } else { if (host != null) { req = client.request(method, host, requestURI); } else { req = client.request(method, requestURI); } } if (headers != null) { req.headers().addAll(headers); } req.exceptionHandler(err -> { if (!responseFuture.isComplete()) { responseFuture.fail(err); } }); req.handler(resp -> { if (!responseFuture.isComplete()) { responseFuture.complete(resp); } }); if (timeout > 0) { req.setTimeout(timeout); } if (body != null) { if (contentType != null) { String prev = req.headers().get(HttpHeaders.CONTENT_TYPE); if (prev == null) { req.putHeader(HttpHeaders.CONTENT_TYPE, contentType); } else { contentType = prev; } } if (body instanceof ReadStream<?>) { ReadStream<Buffer> stream = (ReadStream<Buffer>) body; if (headers == null || !headers.contains(HttpHeaders.CONTENT_LENGTH)) { req.setChunked(true); } Pump pump = Pump.pump(stream, req); stream.exceptionHandler(err -> { req.reset(); if (!responseFuture.isComplete()) { responseFuture.fail(err); } }); stream.endHandler(v -> { pump.stop(); req.end(); }); pump.start(); } else { Buffer buffer; if (body instanceof Buffer) { buffer = (Buffer) body; } else if (body instanceof MultiMap) { try { MultiMap attributes = (MultiMap) body; boolean multipart = "multipart/form-data".equals(contentType); DefaultFullHttpRequest request = new DefaultFullHttpRequest(HttpVersion.HTTP_1_1, io.netty.handler.codec.http.HttpMethod.POST, "/"); HttpPostRequestEncoder encoder = new HttpPostRequestEncoder(request, multipart); for (Map.Entry<String, String> attribute : attributes) { encoder.addBodyAttribute(attribute.getKey(), attribute.getValue()); } encoder.finalizeRequest(); for (String headerName : request.headers().names()) { req.putHeader(headerName, request.headers().get(headerName)); } if (encoder.isChunked()) { buffer = Buffer.buffer(); while (true) { HttpContent chunk = encoder.readChunk(new UnpooledByteBufAllocator(false)); ByteBuf content = chunk.content(); if (content.readableBytes() == 0) { break; } buffer.appendBuffer(Buffer.buffer(content)); } } else { ByteBuf content = request.content(); buffer = Buffer.buffer(content); } } catch (Exception e) { throw new VertxException(e); } } else if (body instanceof JsonObject) { buffer = Buffer.buffer(((JsonObject) body).encode()); } else { buffer = Buffer.buffer(Json.encode(body)); } req.end(buffer); } } else { req.end(); } }
From source file:org.ballerinalang.stdlib.utils.MultipartUtils.java
License:Open Source License
/** * Read http content chunk by chunk from netty encoder and add it to carbon message. * * @param httpRequestMsg Represent carbon message that the content should be added to * @param nettyEncoder Represent netty encoder that holds the actual http content * @throws Exception In case content cannot be read from netty encoder *///from w w w . j a v a2 s . c o m private static void addMultipartsToCarbonMessage(HttpCarbonMessage httpRequestMsg, HttpPostRequestEncoder nettyEncoder) throws Exception { while (!nettyEncoder.isEndOfInput()) { httpRequestMsg.addHttpContent(nettyEncoder.readChunk(ByteBufAllocator.DEFAULT)); } nettyEncoder.cleanFiles(); }