// newSpdyStream is the internal new stream handler used by spdystream.Connection.Serve. // It calls connection's newStreamHandler, giving it the opportunity to accept or reject // the stream. If newStreamHandler returns an error, the stream is rejected. If not, the // stream is accepted and registered with the connection. func (c *connection) newSpdyStream(stream *spdystream.Stream) { err := c.newStreamHandler(stream) rejectStream := (err != nil) if rejectStream { glog.Warningf("Stream rejected: %v", err) stream.Reset() return } c.registerStream(stream) stream.SendReply(http.Header{}, rejectStream) }
func (s *Transport) newStreamHandler(stream *spdystream.Stream) { referenceIDString := stream.Headers().Get("libchan-ref") parentIDString := stream.Headers().Get("libchan-parent-ref") returnHeaders := http.Header{} finish := false referenceID, parseErr := strconv.ParseUint(referenceIDString, 10, 64) if parseErr != nil { returnHeaders.Set("status", "400") finish = true } else { if parentIDString == "" { byteStream := &byteStream{ referenceID: referenceID, stream: stream, session: s, } s.byteStreamC.L.Lock() s.byteStreams[referenceID] = byteStream s.byteStreamC.Broadcast() s.byteStreamC.L.Unlock() returnHeaders.Set("status", "200") } else { parentID, parseErr := strconv.ParseUint(parentIDString, 10, 64) if parseErr != nil { returnHeaders.Set("status", "400") finish = true } else { c := &channel{ referenceID: referenceID, parentID: parentID, stream: stream, session: s, } s.channelC.L.Lock() s.channels[referenceID] = c s.channelC.Broadcast() s.channelC.L.Unlock() if parentID == 0 { c.direction = inbound s.receiverChan <- c } returnHeaders.Set("status", "200") } } } stream.SendReply(returnHeaders, finish) }
// newSpdyStream is the internal new stream handler used by spdystream.Connection.Serve. // It calls connection's newStreamHandler, giving it the opportunity to accept or reject // the stream. If newStreamHandler returns an error, the stream is rejected. If not, the // stream is accepted and registered with the connection. func (c *connection) newSpdyStream(stream *spdystream.Stream) { replySent := make(chan struct{}) err := c.newStreamHandler(stream, replySent) rejectStream := (err != nil) if rejectStream { glog.Warningf("Stream rejected: %v", err) stream.Reset() return } c.registerStream(stream) stream.SendReply(http.Header{}, rejectStream) close(replySent) }
func (p *spdyStreamProvider) newStreamHandler(stream *spdystream.Stream) { s := &spdyStream{ stream: stream, } returnHeaders := http.Header{} var finish bool select { case <-p.closeChan: returnHeaders.Set(":status", "502") finish = true case p.listenChan <- s: returnHeaders.Set(":status", "200") } stream.SendReply(returnHeaders, finish) }
func (s *StreamSession) newStreamHandler(stream *spdystream.Stream) { stream.SendReply(http.Header{}, false) streamChan := s.getStreamChan(stream.Parent()) streamChan <- stream }
func (l *ListenSession) streamHandler(stream *spdystream.Stream) { // TODO authorize stream stream.SendReply(http.Header{}, false) streamChan := l.getStreamChan(stream.Parent()) streamChan <- stream }