From a65068aff8d0cd9fdb8993c20e609364eb1213af Mon Sep 17 00:00:00 2001
From: Valentin Rothberg <rothberg@redhat.com>
Date: Wed, 15 Jan 2020 16:51:46 +0100
Subject: api: utils: add an `IsLibpodRequest` handler

Add a hanlder to figure out if the specified http request came through
a libpod endpoint.  A first user is the top endpoint which has a
different default value for `ps_args` depending if the request came
through the docker or libpod endpoint.

Signed-off-by: Valentin Rothberg <rothberg@redhat.com>
---
 pkg/api/handlers/containers_top.go |  6 +++++-
 pkg/api/handlers/utils/handler.go  | 16 ++++++++++++----
 2 files changed, 17 insertions(+), 5 deletions(-)

(limited to 'pkg/api')

diff --git a/pkg/api/handlers/containers_top.go b/pkg/api/handlers/containers_top.go
index 1a310262c..6b7688eb0 100644
--- a/pkg/api/handlers/containers_top.go
+++ b/pkg/api/handlers/containers_top.go
@@ -15,10 +15,14 @@ func TopContainer(w http.ResponseWriter, r *http.Request) {
 	runtime := r.Context().Value("runtime").(*libpod.Runtime)
 	decoder := r.Context().Value("decoder").(*schema.Decoder)
 
+	defaultValue := "-ef"
+	if utils.IsLibpodRequest(r) {
+		defaultValue = ""
+	}
 	query := struct {
 		PsArgs string `schema:"ps_args"`
 	}{
-		PsArgs: "-ef",
+		PsArgs: defaultValue,
 	}
 	if err := decoder.Decode(&query, r.URL.Query()); err != nil {
 		utils.Error(w, http.StatusText(http.StatusBadRequest), http.StatusBadRequest,
diff --git a/pkg/api/handlers/utils/handler.go b/pkg/api/handlers/utils/handler.go
index 65698bfd3..2fd9bffba 100644
--- a/pkg/api/handlers/utils/handler.go
+++ b/pkg/api/handlers/utils/handler.go
@@ -6,10 +6,18 @@ import (
 	"io"
 	"net/http"
 	"os"
+	"strings"
 
-	log "github.com/sirupsen/logrus"
+	"github.com/sirupsen/logrus"
 )
 
+// IsLibpodRequest returns true if the request related to a libpod endpoint
+// (e.g., /v2/libpod/...).
+func IsLibpodRequest(r *http.Request) bool {
+	split := strings.Split(r.URL.String(), "/")
+	return len(split) >= 3 && split[2] == "libpod"
+}
+
 // WriteResponse encodes the given value as JSON or string and renders it for http client
 func WriteResponse(w http.ResponseWriter, code int, value interface{}) {
 	switch v := value.(type) {
@@ -18,14 +26,14 @@ func WriteResponse(w http.ResponseWriter, code int, value interface{}) {
 		w.WriteHeader(code)
 
 		if _, err := fmt.Fprintln(w, v); err != nil {
-			log.Errorf("unable to send string response: %q", err)
+			logrus.Errorf("unable to send string response: %q", err)
 		}
 	case *os.File:
 		w.Header().Set("Content-Type", "application/octet; charset=us-ascii")
 		w.WriteHeader(code)
 
 		if _, err := io.Copy(w, v); err != nil {
-			log.Errorf("unable to copy to response: %q", err)
+			logrus.Errorf("unable to copy to response: %q", err)
 		}
 	default:
 		WriteJSON(w, code, value)
@@ -40,6 +48,6 @@ func WriteJSON(w http.ResponseWriter, code int, value interface{}) {
 	coder := json.NewEncoder(w)
 	coder.SetEscapeHTML(true)
 	if err := coder.Encode(value); err != nil {
-		log.Errorf("unable to write json: %q", err)
+		logrus.Errorf("unable to write json: %q", err)
 	}
 }
-- 
cgit v1.2.3-54-g00ecf