diff --git a/core/grpcox.go b/core/grpcox.go index efe88e0..398af98 100644 --- a/core/grpcox.go +++ b/core/grpcox.go @@ -137,6 +137,11 @@ func (g *GrpCox) Extend(host string) { g.activeConn.extend(host, g.maxLifeConn) } +// SetReflectHeaders sets grpcox reflection headers +func (g *GrpCox) SetReflectHeaders(headers ...string) { + g.reflectHeaders = headers +} + func (g *GrpCox) dial(ctx context.Context, target string, plainText bool) (*grpc.ClientConn, error) { dialTime := 10 * time.Second ctx, cancel := context.WithTimeout(ctx, dialTime) diff --git a/handler/handler.go b/handler/handler.go index ad2c2d6..dbd11e9 100644 --- a/handler/handler.go +++ b/handler/handler.go @@ -70,6 +70,26 @@ func (h *Handler) getLists(w http.ResponseWriter, r *http.Request) { useTLS, _ := strconv.ParseBool(r.Header.Get("use_tls")) restart, _ := strconv.ParseBool(r.FormValue("restart")) + // treat metadata as reflection headers + metadataHeader := r.Header.Get("Metadata") + metadataArr := strings.Split(metadataHeader, ",") + + // construct array of strings with "key: value" form to be used in the reflection headers + var metadata []string + var metadataStr string + for i, m := range metadataArr { + i += 1 + if isEven := i%2 == 0; isEven { + metadataStr = metadataStr + m + metadata = append(metadata, metadataStr) + metadataStr = "" + continue + } + metadataStr = fmt.Sprintf("%s:", m) + } + + h.g.SetReflectHeaders(metadata...) + res, err := h.g.GetResource(context.Background(), host, !useTLS, restart) if err != nil { writeError(w, err) @@ -230,8 +250,8 @@ func (h *Handler) invokeFunction(w http.ResponseWriter, r *http.Request) { var metadataStr string for i, m := range metadataArr { i += 1 - if isEven := i % 2 == 0; isEven { - metadataStr = metadataStr+m + if isEven := i%2 == 0; isEven { + metadataStr = metadataStr + m metadata = append(metadata, metadataStr) metadataStr = "" continue diff --git a/index/js/style.js b/index/js/style.js index ccc725c..a42780b 100644 --- a/index/js/style.js +++ b/index/js/style.js @@ -17,6 +17,12 @@ $('#get-services').click(function(){ use_tls = "true" } + // use metadata if there is any + ctxArr = []; + $(".ctx-metadata-input-field").each(function(index, val){ + ctxArr.push($(val).text()) + }); + // determine whether the proto connection will use local proto or not const use_proto = $('#local-proto').is(":checked"); @@ -51,6 +57,9 @@ $('#get-services').click(function(){ beforeSend: function(xhr){ $('#choose-service').hide(); xhr.setRequestHeader('use_tls', use_tls); + if(ctxUse) { + xhr.setRequestHeader('Metadata', ctxArr); + } $(this).html("Loading..."); show_loading(); },