diff --git a/htrace-core/src/go/src/org/apache/htrace/client/client.go b/htrace-core/src/go/src/org/apache/htrace/client/client.go index 52fe78e..82400fe 100644 --- a/htrace-core/src/go/src/org/apache/htrace/client/client.go +++ b/htrace-core/src/go/src/org/apache/htrace/client/client.go @@ -113,7 +113,8 @@ func (hcl *Client) Query(query *common.Query) ([]common.Span, error) { return nil, errors.New(fmt.Sprintf("Error marshalling query: %s", err.Error())) } var out []byte - out, _, err = hcl.makeRestRequest("GET", "query", bytes.NewReader(in)) + var url = fmt.Sprintf("query?query=%s", in) + out, _, err = hcl.makeGetRequest(url) if err != nil { return nil, err } diff --git a/htrace-core/src/go/src/org/apache/htrace/htraced/client_test.go b/htrace-core/src/go/src/org/apache/htrace/htraced/client_test.go index 15fbe89..044c7ba 100644 --- a/htrace-core/src/go/src/org/apache/htrace/htraced/client_test.go +++ b/htrace-core/src/go/src/org/apache/htrace/htraced/client_test.go @@ -124,4 +124,16 @@ func TestClientOperations(t *testing.T) { t.Fatalf("FindChildren(%d) returned an invalid number of "+ "children: expected %d, got %d\n", childlessSpan.Id, 0, len(children)) } + + // Test Query + var query common.Query + query = common.Query{Lim: 10} + spans, err := hcl.Query(&query) + if err != nil { + t.Fatalf("Query({lim: %d}) failed: %s\n", 10, err.Error()) + } + if len(spans) != 10 { + t.Fatalf("Query({lim: %d}) returned an invalid number of "+ + "children: expected %d, got %d\n", 10, 10, len(spans)) + } } diff --git a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go index 3ecb14b..43802fa 100644 --- a/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go +++ b/htrace-core/src/go/src/org/apache/htrace/htraced/rest.go @@ -20,6 +20,7 @@ package main import ( + "bytes" "encoding/json" "fmt" "github.com/gorilla/mux" @@ -176,17 +177,22 @@ func (hand *writeSpansHandler) ServeHTTP(w http.ResponseWriter, req *http.Reques } type queryHandler struct { + lg *common.Logger dataStoreHandler } func (hand *queryHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { setResponseHeaders(w.Header()) - _, ok := hand.getReqField32("lim", w, req) - if !ok { + + querystring := req.FormValue("query") + if querystring == "" { + writeError(hand.lg, w, http.StatusBadRequest, "No query provided.\n") return } + var query common.Query - dec := json.NewDecoder(req.Body) + reader := bytes.NewBufferString(querystring) + dec := json.NewDecoder(reader) err := dec.Decode(&query) if err != nil { writeError(hand.lg, w, http.StatusBadRequest, @@ -217,6 +223,6 @@ type defaultServeHandler struct { func (hand *defaultServeHandler) ServeHTTP(w http.ResponseWriter, req *http.Request) { ident := strings.TrimLeft(req.URL.Path, "/") if ident == "" { ident = "index.html" // default to index.html } @@ -262,7 +269,7 @@ func CreateRestServer(cnf *conf.Config, store *dataStore) (*RestServer, error) { store: store, lg: rsv.lg}} r.Handle("/writeSpans", writeSpansH).Methods("POST") - queryH := &queryHandler{dataStoreHandler: dataStoreHandler{store: store}} + queryH := &queryHandler{lg: rsv.lg, dataStoreHandler: dataStoreHandler{store: store}} r.Handle("/query", queryH).Methods("GET") span := r.PathPrefix("/span").Subrouter()