サーバーにアクセスがあるか確認したいときにおすすめです。Webhookなどのデバッグも可能です。
curl https://acc.deno.dev/any_access_path_hogehoge
See the Pen Untitled by John Doe (@04) on CodePen.
削除するには行をクリックしてね
import { serve } from "https://deno.land/std@0.177.0/http/server.ts"
const kv = await Deno.openKv()
const init = {
headers: {
"content-type": "text/html",
}
}
function escapeHtml(unsafe)
{
return unsafe
.replace(/&/g, "&")
.replace(/</g, "<")
.replace(/>/g, ">")
.replace(/"/g, """)
.replace(/'/g, "'");
}
const toHTML = logs => {
const trs = logs.map(log => `<tr onclick="event.target.tagName === 'TD' && event.target.parentNode.parentNode.removeChild(event.target.parentNode) && fetch('https://a.github.day/${log.key.join('/')}')" title="クリックして削除">
<td>${log.value.connInfo.remoteAddr.hostname}</td>
<td nowrap>${new Date(log.key[1]).toLocaleString('sv-SE', { timeZone: 'Asia/Tokyo' })}</td>
<td>${log.value.method}</td>
<td nowrap>${log.value.url}</td>
<td nowrap><details><pre>${escapeHtml(JSON.stringify(log.value, null, 2))}</pre></details></td>
</tr>`).join('\n')
return `<meta charset="utf-8"><table border>
<thead>
<tr>
<th>Remote Host</th>
<th>Time</th>
<th>Method</th>
<th>URL</th>
<th></th>
</tr>
</thead>
<tbody>
${trs}
</tbody>
</table>
<style>
body {
margin: 0
}
table {
border-collapse: collapse
}
tr:hover {
background: #f5f5f5
}
td {
padding: 0 4px
}
</style>`
}
serve(async (req: Request, connInfo: ConnInfo) => {
if (req.url.startsWith('https://a.github.day/logs/')) {
await kv.delete(['logs', parseInt(new URL(req.url).pathname.split('/').pop(), 10)])
return new Response('CLEARED', { headers: { 'Access-Control-Allow-Origin': '*' } })
}
const key = ['logs', Date.now()]
const value = { headers: Object.fromEntries([...req.headers]), url: req.url, method: req.method, connInfo, env: Deno.env.toObject() }
if (['POST', 'PUT'].includes(req.method)) value.body = await req.text()
kv.set(key, value)
if (req.url.includes('no-response')) return new Response()
const logs = []
for await (const log of kv.list({ prefix: ['logs'] }, { reverse: true })) logs.push(log)
return new Response(toHTML(logs), init)
})