use of io.netty.handler.codec.http.HttpContent in project vertx-web by vert-x3.
the class HttpContext method sendRequest.
private void sendRequest() {
Future<HttpClientResponse> responseFuture = Future.<HttpClientResponse>future().setHandler(ar -> {
Context context = Vertx.currentContext();
if (ar.succeeded()) {
HttpClientResponse resp = ar.result();
Future<HttpResponse<Object>> fut = Future.future();
fut.setHandler(r -> {
// We are running on a context (the HTTP client mandates it)
context.runOnContext(v -> currentResponseHandler.handle(r));
});
resp.exceptionHandler(err -> {
if (!fut.isComplete()) {
fut.fail(err);
}
});
resp.pause();
((BodyCodec<Object>) request.codec).create(ar2 -> {
resp.resume();
if (ar2.succeeded()) {
BodyStream<Object> 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 {
currentResponseHandler.handle(Future.failedFuture(ar2.cause()));
}
});
} else {
currentResponseHandler.handle(Future.failedFuture(ar.cause()));
}
});
HttpClientRequest req;
String requestURI;
if (request.queryParams() != null && request.queryParams().size() > 0) {
QueryStringEncoder enc = new QueryStringEncoder(request.uri);
request.queryParams().forEach(param -> enc.addParam(param.getKey(), param.getValue()));
requestURI = enc.toString();
} else {
requestURI = request.uri;
}
int port = request.port;
String host = request.host;
if (request.ssl != request.options.isSsl()) {
req = request.client.client.request(request.method, new RequestOptions().setSsl(request.ssl).setHost(host).setPort(port).setURI(requestURI));
} else {
if (request.protocol != null && !request.protocol.equals("http") && !request.protocol.equals("https")) {
// we have to create an abs url again to parse it in HttpClient
try {
URI uri = new URI(request.protocol, null, host, port, requestURI, null, null);
req = request.client.client.requestAbs(request.method, uri.toString());
} catch (URISyntaxException ex) {
currentResponseHandler.handle(Future.failedFuture(ex));
return;
}
} else {
req = request.client.client.request(request.method, port, host, requestURI);
}
}
if (request.virtualHost != null) {
String virtalHost = request.virtualHost;
if (port != 80) {
virtalHost += ":" + port;
}
req.setHost(virtalHost);
}
req.setFollowRedirects(request.followRedirects);
if (request.headers != null) {
req.headers().addAll(request.headers);
}
req.handler(responseFuture::tryComplete);
if (request.timeout > 0) {
req.setTimeout(request.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 (request.headers == null || !request.headers.contains(HttpHeaders.CONTENT_LENGTH)) {
req.setChunked(true);
}
Pump pump = Pump.pump(stream, req);
req.exceptionHandler(err -> {
pump.stop();
stream.endHandler(null);
stream.resume();
responseFuture.tryFail(err);
});
stream.exceptionHandler(err -> {
req.reset();
responseFuture.tryFail(err);
});
stream.endHandler(v -> {
req.exceptionHandler(responseFuture::tryFail);
req.end();
pump.stop();
});
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.exceptionHandler(responseFuture::tryFail);
req.end(buffer);
}
} else {
req.exceptionHandler(responseFuture::tryFail);
req.end();
}
}
use of io.netty.handler.codec.http.HttpContent in project sidewinder by srotya.
the class HTTPDataPointDecoder method channelRead0.
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) throws Exception {
try {
if (ResourceMonitor.getInstance().isReject()) {
logger.warning("Write rejected, insufficient memory");
if (writeResponse(request, ctx)) {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
return;
}
if (msg instanceof HttpRequest) {
HttpRequest request = this.request = (HttpRequest) msg;
if (HttpUtil.is100ContinueExpected(request)) {
send100Continue(ctx);
}
QueryStringDecoder queryStringDecoder = new QueryStringDecoder(request.uri());
path = queryStringDecoder.path();
Map<String, List<String>> params = queryStringDecoder.parameters();
if (!params.isEmpty()) {
for (Entry<String, List<String>> p : params.entrySet()) {
String key = p.getKey();
if (key.equalsIgnoreCase("db")) {
dbName = p.getValue().get(0);
}
}
}
if (path != null && path.contains("query")) {
Gson gson = new Gson();
JsonObject obj = new JsonObject();
JsonArray ary = new JsonArray();
ary.add(new JsonObject());
obj.add("results", ary);
responseString.append(gson.toJson(obj));
}
}
if (msg instanceof HttpContent) {
HttpContent httpContent = (HttpContent) msg;
ByteBuf byteBuf = httpContent.content();
if (byteBuf.isReadable()) {
requestBuffer.append(byteBuf.toString(CharsetUtil.UTF_8));
}
if (msg instanceof LastHttpContent) {
if (dbName == null) {
responseString.append("Invalid database null");
logger.severe("Invalid database null");
} else {
String payload = requestBuffer.toString();
logger.fine("Request:" + payload);
List<Point> dps = InfluxDecoder.pointsFromString(dbName, payload);
meter.inc(dps.size());
for (Point dp : dps) {
try {
engine.writeDataPointWithLock(dp, false);
logger.fine("Accepted:" + dp + "\t" + new Date(dp.getTimestamp()));
} catch (IOException e) {
logger.fine("Dropped:" + dp + "\t" + e.getMessage());
responseString.append("Dropped:" + dp);
}
}
}
if (writeResponse(request, ctx)) {
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
use of io.netty.handler.codec.http.HttpContent in project vertx-web by vert-x3.
the class MultipartFormUpload method run.
public void run() {
if (Vertx.currentContext() != context) {
throw new IllegalArgumentException();
}
while (!ended) {
if (encoder.isChunked()) {
try {
HttpContent chunk = encoder.readChunk(ALLOC);
ByteBuf content = chunk.content();
Buffer buff = Buffer.buffer(content);
boolean writable = pending.write(buff);
if (encoder.isEndOfInput()) {
ended = true;
request = null;
encoder = null;
pending.write(InboundBuffer.END_SENTINEL);
} else if (!writable) {
break;
}
} catch (Exception e) {
ended = true;
request = null;
encoder = null;
pending.write(e);
break;
}
} else {
ByteBuf content = request.content();
Buffer buffer = Buffer.buffer(content);
request = null;
encoder = null;
pending.write(buffer);
ended = true;
pending.write(InboundBuffer.END_SENTINEL);
}
}
}
use of io.netty.handler.codec.http.HttpContent in project incubator-pulsar by apache.
the class NettyHttpServerHandler method channelRead0.
@Override
protected void channelRead0(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
HttpRequest request = this.request = (HttpRequest) msg;
if (HttpUtil.is100ContinueExpected(request)) {
send100Continue(ctx);
}
}
if (msg instanceof HttpContent) {
HttpContent httpContent = (HttpContent) msg;
ByteBuf content = httpContent.content();
if (content.isReadable()) {
nettySource.consume(new NettyHttpRecord(Optional.ofNullable(""), content.toString(CharsetUtil.UTF_8).getBytes(CharsetUtil.UTF_8)));
}
if (msg instanceof LastHttpContent) {
LastHttpContent trailer = (LastHttpContent) msg;
if (!writeResponse(trailer, ctx)) {
// If keep-alive is off, close the connection once the content is fully written.
ctx.writeAndFlush(Unpooled.EMPTY_BUFFER).addListener(ChannelFutureListener.CLOSE);
}
}
}
}
use of io.netty.handler.codec.http.HttpContent in project com.revolsys.open by revolsys.
the class ODataNettyHandlerImpl method fillODataRequest.
/**
* Extract the information part of Netty Request and fill OData Request
* @param odRequest
* @param httpRequest
* @param split
* @param contextPath
* @return
* @throws ODataLibraryException
*/
private ODataRequest fillODataRequest(final ODataRequest odRequest, final HttpRequest httpRequest, final int split, final String contextPath) throws ODataLibraryException {
final ByteBuf byteBuf = ((HttpContent) httpRequest).content();
final ByteBufInputStream inputStream = new ByteBufInputStream(byteBuf);
odRequest.setBody(inputStream);
odRequest.setProtocol(httpRequest.protocolVersion().text());
odRequest.setMethod(extractMethod(httpRequest));
copyHeaders(odRequest, httpRequest);
fillUriInformationFromHttpRequest(odRequest, httpRequest, split, contextPath);
return odRequest;
}
Aggregations