0
0
Fork 0
mirror of https://github.com/denoland/deno.git synced 2025-03-05 10:26:44 -05:00
deno/http.ts

58 lines
1.2 KiB
TypeScript
Raw Normal View History

2018-11-08 15:03:45 -05:00
import { listen, Conn } from "deno";
import { BufReader, BufState } from "./bufio.ts";
2018-11-07 13:16:07 -05:00
import { TextProtoReader } from "./textproto.ts";
2018-11-08 15:03:45 -05:00
import { Headers } from "./headers.ts";
2018-11-07 13:16:07 -05:00
2018-11-08 15:03:45 -05:00
export async function* serve(addr: string) {
const listener = listen("tcp", addr);
while (true) {
const c = await listener.accept();
yield* serveConn(c);
2018-11-07 13:16:07 -05:00
}
2018-11-08 15:03:45 -05:00
listener.close();
}
2018-11-07 13:16:07 -05:00
2018-11-08 15:03:45 -05:00
export async function* serveConn(c: Conn) {
let bufr = new BufReader(c);
try {
while (true) {
const req = await readRequest(bufr);
yield req;
}
} finally {
c.close();
2018-11-07 13:16:07 -05:00
}
}
2018-11-08 15:03:45 -05:00
interface Response {
status?: number;
body: string;
}
2018-11-07 13:16:07 -05:00
2018-11-08 15:03:45 -05:00
class ServerRequest {
url: string;
method: string;
proto: string;
2018-11-08 18:15:26 -05:00
headers: Headers;
2018-11-07 13:16:07 -05:00
2018-11-08 18:15:26 -05:00
respond(r: Response): Promise<void> {
2018-11-08 15:03:45 -05:00
throw Error("not implemented");
2018-11-07 01:08:51 -05:00
}
2018-11-07 13:16:07 -05:00
}
2018-11-07 01:08:51 -05:00
2018-11-08 15:03:45 -05:00
async function readRequest(b: BufReader): Promise<ServerRequest> {
2018-11-07 13:16:07 -05:00
const tp = new TextProtoReader(b);
const req = new ServerRequest();
2018-11-07 01:08:51 -05:00
2018-11-08 15:03:45 -05:00
let s: string;
let err: BufState;
2018-11-08 18:15:26 -05:00
// First line: GET /index.html HTTP/1.0
2018-11-08 15:03:45 -05:00
[s, err] = await tp.readLine();
2018-11-08 18:15:26 -05:00
[req.method, req.url, req.proto] = s.split(" ", 3);
2018-11-07 13:16:07 -05:00
2018-11-08 18:15:26 -05:00
[req.headers, err] = await tp.readMIMEHeader();
2018-11-08 15:03:45 -05:00
return req;
2018-11-07 01:08:51 -05:00
}