Skip to content

Commit d811c30

Browse files
committed
* Remove dependency on container/vector
* Fix multipart POST requests
1 parent 2f9d30b commit d811c30

File tree

2 files changed

+28
-33
lines changed

2 files changed

+28
-33
lines changed

request.go

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
package web
22

33
import (
4-
"container/vector"
54
"fmt"
65
"http"
76
"io"
@@ -68,7 +67,6 @@ func newRequest(hr *http.Request, hc http.ResponseWriter) *Request {
6867

6968
req := Request{
7069
Method: hr.Method,
71-
RawURL: hr.RawURL,
7270
URL: hr.URL,
7371
Proto: hr.Proto,
7472
ProtoMajor: hr.ProtoMajor,
@@ -140,7 +138,6 @@ func newRequestCgi(headers http.Header, body io.Reader) *Request {
140138
}
141139

142140
func parseForm(m map[string][]string, query string) (err os.Error) {
143-
data := make(map[string]*vector.StringVector)
144141
for _, kv := range strings.Split(query, "&") {
145142
kvPair := strings.SplitN(kv, "=", 2)
146143

@@ -154,16 +151,11 @@ func parseForm(m map[string][]string, query string) (err os.Error) {
154151
err = e
155152
}
156153

157-
vec, ok := data[key]
154+
vec, ok := m[key]
158155
if !ok {
159-
vec = new(vector.StringVector)
160-
data[key] = vec
156+
vec = []string{}
161157
}
162-
vec.Push(value)
163-
}
164-
165-
for k, vec := range data {
166-
m[k] = vec.Copy()
158+
m[key] = append(vec, value)
167159
}
168160

169161
return
@@ -203,22 +195,27 @@ func (r *Request) parseParams() (err os.Error) {
203195
r.Params = map[string]string{}
204196
json.Unmarshal(b, r.Params)
205197
case "multipart/form-data":
206-
_, params := mime.ParseMediaType(ct)
198+
_, params, err := mime.ParseMediaType(ct)
199+
if err != nil {
200+
return err
201+
}
207202
boundary, ok := params["boundary"]
208203
if !ok {
209204
return os.NewError("Missing Boundary")
210205
}
206+
211207
reader := multipart.NewReader(r.Body, boundary)
212208
r.Files = make(map[string]filedata)
213209
for {
214210
part, err := reader.NextPart()
211+
if part == nil && err == os.EOF {
212+
break
213+
}
214+
215215
if err != nil {
216216
return err
217217
}
218218

219-
if part == nil {
220-
break
221-
}
222219
//read the data
223220
data, _ := ioutil.ReadAll(part)
224221
//check for the 'filename' param
@@ -227,15 +224,18 @@ func (r *Request) parseParams() (err os.Error) {
227224
continue
228225
}
229226
name := part.FormName()
230-
d, params := mime.ParseMediaType(v)
227+
d, params, err := mime.ParseMediaType(v)
228+
if err != nil {
229+
return err
230+
}
231231
if d != "form-data" {
232232
continue
233233
}
234234
if params["filename"] != "" {
235235
r.Files[name] = filedata{params["filename"], data}
236236
} else {
237-
var params vector.StringVector = r.FullParams[name]
238-
params.Push(string(data))
237+
var params []string = r.FullParams[name]
238+
params = append(params, string(data))
239239
r.FullParams[name] = params
240240
}
241241

@@ -244,6 +244,7 @@ func (r *Request) parseParams() (err os.Error) {
244244
return &badStringError{"unknown Content-Type", ct}
245245
}
246246
}
247+
247248
if queryParams != "" {
248249
err = parseForm(r.FullParams, queryParams)
249250
if err != nil {

web.go

Lines changed: 9 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ package web
22

33
import (
44
"bytes"
5-
"container/vector"
65
"crypto/hmac"
76
"encoding/base64"
87
"fmt"
@@ -201,10 +200,10 @@ func (s *Server) addRoute(r string, method string, handler interface{}) {
201200
}
202201

203202
if fv, ok := handler.(reflect.Value); ok {
204-
s.routes.Push(route{r, cr, method, fv})
203+
s.routes = append(s.routes, route{r, cr, method, fv})
205204
} else {
206205
fv := reflect.ValueOf(handler)
207-
s.routes.Push(route{r, cr, method, fv})
206+
s.routes = append(s.routes, route{r, cr, method, fv})
208207
}
209208
}
210209

@@ -326,8 +325,8 @@ func (s *Server) routeHandler(req *Request, c conn) {
326325
return
327326
}
328327

329-
for i := 0; i < s.routes.Len(); i++ {
330-
route := s.routes.At(i).(route)
328+
for i := 0; i < len(s.routes); i++ {
329+
route := s.routes[i]
331330
cr := route.cr
332331
//if the methods don't match, skip this handler (except HEAD can be used in place of GET)
333332
if req.Method != route.method && !(req.Method == "HEAD" && route.method == "GET") {
@@ -343,21 +342,16 @@ func (s *Server) routeHandler(req *Request, c conn) {
343342
continue
344343
}
345344

346-
var args vector.Vector
345+
var args []reflect.Value
347346
handlerType := route.handler.Type()
348347
if requiresContext(handlerType) {
349-
args.Push(reflect.ValueOf(&ctx))
348+
args = append(args, reflect.ValueOf(&ctx))
350349
}
351350
for _, arg := range match[1:] {
352-
args.Push(reflect.ValueOf(arg))
351+
args = append(args, reflect.ValueOf(arg))
353352
}
354353

355-
valArgs := make([]reflect.Value, args.Len())
356-
for i := 0; i < args.Len(); i++ {
357-
valArgs[i] = args.At(i).(reflect.Value)
358-
}
359-
360-
ret, err := s.safelyCall(route.handler, valArgs)
354+
ret, err := s.safelyCall(route.handler, args)
361355
if err != nil {
362356
//fmt.Printf("%v\n", err)
363357
//there was an error or panic while calling the handler
@@ -406,7 +400,7 @@ var mainServer = Server{
406400

407401
type Server struct {
408402
Config *ServerConfig
409-
routes vector.Vector
403+
routes []route
410404
Logger *log.Logger
411405
//save the listener so it can be closed
412406
l net.Listener

0 commit comments

Comments
 (0)