@@ -20,9 +20,10 @@ var ErrFileDoesntExists = errors.New("file doesn't exists")
2020
2121// filedrop server structure, implements http.Handler.
2222type Server struct {
23- DB * db
24- Conf Config
25- Logger * log.Logger
23+ DB * db
24+ Conf Config
25+ Logger * log.Logger
26+ DebugLogger * log.Logger
2627
2728 fileCleanerStopChan chan bool
2829}
@@ -41,6 +42,12 @@ func New(conf Config) (*Server, error) {
4142 return s , err
4243}
4344
45+ func (s * Server ) dbgLog (v ... interface {}) {
46+ if s .DebugLogger != nil {
47+ s .DebugLogger .Println (v ... )
48+ }
49+ }
50+
4451// AddFile adds file to storage and returns assigned UUID which can be directly
4552// substituted into URL.
4653func (s * Server ) AddFile (contents io.Reader , contentType string , maxUses uint , storeUntil time.Time ) (string , error ) {
@@ -52,18 +59,22 @@ func (s *Server) AddFile(contents io.Reader, contentType string, maxUses uint, s
5259
5360 _ , err = os .Stat (outLocation )
5461 if err == nil {
62+ s .Logger .Println ("UUID collision detected:" , fileUUID )
5563 return "" , errors .New ("UUID collision detected" )
5664 }
5765
5866 file , err := os .Create (outLocation )
5967 if err != nil {
68+ s .Logger .Printf ("File create failure (%v): %v\n " , fileUUID , err )
6069 return "" , errors .Wrap (err , "file open" )
6170 }
6271 if _ , err := io .Copy (file , contents ); err != nil {
72+ s .Logger .Printf ("File write failure (%v): %v\n " , fileUUID , err )
6373 return "" , errors .Wrap (err , "file write" )
6474 }
6575 if err := s .DB .AddFile (nil , fileUUID .String (), contentType , maxUses , storeUntil ); err != nil {
6676 os .Remove (outLocation )
77+ s .Logger .Printf ("DB add failure (%v, %v, %v, %v): %v\n " , fileUUID , contentType , maxUses , storeUntil , err )
6778 return "" , errors .Wrap (err , "db add" )
6879 }
6980
@@ -85,11 +96,13 @@ func (s *Server) removeFile(tx *sql.Tx, fileUUID string) error {
8596 }
8697
8798 if err := s .DB .RemoveFile (tx , fileUUID ); err != nil {
99+ s .Logger .Printf ("DB remove failure (%v): %v\n " , fileUUID , err )
88100 return errors .Wrap (err , "db remove" )
89101 }
90102
91103 if err := os .Remove (fileLocation ); err != nil {
92104 // TODO: Recover DB entry?
105+ s .Logger .Printf ("File remove failure (%v): %v\n " , fileUUID , err )
93106 return errors .Wrap (err , "file remove" )
94107 }
95108 return nil
@@ -132,13 +145,14 @@ func (s *Server) GetFile(fileUUID string) (r io.Reader, contentType string, err
132145 }
133146 defer tx .Rollback () // rollback is no-op after commit
134147
148+ s .dbgLog ("Serving file" , fileUUID )
149+
135150 if s .DB .ShouldDelete (tx , fileUUID ) {
151+ s .dbgLog ("File removed just before getting, UUID:" , fileUUID )
136152 if err := s .removeFile (tx , fileUUID ); err != nil {
137153 s .Logger .Println ("Error while trying to remove file" , fileUUID + ":" , err )
138-
139154 }
140155 if err := tx .Commit (); err != nil {
141- s .Logger .Println ("Tx commit error:" , err )
142156 return nil , "" , err
143157 }
144158 return nil , "" , ErrFileDoesntExists
@@ -157,7 +171,6 @@ func (s *Server) GetFile(fileUUID string) (r io.Reader, contentType string, err
157171 return nil , "" , err
158172 }
159173 if err := tx .Commit (); err != nil {
160- s .Logger .Println ("Tx commit error:" , err )
161174 return nil , "" , errors .Wrap (err , "tx commit" )
162175 }
163176
@@ -179,6 +192,8 @@ func (s *Server) acceptFile(w http.ResponseWriter, r *http.Request) {
179192 return
180193 }
181194
195+ s .dbgLog ("Acceping file" )
196+
182197 if s .Conf .Limits .MaxFileSize != 0 && r .ContentLength > int64 (s .Conf .Limits .MaxFileSize ) {
183198 w .WriteHeader (http .StatusRequestEntityTooLarge )
184199 w .Write ([]byte ("413 request entity too large" ))
@@ -222,6 +237,7 @@ func (s *Server) acceptFile(w http.ResponseWriter, r *http.Request) {
222237
223238 fileUUID , err := s .AddFile (r .Body , r .Header .Get ("Content-Type" ), maxUses , storeUntil )
224239 if err != nil {
240+ s .Logger .Println ("Error while serving" , r .RequestURI + ":" , err )
225241 w .WriteHeader (http .StatusInternalServerError )
226242 w .Write ([]byte (err .Error ()))
227243 return
@@ -268,8 +284,8 @@ func (s *Server) serveFile(w http.ResponseWriter, r *http.Request) {
268284 if err == ErrFileDoesntExists {
269285 w .WriteHeader (http .StatusNotFound )
270286 w .Write ([]byte ("404 not found" ))
271-
272287 } else {
288+ s .Logger .Println ("Error while serving" , r .RequestURI + ":" , err )
273289 w .WriteHeader (http .StatusInternalServerError )
274290 w .Write ([]byte (err .Error ()))
275291 }
@@ -333,6 +349,10 @@ func (s *Server) cleanupFiles() {
333349 return
334350 }
335351
352+ if len (uuids ) != 0 {
353+ s .dbgLog (len (uuids ), "to be removed" )
354+ }
355+
336356 for _ , fileUUID := range uuids {
337357 if err := os .Remove (filepath .Join (s .Conf .StorageDir , fileUUID )); err != nil {
338358 s .Logger .Println ("Failed to remove file during clean-up:" , err )
0 commit comments