|
- // Copyright 2015 Google Inc. All rights reserved.
- //
- // Licensed under the Apache License, Version 2.0 (the "License");
- // you may not use this file except in compliance with the License.
- // You may obtain a copy of the License at
- //
- // http://www.apache.org/licenses/LICENSE-2.0
- //
- // Unless required by applicable law or agreed to in writing, software
- // distributed under the License is distributed on an "AS IS" BASIS,
- // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- // See the License for the specific language governing permissions and
- // limitations under the License.
-
- package verify
-
- import (
- "encoding/json"
- "net/http"
-
- "github.com/google/martian"
- "github.com/google/martian/log"
- )
-
- // Handler is an http.Handler that returns the request and response
- // verifications of reqv and resv as JSON.
- type Handler struct {
- reqv RequestVerifier
- resv ResponseVerifier
- }
-
- // ResetHandler is an http.Handler that resets the request and response
- // verifications of reqv and resv.
- type ResetHandler struct {
- reqv RequestVerifier
- resv ResponseVerifier
- }
-
- type verifyResponse struct {
- Errors []verifyError `json:"errors"`
- }
-
- type verifyError struct {
- Message string `json:"message"`
- }
-
- // NewHandler returns an http.Handler for requesting the verification
- // error status.
- func NewHandler() *Handler {
- return &Handler{}
- }
-
- // NewResetHandler returns an http.Handler for reseting the verification error
- // status.
- func NewResetHandler() *ResetHandler {
- return &ResetHandler{}
- }
-
- // SetRequestVerifier sets the RequestVerifier to verify.
- func (h *Handler) SetRequestVerifier(reqv RequestVerifier) {
- h.reqv = reqv
- }
-
- // SetResponseVerifier sets the ResponseVerifier to verify.
- func (h *Handler) SetResponseVerifier(resv ResponseVerifier) {
- h.resv = resv
- }
-
- // ServeHTTP writes out a JSON response containing a list of verification
- // errors that occurred during the requests and responses sent to the proxy.
- func (h *Handler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
- rw.Header().Set("Content-Type", "application/json")
-
- if req.Method != "GET" {
- rw.Header().Set("Allow", "GET")
- rw.WriteHeader(405)
- log.Errorf("verify: invalid request method: %s", req.Method)
- return
- }
-
- vres := &verifyResponse{
- Errors: make([]verifyError, 0),
- }
-
- if h.reqv != nil {
- if err := h.reqv.VerifyRequests(); err != nil {
- appendError(vres, err)
- }
- }
- if h.resv != nil {
- if err := h.resv.VerifyResponses(); err != nil {
- appendError(vres, err)
- }
- }
-
- json.NewEncoder(rw).Encode(vres)
- }
-
- func appendError(vres *verifyResponse, err error) {
- merr, ok := err.(*martian.MultiError)
- if !ok {
- vres.Errors = append(vres.Errors, verifyError{Message: err.Error()})
- return
- }
-
- for _, err := range merr.Errors() {
- vres.Errors = append(vres.Errors, verifyError{Message: err.Error()})
- }
- }
-
- // SetRequestVerifier sets the RequestVerifier to reset.
- func (h *ResetHandler) SetRequestVerifier(reqv RequestVerifier) {
- h.reqv = reqv
- }
-
- // SetResponseVerifier sets the ResponseVerifier to reset.
- func (h *ResetHandler) SetResponseVerifier(resv ResponseVerifier) {
- h.resv = resv
- }
-
- // ServeHTTP resets the verifier for the given ID so that it may
- // be run again.
- func (h *ResetHandler) ServeHTTP(rw http.ResponseWriter, req *http.Request) {
- if req.Method != "POST" {
- rw.Header().Set("Allow", "POST")
- rw.WriteHeader(405)
- log.Errorf("verify: invalid request method: %s", req.Method)
- return
- }
-
- if h.reqv != nil {
- h.reqv.ResetRequestVerifications()
- }
- if h.resv != nil {
- h.resv.ResetResponseVerifications()
- }
-
- rw.WriteHeader(204)
- }
|