Skip to content

Commit

Permalink
httptransport: report write errors via trailer
Browse files Browse the repository at this point in the history
Signed-off-by: Hank Donnay <hdonnay@redhat.com>
  • Loading branch information
hdonnay committed Apr 3, 2020
1 parent ea5873b commit 9cd6cab
Show file tree
Hide file tree
Showing 5 changed files with 20 additions and 34 deletions.
9 changes: 1 addition & 8 deletions httptransport/indexhandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -92,15 +92,8 @@ func IndexHandler(serv indexer.StateIndexer) http.HandlerFunc {

w.Header().Set("etag", validator)
w.Header().Set("location", next)
defer writerError(w, &err)()
w.WriteHeader(http.StatusCreated)
err = json.NewEncoder(w).Encode(report)
if err != nil {
resp := &je.Response{
Code: "encoding-error",
Message: fmt.Sprintf("failed to encode scan report: %v", err),
}
je.Error(w, resp, http.StatusInternalServerError)
return
}
}
}
9 changes: 1 addition & 8 deletions httptransport/indexreporthandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,14 +91,7 @@ func IndexReportHandler(serv indexer.StateReporter) http.HandlerFunc {
}

w.Header().Add("etag", validator)
defer writerError(w, &err)()
err = json.NewEncoder(w).Encode(report)
if err != nil {
resp := &je.Response{
Code: "encoding-error",
Message: fmt.Sprintf("failed to encode scan report: %v", err),
}
je.Error(w, resp, http.StatusInternalServerError)
return
}
}
}
16 changes: 16 additions & 0 deletions httptransport/server.go
Original file line number Diff line number Diff line change
Expand Up @@ -255,3 +255,19 @@ func (t *Server) configureWithAuth() error {
}
panic("should not reach")
}

// WriterError is a helper that closes over an error that may be returned after
// writing a response body starts.
//
// The normal error flow can't be used, because the HTTP status code will have
// been sent and some amount of body data may have been written.
func writerError(w http.ResponseWriter, e *error) func() {
const errHeader = `Clair-Error`
w.Header().Add("trailer", errHeader)
return func() {
if *e == nil {
return
}
w.Header().Add(errHeader, (*e).Error())
}
}
10 changes: 1 addition & 9 deletions httptransport/statehandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ package httptransport

import (
"encoding/json"
"fmt"
"net/http"

je "github.com/quay/claircore/pkg/jsonerr"
Expand Down Expand Up @@ -43,18 +42,11 @@ func StateHandler(service indexer.Stater) http.HandlerFunc {

w.Header().Set("content-type", "application/json")

defer writerError(w, &err)()
err = json.NewEncoder(w).Encode(struct {
State string `json:"state"`
}{
State: s,
})
if err != nil {
resp := &je.Response{
Code: "encoding-error",
Message: fmt.Sprintf("failed to encode state: %v", err),
}
je.Error(w, resp, http.StatusInternalServerError)
}
return
}
}
10 changes: 1 addition & 9 deletions httptransport/vulnerabilityreporthandler.go
Original file line number Diff line number Diff line change
Expand Up @@ -80,16 +80,8 @@ func VulnerabilityReportHandler(service matcher.Service, indexer indexer.Service
return
}

defer writerError(w, &err)()
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(vulnReport)
if err != nil {
resp := &je.Response{
Code: "encoding-error",
Message: fmt.Sprintf("failed to encode vulnerability report: %v", err),
}
je.Error(w, resp, http.StatusInternalServerError)
return
}
return
}
}

0 comments on commit 9cd6cab

Please sign in to comment.