# ===== CodeLab: net-cookie =====
# 以下代码片段按文章出现顺序拼接, 共 5 段

# ----- 片段 1 (bash) -----
# -c 指定 cookie 文件,curl 会把 Set-Cookie 的内容写进去
curl -c cookies.txt "https://httpbin.org/cookies/set?name=codelab"

# 看看文件里存了什么
cat cookies.txt

# ----- 片段 2 (bash) -----
# -b 让 curl 从文件读取 Cookie 并放进请求头
curl -b cookies.txt https://httpbin.org/cookies

# ----- 片段 3 (bash) -----
curl -v -b "name=codelab" https://httpbin.org/cookies 2>&1 | grep -i cookie

# ----- 片段 4 (javascript) -----
// 设置一个 1 小时后过期的主题 Cookie
document.cookie = "theme=dark; max-age=3600; path=/";
// 读取当前页面的所有 Cookie
console.log(document.cookie);

# ----- 片段 5 (python) -----
import http.cookies
import threading
from http.server import BaseHTTPRequestHandler, HTTPServer
import http.client

class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        raw = self.headers.get("Cookie", "")
        cookie = http.cookies.SimpleCookie(raw)
        if self.path == "/login":
            # 下发会话 Cookie:1 小时后过期,并跳回首页
            self.send_response(302)
            self.send_header("Set-Cookie", "user=codelab; Path=/; Max-Age=3600")
            self.send_header("Location", "/")
            self.end_headers()
        elif self.path == "/":
            name = cookie.get("user")
            if name:
                body = ("欢迎回来," + name.value).encode()
            else:
                body = "未登录,请先访问 /login".encode()
            self.send_response(200)
            self.end_headers()
            self.wfile.write(body)
        else:
            self.send_response(404)
            self.end_headers()

    def log_message(self, *args):
        pass

server = HTTPServer(("127.0.0.1", 0), Handler)
port = server.server_address[1]
threading.Thread(target=server.serve_forever, daemon=True).start()

# 第一步:不带 Cookie 访问首页
conn = http.client.HTTPConnection("127.0.0.1", port, timeout=3)
conn.request("GET", "/")
r = conn.getresponse()
print("未登录:", r.read().decode())
conn.close()

# 第二步:访问 /login,看 Set-Cookie 头
conn = http.client.HTTPConnection("127.0.0.1", port, timeout=3)
conn.request("GET", "/login")
r = conn.getresponse()
print("登录响应:", r.status, "| Set-Cookie:", r.getheader("Set-Cookie"))
conn.close()

# 第三步:带上 Cookie 再访问首页
conn = http.client.HTTPConnection("127.0.0.1", port, timeout=3)
conn.request("GET", "/", headers={"Cookie": "user=codelab"})
r = conn.getresponse()
print("带 Cookie:", r.read().decode())
conn.close()

server.shutdown()
