log: Dump signature request properly. (#4063)

Currently percent encoded strings are not properly encoded.

`s3%!!(MISSING)A(MISSING)`

Print properly as json encoded.

`s3%3AObjectCreated%3A%2A`
master
Harshavardhana 8 years ago committed by GitHub
parent 60ea2b17ba
commit f44f2e341c
  1. 14
      cmd/utils.go
  2. 43
      cmd/utils_test.go

@ -18,6 +18,7 @@ package cmd
import ( import (
"encoding/base64" "encoding/base64"
"encoding/json"
"encoding/xml" "encoding/xml"
"errors" "errors"
"fmt" "fmt"
@ -28,8 +29,6 @@ import (
"strings" "strings"
"time" "time"
"encoding/json"
humanize "github.com/dustin/go-humanize" humanize "github.com/dustin/go-humanize"
"github.com/pkg/profile" "github.com/pkg/profile"
) )
@ -248,12 +247,15 @@ func dumpRequest(r *http.Request) string {
Path string `json:"path"` Path string `json:"path"`
Query string `json:"query"` Query string `json:"query"`
Header http.Header `json:"header"` Header http.Header `json:"header"`
}{r.Method, r.URL.Path, r.URL.RawQuery, header} }{r.Method, getURLEncodedName(r.URL.Path), r.URL.RawQuery, header}
jsonBytes, err := json.Marshal(req) jsonBytes, err := json.Marshal(&req)
if err != nil { if err != nil {
return "<error dumping request>" // Upon error just return Go-syntax representation of the value
return fmt.Sprintf("%#v", req)
} }
return string(jsonBytes) // Replace all '%' to '%%' so that printer format parser
// to ignore URL encoded values.
return strings.Replace(string(jsonBytes), "%", "%%", -1)
} }
// isFile - returns whether given path is a file or not. // isFile - returns whether given path is a file or not.

@ -17,12 +17,14 @@
package cmd package cmd
import ( import (
"encoding/json"
"fmt" "fmt"
"net" "net"
"net/http" "net/http"
"net/url" "net/url"
"reflect" "reflect"
"runtime" "runtime"
"strings"
"testing" "testing"
) )
@ -413,3 +415,44 @@ func TestCheckURL(t *testing.T) {
} }
} }
} }
// Testing dumping request function.
func TestDumpRequest(t *testing.T) {
req, err := http.NewRequest("GET", "http://localhost:9000?prefix=Hello%2AWorld%2A", nil)
if err != nil {
t.Fatal(err)
}
req.Header.Set("content-md5", "====test")
jsonReq := dumpRequest(req)
type jsonResult struct {
Method string `json:"method"`
Path string `json:"path"`
Query string `json:"query"`
Header http.Header `json:"header"`
}
jsonReq = strings.Replace(jsonReq, "%%", "%", -1)
res := jsonResult{}
if err = json.Unmarshal([]byte(jsonReq), &res); err != nil {
t.Fatal(err)
}
// Look for expected method.
if res.Method != "GET" {
t.Fatalf("Unexpected method %s, expected 'GET'", res.Method)
}
// Look for expected query values
expectedQuery := url.Values{}
expectedQuery.Set("prefix", "Hello*World*")
if !reflect.DeepEqual(res.Query, expectedQuery.Encode()) {
t.Fatalf("Expected %#v, got %#v", expectedQuery, res.Query)
}
// Look for expected header.
expectedHeader := http.Header{}
expectedHeader.Set("content-md5", "====test")
expectedHeader.Set("host", "localhost:9000")
if !reflect.DeepEqual(res.Header, expectedHeader) {
t.Fatalf("Expected %#v, got %#v", expectedHeader, res.Header)
}
}

Loading…
Cancel
Save