Example usage for io.netty.buffer ByteBuf readByte

List of usage examples for io.netty.buffer ByteBuf readByte

Introduction

In this page you can find the example usage for io.netty.buffer ByteBuf readByte.

Prototype

public abstract byte readByte();

Source Link

Document

Gets a byte at the current readerIndex and increases the readerIndex by 1 in this buffer.

Usage

From source file:com.corundumstudio.socketio.protocol.PacketDecoder.java

License:Apache License

private PacketType readType(ByteBuf buffer) {
    int typeId = buffer.readByte() & 0xF;
    return PacketType.valueOf(typeId);
}

From source file:com.corundumstudio.socketio.protocol.PacketDecoder.java

License:Apache License

private PacketType readInnerType(ByteBuf buffer) {
    int typeId = buffer.readByte() & 0xF;
    return PacketType.valueOfInner(typeId);
}

From source file:com.corundumstudio.socketio.protocol.PacketDecoder.java

License:Apache License

private Packet parseBinary(ClientHead head, ByteBuf frame) throws IOException {
    if (frame.getByte(0) == 1) {
        frame.readByte();
        int headEndIndex = frame.bytesBefore((byte) -1);
        int len = (int) readLong(frame, headEndIndex);
        ByteBuf oldFrame = frame;//  w w  w .  ja v a 2s.c o m
        frame = frame.slice(oldFrame.readerIndex() + 1, len);
        oldFrame.readerIndex(oldFrame.readerIndex() + 1 + len);
    }

    if (frame.getByte(0) == 'b' && frame.getByte(1) == '4') {
        frame.readShort();
    } else if (frame.getByte(0) == 4) {
        frame.readByte();
    }

    Packet binaryPacket = head.getLastBinaryPacket();
    if (binaryPacket != null) {
        ByteBuf attachBuf;
        if (frame.getByte(0) == 'b' && frame.getByte(1) == '4') {
            attachBuf = frame;
        } else {
            attachBuf = Base64.encode(frame);
        }
        binaryPacket.addAttachment(Unpooled.copiedBuffer(attachBuf));
        frame.readerIndex(frame.readerIndex() + frame.readableBytes());

        if (binaryPacket.isAttachmentsLoaded()) {
            LinkedList<ByteBuf> slices = new LinkedList<ByteBuf>();
            ByteBuf source = binaryPacket.getDataSource();
            for (int i = 0; i < binaryPacket.getAttachments().size(); i++) {
                ByteBuf attachment = binaryPacket.getAttachments().get(i);
                ByteBuf scanValue = Unpooled.copiedBuffer("{\"_placeholder\":true,\"num\":" + i + "}",
                        CharsetUtil.UTF_8);
                int pos = PacketEncoder.find(source, scanValue);
                if (pos == -1) {
                    throw new IllegalStateException(
                            "Can't find attachment by index: " + i + " in packet source");
                }

                ByteBuf prefixBuf = source.slice(source.readerIndex(), pos - source.readerIndex());
                slices.add(prefixBuf);
                slices.add(QUOTES);
                slices.add(attachment);
                slices.add(QUOTES);

                source.readerIndex(pos + scanValue.readableBytes());
            }
            slices.add(source.slice());

            ByteBuf compositeBuf = Unpooled.wrappedBuffer(slices.toArray(new ByteBuf[slices.size()]));
            parseBody(head, compositeBuf, binaryPacket);
            head.setLastBinaryPacket(null);
            return binaryPacket;
        }
    }
    return new Packet(PacketType.MESSAGE);
}

From source file:com.corundumstudio.socketio.protocol.PacketEncoder.java

License:Apache License

private void processUtf8(ByteBuf in, ByteBuf out, boolean jsonpMode) {
    while (in.isReadable()) {
        short value = (short) (in.readByte() & 0xFF);
        if (value >>> 7 == 0) {
            if (jsonpMode && (value == '\\' || value == '\'')) {
                out.writeByte('\\');
            }/*from   w  w  w. j  av  a2  s  .c om*/
            out.writeByte(value);
        } else {
            out.writeByte(((value >>> 6) | 0xC0));
            out.writeByte(((value & 0x3F) | 0x80));
        }
    }
}

From source file:com.couchbase.client.core.endpoint.kv.KeyValueHandler.java

License:Apache License

/**
 * Helper method to decode all multi mutation response messages.
 *
 * @param request the current request./*from w  w w.j  a  v a 2  s.c om*/
 * @param msg the current response message.
 * @param ctx the handler context.
 * @param status the response status code.
 * @return the decoded response or null if it wasn't a subdocument multi lookup.
 */
private static CouchbaseResponse handleSubdocumentMultiMutationResponseMessages(BinaryRequest request,
        FullBinaryMemcacheResponse msg, ChannelHandlerContext ctx, ResponseStatus status,
        boolean seqOnMutation) {
    if (!(request instanceof BinarySubdocMultiMutationRequest))
        return null;

    BinarySubdocMultiMutationRequest subdocRequest = (BinarySubdocMultiMutationRequest) request;

    long cas = msg.getCAS();
    short statusCode = msg.getStatus();
    String bucket = request.bucket();

    MutationToken mutationToken = null;
    if (msg.getExtrasLength() > 0) {
        mutationToken = extractToken(bucket, seqOnMutation, status.isSuccess(), msg.getExtras(),
                request.partition());
    }

    MultiMutationResponse response;
    ByteBuf body = msg.content();
    List<MultiResult<Mutation>> responses;
    if (status.isSuccess()) {
        List<MutationCommand> commands = subdocRequest.commands();
        responses = new ArrayList<MultiResult<Mutation>>(commands.size());
        //MB-17842: Mutations can have a value, so there could be individual results
        //but only mutation commands that provide a value will have an explicit result in the binary response.
        //However, we still want MutationResult for all of the commands
        ListIterator<MutationCommand> it = commands.listIterator();
        int explicitResultSize = 0;
        //as long as there is an explicit response to read...
        while (msg.content().readableBytes() >= 7) {
            explicitResultSize++;
            //...read the data
            byte responseIndex = body.readByte();
            short responseStatus = body.readShort(); //will this always be SUCCESS?
            int responseLength = body.readInt();
            ByteBuf responseValue;
            if (responseLength > 0) {
                responseValue = ctx.alloc().buffer(responseLength, responseLength);
                responseValue.writeBytes(body, responseLength);
            } else {
                responseValue = Unpooled.EMPTY_BUFFER; //can an explicit response be 0-length (empty)?
            }

            //...sanity check response so subsequent loop don't run forever
            if (it.nextIndex() > responseIndex) {
                body.release();
                throw new IllegalStateException("Unable to interpret multi mutation response, responseIndex = "
                        + responseIndex + " while next available command was #" + it.nextIndex());
            }

            ///...catch up on all commands before current one that didn't get an explicit response
            while (it.nextIndex() < responseIndex) {
                MutationCommand noResultCommand = it.next();
                responses.add(MultiResult.create(KeyValueStatus.SUCCESS.code(), ResponseStatus.SUCCESS,
                        noResultCommand.path(), noResultCommand.mutation(), Unpooled.EMPTY_BUFFER));
            }

            //...then process the one that did get an explicit response
            MutationCommand cmd = it.next();
            responses.add(MultiResult.create(responseStatus, ResponseStatusConverter.fromBinary(responseStatus),
                    cmd.path(), cmd.mutation(), responseValue));
        }
        //...and finally the remainder of commands after the last one that got an explicit response:
        while (it.hasNext()) {
            MutationCommand noResultCommand = it.next();
            responses.add(MultiResult.create(KeyValueStatus.SUCCESS.code(), ResponseStatus.SUCCESS,
                    noResultCommand.path(), noResultCommand.mutation(), Unpooled.EMPTY_BUFFER));
        }

        if (responses.size() != commands.size()) {
            body.release();
            throw new IllegalStateException(
                    "Multi mutation spec size and result size differ: " + commands.size() + " vs "
                            + responses.size() + ", including " + explicitResultSize + " explicit results");
        }

        response = new MultiMutationResponse(bucket, subdocRequest, cas, mutationToken, responses);
    } else if (ResponseStatus.SUBDOC_MULTI_PATH_FAILURE.equals(status)) {
        //MB-17842: order of index and status has been swapped
        byte firstErrorIndex = body.readByte();
        short firstErrorCode = body.readShort();
        response = new MultiMutationResponse(status, statusCode, bucket, firstErrorIndex, firstErrorCode,
                subdocRequest, cas, mutationToken);
    } else {
        response = new MultiMutationResponse(status, statusCode, bucket, subdocRequest, cas, mutationToken);
    }
    body.release();
    return response;
}

From source file:com.couchbase.client.core.endpoint.kv.KeyValueHandler.java

License:Apache License

/**
 * Helper method to decode all other response messages.
 *
 * @param request the current request.//from w ww .  j  a  va 2 s. c om
 * @param msg the current response message.
 * @param status the response status code.
 * @return the decoded response or null if none did match.
 */
private static CouchbaseResponse handleOtherResponseMessages(BinaryRequest request,
        FullBinaryMemcacheResponse msg, ResponseStatus status, boolean seqOnMutation, String remoteHostname) {
    CouchbaseResponse response = null;
    ByteBuf content = msg.content();
    long cas = msg.getCAS();
    short statusCode = msg.getStatus();
    String bucket = request.bucket();

    if (request instanceof UnlockRequest) {
        response = new UnlockResponse(status, statusCode, bucket, content, request);
    } else if (request instanceof TouchRequest) {
        response = new TouchResponse(status, statusCode, bucket, content, request);
    } else if (request instanceof AppendRequest) {
        MutationToken descr = extractToken(bucket, seqOnMutation, status.isSuccess(), msg.getExtras(),
                request.partition());
        response = new AppendResponse(status, statusCode, cas, bucket, content, descr, request);
    } else if (request instanceof PrependRequest) {
        MutationToken descr = extractToken(bucket, seqOnMutation, status.isSuccess(), msg.getExtras(),
                request.partition());
        response = new PrependResponse(status, statusCode, cas, bucket, content, descr, request);
    } else if (request instanceof KeepAliveRequest) {
        releaseContent(content);
        response = new KeepAliveResponse(status, statusCode, request);
    } else if (request instanceof CounterRequest) {
        long value = status.isSuccess() ? content.readLong() : 0;
        releaseContent(content);

        MutationToken descr = extractToken(bucket, seqOnMutation, status.isSuccess(), msg.getExtras(),
                request.partition());
        response = new CounterResponse(status, statusCode, bucket, value, cas, descr, request);
    } else if (request instanceof StatRequest) {
        String key = new String(msg.getKey(), CHARSET);
        String value = content.toString(CHARSET);
        releaseContent(content);

        response = new StatResponse(status, statusCode, remoteHostname, key, value, bucket, request);
    } else if (request instanceof GetAllMutationTokensRequest) {
        // 2 bytes for partition ID, and 8 bytes for sequence number
        MutationToken[] mutationTokens = new MutationToken[content.readableBytes() / 10];
        for (int i = 0; i < mutationTokens.length; i++) {
            mutationTokens[i] = new MutationToken((long) content.readShort(), 0, content.readLong(),
                    request.bucket());
        }
        releaseContent(content);
        response = new GetAllMutationTokensResponse(mutationTokens, status, statusCode, bucket, request);
    } else if (request instanceof ObserveRequest) {
        byte observed = ObserveResponse.ObserveStatus.UNKNOWN.value();
        long observedCas = 0;
        if (status.isSuccess()) {
            short keyLength = content.getShort(2);
            observed = content.getByte(keyLength + 4);
            observedCas = content.getLong(keyLength + 5);
        }
        releaseContent(content);
        response = new ObserveResponse(status, statusCode, observed, ((ObserveRequest) request).master(),
                observedCas, bucket, request);
    } else if (request instanceof ObserveSeqnoRequest) {
        if (status.isSuccess()) {
            byte format = content.readByte();
            switch (format) {
            case 0:
                response = new NoFailoverObserveSeqnoResponse(((ObserveSeqnoRequest) request).master(),
                        content.readShort(), content.readLong(), content.readLong(), content.readLong(), status,
                        statusCode, bucket, request);
                break;
            case 1:
                response = new FailoverObserveSeqnoResponse(((ObserveSeqnoRequest) request).master(),
                        content.readShort(), content.readLong(), content.readLong(), content.readLong(),
                        content.readLong(), content.readLong(), status, statusCode, bucket, request);
                break;
            default:
                throw new IllegalStateException("Unknown format for observe-seq: " + format);
            }
        } else {
            response = new NoFailoverObserveSeqnoResponse(((ObserveSeqnoRequest) request).master(), (short) 0,
                    0, 0, 0, status, statusCode, bucket, request);
        }
        releaseContent(content);
    }

    return response;
}

From source file:com.datastax.driver.core.CBUtil.java

License:Apache License

public static InetSocketAddress readInet(ByteBuf cb) {
    int addrSize = cb.readByte();
    byte[] address = new byte[addrSize];
    cb.readBytes(address);/*from   www  . j av  a2 s .  c  om*/
    int port = cb.readInt();
    try {
        return new InetSocketAddress(InetAddress.getByAddress(address), port);
    } catch (UnknownHostException e) {
        throw new DriverInternalError(
                String.format("Invalid IP address (%d.%d.%d.%d) while deserializing inet address", address[0],
                        address[1], address[2], address[3]));
    }
}

From source file:com.datastax.driver.core.Frame.java

License:Apache License

private static Frame create(ByteBuf fullFrame) {
    assert fullFrame.readableBytes() >= 1 : String.format("Frame too short (%d bytes)",
            fullFrame.readableBytes());/*  ww  w  . j  a v a  2  s. com*/

    int versionBytes = fullFrame.readByte();
    // version first byte is the "direction" of the frame (request or response)
    ProtocolVersion version = ProtocolVersion.fromInt(versionBytes & 0x7F);
    int hdrLen = Header.lengthFor(version);
    assert fullFrame.readableBytes() >= (hdrLen - 1) : String.format("Frame too short (%d bytes)",
            fullFrame.readableBytes());

    int flags = fullFrame.readByte();
    int streamId = readStreamid(fullFrame, version);
    int opcode = fullFrame.readByte();
    int length = fullFrame.readInt();
    assert length == fullFrame.readableBytes();

    Header header = new Header(version, flags, streamId, opcode);
    return new Frame(header, fullFrame);
}

From source file:com.datastax.driver.core.Frame.java

License:Apache License

private static int readStreamid(ByteBuf fullFrame, ProtocolVersion version) {
    switch (version) {
    case V1:/*from w  ww .java2s  . co  m*/
    case V2:
        return fullFrame.readByte();
    case V3:
    case V4:
        return fullFrame.readShort();
    default:
        throw version.unsupported();
    }
}

From source file:com.Da_Technomancer.crossroads.API.packets.Message.java

License:Creative Commons License

private static byte readByte(ByteBuf buf) {
    return buf.readByte();
}