1
0

DemoServer.swift 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206
  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["/files/:path"] = directoryBrowser("/")
  13. server["/"] = scopes {
  14. html {
  15. body {
  16. ul(server.routes) { service in
  17. li {
  18. a { href = service; inner = service }
  19. }
  20. }
  21. }
  22. }
  23. }
  24. server["/magic"] = { .ok(.html("You asked for " + $0.path)) }
  25. server["/test/:param1/:param2"] = { r in
  26. scopes {
  27. html {
  28. body {
  29. h3 { inner = "Address: \(r.address ?? "unknown")" }
  30. h3 { inner = "Url: \(r.path)" }
  31. h3 { inner = "Method: \(r.method)" }
  32. h3 { inner = "Query:" }
  33. table(r.queryParams) { param in
  34. tr {
  35. td { inner = param.0 }
  36. td { inner = param.1 }
  37. }
  38. }
  39. h3 { inner = "Headers:" }
  40. table(r.headers) { header in
  41. tr {
  42. td { inner = header.0 }
  43. td { inner = header.1 }
  44. }
  45. }
  46. h3 { inner = "Route params:" }
  47. table(r.params) { param in
  48. tr {
  49. td { inner = param.0 }
  50. td { inner = param.1 }
  51. }
  52. }
  53. }
  54. }
  55. }(r)
  56. }
  57. server.GET["/upload"] = scopes {
  58. html {
  59. body {
  60. form {
  61. method = "POST"
  62. action = "/upload"
  63. enctype = "multipart/form-data"
  64. input { name = "my_file1"; type = "file" }
  65. input { name = "my_file2"; type = "file" }
  66. input { name = "my_file3"; type = "file" }
  67. button {
  68. type = "submit"
  69. inner = "Upload"
  70. }
  71. }
  72. }
  73. }
  74. }
  75. server.POST["/upload"] = { r in
  76. var response = ""
  77. for multipart in r.parseMultiPartFormData() {
  78. guard let name = multipart.name, let fileName = multipart.fileName else { continue }
  79. response += "Name: \(name) File name: \(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)" }).joined(separator: "<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"], { try $0.write([UInt8]("test".utf8)) })
  128. }
  129. server["/redirect/permanently"] = { r in
  130. return .movedPermanently("http://www.google.com")
  131. }
  132. server["/redirect/temporarily"] = { r in
  133. return .movedTemporarily("http://www.google.com")
  134. }
  135. server["/long"] = { r in
  136. var longResponse = ""
  137. for k in 0..<1000 { longResponse += "(\(k)),->" }
  138. return .ok(.html(longResponse))
  139. }
  140. server["/wildcard/*/test/*/:param"] = { r in
  141. return .ok(.html(r.path))
  142. }
  143. server["/stream"] = { r in
  144. return HttpResponse.raw(200, "OK", nil, { w in
  145. for i in 0...100 {
  146. try w.write([UInt8]("[chunk \(i)]".utf8))
  147. }
  148. })
  149. }
  150. server["/websocket-echo"] = websocket(text: { (session, text) in
  151. session.writeText(text)
  152. }, binary: { (session, binary) in
  153. session.writeBinary(binary)
  154. }, pong: { (session, pong) in
  155. // Got a pong frame
  156. }, connected: { (session) in
  157. // New client connected
  158. }, disconnected: { (session) in
  159. // Client disconnected
  160. })
  161. server.notFoundHandler = { r in
  162. return .movedPermanently("https://github.com/404")
  163. }
  164. server.middleware.append { r in
  165. print("Middleware: \(r.address ?? "unknown address") -> \(r.method) -> \(r.path)")
  166. return nil
  167. }
  168. return server
  169. }