0001    //
0002    //  DemoServer.swift
0003    //  Swifter
0004    //
0005    //  Copyright (c) 2014-2016 Damian KoĊ‚akowski. All rights reserved.
0006    //
0007    
0008    import Foundation
0009    
0010    public func demoServer(publicDir: String) -> HttpServer {
0011        
0012        print(publicDir)
0013        
0014        let server = HttpServer()
0015        
0016        server["/public/:path"] = HttpHandlers.shareFilesFromDirectory(publicDir)
0017        
0018        server["/files/:path"] = HttpHandlers.directoryBrowser("/")
0019    
0020        server["/"] = { r in
0021            var listPage = "Available services:<br><ul>"
0022            for services in server.routes {
0023                if services.isEmpty {
0024                    listPage += "<li><a href=\"/\">/</a></li>"
0025                } else {
0026                    listPage += "<li><a href=\"\(services)\">\(services)</a></li>"
0027                }
0028            }
0029            listPage += "</ul>"
0030            return .OK(.Html(listPage))
0031        }
0032        
0033        server["/magic"] = { .OK(.Html("You asked for " + $0.path)) }
0034        
0035        server["/test/:param1/:param2"] = { r in
0036            var headersInfo = ""
0037            for (name, value) in r.headers {
0038                headersInfo += "\(name) : \(value)<br>"
0039            }
0040            var queryParamsInfo = ""
0041            for (name, value) in r.queryParams {
0042                queryParamsInfo += "\(name) : \(value)<br>"
0043            }
0044            var pathParamsInfo = ""
0045            for token in r.params {
0046                pathParamsInfo += "\(token.0) : \(token.1)<br>"
0047            }
0048            return .OK(.Html("<h3>Address: \(r.address)</h3><h3>Url:</h3> \(r.path)<h3>Method:</h3>\(r.method)<h3>Headers:</h3>\(headersInfo)<h3>Query:</h3>\(queryParamsInfo)<h3>Path params:</h3>\(pathParamsInfo)"))
0049        }
0050        
0051        server.GET["/upload"] = { r in
0052            if let html = NSData(contentsOfFile:"\(publicDir)/file.html") {
0053                var array = [UInt8](count: html.length, repeatedValue: 0)
0054                html.getBytes(&array, length: html.length)
0055                return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
0056            }
0057            return .NotFound
0058        }
0059        
0060        server.POST["/upload"] = { r in
0061            var response = ""
0062            for multipart in r.parseMultiPartFormData() {
0063                response += "Name: \(multipart.name) File name: \(multipart.fileName) Size: \(multipart.body.count)<br>"
0064            }
0065            return HttpResponse.OK(.Html(response))
0066        }
0067        
0068        server.GET["/login"] = { r in
0069            if let html = NSData(contentsOfFile:"\(publicDir)/login.html") {
0070                var array = [UInt8](count: html.length, repeatedValue: 0)
0071                html.getBytes(&array, length: html.length)
0072                return HttpResponse.RAW(200, "OK", nil, { $0.write(array) })
0073            }
0074            return .NotFound
0075        }
0076        
0077        server.POST["/login"] = { r in
0078            let formFields = r.parseUrlencodedForm()
0079            return HttpResponse.OK(.Html(formFields.map({ "\($0.0) = \($0.1)" }).joinWithSeparator("<br>")))
0080        }
0081        
0082        server["/demo"] = { r in
0083            return .OK(.Html("<center><h2>Hello Swift</h2><img src=\"https://devimages.apple.com.edgekey.net/swift/images/swift-hero_2x.png\"/><br></center>"))
0084        }
0085        
0086        server["/raw"] = { r in
0087            return HttpResponse.RAW(200, "OK", ["XXX-Custom-Header": "value"], { $0.write([UInt8]("test".utf8)) })
0088        }
0089        
0090        server["/json"] = { r in
0091            let jsonObject: NSDictionary = [NSString(string: "foo"): NSNumber(int: 3), NSString(string: "bar"): NSString(string: "baz")] 
0092            return .OK(.Json(jsonObject))
0093        }
0094        
0095        server["/redirect"] = { r in
0096            return .MovedPermanently("http://www.google.com")
0097        }
0098    
0099        server["/long"] = { r in
0100            var longResponse = ""
0101            for k in 0..<1000 { longResponse += "(\(k)),->" }
0102            return .OK(.Html(longResponse))
0103        }
0104        
0105        server["/wildcard/*/test/*/:param"] = { r in
0106            return .OK(.Html(r.path))
0107        }
0108        
0109        server["/stream"] = { r in
0110            return HttpResponse.RAW(200, "OK", nil, { w in
0111                for i in 0...100 {
0112                    w.write([UInt8]("[chunk \(i)]".utf8));
0113                }
0114            })
0115        }
0116        
0117        server["/websocket-echo"] = HttpHandlers.websocket({ (session, text) in
0118            session.writeText(text)
0119        }, { (session, binary) in
0120            session.writeBinary(binary)
0121        })
0122        
0123        return server
0124    }
0125