Skip to content

Commit cab022a

Browse files
committed
Merge pull request #17 from noppoMan/slimane-static
Slimane static
2 parents 3ac60ff + fdfac1b commit cab022a

File tree

4 files changed

+114
-18
lines changed

4 files changed

+114
-18
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.build
22
Packages
33
Xcode
4+
Sources/main.swift

README.md

Lines changed: 62 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,69 @@ app.use { req, res, next in
139139
We are using S4.Request and S4.Response
140140
See more detail, please visit https://github.com/open-swift/S4
141141

142+
## Static Files/Assets
142143

143-
## Session/Cookie
144-
Getting ready
144+
Just register the `Slimane.Static()` into middleware chains
145+
146+
```swift
147+
app.use(Slimane.Static(root: "/path/to/your/public"))
148+
```
149+
150+
## Cookie
151+
152+
#### request.cookie: `Set<Cookie>`
153+
154+
request.cookies is Readonly.
155+
```swift
156+
req.cookies["session-id"]
157+
```
158+
159+
**Cookie** is declared in S4. See more to visit https://github.com/open-swift/S4
160+
161+
#### response.cookies: `Set<AttributedCookie>`
162+
163+
response.cookies is Writable.
164+
165+
```swift
166+
let setCookie = AttributedCookie(....)
167+
res.cookies = Set<setCookie>
168+
```
169+
**AttributedCookie** is declared in S4. See more to visit https://github.com/open-swift/S4
170+
171+
172+
## Session
173+
174+
Register SessionMiddleware into the middleware chains.
175+
See more detail for SessionMiddleware to visit https://github.com/slimane-swift/SessionMiddleware
176+
177+
```swift
178+
import Slimane
179+
import SessionMiddleware
180+
181+
let app = Slimane()
182+
183+
// SessionConfig
184+
let sesConf = SessionConfig(
185+
secret: "my-secret-value",
186+
expires: 180,
187+
HTTPOnly: true
188+
)
189+
190+
// Enable to use session in Slimane
191+
app.use(SessionMiddleware(conf: sesConf))
192+
193+
app.get("/") { req, responder
194+
// set data into the session
195+
req.session["foo"] = "bar"
196+
197+
req.session.id // show session id
198+
199+
responder {
200+
Response()
201+
}
202+
}
203+
204+
```
145205

146206
## Body Data
147207

Sources/Slimane+Static.swift

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
//
2+
// Static.swift
3+
// Slimane
4+
//
5+
// Created by Yuki Takei on 4/19/16.
6+
//
7+
//
8+
9+
extension Slimane {
10+
public struct Static: MiddlewareType {
11+
let root: String
12+
13+
public init(root: String){
14+
self.root = root
15+
}
16+
17+
public func respond(req: Request, res: Response, next: MiddlewareChain) {
18+
guard let path = req.path , ext = path.split(by: ".").last, mediaType = mediaTypeForFileExtension(ext) else {
19+
return next(.Chain(req, res))
20+
}
21+
22+
FS.readFile(root + path) {
23+
switch($0) {
24+
case .Success(let buffer):
25+
var res = res
26+
res.contentType = mediaType
27+
res.body = .buffer(buffer.data)
28+
next(.Chain(req, res))
29+
case .Error(let error):
30+
next(.Error(Error.ResourceNotFound("\(path) is not found")))
31+
}
32+
}
33+
}
34+
}
35+
}

Sources/Slimane.swift

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -32,26 +32,26 @@ public class Slimane {
3232
}
3333

3434
internal func dispatch(request: Request, stream: Skelton.HTTPStream){
35-
var request = request
36-
let responder: AsyncResponder
37-
if let route = self.router.match(request) {
38-
request.params = route.params(request)
39-
responder = BasicAsyncResponder { request, result in
40-
if request.isIntercepted {
41-
result {
42-
request.response
43-
}
44-
return
35+
let responder = BasicAsyncResponder { [unowned self] request, result in
36+
if request.isIntercepted {
37+
result {
38+
request.response
4539
}
46-
route.handler.respond(to: request) { chainedResponse in
40+
return
41+
}
42+
43+
if let route = self.router.match(request) {
44+
var request = request
45+
request.params = route.params(request)
46+
route.handler.respond(to: request) { response in
4747
result {
48-
request.response.merged(try chainedResponse())
48+
request.response.merged(try response())
4949
}
5050
}
51-
}
52-
} else {
53-
responder = BasicAsyncResponder { [unowned self] _, result in
54-
self.handleError(Error.RouteNotFound(path: request.uri.path ?? "/"), request, stream)
51+
} else {
52+
result {
53+
self.errorHandler(Error.RouteNotFound(path: request.uri.path ?? "/"))
54+
}
5555
}
5656
}
5757

0 commit comments

Comments
 (0)