示例#1
0
文件: middleware.go 项目: cyx/busl
func newReader(w http.ResponseWriter, r *http.Request) (io.ReadCloser, error) {
	rd, err := newStorageReader(w, r)
	if err != nil {
		if rd != nil {
			rd.Close()
		}
		return rd, err
	}

	// For default requests, we use a null byte for sending
	// the keepalive ack.
	ack := util.GetNullByte()

	if broker.NoContent(rd, offset(r)) {
		return nil, errNoContent
	}

	if r.Header.Get("Accept") == "text/event-stream" {
		w.Header().Set("Content-Type", "text/event-stream")
		w.Header().Set("Cache-Control", "no-cache")

		encoder := sse.NewEncoder(rd)
		encoder.(io.Seeker).Seek(offset(r), 0)

		rd = ioutil.NopCloser(encoder)

		// For SSE, we change the ack to a :keepalive
		ack = []byte(":keepalive\n")
	}

	done := w.(http.CloseNotifier).CloseNotify()
	return newKeepAliveReader(rd, ack, *util.HeartbeatDuration, done), nil
}
示例#2
0
文件: middleware.go 项目: heroku/busl
func (s *Server) newReader(w http.ResponseWriter, r *http.Request) (io.ReadCloser, error) {
	rd, err := s.newStorageReader(w, r)
	if err != nil {
		if rd != nil {
			rd.Close()
		}
		return rd, err
	}

	// For default requests, we use a null byte for sending
	// the keepalive ack.
	ack := []byte{0}

	o, err := offset(r)
	if err != nil {
		return nil, err
	}

	if broker.NoContent(rd, o) {
		return nil, errNoContent
	}

	var encoder io.ReadSeeker
	if r.Header.Get("Accept") == "text/event-stream" {
		w.Header().Set("Content-Type", "text/event-stream")
		w.Header().Set("Cache-Control", "no-cache")

		encoder = encoders.NewSSEEncoder(rd)
		encoder.(io.Seeker).Seek(o, 0)

		// For SSE, we change the ack to a :keepalive
		ack = []byte(":keepalive\n")
	} else {
		encoder = encoders.NewTextEncoder(rd)
	}

	encoder.Seek(o, io.SeekStart)
	rd = ioutil.NopCloser(encoder)

	done := w.(http.CloseNotifier).CloseNotify()
	return newKeepAliveReader(rd, ack, s.HeartbeatDuration, done), nil
}