PowerShell で簡易的な Webサーバ を建てる

経緯

PC でポートの導通試験で HTTP(80番) の検証をサクッとやりたくなりました。

標準機能として使用できるもので何とかできないか、と検索したら PowerShell で .NETフレームワーク を操作して Webサーバ を建てる、というものがあったので試しました。

スニペット

早速ですが、試したスニペットが以下です。

$listener = New-Object Net.HttpListener
$listener.Prefixes.Add("http://+:80/Temporary_Listen_Addresses/")
try {
    $listener.Start()
    while ($true) {
        $context = $listener.GetContext()
        $response = $context.Response
        $response.ContentEncoding = [Text.Encoding]::UTF8
        $response.ContentType = 'text/html; charset='+$response.ContentEncoding.HeaderName
        $content = [System.Text.Encoding]::UTF8.GetBytes('<!DOCTYPE html><html lang="ja"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>濡髪童子</title></head><body><header><h1>知恩院御影堂七不思議の一「忘れ傘」</h1></header><main><p>濡髪童子</p></main><footer><h6 style="text-align:center;">忘れ傘</h6></footer></body></html>')
        $response.OutputStream.Write($content, 0, $content.Length)
        $response.Close()
    }
}
catch {
    Write-Error($_.Exception)
}

意図としては以下の通り。

  • $listener.Prefixes.Add("http://+:80/Temporary_Listen_Addresses/") で試すと制限環境下でも最低限の通信確認はできる、とのことなので今回はこのやり方を採用。
  • 一応レスポンスヘッダで文字コードと Content-Type を指定。
  • レスポンスボディ部分は最低限の HTML を返却。

備考

エンコーディングなどは最低限しか触っていないため、スニペットのコードファイル自体は UTF-8 BOMあり で保存しました (さもなくばマルチバイト文字で文字化けする)。

Windows と PowerShell の Shift-JIS (ようやく UTF-8 かと思ったら BOMあり ですし) や改行文字周りにもにょっとしつつ最低限動作確認が取れたので良しとします。

参考

Origin of Name

今回は上述で見えている通り、知恩院の七不思議の一つ「忘れ傘」および濡髪童子をお借りしました。

理由は、 HTTP のポート番号が 80 で、 80→傘寿(八十の縦書きが傘の略字「仐」に見えるため)→傘、という連想で傘の伝説からの採用です。

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。