From 51ee1e77c2ff6117d15f8c2832d22449e114444e Mon Sep 17 00:00:00 2001 From: astaxie Date: Mon, 18 Aug 2014 14:42:17 +0800 Subject: [PATCH] beego: close the file when finish init --- session/sess_file.go | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/session/sess_file.go b/session/sess_file.go index 38de7a90..0362e45a 100644 --- a/session/sess_file.go +++ b/session/sess_file.go @@ -29,7 +29,6 @@ var ( // File session store type FileSessionStore struct { - f *os.File sid string lock sync.RWMutex values map[interface{}]interface{} @@ -77,14 +76,23 @@ func (fs *FileSessionStore) SessionID() string { // Write file session to local file with Gob string func (fs *FileSessionStore) SessionRelease(w http.ResponseWriter) { - defer fs.f.Close() b, err := EncodeGob(fs.values) if err != nil { return } - fs.f.Truncate(0) - fs.f.Seek(0, 0) - fs.f.Write(b) + _, err = os.Stat(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid)) + var f *os.File + if err == nil { + f, err = os.OpenFile(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid), os.O_RDWR, 0777) + } else if os.IsNotExist(err) { + f, err = os.Create(path.Join(filepder.savePath, string(fs.sid[0]), string(fs.sid[1]), fs.sid)) + } else { + return + } + f.Truncate(0) + f.Seek(0, 0) + f.Write(b) + f.Close() } // File session provider @@ -137,8 +145,7 @@ func (fp *FileProvider) SessionRead(sid string) (SessionStore, error) { } } f.Close() - f, err = os.OpenFile(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid), os.O_WRONLY|os.O_CREATE, 0777) - ss := &FileSessionStore{f: f, sid: sid, values: kv} + ss := &FileSessionStore{sid: sid, values: kv} return ss, nil } @@ -235,9 +242,7 @@ func (fp *FileProvider) SessionRegenerate(oldsid, sid string) (SessionStore, err return nil, err } } - - newf, err = os.OpenFile(path.Join(fp.savePath, string(sid[0]), string(sid[1]), sid), os.O_WRONLY|os.O_CREATE, 0777) - ss := &FileSessionStore{f: newf, sid: sid, values: kv} + ss := &FileSessionStore{sid: sid, values: kv} return ss, nil }