1 /* 2 * ==================================================================== 3 * Licensed to the Apache Software Foundation (ASF) under one 4 * or more contributor license agreements. See the NOTICE file 5 * distributed with this work for additional information 6 * regarding copyright ownership. The ASF licenses this file 7 * to you under the Apache License, Version 2.0 (the 8 * "License"); you may not use this file except in compliance 9 * with the License. You may obtain a copy of the License at 10 * 11 * http://www.apache.org/licenses/LICENSE-2.0 12 * 13 * Unless required by applicable law or agreed to in writing, 14 * software distributed under the License is distributed on an 15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16 * KIND, either express or implied. See the License for the 17 * specific language governing permissions and limitations 18 * under the License. 19 * ==================================================================== 20 * 21 * This software consists of voluntary contributions made by many 22 * individuals on behalf of the Apache Software Foundation. For more 23 * information on the Apache Software Foundation, please see 24 * <http://www.apache.org/>. 25 * 26 */ 27 package org.apache.hc.core5.http2.frame; 28 29 import java.nio.ByteBuffer; 30 31 /** 32 * HTTP/2 stream frame. 33 * 34 * @since 5.0 35 */ 36 public final class RawFrame extends Frame<ByteBuffer> { 37 38 private final ByteBuffer payload; 39 private final int len; 40 41 public RawFrame(final int type, final int flags, final int streamId, final ByteBuffer payload) { 42 super(type, flags, streamId); 43 this.payload = payload; 44 this.len = payload != null ? payload.remaining() : 0; 45 } 46 47 public boolean isPadded() { 48 return isFlagSet(FrameFlag.PADDED); 49 } 50 51 public int getLength() { 52 return len; 53 } 54 55 public ByteBuffer getPayloadContent() { 56 if (payload != null) { 57 if (isPadded()) { 58 final ByteBuffer dup = payload.duplicate(); 59 if (dup.remaining() == 0) { 60 return null; 61 } 62 final int padding = dup.get() & 0xff; 63 if (padding > dup.remaining()) { 64 return null; 65 } 66 dup.limit(dup.limit() - padding); 67 return dup; 68 } 69 return payload.duplicate(); 70 } 71 return null; 72 } 73 74 @Override 75 public ByteBuffer getPayload() { 76 return payload != null ? payload.duplicate() : null; 77 } 78 79 }