63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
const listener = Deno.listen({ port: 8080 });
|
|
|
|
const decoder = new TextDecoder();
|
|
const encoder = new TextEncoder();
|
|
|
|
for await (const conn of listener) {
|
|
handleConn(conn);
|
|
}
|
|
|
|
async function handleConn(conn: Deno.Conn) {
|
|
const buf = new Uint8Array(1024);
|
|
const bytes = await conn.read(buf);
|
|
if (bytes === null) {
|
|
conn.close();
|
|
return;
|
|
}
|
|
|
|
const rawRequest = decoder.decode(buf.subarray(0, bytes));
|
|
|
|
console.log(rawRequest);
|
|
|
|
const [
|
|
requestMethod,
|
|
requestHost,
|
|
requestUserAgent,
|
|
requestAccept,
|
|
requestContentType,
|
|
requestContentLength,
|
|
_,
|
|
requestBody,
|
|
] = rawRequest.split("\r\n");
|
|
|
|
const [method, path, protocol] = requestMethod.split(" ");
|
|
const [, host] = requestHost.split(" ");
|
|
const [, userAgent] = requestUserAgent.split(" ");
|
|
const [, accept] = requestAccept.split(" ");
|
|
const [, contentType] = requestContentType.split(" ");
|
|
const [, contentLength] = requestContentLength.split(" ");
|
|
|
|
const responseBody = `{` +
|
|
`"method": "${method}",` +
|
|
`"path": "${path}",` +
|
|
`"protocol": "${protocol}",` +
|
|
`"host": "${host}",` +
|
|
`"user-agent": "${userAgent}",` +
|
|
`"accept": "${accept}",` +
|
|
`"content-type": "${contentType}",` +
|
|
`"content-length": "${contentLength}",` +
|
|
`"body": "${requestBody}"` +
|
|
`}\n`;
|
|
|
|
const response =
|
|
"HTTP/1.1 200 OK\r\n" +
|
|
"Content-Type: text/json\r\n" +
|
|
`Content-Length: ${responseBody.length}\r\n` +
|
|
"Connection: close\r\n" +
|
|
"\r\n" +
|
|
responseBody;
|
|
|
|
await conn.write(encoder.encode(response));
|
|
conn.close();
|
|
}
|