Forráskód Böngészése

Merge branch 'multipart-form-data-fix' of https://github.com/konjoot/gin

- the merge was manually modified before committing.
Manu Mtz-Almeida 10 éve
szülő
commit
ec1ce34d32
3 módosított fájl, 71 hozzáadás és 3 törlés
  1. 1 1
      binding/binding.go
  2. 5 2
      binding/binding_test.go
  3. 65 0
      context_test.go

+ 1 - 1
binding/binding.go

@@ -42,7 +42,7 @@ func Default(method, contentType string) Binding {
 			return JSON
 		case MIMEXML, MIMEXML2:
 			return XML
-		default:
+		default: //case MIMEPOSTForm, MIMEMultipartPOSTForm:
 			return Form
 		}
 	}

+ 5 - 2
binding/binding_test.go

@@ -32,7 +32,10 @@ func TestBindingDefault(t *testing.T) {
 	assert.Equal(t, Default("PUT", MIMEXML2), XML)
 
 	assert.Equal(t, Default("POST", MIMEPOSTForm), Form)
-	assert.Equal(t, Default("DELETE", MIMEPOSTForm), Form)
+	assert.Equal(t, Default("PUT", MIMEPOSTForm), Form)
+
+	assert.Equal(t, Default("POST", MIMEMultipartPOSTForm), Form)
+	assert.Equal(t, Default("PUT", MIMEMultipartPOSTForm), Form)
 }
 
 func TestBindingJSON(t *testing.T) {
@@ -63,7 +66,7 @@ func TestBindingXML(t *testing.T) {
 
 func testFormBinding(t *testing.T, method, path, badPath, body, badBody string) {
 	b := Form
-	assert.Equal(t, b.Name(), "query")
+	assert.Equal(t, b.Name(), "form")
 
 	obj := FooBarStruct{}
 	req := requestWithBody(method, path, body)

+ 65 - 0
context_test.go

@@ -8,6 +8,7 @@ import (
 	"bytes"
 	"errors"
 	"html/template"
+	"mime/multipart"
 	"net/http"
 	"net/http/httptest"
 	"testing"
@@ -33,6 +34,26 @@ func createTestContext() (c *Context, w *httptest.ResponseRecorder, r *Engine) {
 	return
 }
 
+func createMultipartForm() (body *bytes.Buffer, header string, err error) {
+	boundary := "--testboundary"
+	header = MIMEMultipartPOSTForm + "; boundary=" + boundary
+	body = &bytes.Buffer{}
+
+	mw := multipart.NewWriter(body)
+	defer mw.Close()
+
+	if err = mw.SetBoundary(boundary); err != nil {
+		return
+	}
+	if err = mw.WriteField("foo", "bar"); err != nil {
+		return
+	}
+	if err = mw.WriteField("bar", "foo"); err != nil {
+		return
+	}
+	return
+}
+
 func TestContextReset(t *testing.T) {
 	router := New()
 	c := router.allocateContext()
@@ -444,6 +465,28 @@ func TestContextAutoBind(t *testing.T) {
 	assert.Equal(t, w.Body.Len(), 0)
 }
 
+func TestContextMultipartPostFormAutoBind(t *testing.T) {
+	c, w, _ := createTestContext()
+
+	var obj struct {
+		Foo string `form:"foo"`
+		Bar string `form:"bar"`
+	}
+
+	body, header, err := createMultipartForm()
+	if err != nil {
+		t.Error(err)
+	}
+
+	c.Request, _ = http.NewRequest("POST", "/", body)
+	c.Request.Header.Add("Content-Type", header)
+
+	assert.NoError(t, c.Bind(&obj))
+	assert.Equal(t, obj.Bar, "foo")
+	assert.Equal(t, obj.Foo, "bar")
+	assert.Equal(t, w.Body.Len(), 0)
+}
+
 func TestContextBadAutoBind(t *testing.T) {
 	c, w, _ := createTestContext()
 	c.Request, _ = http.NewRequest("POST", "http://example.com", bytes.NewBufferString("\"foo\":\"bar\", \"bar\":\"foo\"}"))
@@ -477,6 +520,28 @@ func TestContextBindWith(t *testing.T) {
 	assert.Equal(t, w.Body.Len(), 0)
 }
 
+func TestContextMultipartBindWith(t *testing.T) {
+	c, w, _ := createTestContext()
+
+	var obj struct {
+		Foo string `form:"foo"`
+		Bar string `form:"bar"`
+	}
+
+	body, header, err := createMultipartForm()
+	if err != nil {
+		t.Error(err)
+	}
+
+	c.Request, _ = http.NewRequest("POST", "/", body)
+	c.Request.Header.Add("Content-Type", header)
+
+	assert.NoError(t, c.BindWith(&obj, binding.Form))
+	assert.Equal(t, obj.Bar, "foo")
+	assert.Equal(t, obj.Foo, "bar")
+	assert.Equal(t, w.Body.Len(), 0)
+}
+
 func TestContextGolangContext(t *testing.T) {
 	c, _, _ := createTestContext()
 	c.Request, _ = http.NewRequest("POST", "/", bytes.NewBufferString("{\"foo\":\"bar\", \"bar\":\"foo\"}"))