cookie
Client
import net.http.*
import encoding.url.*
import std.socket.*
import std.time.*
import std.sync.*
main() {
// 1 Starts the socket server.
let serverSocket = TcpServerSocket(bindAt: 0)
serverSocket.bind()
let fut = spawn {
serverPacketCapture(serverSocket)
}
sleep(Duration.millisecond * 10)
// The client reads cookie from the Set-Cookie header in the response and saves it to the cookieJar.
// When a request is initiated next time, the cookie is sent in the Cookie header of the request.
// 2 Starts the client.
let client = ClientBuilder().build()
let port = serverSocket.localAddress.port
var u = URL.parse("http://127.0.0.1:${port}/a/b/c")
var r = HttpRequestBuilder()
.url(u)
.build()
// 3 Sends a request.
client.send(r)
sleep(Duration.second * 2)
r = HttpRequestBuilder()
.url(u)
.build()
// 4 Sends a new request, obtains the cookie from the CookieJar, and converts the cookie to the value in the Cookie header.
// cookie 2=2 has expired. Therefore, only cookie 1=1 is sent.
client.send(r)
// 5 Closes the client.
client.close()
fut.get()
serverSocket.close()
}
func serverPacketCapture(serverSocket: TcpServerSocket) {
let buf = Array<UInt8>(500, item: 0)
let server = serverSocket.accept()
var i = server.read(buf)
println(String.fromUtf8(buf[..i]))
// GET /a/b/c HTTP/1.1
// host: 127.0.0.1:44649
// user-agent: CANGJIEUSERAGENT_1_1
// connection: keep-alive
// content-length: 0
//
// cookie1 valid for 4 seconds
let cookie1 = Cookie("1", "1", maxAge: 4, domain: "127.0.0.1", path: "/a/b/")
let setCookie1 = cookie1.toSetCookieString()
// cookie2 valid for 2 seconds
let cookie2 = Cookie("2", "2", maxAge: 2, path: "/a/")
let setCookie2 = cookie2.toSetCookieString()
// The server sends the Set-Cookie header, and the client parses the header and saves it to the CookieJar.
server.write("HTTP/1.1 204 ok\r\nSet-Cookie: ${setCookie1}\r\nSet-Cookie: ${setCookie2}\r\nConnection: close\r\n\r\n".toArray())
let server2 = serverSocket.accept()
i = server2.read(buf)
// Receives a request with a cookie from the client.
println(String.fromUtf8(buf[..i]))
// GET /a/b/c HTTP/1.1
// host: 127.0.0.1:34857
// cookie: 1=1
// user-agent: CANGJIEUSERAGENT_1_1
// connection: keep-alive
// content-length: 0
//
server2.write("HTTP/1.1 204 ok\r\nConnection: close\r\n\r\n".toArray())
server2.close()
}
Running result:
GET /a/b/c HTTP/1.1
host: 127.0.0.1:37359
user-agent: CANGJIEUSERAGENT_1_1
connection: keep-alive
content-length: 0
GET /a/b/c HTTP/1.1
host: 127.0.0.1:37359
cookie: 1=1
user-agent: CANGJIEUSERAGENT_1_1
connection: keep-alive
content-length: 0
Server
import net.http.*
main () {
// The server sends the cookie to the client by saving it in the Set-Cookie header.
// 1 Constructs a server instance.
let server = ServerBuilder()
.addr("127.0.0.1")
.port(8080)
.build()
// 2 Registers the HttpRequestHandler.
server.distributor.register("/index", {httpContext =>
let cookie = Cookie("name", "value")
httpContext.responseBuilder.header("Set-Cookie", cookie.toSetCookieString()).body("Hello Cangjie!")
})
// 3 Starts the service.
server.serve()
}