Skip to content
Snippets Groups Projects
handler.go 2.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • OZGCloud's avatar
    OZGCloud committed
    /*
     * Copyright (C) 2023-2024
     * Das Land Schleswig-Holstein vertreten durch den
     * Ministerpräsidenten des Landes Schleswig-Holstein
     * Staatskanzlei
     * Abteilung Digitalisierung und zentrales IT-Management der Landesregierung
     *
     * Lizenziert unter der EUPL, Version 1.2 oder - sobald
     * diese von der Europäischen Kommission genehmigt wurden -
     * Folgeversionen der EUPL ("Lizenz");
     * Sie dürfen dieses Werk ausschließlich gemäß
     * dieser Lizenz nutzen.
     * Eine Kopie der Lizenz finden Sie hier:
     *
     * https://joinup.ec.europa.eu/collection/eupl/eupl-text-eupl-12
     *
     * Sofern nicht durch anwendbare Rechtsvorschriften
     * gefordert oder in schriftlicher Form vereinbart, wird
     * die unter der Lizenz verbreitete Software "so wie sie
     * ist", OHNE JEGLICHE GEWÄHRLEISTUNG ODER BEDINGUNGEN -
     * ausdrücklich oder stillschweigend - verbreitet.
     * Die sprachspezifischen Genehmigungen und Beschränkungen
     * unter der Lizenz sind dem Lizenztext zu entnehmen.
     */
    
    package server
    
    import (
    	"context"
    	"fmt"
    	"github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
    	"google.golang.org/grpc/codes"
    	"google.golang.org/grpc/status"
    	"net/http"
    )
    
    func RegisterHomeEndpoint(mux *runtime.ServeMux) {
    	err := mux.HandlePath("GET", "/", func(w http.ResponseWriter, r *http.Request, pathParams map[string]string) {
    		defer func() {
    			if err := recover(); err != nil {
    				logger.Error("failed to recover: %v", err)
    				http.Error(w, fmt.Sprintf("failed to recover: %v", err), http.StatusInternalServerError)
    			}
    		}()
    	})
    
    	if err != nil {
    		logger.Fatal("failed to register home endpoint: %v", err)
    	}
    }
    
    func ErrorHandler(ctx context.Context, mux *runtime.ServeMux, marshaler runtime.Marshaler, w http.ResponseWriter, r *http.Request, err error) {
    	st, ok := status.FromError(err)
    	if !ok {
    		runtime.DefaultHTTPErrorHandler(ctx, mux, marshaler, w, r, err)
    		return
    	}
    
    	statusCodeMap := map[codes.Code]int{
    		codes.InvalidArgument: http.StatusBadRequest,
    		codes.AlreadyExists:   http.StatusConflict,
    		codes.Unavailable:     http.StatusServiceUnavailable,
    	}
    
    	httpStatusCode := http.StatusInternalServerError
    
    	if code, exists := statusCodeMap[st.Code()]; exists {
    		httpStatusCode = code
    	}
    
    	w.Header().Set("Content-Type", marshaler.ContentType(r))
    	w.WriteHeader(httpStatusCode)
    
    	_, writeErr := w.Write([]byte(st.Message()))
    	if writeErr != nil {
    		logger.Fatal("failed to handle grpc error: %v", writeErr)
    	}
    }