1
0

DemoServer.swift 6.3 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. // swiftlint:disable function_body_length
  9. public func demoServer(_ publicDir: String) -> HttpServer {
  10. print(publicDir)
  11. let server = HttpServer()
  12. server["/public/:path"] = shareFilesFromDirectory(publicDir)
  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"] = { request in
  27. scopes {
  28. html {
  29. body {
  30. h3 { inner = "Address: \(request.address ?? "unknown")" }
  31. h3 { inner = "Url: \(request.path)" }
  32. h3 { inner = "Method: \(request.method)" }
  33. h3 { inner = "Query:" }
  34. table(request.queryParams) { param in
  35. tr {
  36. td { inner = param.0 }
  37. td { inner = param.1 }
  38. }
  39. }
  40. h3 { inner = "Headers:" }
  41. table(request.headers) { header in
  42. tr {
  43. td { inner = header.0 }
  44. td { inner = header.1 }
  45. }
  46. }
  47. h3 { inner = "Route params:" }
  48. table(request.params) { param in
  49. tr {
  50. td { inner = param.0 }
  51. td { inner = param.1 }
  52. }
  53. }
  54. }
  55. }
  56. }(request)
  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"] = { request in
  77. var response = ""
  78. for multipart in request.parseMultiPartFormData() {
  79. guard let name = multipart.name, let fileName = multipart.fileName else { continue }
  80. response += "Name: \(name) File name: \(fileName) Size: \(multipart.body.count)<br>"
  81. }
  82. return HttpResponse.ok(.html(response))
  83. }
  84. server.GET["/login"] = scopes {
  85. html {
  86. head {
  87. script { src = "http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js" }
  88. stylesheet { href = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/css/bootstrap.min.css" }
  89. }
  90. body {
  91. h3 { inner = "Sign In" }
  92. form {
  93. method = "POST"
  94. action = "/login"
  95. fieldset {
  96. input { placeholder = "E-mail"; name = "email"; type = "email"; autofocus = "" }
  97. input { placeholder = "Password"; name = "password"; type = "password"; autofocus = "" }
  98. a {
  99. href = "/login"
  100. button {
  101. type = "submit"
  102. inner = "Login"
  103. }
  104. }
  105. }
  106. }
  107. javascript {
  108. src = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/js/bootstrap.min.js"
  109. }
  110. }
  111. }
  112. }
  113. server.POST["/login"] = { request in
  114. let formFields = request.parseUrlencodedForm()
  115. return HttpResponse.ok(.html(formFields.map({ "\($0.0) = \($0.1)" }).joined(separator: "<br>")))
  116. }
  117. server["/demo"] = scopes {
  118. html {
  119. body {
  120. center {
  121. h2 { inner = "Hello Swift" }
  122. img { src = "https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png" }
  123. }
  124. }
  125. }
  126. }
  127. server["/raw"] = { _ in
  128. return HttpResponse.raw(200, "OK", ["XXX-Custom-Header": "value"], { try $0.write([UInt8]("test".utf8)) })
  129. }
  130. server["/redirect/permanently"] = { _ in
  131. return .movedPermanently("http://www.google.com")
  132. }
  133. server["/redirect/temporarily"] = { _ in
  134. return .movedTemporarily("http://www.google.com")
  135. }
  136. server["/long"] = { _ in
  137. var longResponse = ""
  138. for index in 0..<1000 { longResponse += "(\(index)),->" }
  139. return .ok(.html(longResponse))
  140. }
  141. server["/wildcard/*/test/*/:param"] = { request in
  142. return .ok(.html(request.path))
  143. }
  144. server["/stream"] = { _ in
  145. return HttpResponse.raw(200, "OK", nil, { writer in
  146. for index in 0...100 {
  147. try writer.write([UInt8]("[chunk \(index)]".utf8))
  148. }
  149. })
  150. }
  151. server["/websocket-echo"] = websocket(text: { (session, text) in
  152. session.writeText(text)
  153. }, binary: { (session, binary) in
  154. session.writeBinary(binary)
  155. }, pong: { (_, _) in
  156. // Got a pong frame
  157. }, connected: { _ in
  158. // New client connected
  159. }, disconnected: { _ in
  160. // Client disconnected
  161. })
  162. server.notFoundHandler = { _ in
  163. return .movedPermanently("https://github.com/404")
  164. }
  165. server.middleware.append { request in
  166. print("Middleware: \(request.address ?? "unknown address") -> \(request.method) -> \(request.path)")
  167. return nil
  168. }
  169. return server
  170. }