Advertisement
Guest User

Untitled

a guest
Nov 28th, 2013
97
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
F# 3.16 KB | None | 0 0
  1.  
  2. open System
  3. open System.Net
  4.  
  5. open Suave.Web
  6. open Suave.Http
  7. open Suave.Types
  8. open Suave.Session
  9.  
  10. open OpenSSL.X509
  11. open OpenSSL.Core
  12.  
  13. let basic_auth  : WebPart =
  14.   authenticate_basic ( fun x -> x.Username.Equals("foo") && x.Password.Equals("bar"))
  15.  
  16. let sslCert = X509Certificate.FromPKCS12(BIO.File("suave.p12","r"),"easy")
  17.  
  18. let myapp : WebPart =
  19.   choose [
  20.     GET >>= choose
  21.       [ url "/hello" >>= OK "Hello GET" ; url "/goodbye" >>= OK "Good bye GET" ];
  22.     POST >>= choose
  23.       [ url "/hello" >>= OK "Hello POST" ; url "/goodbye" >>= OK "Good bye POST" ];
  24.     DELETE >>= choose
  25.       [ url "/hello" >>= OK "Hello DELETE" ; url "/goodbye" >>= OK "Good bye DELETE" ];
  26.     PUT >>= choose
  27.       [ url "/hello" >>= OK "Hello PUT" ; url "/goodbye" >>= OK "Good bye PUT" ];
  28.   ]
  29.  
  30. // typed routes
  31. let testapp : WebPart =
  32.   choose [
  33.     Console.OpenStandardOutput() |> log >>= never ;
  34.     url_scan "/add/%d/%d"   (fun (a,b) -> OK((a + b).ToString()))
  35.     url_scan "/minus/%d/%d" (fun (a,b) -> OK((a - b).ToString()))
  36.     NOT_FOUND "Found no handlers"
  37.   ]
  38.  
  39. System.Net.ServicePointManager.DefaultConnectionLimit <- Int32.MaxValue
  40.  
  41. let timeout r =
  42.   async {
  43.     do! Async.Sleep 1500
  44.   } |> succeed
  45.  
  46. choose [
  47.   Console.OpenStandardOutput() |> log >>= never ;
  48.  
  49.   GET >>= url "/hello" >>= never ;
  50.   url_regex "(.*?)\.(dll|mdb|log)$" >>= FORBIDDEN "Access denied."
  51.   url "/neverme" >>= never >>= OK (Guid.NewGuid().ToString()) ;
  52.   url "/guid" >>= OK (Guid.NewGuid().ToString()) ;
  53.   url "/hello" >>= OK "Hello World" ;
  54.   GET >>= url "/query" >>= warbler( fun x -> cond (x.Query) ? name (fun y -> OK ("Hello " + y)) never) ;
  55.   GET >>= url "/query" >>= OK "Hello beautiful" ;
  56.   url "/redirect" >>= redirect "/redirected"
  57.   url "/redirected" >>=  OK "You have been redirected." ;
  58.   url "/date" >>= warbler (fun _ -> OK (DateTime.Now.ToString()));
  59.   url "/timeout" >>= timeout;
  60.   url "/session"
  61.     >>= session_support
  62.     // alternative to warbler
  63.     >>== (fun x ->
  64.       cond (session x) ? counter
  65.           ( fun y ->
  66.               (session x) ? counter <- (y :?> int) + 1 :> obj ;
  67.               OK (sprintf "Hello %A time(s)"  y ))
  68.             ((session x) ? counter <- 1 :> obj ; OK "First time" )) ;
  69.   basic_auth; // from here on it will require authentication
  70.   GET >>= browse; //serves file if exists
  71.   GET >>= dir; //show directory listing
  72.   POST >>= url "/upload" >>= OK "Upload successful." ;
  73.   POST >>= url "/upload2"
  74.       >>= warbler(fun x ->
  75.                     let files = x.Files |> Seq.fold (fun x y -> x + "<br>" + (sprintf "(%s,%s,%s)" y.FileName y.MimeType y.Path)) "" ;
  76.                     OK (sprintf "Upload successful.<br>POST data: %A<br>Uploaded files (%d): %s" (x.Form)(x.Files.Count) files)) ;
  77.   POST >>= warbler( fun x -> OK (sprintf "POST data: %A" (x.Form)));
  78.   NOT_FOUND "Found no handlers"
  79.   ]
  80.   |> web_server
  81.       { bindings =
  82.         [ HttpBinding.Create(HTTP, "127.0.0.1", 8082)
  83.         ; { scheme = HTTPS(sslCert); ip = IPAddress.Parse "127.0.0.1"; port = 8083us } ]
  84.       ; error_handler = default_error_handler
  85.       ; timeout       = TimeSpan.FromMilliseconds 1000.
  86.       ; ct             = Async.DefaultCancellationToken }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement