From 952974491b7e8cc0d4937e38a3ac398dd46e3685 Mon Sep 17 00:00:00 2001 From: Chris Lu Date: Tue, 6 Aug 2013 11:23:24 -0700 Subject: [PATCH] refactor "content upload" out of needle creation --- go/storage/needle.go | 70 +++++++++++++++++++++++++------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/go/storage/needle.go b/go/storage/needle.go index 831ca51fa..b403d16bf 100644 --- a/go/storage/needle.go +++ b/go/storage/needle.go @@ -38,9 +38,7 @@ type Needle struct { Padding []byte `comment:"Aligned to 8 bytes"` } -func NewNeedle(r *http.Request) (n *Needle, e error) { - - n = new(Needle) +func ParseUpload(r *http.Request) (fileName string, data []byte, mimeType string, isGzipped bool, modifiedTime uint64, e error) { form, fe := r.MultipartReader() if fe != nil { log.Println("MultipartReader [ERROR]", fe) @@ -53,58 +51,70 @@ func NewNeedle(r *http.Request) (n *Needle, e error) { e = fe return } - fname := part.FileName() - if fname != "" { - fname = path.Base(part.FileName()) + fileName = part.FileName() + if fileName != "" { + fileName = path.Base(fileName) } else { e = errors.New("No file found!") return } - data, ioe := ioutil.ReadAll(part) - if ioe != nil { - e = ioe - log.Println("Reading Content [ERROR]", ioe) + data, e = ioutil.ReadAll(part) + if e != nil { + log.Println("Reading Content [ERROR]", e) return } - dotIndex := strings.LastIndex(fname, ".") + dotIndex := strings.LastIndex(fileName, ".") ext, mtype := "", "" if dotIndex > 0 { - ext = fname[dotIndex:] + ext = strings.ToLower(fileName[dotIndex:]) mtype = mime.TypeByExtension(ext) } contentType := part.Header.Get("Content-Type") - if contentType != "" && mtype != contentType && len(contentType) < 256 { - n.Mime = []byte(contentType) - n.SetHasMime() + if contentType != "" && mtype != contentType { + mimeType = contentType //only return mime type if not deductable mtype = contentType } if part.Header.Get("Content-Encoding") == "gzip" { - n.SetGzipped() + isGzipped = true } else if IsGzippable(ext, mtype) { if data, e = GzipData(data); e != nil { return } - n.SetGzipped() + isGzipped = true } if ext == ".gz" { + isGzipped = true + } + if strings.HasSuffix(fileName, ".gz") { + fileName = fileName[:len(fileName)-3] + } + modifiedTime, _ = strconv.ParseUint(r.FormValue("ts"), 10, 64) + return +} +func NewNeedle(r *http.Request) (n *Needle, e error) { + fname, mimeType, isGzipped := "", "", false + n = new(Needle) + fname, n.Data, mimeType, isGzipped, n.LastModified, e = ParseUpload(r) + if e != nil { + return + } + if len(fname) < 256 { + n.Name = []byte(fname) + n.SetHasName() + } + if len(mimeType) < 256 { + n.Mime = []byte(mimeType) + n.SetHasMime() + } + if isGzipped { n.SetGzipped() } - if len(fname) < 256 { - if strings.HasSuffix(fname, ".gz") { - n.Name = []byte(fname[:len(fname)-3]) - } else { - n.Name = []byte(fname) - } - n.SetHasName() - } - var parseError error - if n.LastModified, parseError = strconv.ParseUint(r.FormValue("ts"), 10, 64); parseError != nil { + if n.LastModified == 0 { n.LastModified = uint64(time.Now().Unix()) + n.SetHasLastModifiedDate() } - n.SetHasLastModifiedDate() - n.Data = data - n.Checksum = NewCRC(data) + n.Checksum = NewCRC(n.Data) commaSep := strings.LastIndex(r.URL.Path, ",") dotSep := strings.LastIndex(r.URL.Path, ".")