from Cookie import SimpleCookie from urlparse import parse_qs from uuid import uuid4 from wsgiref.simple_server import make_server def tracking_server(environ, respond): """Function used to handle all requests made to this tracking server """ if environ['PATH_INFO'] == '/track.js': return track_user(environ, respond) elif environ['PATH_INFO'] == '/buster.js': return cache_buster(environ, respond) elif environ['PATH_INFO'] == '/favicon.ico': respond('204 NO CONTENT', []) return [''] else: return html_content(environ, respond) def track_user(environ, respond): """Function used to handle the route: /track.js This will check to make sure that the user has a cookie id=, if not then we will generate a new uuid4 id for them and set the cookie. This will also print to stdout when we generate a new cookie as well as what the user searched for. """ cookies = SimpleCookie() cookies.load(environ.get('HTTP_COOKIE', '')) if not cookies.get('id'): user_id = uuid4() print 'User did not have id, giving: %s' % user_id else: user_id = cookies['id'].value query = parse_qs(environ['QUERY_STRING']) search = query.get('s', [''])[0] print 'User %s Searched For: %s' % (user_id, search) headers = [('Content-Type', 'application/javascript'), ('Set-Cookie', 'id=%s' % user_id)] respond('200 OK', headers) return [''] def cache_buster(environ, respond): """Function used to handle the /buster.js route This will simply return our cache buster javascript to the user, which adds a script tag to call /track.js """ headers = [('Content-Type', 'application/javascript')] respond('200 OK', headers) cb_js = """ function getParameterByName(name){ name = name.replace(/[\[]/, "\\\[").replace(/[\]]/, "\\\]"); var regexS = "[\\?&]" + name + "=([^&#]*)"; var regex = new RegExp(regexS); var results = regex.exec(window.location.search); if(results == null) return ""; else return decodeURIComponent(results[1].replace(/\+/g, " ")); } var now = new Date().getTime(); var random = Math.random() * 99999999999; var search = getParameterByName('search'); document.write(''); """ return [cb_js] def html_content(environ, respond): """Function used to handle any route that is not /track.js This will return to the user a very basic html page that has a script that to call our /buster.js script """ headers = [('Content-Type', 'text/html')] respond('200 OK', headers) return ['

Welcome

\n'] if __name__ == '__main__': try: httpd = make_server('', 8000, tracking_server) print 'Tracking Server Listening on Port 8000...' httpd.serve_forever() except KeyboardInterrupt: print 'Exiting...'