func mkstream(w http.ResponseWriter, _ *http.Request) { registrar := broker.NewRedisRegistrar() uuid, err := util.NewUUID() if err != nil { http.Error(w, "Unable to create stream. Please try again.", http.StatusServiceUnavailable) rollbar.Error(rollbar.ERR, fmt.Errorf("unable to create new uuid for stream: %#v", err)) util.CountWithData("mkstream.create.fail", 1, "error=%s", err) return } if err := registrar.Register(uuid); err != nil { http.Error(w, "Unable to create stream. Please try again.", http.StatusServiceUnavailable) rollbar.Error(rollbar.ERR, fmt.Errorf("unable to register stream: %#v", err)) util.CountWithData("mkstream.create.fail", 1, "error=%s", err) return } util.Count("mkstream.create.success") io.WriteString(w, string(uuid)) }
func put(w http.ResponseWriter, r *http.Request) { registrar := broker.NewRedisRegistrar() if err := registrar.Register(key(r)); err != nil { http.Error(w, "Unable to create stream. Please try again.", http.StatusServiceUnavailable) rollbar.Error(rollbar.ERR, fmt.Errorf("unable to register stream: %#v", err)) util.CountWithData("put.create.fail", 1, "error=%s", err) return } util.Count("put.create.success") w.WriteHeader(http.StatusCreated) }
func pub(w http.ResponseWriter, r *http.Request) { if !util.StringSliceUtil(r.TransferEncoding).Contains("chunked") { http.Error(w, "A chunked Transfer-Encoding header is required.", http.StatusBadRequest) return } writer, err := broker.NewWriter(key(r)) if err != nil { handleError(w, r, err) return } defer writer.Close() body := bufio.NewReader(r.Body) defer r.Body.Close() done := make(chan struct{}) go func() { for { select { case <-done: // Asynchronously upload the output to our defined storage backend. go storeOutput(key(r), requestURI(r)) return case <-time.After(*util.StorageInterval): // Asynchronously upload the output to our defined storage backend. go storeOutput(key(r), requestURI(r)) } } }() _, err = io.Copy(writer, body) if err == io.ErrUnexpectedEOF { util.CountWithData("server.pub.read.eoferror", 1, "msg=\"%v\"", err.Error()) return } if err != nil { log.Printf("%#v", err) http.Error(w, "Unhandled error, please try again.", http.StatusInternalServerError) rollbar.Error(rollbar.ERR, fmt.Errorf("unhandled error: %#v", err)) return } close(done) }