Browse Source

Updates

master
Artyom Beilis 8 years ago
parent
commit
1373fd7766
3 changed files with 184 additions and 16 deletions
  1. +1
    -2
      cppcms/capi/session.h
  2. +14
    -7
      src/capi/session.cpp
  3. +169
    -7
      tests/session.py

+ 1
- 2
cppcms/capi/session.h View File

@@ -77,7 +77,6 @@ CPPCMS_API int cppcms_capi_session_save(cppcms_capi_session *session);

CPPCMS_API cppcms_capi_cookie *cppcms_capi_session_cookie_first(cppcms_capi_session *session);
CPPCMS_API cppcms_capi_cookie *cppcms_capi_session_cookie_next(cppcms_capi_session *session);
CPPCMS_API cppcms_capi_cookie *cppcms_capi_session_cookie_next(cppcms_capi_session *session);

CPPCMS_API void cppcms_capi_cookie_delete(cppcms_capi_cookie *cookie);

@@ -95,7 +94,7 @@ CPPCMS_API unsigned cppcms_capi_cookie_max_age(cppcms_capi_cookie const *cookie)
CPPCMS_API int cppcms_capi_cookie_expires_defined(cppcms_capi_cookie const *cookie);
CPPCMS_API long long cppcms_capi_cookie_expires(cppcms_capi_cookie const *cookie);

CPPCMS_API int cppcms_capi_cookie_expires_is_secure(cppcms_capi_cookie const *cookie);
CPPCMS_API int cppcms_capi_cookie_is_secure(cppcms_capi_cookie const *cookie);


#ifdef __cplusplus


+ 14
- 7
src/capi/session.cpp View File

@@ -18,8 +18,12 @@
#include <booster/hold_ptr.h>
#include <booster/nowide/fstream.h>
#include <stdio.h>
#include <typeinfo>



namespace {

template<typename C>
void handle(C *ptr)
{
@@ -98,11 +102,12 @@ struct cppcms_capi_session {
std::string returned_value;

struct cookie_adapter : public cppcms::session_interface_cookie_adapter {
std::list<cppcms::http::cookie> cookies;
std::list<cppcms::http::cookie>::const_iterator cookies_ptr;
std::map<std::string,cppcms::http::cookie> cookies;
std::map<std::string,cppcms::http::cookie>::const_iterator cookies_ptr;

std::string value;
virtual void set_cookie(cppcms::http::cookie const &updated_cookie) {
cookies.push_back(updated_cookie);
cookies[updated_cookie.name()]=updated_cookie;
}
virtual std::string get_session_cookie(std::string const &) {
return value;
@@ -487,7 +492,8 @@ cppcms_capi_cookie *cppcms_capi_session_cookie_first(cppcms_capi_session *sessio
session->adapter.cookies_ptr=session->adapter.cookies.begin();
if(session->adapter.cookies_ptr == session->adapter.cookies.end())
return 0;
cppcms_capi_cookie *r=new cppcms_capi_cookie(*session->adapter.cookies_ptr++);
cppcms_capi_cookie *r=new cppcms_capi_cookie(session->adapter.cookies_ptr->second);
++session->adapter.cookies_ptr;
return r;
}
CATCH(session,0,0);
@@ -499,13 +505,14 @@ cppcms_capi_cookie *cppcms_capi_session_cookie_next(cppcms_capi_session *session
session->check_saved();
if(session->adapter.cookies_ptr == session->adapter.cookies.end())
return 0;
cppcms_capi_cookie *r=new cppcms_capi_cookie(*session->adapter.cookies_ptr++);
cppcms_capi_cookie *r=new cppcms_capi_cookie(session->adapter.cookies_ptr->second);
++session->adapter.cookies_ptr;
return r;
}
CATCH(session,0,0);
}

void cppcms_capi_cookie_delete(cppcms_capi_cookie *cookie) { delete cookie; }
void cppcms_capi_cookie_delete(cppcms_capi_cookie *cookie) { if(cookie) delete cookie; }

char const *cppcms_capi_cookie_header(cppcms_capi_cookie const *cookie) { return cookie->header.c_str(); }
char const *cppcms_capi_cookie_header_content(cppcms_capi_cookie const *cookie) { return cookie->header_content.c_str(); }
@@ -521,6 +528,6 @@ unsigned cppcms_capi_cookie_max_age(cppcms_capi_cookie const *cookie) { return c
int cppcms_capi_cookie_expires_defined(cppcms_capi_cookie const *cookie) { return cookie->has_expires; }
long long cppcms_capi_cookie_expires(cppcms_capi_cookie const *cookie) { return cookie->expires; }

int cppcms_capi_cookie_expires_is_secure(cppcms_capi_cookie const *cookie) { return cookie->secure; }
int cppcms_capi_cookie_is_secure(cppcms_capi_cookie const *cookie) { return cookie->secure; }

} // extern "C"

+ 169
- 7
tests/session.py View File

@@ -13,33 +13,41 @@ class MManip:
def __init__(self,c,cname):
self.Class = c;
self.cname = cname;
def add_method(self,name,result,params,check_error=True):
def add_method(self,name,result,params,check_error=True,mname=None):
if not mname:
mname = name
real_method = getattr(capi,self.cname + "_" + name);
real_method.restype = result
real_method.argstypes = params
cname = self.cname
if name == 'new':
def wrap(self):
self.d=real_method()
setattr(self.Class,name,classmethod(wrap))
#print 'Calling %s.%s() -> %s' % (cname,name,self.d)
setattr(self.Class,mname,classmethod(wrap))
else:
def wrap(self,*args):
r=real_method(self.d,*args)
if check_error:
if(self.got_error()):
raise RuntimeError(self.strerror())
if name == 'delete':
self.d = None
#print 'Called %s->%s.%s(%s) -> %s' % (self.d,cname,name,list(args),r)

return r
setattr(self.Class,name,classmethod(wrap))
setattr(self.Class,mname,classmethod(wrap))

class SessionPool:
def __init__(self):
self.new()
def __del__(self):
self.delete()
self.impl_delete()
@staticmethod
def setup():
m=MManip(SessionPool,"cppcms_capi_session_pool")
m.add_method('new',c_void_p,[],False)
m.add_method('delete',None,[c_void_p],False)
m.add_method('delete',None,[c_void_p],False,'impl_delete')
m.add_method('strerror',c_char_p,[c_void_p],False)
m.add_method('got_error',c_int,[c_void_p],False)
m.add_method('clear_error',None,[c_void_p],False)
@@ -48,11 +56,165 @@ class SessionPool:

SessionPool.setup()

class Cookie:
def __init__(self,ptr):
self.init(ptr)
def __del__(self):
self.impl_delete()
pass
def __str__(self):
return self.header()
@staticmethod
def setup():
m=MManip(Cookie,"cppcms_capi_cookie")
m.add_method('delete',None,[c_void_p],False,'impl_delete')
m.add_method('name',c_char_p,[c_void_p],False)
m.add_method('value',c_char_p,[c_void_p],False)
m.add_method('path',c_char_p,[c_void_p],False)
m.add_method('domain',c_char_p,[c_void_p],False)
m.add_method('header',c_char_p,[c_void_p],False)
m.add_method('header_content',c_char_p,[c_void_p],False)
m.add_method('max_age',c_uint,[c_void_p],False)
m.add_method('max_age_defined',c_int,[c_void_p],False)
m.add_method('expires',c_longlong,[c_void_p],False)
m.add_method('expires_defined',c_int,[c_void_p],False)
m.add_method('is_secure',c_int,[c_void_p],False)
def init(self,d):
self.d = d
setattr(Cookie,'init',classmethod(init))

Cookie.setup()

class Session:
def __init__(self,pool):
self.new()
self.impl_init(pool.d)
def __del__(self):
self.impl_delete()
pass
class KeyIterator:
def __init__(self,session):
self.s = session
self.started = False
def __iter__(self):
return self
def next(self):
if self.started:
next_key = self.s.get_next_key()
else:
next_key = self.s.get_first_key()
self.started = True
if not next_key:
raise StopIteration
return next_key
def keys(self):
return Session.KeyIterator(self)

class CookieIterator:
def __init__(self,session):
self.s = session
self.started = False
def __iter__(self):
return self
def next(self):
if self.started:
r = self.s.cookie_next()
else:
r = self.s.cookie_first()
self.started = True
if not r:
raise StopIteration
return r
def keys(self):
return Session.KeyIterator(self)
def cookies(self):
return Session.CookieIterator(self)



@staticmethod
def setup():
m=MManip(Session,"cppcms_capi_session")
m.add_method('new',c_void_p,[],False)
m.add_method('delete',None,[c_void_p],False,'impl_delete')
m.add_method('strerror',c_char_p,[c_void_p],False)
m.add_method('got_error',c_int,[c_void_p],False)
m.add_method('clear_error',None,[c_void_p],False)
m.add_method('init',c_int,[c_char_p],True,'impl_init')
m.add_method('clear',c_int,[c_void_p])
m.add_method('is_set',c_int,[c_void_p,c_char_p])
m.add_method('erase',c_int,[c_void_p,c_char_p])
m.add_method('get_exposed',c_int,[c_void_p,c_char_p])
m.add_method('set_exposed',c_int,[c_void_p,c_char_p,c_int])
m.add_method('get_first_key',c_char_p,[c_void_p])
m.add_method('get_next_key',c_char_p,[c_void_p])
m.add_method('get_csrf_token',c_char_p,[c_void_p])
m.add_method('get',c_char_p,[c_void_p,c_char_p])
m.add_method('set',c_int,[c_void_p,c_char_p,c_char_p,c_int],True,'impl_set')
m.add_method('get_session_cookie_name',c_char_p,[c_void_p])
m.add_method('save',c_int,[c_void_p])
m.add_method('load',c_int,[c_void_p,c_char_p])
m.add_method('cookie_first',c_void_p,[c_void_p],True,'impl_cookie_first')
m.add_method('cookie_next',c_void_p,[c_void_p],True,'impl_cookie_next')

def set(self,key,value):
self.impl_set(key,value,-1)

def cookie_first(self):
p=self.impl_cookie_first();
if p:
return Cookie(p)
return None
def cookie_next(self):
p=self.impl_cookie_next();
if p:
return Cookie(p)
return None


Session.setup()


def x():
def test():
state=''
p=SessionPool()
p.init(sys.argv[2])
s=Session(p)
s.load(state)
s.set('x','111')
s.set('y','222')
s.set_exposed('x',1)
for k in s.keys():
print 'Got ' + k
print 'Value ' + s.get(k)
s.save()
for c in s.cookies():
print c
print c.value()
if(c.name()==s.get_session_cookie_name()):
state = c.value()
s=None
s=Session(p)
s.load(state)
s.set_exposed('x',0)
s.save()
for c in s.cookies():
print c
print c.value()
if(c.name()==s.get_session_cookie_name()):
state = c.value()
s=None
s=Session(p)
s.load(state)
s.clear()
s.save()
for c in s.cookies():
print c
print c.value()
if(c.name()==s.get_session_cookie_name()):
state = c.value()

x()
test()



Loading…
Cancel
Save