New json based log format, stores content-type
This commit is contained in:
parent
99b15cf7af
commit
e8d2364048
|
@ -1,13 +1,12 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
"path"
|
"path"
|
||||||
"strconv"
|
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -19,8 +18,7 @@ func NewDataStore(dir string) *DataStore {
|
||||||
return &DataStore{dir: dir}
|
return &DataStore{dir: dir}
|
||||||
}
|
}
|
||||||
|
|
||||||
// @TODO Add support for Content-Type
|
func (s *DataStore) CreateFile(id string, size int64, contentType string) error {
|
||||||
func (s *DataStore) CreateFile(id string, size int64) error {
|
|
||||||
file, err := os.OpenFile(s.filePath(id), os.O_CREATE|os.O_WRONLY, 0666)
|
file, err := os.OpenFile(s.filePath(id), os.O_CREATE|os.O_WRONLY, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
@ -30,7 +28,9 @@ func (s *DataStore) CreateFile(id string, size int64) error {
|
||||||
if err := file.Truncate(size); err != nil {
|
if err := file.Truncate(size); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
|
||||||
|
entry := logEntry{Meta: &metaEntry{ContentType: contentType}}
|
||||||
|
return s.appendFileLog(id, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DataStore) WriteFileChunk(id string, start int64, end int64, src io.Reader) error {
|
func (s *DataStore) WriteFileChunk(id string, start int64, end int64, src io.Reader) error {
|
||||||
|
@ -53,7 +53,8 @@ func (s *DataStore) WriteFileChunk(id string, start int64, end int64, src io.Rea
|
||||||
return errors.New("WriteFileChunk: partial copy")
|
return errors.New("WriteFileChunk: partial copy")
|
||||||
}
|
}
|
||||||
|
|
||||||
return s.appendFileLog(id, fmt.Sprintf("%d,%d", start, end))
|
entry := logEntry{Chunk: &chunkEntry{Start: start, End: end}}
|
||||||
|
return s.appendFileLog(id, entry)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DataStore) GetFileChunks(id string) (chunkSet, error) {
|
func (s *DataStore) GetFileChunks(id string) (chunkSet, error) {
|
||||||
|
@ -71,22 +72,14 @@ func (s *DataStore) GetFileChunks(id string) (chunkSet, error) {
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
parts := strings.Split(line, ",")
|
entry := logEntry{}
|
||||||
if len(parts) != 2 {
|
if err := json.Unmarshal([]byte(line), &entry); err != nil {
|
||||||
return nil, errors.New("getReceivedChunks: corrupt log line: " + line)
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
start, err := strconv.ParseInt(parts[0], 10, 64)
|
if entry.Chunk != nil {
|
||||||
if err != nil {
|
chunks.Add(chunk{Start: entry.Chunk.Start, End: entry.Chunk.End})
|
||||||
return nil, errors.New("getReceivedChunks: invalid start: " + parts[0])
|
|
||||||
}
|
}
|
||||||
|
|
||||||
end, err := strconv.ParseInt(parts[1], 10, 64)
|
|
||||||
if err != nil {
|
|
||||||
return nil, errors.New("getReceivedChunks: invalid end: " + parts[1])
|
|
||||||
}
|
|
||||||
|
|
||||||
chunks.Add(chunk{Start: start, End: end})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return chunks, nil
|
return chunks, nil
|
||||||
|
@ -106,7 +99,7 @@ func (s *DataStore) ReadFile(id string) (io.ReadCloser, int64, error) {
|
||||||
return file, stat.Size(), nil
|
return file, stat.Size(), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *DataStore) appendFileLog(id string, entry string) error {
|
func (s *DataStore) appendFileLog(id string, entry interface{}) error {
|
||||||
logPath := s.logPath(id)
|
logPath := s.logPath(id)
|
||||||
logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
|
logFile, err := os.OpenFile(logPath, os.O_APPEND|os.O_WRONLY|os.O_CREATE, 0666)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
@ -114,7 +107,12 @@ func (s *DataStore) appendFileLog(id string, entry string) error {
|
||||||
}
|
}
|
||||||
defer logFile.Close()
|
defer logFile.Close()
|
||||||
|
|
||||||
if _, err := logFile.WriteString(entry + "\n"); err != nil {
|
data, err := json.Marshal(entry)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
if _, err := logFile.WriteString(string(data) + "\n"); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
|
@ -127,3 +125,11 @@ func (s *DataStore) filePath(id string) string {
|
||||||
func (s *DataStore) logPath(id string) string {
|
func (s *DataStore) logPath(id string) string {
|
||||||
return s.filePath(id) + ".log"
|
return s.filePath(id) + ".log"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type logEntry struct {
|
||||||
|
Chunk *chunkEntry `json:",omitempty"`
|
||||||
|
Meta *metaEntry `json:",omitempty"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type chunkEntry struct{ Start, End int64 }
|
||||||
|
type metaEntry struct{ ContentType string }
|
||||||
|
|
|
@ -83,7 +83,7 @@ func postFiles(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
id := uid()
|
id := uid()
|
||||||
if err := dataStore.CreateFile(id, contentRange.Size); err != nil {
|
if err := dataStore.CreateFile(id, contentRange.Size, contentType); err != nil {
|
||||||
reply(w, http.StatusInternalServerError, err.Error())
|
reply(w, http.StatusInternalServerError, err.Error())
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
@ -97,7 +97,7 @@ func postFiles(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
|
|
||||||
w.Header().Set("Location", "/files/"+id)
|
w.Header().Set("Location", "/files/"+id)
|
||||||
//setFileRangeHeader(w, id)
|
setFileRangeHeader(w, id)
|
||||||
w.WriteHeader(http.StatusCreated)
|
w.WriteHeader(http.StatusCreated)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue