本文整理汇总了Golang中github.com/SlyMarbo/spdy/spdy3/frames.RST_STREAM类的典型用法代码示例。如果您正苦于以下问题:Golang RST_STREAM类的具体用法?Golang RST_STREAM怎么用?Golang RST_STREAM使用的例子?那么恭喜您, 这里精选的类代码示例或许可以为您提供帮助。
在下文中一共展示了RST_STREAM类的7个代码示例,这些例子默认根据受欢迎程度排序。您可以为喜欢或者感觉有用的代码点赞,您的评价将有助于系统推荐出更棒的Golang代码示例。
示例1: ReceiveFrame
func (p *PushStream) ReceiveFrame(frame common.Frame) error {
p.Lock()
defer p.Unlock()
if frame == nil {
return errors.New("Error: Nil frame received.")
}
// Process the frame depending on its type.
switch frame := frame.(type) {
case *frames.WINDOW_UPDATE:
err := p.flow.UpdateWindow(frame.DeltaWindowSize)
if err != nil {
reply := new(frames.RST_STREAM)
reply.StreamID = p.streamID
reply.Status = common.RST_STREAM_FLOW_CONTROL_ERROR
p.output <- reply
return err
}
default:
return errors.New(fmt.Sprintf("Received unexpected frame of type %T.", frame))
}
return nil
}
示例2: shutdown
func (s *RequestStream) shutdown() {
s.writeHeader()
if s.state != nil {
if s.state.OpenThere() {
// Send the RST_STREAM.
rst := new(frames.RST_STREAM)
rst.StreamID = s.streamID
rst.Status = common.RST_STREAM_CANCEL
s.output <- rst
}
s.state.Close()
}
if s.flow != nil {
s.flow.Close()
}
select {
case <-s.finished:
default:
close(s.finished)
}
select {
case <-s.headerChan:
default:
close(s.headerChan)
}
s.conn.requestStreamLimit.Close()
s.output = nil
s.Request = nil
s.Receiver = nil
s.header = nil
s.stop = nil
}
示例3: ReceiveFrame
func (s *ResponseStream) ReceiveFrame(frame common.Frame) error {
s.Lock()
defer s.Unlock()
if frame == nil {
return errors.New("Error: Nil frame received.")
}
// Process the frame depending on its type.
switch frame := frame.(type) {
case *frames.DATA:
s.requestBody.Write(frame.Data)
s.flow.Receive(frame.Data)
if frame.Flags.FIN() {
select {
case <-s.ready:
default:
close(s.ready)
}
s.state.CloseThere()
}
case *frames.SYN_REPLY:
common.UpdateHeader(s.header, frame.Header)
if frame.Flags.FIN() {
select {
case <-s.ready:
default:
close(s.ready)
}
s.state.CloseThere()
}
case *frames.HEADERS:
common.UpdateHeader(s.header, frame.Header)
case *frames.WINDOW_UPDATE:
err := s.flow.UpdateWindow(frame.DeltaWindowSize)
if err != nil {
reply := new(frames.RST_STREAM)
reply.StreamID = s.streamID
reply.Status = common.RST_STREAM_FLOW_CONTROL_ERROR
s.output <- reply
return err
}
default:
return errors.New(fmt.Sprintf("Received unknown frame of type %T.", frame))
}
return nil
}
示例4: protocolError
// protocolError informs the other endpoint that a protocol error has
// occurred, stops all running streams, and ends the connection.
func (c *Conn) protocolError(streamID common.StreamID) {
reply := new(frames.RST_STREAM)
reply.StreamID = streamID
reply.Status = common.RST_STREAM_PROTOCOL_ERROR
select {
case c.output[0] <- reply:
case <-time.After(100 * time.Millisecond):
debug.Println("Failed to send PROTOCOL_ERROR RST_STREAM.")
}
if c.shutdownError == nil {
c.shutdownError = reply
}
c.Close()
}
示例5: Receive
// Receive is called when data is received from
// the other endpoint. This ensures that they
// conform to the transfer window, regrows the
// window, and sends errors if necessary.
func (f *flowControl) Receive(data []byte) {
// The transfer window shouldn't already be negative.
if f.transferWindowThere < 0 {
rst := new(frames.RST_STREAM)
rst.StreamID = f.streamID
rst.Status = common.RST_STREAM_FLOW_CONTROL_ERROR
f.output <- rst
}
// Update the window.
f.transferWindowThere -= int64(len(data))
// Regrow the window if it's half-empty.
delta := f.flowControl.ReceiveData(f.streamID, f.initialWindowThere, f.transferWindowThere)
if delta != 0 {
grow := new(frames.WINDOW_UPDATE)
grow.StreamID = f.streamID
grow.DeltaWindowSize = delta
f.output <- grow
f.transferWindowThere += int64(grow.DeltaWindowSize)
}
}
示例6: ReceiveFrame
func (s *RequestStream) ReceiveFrame(frame common.Frame) error {
s.recvMutex.Lock()
defer s.recvMutex.Unlock()
if frame == nil {
return errors.New("Nil frame received.")
}
// Process the frame depending on its type.
switch frame := frame.(type) {
case *frames.DATA:
// Extract the data.
data := frame.Data
if data == nil {
data = []byte{}
}
// Give to the client.
s.flow.Receive(frame.Data)
s.headerChan <- func() {
s.Receiver.ReceiveData(s.Request, data, frame.Flags.FIN())
if frame.Flags.FIN() {
s.state.CloseThere()
s.Close()
}
}
case *frames.SYN_REPLY:
s.headerChan <- func() {
s.Receiver.ReceiveHeader(s.Request, frame.Header)
if frame.Flags.FIN() {
s.state.CloseThere()
s.Close()
}
}
case *frames.HEADERS:
s.headerChan <- func() {
s.Receiver.ReceiveHeader(s.Request, frame.Header)
if frame.Flags.FIN() {
s.state.CloseThere()
s.Close()
}
}
case *frames.WINDOW_UPDATE:
err := s.flow.UpdateWindow(frame.DeltaWindowSize)
if err != nil {
reply := new(frames.RST_STREAM)
reply.StreamID = s.streamID
reply.Status = common.RST_STREAM_FLOW_CONTROL_ERROR
s.output <- reply
}
default:
return errors.New(fmt.Sprintf("Received unknown frame of type %T.", frame))
}
return nil
}
示例7: _RST_STREAM
func (c *Conn) _RST_STREAM(streamID common.StreamID, status common.StatusCode) {
rst := new(frames.RST_STREAM)
rst.StreamID = streamID
rst.Status = status
c.output[0] <- rst
}