Search in sources :

Example 6 with Request

use of io.s4.message.Request in project rest.li by linkedin.

the class Http2StreamCodec method write.

@Override
public void write(ChannelHandlerContext ctx, Object msg, ChannelPromise promise) throws Exception {
    if (!(msg instanceof RequestWithCallback)) {
        ctx.write(msg, promise);
        return;
    }
    Request request = ((RequestWithCallback) msg).request();
    Http2ConnectionEncoder encoder = encoder();
    int streamId = connection().local().incrementAndGetNextStreamId();
    if (request instanceof StreamRequest) {
        LOG.debug("Writing StreamRequest...");
        StreamRequest streamRequest = (StreamRequest) request;
        Http2Headers http2Headers = NettyRequestAdapter.toHttp2Headers(streamRequest);
        BufferedReader reader = new BufferedReader(ctx, encoder, streamId, ((RequestWithCallback) msg).handle());
        streamRequest.getEntityStream().setReader(reader);
        encoder.writeHeaders(ctx, streamId, http2Headers, NO_PADDING, NOT_END_STREAM, promise).addListener(future -> reader.request());
        LOG.debug("Sent HTTP/2 HEADERS frame, stream={}, end={}, headers={}, padding={}bytes", new Object[] { streamId, NOT_END_STREAM, http2Headers.size(), NO_PADDING });
    } else if (request instanceof RestRequest) {
        LOG.debug("Writing RestRequest...");
        PromiseCombiner promiseCombiner = new PromiseCombiner();
        ChannelPromise headersPromise = ctx.channel().newPromise();
        ChannelPromise dataPromise = ctx.channel().newPromise();
        promiseCombiner.add(headersPromise);
        promiseCombiner.add(dataPromise);
        promiseCombiner.finish(promise);
        RestRequest restRequest = (RestRequest) request;
        Http2Headers headers = NettyRequestAdapter.toHttp2Headers(restRequest);
        encoder.writeHeaders(ctx, streamId, headers, NO_PADDING, NOT_END_STREAM, headersPromise);
        LOG.debug("Sent HTTP/2 HEADERS frame, stream={}, end={}, headers={}, padding={}bytes", new Object[] { streamId, NOT_END_STREAM, headers.size(), NO_PADDING });
        ByteBuf data = Unpooled.wrappedBuffer(restRequest.getEntity().asByteBuffer());
        encoder.writeData(ctx, streamId, data, NO_PADDING, END_STREAM, dataPromise);
        LOG.debug("Sent HTTP/2 DATA frame, stream={}, end={}, data={}bytes, padding={}bytes", new Object[] { streamId, END_STREAM, data.readableBytes(), NO_PADDING });
    } else {
        // Request type is not supported. Returns channel back to the pool and throws exception.
        ctx.fireChannelRead(((RequestWithCallback) msg).handle());
        throw new IllegalArgumentException("Request is neither StreamRequest or RestRequest");
    }
    // Sets TransportCallback as a stream property to be retrieved later
    TransportCallback<?> callback = ((RequestWithCallback) msg).callback();
    Http2Connection.PropertyKey callbackKey = ctx.channel().attr(Http2ClientPipelineInitializer.CALLBACK_ATTR_KEY).get();
    connection().stream(streamId).setProperty(callbackKey, callback);
    // Sets AsyncPoolHandle as a stream property to be retrieved later
    AsyncPoolHandle<?> handle = ((RequestWithCallback) msg).handle();
    Http2Connection.PropertyKey handleKey = ctx.channel().attr(Http2ClientPipelineInitializer.CHANNEL_POOL_HANDLE_ATTR_KEY).get();
    connection().stream(streamId).setProperty(handleKey, handle);
}
Also used : PromiseCombiner(io.netty.util.concurrent.PromiseCombiner) Http2Connection(io.netty.handler.codec.http2.Http2Connection) StreamRequest(com.linkedin.r2.message.stream.StreamRequest) Request(com.linkedin.r2.message.Request) RestRequest(com.linkedin.r2.message.rest.RestRequest) ChannelPromise(io.netty.channel.ChannelPromise) ByteBuf(io.netty.buffer.ByteBuf) StreamRequest(com.linkedin.r2.message.stream.StreamRequest) RestRequest(com.linkedin.r2.message.rest.RestRequest) RequestWithCallback(com.linkedin.r2.transport.common.bridge.common.RequestWithCallback) Http2Headers(io.netty.handler.codec.http2.Http2Headers) Http2ConnectionEncoder(io.netty.handler.codec.http2.Http2ConnectionEncoder)

Example 7 with Request

use of io.s4.message.Request in project core by s4.

the class SinglePERequest method partition.

public List<CompoundKeyInfo> partition(Hasher h, String delim, int partCount) {
    List<String> valueList = this.getTarget();
    if (valueList == null)
        return null;
    // First, build the key
    KeyInfo keyInfo = new KeyInfo();
    // special kay name to denote request
    keyInfo.addElementToPath("#req");
    // for value, concatenate list of values from Request's target field.
    String stringValue = StringUtils.collectionToDelimitedString(valueList, delim);
    keyInfo.setValue(stringValue);
    // partition id is derived form string value, as usual
    int partitionId = (int) (h.hash(stringValue) % partCount);
    CompoundKeyInfo partitionInfo = new CompoundKeyInfo();
    partitionInfo.addKeyInfo(keyInfo);
    partitionInfo.setCompoundValue(stringValue);
    partitionInfo.setPartitionId(partitionId);
    List<CompoundKeyInfo> partitionInfoList = new ArrayList<CompoundKeyInfo>();
    partitionInfoList.add(partitionInfo);
    return partitionInfoList;
}
Also used : KeyInfo(io.s4.dispatcher.partitioner.KeyInfo) CompoundKeyInfo(io.s4.dispatcher.partitioner.CompoundKeyInfo) ArrayList(java.util.ArrayList) CompoundKeyInfo(io.s4.dispatcher.partitioner.CompoundKeyInfo)

Aggregations

Request (com.linkedin.r2.message.Request)4 RequestWithCallback (com.linkedin.r2.transport.common.bridge.common.RequestWithCallback)3 URI (java.net.URI)3 CompoundKeyInfo (io.s4.dispatcher.partitioner.CompoundKeyInfo)2 ArrayList (java.util.ArrayList)2 Gson (com.google.gson.Gson)1 GsonBuilder (com.google.gson.GsonBuilder)1 InstanceCreator (com.google.gson.InstanceCreator)1 JsonObject (com.google.gson.JsonObject)1 RestRequest (com.linkedin.r2.message.rest.RestRequest)1 StreamRequest (com.linkedin.r2.message.stream.StreamRequest)1 ByteBuf (io.netty.buffer.ByteBuf)1 ChannelPromise (io.netty.channel.ChannelPromise)1 Http2Connection (io.netty.handler.codec.http2.Http2Connection)1 Http2ConnectionEncoder (io.netty.handler.codec.http2.Http2ConnectionEncoder)1 Http2Headers (io.netty.handler.codec.http2.Http2Headers)1 PromiseCombiner (io.netty.util.concurrent.PromiseCombiner)1 KeyInfo (io.s4.dispatcher.partitioner.KeyInfo)1 Request (io.s4.message.Request)1 SinglePERequest (io.s4.message.SinglePERequest)1