github.com/alejandroesc/spdy@v0.0.0-20200317064415-01a02f0eb389/spdy2/frames/window_update.go (about)

     1  // Copyright 2014 Jamie Hall. All rights reserved.
     2  // Use of this source code is governed by a BSD-style
     3  // license that can be found in the LICENSE file.
     4  
     5  package frames
     6  
     7  import (
     8  	"bytes"
     9  	"errors"
    10  	"fmt"
    11  	"io"
    12  
    13  	"github.com/SlyMarbo/spdy/common"
    14  )
    15  
    16  type WINDOW_UPDATE struct {
    17  	StreamID        common.StreamID
    18  	DeltaWindowSize uint32
    19  }
    20  
    21  func (frame *WINDOW_UPDATE) Compress(comp common.Compressor) error {
    22  	return nil
    23  }
    24  
    25  func (frame *WINDOW_UPDATE) Decompress(decomp common.Decompressor) error {
    26  	return nil
    27  }
    28  
    29  func (frame *WINDOW_UPDATE) Name() string {
    30  	return "WINDOW_UPDATE"
    31  }
    32  
    33  func (frame *WINDOW_UPDATE) ReadFrom(reader io.Reader) (int64, error) {
    34  	c := common.ReadCounter{R: reader}
    35  	data, err := common.ReadExactly(&c, 16)
    36  	if err != nil {
    37  		return c.N, err
    38  	}
    39  
    40  	err = controlFrameCommonProcessing(data[:5], _WINDOW_UPDATE, 0)
    41  	if err != nil {
    42  		return c.N, err
    43  	}
    44  
    45  	// Get and check length.
    46  	length := int(common.BytesToUint24(data[5:8]))
    47  	if length != 8 {
    48  		return c.N, common.IncorrectDataLength(length, 8)
    49  	}
    50  
    51  	frame.StreamID = common.StreamID(common.BytesToUint32(data[8:12]))
    52  	frame.DeltaWindowSize = common.BytesToUint32(data[12:16])
    53  
    54  	if !frame.StreamID.Valid() {
    55  		return c.N, common.StreamIdTooLarge
    56  	}
    57  	if frame.StreamID.Zero() {
    58  		return c.N, common.StreamIdIsZero
    59  	}
    60  	if frame.DeltaWindowSize > common.MAX_DELTA_WINDOW_SIZE {
    61  		return c.N, errors.New("Error: Delta Window Size too large.")
    62  	}
    63  
    64  	return c.N, nil
    65  }
    66  
    67  func (frame *WINDOW_UPDATE) String() string {
    68  	buf := new(bytes.Buffer)
    69  
    70  	buf.WriteString("WINDOW_UPDATE {\n\t")
    71  	buf.WriteString(fmt.Sprintf("Version:              2\n\t"))
    72  	buf.WriteString(fmt.Sprintf("Stream ID:            %d\n\t", frame.StreamID))
    73  	buf.WriteString(fmt.Sprintf("Delta window size:    %d\n}\n", frame.DeltaWindowSize))
    74  
    75  	return buf.String()
    76  }
    77  
    78  func (frame *WINDOW_UPDATE) WriteTo(writer io.Writer) (int64, error) {
    79  	return 0, nil
    80  }