DemoServer.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  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)" }
  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. response += "Name: \(multipart.name) File name: \(multipart.fileName) Size: \(multipart.body.count)<br>"
  79. }
  80. return HttpResponse.ok(.html(response))
  81. }
  82. server.GET["/login"] = scopes {
  83. html {
  84. head {
  85. script { src = "http://cdn.staticfile.org/jquery/2.1.4/jquery.min.js" }
  86. stylesheet { href = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/css/bootstrap.min.css" }
  87. }
  88. body {
  89. h3 { inner = "Sign In" }
  90. form {
  91. method = "POST"
  92. action = "/login"
  93. fieldset {
  94. input { placeholder = "E-mail"; name = "email"; type = "email"; autofocus = "" }
  95. input { placeholder = "Password"; name = "password"; type = "password"; autofocus = "" }
  96. a {
  97. href = "/login"
  98. button {
  99. type = "submit"
  100. inner = "Login"
  101. }
  102. }
  103. }
  104. }
  105. javascript {
  106. src = "http://cdn.staticfile.org/twitter-bootstrap/3.3.0/js/bootstrap.min.js"
  107. }
  108. }
  109. }
  110. }
  111. server.POST["/login"] = { r in
  112. let formFields = r.parseUrlencodedForm()
  113. return HttpResponse.ok(.html(formFields.map({ "\($0.0) = \($0.1)" }).joined(separator: "<br>")))
  114. }
  115. server["/demo"] = scopes {
  116. html {
  117. body {
  118. center {
  119. h2 { inner = "Hello Swift" }
  120. img { src = "https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png" }
  121. }
  122. }
  123. }
  124. }
  125. server["/raw"] = { r in
  126. return HttpResponse.raw(200, "OK", ["XXX-Custom-Header": "value"], { try $0.write([UInt8]("test".utf8)) })
  127. }
  128. server["/redirect"] = { r in
  129. return .movedPermanently("http://www.google.com")
  130. }
  131. server["/long"] = { r in
  132. var longResponse = ""
  133. for k in 0..<1000 { longResponse += "(\(k)),->" }
  134. return .ok(.html(longResponse))
  135. }
  136. server["/wildcard/*/test/*/:param"] = { r in
  137. return .ok(.html(r.path))
  138. }
  139. server["/stream"] = { r in
  140. return HttpResponse.raw(200, "OK", nil, { w in
  141. for i in 0...100 {
  142. try w.write([UInt8]("[chunk \(i)]".utf8))
  143. }
  144. })
  145. }
  146. server["/websocket-echo"] = websocket({ (session, text) in
  147. session.writeText(text)
  148. }, { (session, binary) in
  149. session.writeBinary(binary)
  150. })
  151. server.notFoundHandler = { r in
  152. return .movedPermanently("https://github.com/404")
  153. }
  154. server.middleware.append { r in
  155. print("Middleware: \(r.address) -> \(r.method) -> \(r.path)")
  156. return nil
  157. }
  158. return server
  159. }