summaryrefslogtreecommitdiff
path: root/src/helsinki.at/rhimport
diff options
context:
space:
mode:
Diffstat (limited to 'src/helsinki.at/rhimport')
-rw-r--r--src/helsinki.at/rhimport/session_store.go35
1 files changed, 23 insertions, 12 deletions
diff --git a/src/helsinki.at/rhimport/session_store.go b/src/helsinki.at/rhimport/session_store.go
index 5025d8c..7fe6585 100644
--- a/src/helsinki.at/rhimport/session_store.go
+++ b/src/helsinki.at/rhimport/session_store.go
@@ -40,11 +40,13 @@ type newSessionResponse struct {
type newSessionRequest struct {
ctx *ImportContext
+ refId string
response chan newSessionResponse
}
type getSessionResponse struct {
session *SessionChan
+ refId string
responsecode int
errorstring string
}
@@ -52,6 +54,7 @@ type getSessionResponse struct {
type getSessionRequest struct {
user string
id string
+ refId string
response chan getSessionResponse
}
@@ -66,8 +69,13 @@ type removeSessionRequest struct {
response chan removeSessionResponse
}
+type SessionStoreElement struct {
+ s *Session
+ refId string
+}
+
type SessionStore struct {
- store map[string]map[string]*Session
+ store map[string]map[string]*SessionStoreElement
quit chan bool
done chan bool
newChan chan newSessionRequest
@@ -83,7 +91,7 @@ func generateSessionId() (string, error) {
return base64.RawStdEncoding.EncodeToString(b[:]), nil
}
-func (self *SessionStore) new(ctx *ImportContext) (resp newSessionResponse) {
+func (self *SessionStore) new(ctx *ImportContext, refId string) (resp newSessionResponse) {
resp.responsecode = http.StatusOK
resp.errorstring = "OK"
if !ctx.Trusted {
@@ -103,10 +111,11 @@ func (self *SessionStore) new(ctx *ImportContext) (resp newSessionResponse) {
} else {
resp.id = id
if _, exists := self.store[ctx.UserName]; !exists {
- self.store[ctx.UserName] = make(map[string]*Session)
+ self.store[ctx.UserName] = make(map[string]*SessionStoreElement)
}
- self.store[ctx.UserName][resp.id] = NewSession(ctx, func() { self.GetInterface().Remove(ctx.UserName, resp.id) })
- resp.session = self.store[ctx.UserName][resp.id].getInterface()
+ s := &SessionStoreElement{NewSession(ctx, func() { self.GetInterface().Remove(ctx.UserName, resp.id) }), refId}
+ self.store[ctx.UserName][resp.id] = s
+ resp.session = self.store[ctx.UserName][resp.id].s.getInterface()
rhdl.Printf("SessionStore: created session for '%s' -> %s", ctx.UserName, resp.id)
}
return
@@ -116,7 +125,8 @@ func (self *SessionStore) get(user, id string) (resp getSessionResponse) {
resp.responsecode = http.StatusOK
resp.errorstring = "OK"
if session, exists := self.store[user][id]; exists {
- resp.session = session.getInterface()
+ resp.session = session.s.getInterface()
+ resp.refId = session.refId
} else {
resp.responsecode = http.StatusNotFound
resp.errorstring = fmt.Sprintf("SessionStore: session '%s/%s' not found", user, id)
@@ -128,7 +138,7 @@ func (self *SessionStore) remove(user, id string) (resp removeSessionResponse) {
resp.responsecode = http.StatusOK
resp.errorstring = "OK"
if session, exists := self.store[user][id]; exists {
- go session.Cleanup() // cleanup could take a while -> don't block all the other stuff
+ go session.s.Cleanup() // cleanup could take a while -> don't block all the other stuff
delete(self.store[user], id)
rhdl.Printf("SessionStore: removed session '%s/%s'", user, id)
if userstore, exists := self.store[user]; exists {
@@ -151,7 +161,7 @@ func (self *SessionStore) dispatchRequests() {
case <-self.quit:
return
case req := <-self.newChan:
- req.response <- self.new(req.ctx)
+ req.response <- self.new(req.ctx, req.refId)
case req := <-self.getChan:
req.response <- self.get(req.user, req.id)
case req := <-self.removeChan:
@@ -169,10 +179,11 @@ type SessionStoreChan struct {
removeChan chan<- removeSessionRequest
}
-func (self *SessionStoreChan) New(ctx *ImportContext) (string, *SessionChan, int, string) {
+func (self *SessionStoreChan) New(ctx *ImportContext, refId string) (string, *SessionChan, int, string) {
res_ch := make(chan newSessionResponse)
req := newSessionRequest{}
req.ctx = ctx
+ req.refId = refId
req.response = res_ch
self.newChan <- req
@@ -180,7 +191,7 @@ func (self *SessionStoreChan) New(ctx *ImportContext) (string, *SessionChan, int
return res.id, res.session, res.responsecode, res.errorstring
}
-func (self *SessionStoreChan) Get(user, id string) (*SessionChan, int, string) {
+func (self *SessionStoreChan) Get(user, id string) (*SessionChan, string, int, string) {
res_ch := make(chan getSessionResponse)
req := getSessionRequest{}
req.user = user
@@ -189,7 +200,7 @@ func (self *SessionStoreChan) Get(user, id string) (*SessionChan, int, string) {
self.getChan <- req
res := <-res_ch
- return res.session, res.responsecode, res.errorstring
+ return res.session, res.refId, res.responsecode, res.errorstring
}
func (self *SessionStoreChan) Remove(user, id string) (int, string) {
@@ -227,7 +238,7 @@ func NewSessionStore(conf *Config) (store *SessionStore, err error) {
store.quit = make(chan bool)
store.done = make(chan bool)
- store.store = make(map[string]map[string]*Session)
+ store.store = make(map[string]map[string]*SessionStoreElement)
store.newChan = make(chan newSessionRequest, 10)
store.getChan = make(chan getSessionRequest, 10)
store.removeChan = make(chan removeSessionRequest, 10)