• Stars
    star
    1
  • Language
    Scheme
  • License
    GNU Lesser Genera...
  • Created over 14 years ago
  • Updated over 14 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Cookie-based in-memory session storage for the Racket HTTP Server.

Dave's Session Example

Developed by Dave Gurnell.

Example session storage for the Racket HTTP Server. Run test-app.ss for a demo.

Copyright 2006 to 2010 Untyped.

See LICENCE and COPYING for licence information.

Overview

A "session" is a key/value store that is specific to a particular browser.

Sessions are mapped to browsers using cookies. The name of the cookie is something specific to the application, e.g. "DavesApplication", and the value of the cookie is a unique identifier for a session.

Cookies are installed and removed with the procedures in session-control.ss. There are also procedures for adjusting session lifetime:

session-control.ss:

  • begin-session - store a session cookie that will be deleted when the browser is closed;
  • end-session - delete the session cookie from the browser;
  • adjust-session-lifetime - make the session cookie last for a certain number of seconds;
  • adjust-session-expiry - make the session cookie last until a certain time;

Once a cookie as been stored, a session can be retrieved and manipulated using procedures from session.ss:

session.ss:

  • session-cookie-name - parameter - the name of the session cookie - default is a random string of the form "PLTxxxx";
  • request-session-cookie-value - retrieves the value of said cookie (the session name) form a request;
  • request-session - retrieves the current session from a request;
  • session? - predicate that recognises session objects;
  • session-cookie-value - retrieves the cookie value of a session;
  • dict-ref,dict-set!,etc - sessions are dicts with eq? key comparison, support for mutation, and no support for functional update.

"Session cells" are a convenient abstraction on top of sessions. Each cell contains a unique key into the session store. This makes session-cells behave a bit like web-cells:

session-cell.ss:

  • make-session-cell - create a session cell with a default value;
  • session-cell-ref - retrieves the cell's current value from the session, or returns the cell's default value;
  • session-cell-set! - determines whether there is a value for the session in the key/value store (returns #f if session-cell-ref would fall back to the default value);
  • session-cell-set! - stores a value for the cell in the session;
  • session-cell-unset! - removes any value for the cell from the session.

See the source code for more detail.

Outstanding issues

Test coverage

Test coverage is not complete, particularly tests of the procedures in session-control.ss. I haven't used this adaptation of the code in production so I expect there will still be bugs there.

Global hash table

Currently, all session information is stored in a single global hash table called "all-sessions". Over time, this hash table will increase in size, theoretically ending in an out-of-memory errors.

Untyped have been using this global hash table approach to store usernames for authenticated users for years and to our knowledge it has never caused a problem. Usernames are small so there's no reason we should ever have seen a crash, but it would be inadvisable to use this code to store large amounts of data in its current implementation.

Jay has proposed an alternative implementation using md5-stuffers to store session data on-disk. I'll implement this as soon as I get a chance.

Netscape cookie implementation

The code uses a version of collects/net/cookie-unit.ss that implements the old Netscape cookie spec, rather than the more recent RFC standard implemented in core Racket. Untyped had issues getting cookies to work on IE6 a few years ago, which caused us to fork this code.

I have tested the Untyped library on Firefox 2+, Safari 3+ and IE 6+ and found it to work okay. However, I don't know for sure whether the core Racket library will perform better or worse in terms of browser compatibility.

More Repositories

1

bridges

Generate bindings for Scala types in other programming languages.
Scala
56
star
2

unindent

Indent-adjusted multiline string literals for Scala.
Shell
48
star
3

checklist

Validation library for Scala.
Scala
47
star
4

bulletin

Automatically perform shallow merges on case classes. Treat your data with the latest updates!
Scala
42
star
5

meowsynth

The mighty meowing synthesizer!
Scala
30
star
6

validation

Scala data validation library
Scala
29
star
7

typelevel-todomvc

Scala
25
star
8

atlas

A tiny embedded scripting language implemented in Scala.
Scala
24
star
9

shapeless-guide

The Type Astronaut's Guide to Shapeless
19
star
10

functional-data-validation

Slides and code samples for a talk on thinking functionally (and validating web forms).
Scala
18
star
11

99-ways-to-di

Slides from my lightning talk on Dependency Injection at Scala Central #5.
14
star
12

css-selector

Lift-style CSS selector transforms based on Scalate's Scuery
Scala
10
star
13

tipi

Tiny templating language written in Scala.
Scala
10
star
14

macros-vs-shapeless

Slides and code samples on meta-programming techniques in Scala.
Scala
10
star
15

spandoc

Write Pandoc filters in Scala.
Scala
7
star
16

scalalol-2011-talk

Slides and code samples for talk at Scala Lift-Off London 2011.
Scala
6
star
17

scala-opengl

Simple OpenGL examples using Scala, LWJGL, and sbt-lwjgl
Scala
6
star
18

shapeless-guide-slides

Slides for my Scala World 2016 workshop on shapeless.
6
star
19

smartypants

Simple smart constructor generation for Scala.
Scala
4
star
20

scalax2gether-2017

Workshop and hack proposals for the Scala Exchange Hack Day (ScalaX2gether 2017)
4
star
21

shapeless-sandbox

Scala
3
star
22

scalax-2014

Slides and code samples for my Scala Exchange 2014 talk on Functional Data Validation.
3
star
23

typelevel-philly-2016

3
star
24

sbt-less

Superseded by sbt-less in https://github.com/untyped/sbt-plugins.
Scala
3
star
25

akka-streams-case-study

Scala
2
star
26

poker-case-study

Poker hand comparison in Scala. A fairly advanced "Essential Scala" case study.
Scala
2
star
27

interpreter-case-study

Scala case study about building an interpreter and a simple DSL.
Scala
2
star
28

cats-error-case-study

Scala
2
star
29

bus-driver-case-study

Gossiping Bus Drivers Kata
Scala
2
star
30

scala-rpg-test

A sandbox project for playing with Scala and the graphics from Browserquest.
Scala
2
star
31

concurrency-case-study

Scala
2
star
32

versionit

Grab your Git commit hash as a Scala String.
Scala
2
star
33

advanced-scala-scalax15

Code written at Advanced Scala at Scala Exchange 2015
Scala
1
star
34

spectaskular-iphone

iPhone todo list app
Objective-C
1
star
35

brighton-java-sample-app

Scala talk for Brighton Java
CSS
1
star
36

kitties-case-study

Meow!
Scala
1
star
37

gilded-rose-case-study

Code refactoring kata
Scala
1
star
38

conway-case-study

Scala
1
star
39

mars-rover-case-study

Scala
1
star
40

asyncjs-creative-fp

Creative Functional Programming talk for AsyncJS.
1
star
41

parallel-case-study

Scala
1
star
42

bank-ocr-case-study

Scala
1
star
43

play-json-case-study

Scala
1
star
44

calc-case-study

Scala
1
star
45

bowling-case-study

Scala
1
star
46

advanced-scala

The old source code repository for Scala with Cats
1
star
47

paths-case-study

Essential Scala case study: selecting paths from a route finder service
Scala
1
star
48

typeclub

Scala
1
star
49

tagless-case-study

Scala
1
star
50

composejs

Javascript port of Compose (https://github.com/underscoreio/compose).
JavaScript
1
star
51

doodlejs

Javascript port of Doodle
JavaScript
1
star
52

fpinscala

My attempts at the exercises in Functional Programming in Scala.
Scala
1
star
53

shapeless-guide-code

The Type Astronaut's Guide to Shapeless (Example Code)
1
star
54

scaladays-berlin-2016

1
star
55

property-based-testing-workshop

Scala
1
star
56

advanced-scala-exercises

Scala
1
star
57

away-with-the-types

Scala
1
star
58

cats-effect-sandbox

An empty SBT project with dependencies on Cats and Cats Effect.
Scala
1
star