DemoServer.swift 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200
  1. //
  2. // DemoServer.swift
  3. // Swifter
  4. //
  5. // Copyright (c) 2014-2016 Damian Kołakowski. All rights reserved.
  6. //
  7. import Foundation
  8. public func demoServer(publicDir: String) -> HttpServer {
  9. print(publicDir)
  10. let server = HttpServer()
  11. server["/public/:path"] = shareFilesFromDirectory(publicDir)
  12. server["/public/"] = shareFilesFromDirectory(publicDir) // needed to serve index file at root level
  13. server["/files/:path"] = directoryBrowser("/")
  14. server["/"] = scopes {
  15. html {
  16. body {
  17. ul(server.routes) { service in
  18. li {
  19. a { href = service; inner = service }
  20. }
  21. }
  22. }
  23. }
  24. }
  25. server["/magic"] = { .OK(.Html("You asked for " + $0.path)) }
  26. server["/test/:param1/:param2"] = { r in
  27. scopes {
  28. html {
  29. body {
  30. h3 { inner = "Address: \(r.address)" }
  31. h3 { inner = "Url: \(r.path)" }
  32. h3 { inner = "Method: \(r.method)" }
  33. h3 { inner = "Query:" }
  34. table(r.queryParams) { param in
  35. tr {
  36. td { inner = param.0 }
  37. td { inner = param.1 }
  38. }
  39. }
  40. h3 { inner = "Headers:" }
  41. table(r.headers) { header in
  42. tr {
  43. td { inner = header.0 }
  44. td { inner = header.1 }
  45. }
  46. }
  47. h3 { inner = "Route params:" }
  48. table(r.params) { param in
  49. tr {
  50. td { inner = param.0 }
  51. td { inner = param.1 }
  52. }
  53. }
  54. }
  55. }
  56. }(r)
  57. }
  58. server.GET["/upload"] = scopes {
  59. html {
  60. body {
  61. form {
  62. method = "POST"
  63. action = "/upload"
  64. enctype = "multipart/form-data"
  65. input { name = "my_file1"; type = "file" }
  66. input { name = "my_file2"; type = "file" }
  67. input { name = "my_file3"; type = "file" }
  68. button {
  69. type = "submit"
  70. inner = "Upload"
  71. }
  72. }
  73. }
  74. }
  75. }
  76. server.POST["/upload"] = { r in
  77. var response = ""
  78. for multipart in r.parseMultiPartFormData() {
  79. response += "Name: \(multipart.name) File name: \(multipart.fileName) Size: \(multipart.body.count)<br>"
  80. }
  81. return HttpResponse.OK(.Html(response))
  82. }
  83. server.GET["/login"] = scopes {
  84. html {
  85. head {
  86. script { src = "http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js" }
  87. stylesheet { href = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/css/bootstrap.min.css" }
  88. }
  89. body {
  90. h3 { inner = "Sign In" }
  91. form {
  92. method = "POST"
  93. action = "/login"
  94. fieldset {
  95. input { placeholder = "E-mail"; name = "email"; type = "email"; autofocus = "" }
  96. input { placeholder = "Password"; name = "password"; type = "password"; autofocus = "" }
  97. a {
  98. href = "/login"
  99. button {
  100. type = "submit"
  101. inner = "Login"
  102. }
  103. }
  104. }
  105. }
  106. javascript {
  107. src = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/js/bootstrap.min.js"
  108. }
  109. }
  110. }
  111. }
  112. server.POST["/login"] = { r in
  113. let formFields = r.parseUrlencodedForm()
  114. return HttpResponse.OK(.Html(formFields.map({ "\($0.0) = \($0.1)" }).joinWithSeparator("<br>")))
  115. }
  116. server["/demo"] = scopes {
  117. html {
  118. body {
  119. center {
  120. h2 { inner = "Hello Swift" }
  121. img { src = "https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png" }
  122. }
  123. }
  124. }
  125. }
  126. server["/raw"] = { r in
  127. return HttpResponse.RAW(200, "OK", ["XXX-Custom-Header": "value"], { $0.write([UInt8]("test".utf8)) })
  128. }
  129. server["/json"] = { r in
  130. let jsonObject: NSDictionary = [NSString(string: "foo"): NSNumber(int: 3), NSString(string: "bar"): NSString(string: "baz")]
  131. return .OK(.Json(jsonObject))
  132. }
  133. server["/redirect"] = { r in
  134. return .MovedPermanently("http://www.google.com")
  135. }
  136. server["/long"] = { r in
  137. var longResponse = ""
  138. for k in 0..<1000 { longResponse += "(\(k)),->" }
  139. return .OK(.Html(longResponse))
  140. }
  141. server["/wildcard/*/test/*/:param"] = { r in
  142. return .OK(.Html(r.path))
  143. }
  144. server["/stream"] = { r in
  145. return HttpResponse.RAW(200, "OK", nil, { w in
  146. for i in 0...100 {
  147. w.write([UInt8]("[chunk \(i)]".utf8))
  148. }
  149. })
  150. }
  151. server["/websocket-echo"] = websocket({ (session, text) in
  152. session.writeText(text)
  153. }, { (session, binary) in
  154. session.writeBinary(binary)
  155. })
  156. server.notFoundHandler = { r in
  157. return .MovedPermanently("https://github.com/404")
  158. }
  159. server.middleware.append { r in
  160. print("Middleware:\(r.method) \(r.path)")
  161. return nil
  162. }
  163. return server
  164. }