< prev index next >
   1 /*
   2  * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
   3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
   4  *
   5  * This code is free software; you can redistribute it and/or modify it
   6  * under the terms of the GNU General Public License version 2 only, as
   7  * published by the Free Software Foundation.  Oracle designates this
   8  * particular file as subject to the "Classpath" exception as provided
   9  * by Oracle in the LICENSE file that accompanied this code.
  10  *
  11  * This code is distributed in the hope that it will be useful, but WITHOUT
  12  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  13  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  14  * version 2 for more details (a copy is included in the LICENSE file that
  15  * accompanied this code).
  16  *
  17  * You should have received a copy of the GNU General Public License version
  18  * 2 along with this work; if not, write to the Free Software Foundation,
  19  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
  20  *
  21  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
  22  * or visit www.oracle.com if you need additional information or have any
  23  */
  24 
  25 package java.net.http;
  26 
  27 import java.io.IOException;
  28 import java.nio.ByteBuffer;
  29 
  30 class PushPromiseFrame extends HeaderFrame {
  31 
  32     int padLength;
  33     int promisedStream;
  34 
  35     PushPromiseFrame() {
  36         type = TYPE;
  37     }
  38 
  39     public static final int TYPE = 0x5;
  40 
  41     // Flags
  42     public static final int END_HEADERS = 0x4;
  43     public static final int PADDED = 0x8;
  44 
  45     @Override
  46     public String toString() {
  47         return super.toString() + " promisedStreamid: " + promisedStream
  48                 + " headerLength: " + headerLength;
  49     }
  50 
  51     @Override
  52     String flagAsString(int flag) {
  53         switch (flag) {
  54         case PADDED:
  55             return "PADDED";
  56         case END_HEADERS:
  57             return "END_HEADERS";
  58         }
  59         return super.flagAsString(flag);
  60     }
  61 
  62     public void setPadLength(int padLength) {
  63         this.padLength = padLength;
  64         flags |= PADDED;
  65     }
  66 
  67     public void setPromisedStream(int stream) {
  68         this.promisedStream = stream;
  69     }
  70 
  71     public int getPromisedStream() {
  72         return promisedStream;
  73     }
  74 
  75     /**
  76      */
  77     @Override
  78     void readIncomingImpl(ByteBufferConsumer bc) throws IOException {
  79         if ((flags & PADDED) != 0) {
  80             padLength = bc.getByte();
  81             headerLength = length - (padLength + 5);
  82         } else
  83             headerLength = length - 4;
  84 
  85         promisedStream = bc.getInt() & 0x7fffffff;
  86         headerBlocks = bc.getBuffers(headerLength);
  87     }
  88 
  89     @Override
  90     void computeLength() {
  91         int len = 0;
  92         if ((flags & PADDED) != 0) {
  93             len += (1 + padLength);
  94         }
  95         len += (4 + headerLength);
  96         this.length = len;
  97     }
  98 
  99     @Override
 100     void writeOutgoing(ByteBufferGenerator bg) {
 101         super.writeOutgoing(bg);
 102         ByteBuffer buf = bg.getBuffer(length);
 103         if ((flags & PADDED) != 0) {
 104             buf.put((byte)padLength);
 105         }
 106         buf.putInt(promisedStream);
 107         for (int i=0; i<headerBlocks.length; i++) {
 108             bg.addByteBuffer(headerBlocks[i]);
 109         }
 110         if ((flags & PADDED) != 0) {
 111             bg.addPadding(padLength);
 112         }
 113     }
 114 
 115     @Override
 116     public boolean endHeaders() {
 117         return getFlag(END_HEADERS);
 118     }
 119 }
< prev index next >