SlideShare a Scribd company logo
1 of 15
Tiny Server
komem3
1
Web サーバーを自力で作ろう
この本を参考に web サーバーを作って行きます
この本では C 言語で書かれていますが、説明が大変なので
Go で実装していきます
2
Web サーバーの流れ
1. リクエストを待つ
2. 入ってきたリクエストの中身を確認
3. 中身に合わせてレスポンスを書き込み
4. コネクションを閉じる
簡単に書くとこのような流れをしています
簡単に書けるので実装も簡単そう?
3
リクエストを待つ
ポートとプロトコルを指定してリクエストを待てる便利な関数を使う(net)
ループと並行処理でコネクションに対して
処理していくことが分かる
4
ln, err := net.Listen("tcp", ":8080")
if err != nil {
// handle error
}
for {
conn, err := ln.Accept()
if err != nil {
// handle error
}
go handleConnection(conn)
}
https://golang.org/pkg/net
適当にコネクションに書き込む
telnet だとメッセージが見れるがブラウザだと見れない
5
func handleConnection(con net.Conn) {
message := "hello World¥n"
_, _ = con.Write([]byte(message))
con.Close()
}
見れない理由
http プロトコルに準拠していない
6
https://developer.mozilla.org/ja/docs/Web/HTTP/Overview#HTTP_flow
リクエストで必要なもの
・httpメソッド
・リソースパス
・プロトコルのバージョン
・任意のヘッダー
・任意のボディ(POSTなど)
レスポンスで必要なもの
・準拠するプロトコルのバージョン
・ステータスコード
・ステータスメッセージ
・任意のヘッダー
・任意のリソースを含む本文
http プロトコルに合わせる(response)
最小限 http プロトコルに準拠してみる
コネクションに以下の情報を書き込む
7
Http/1.1 200 OK
Hello World
func handlerConnection(con net.Conn) {
defer con.Close()
writeString := fmt.Sprintf("Http/1.1 200 OK¥r¥n")
writeString += fmt.Sprintf("¥r¥nHello World¥r¥n")
con.Write([]byte(writeString))
}
見れた!!
http プロトコルに合わせる(request)
request はもう少し真面目に合わせてみる
8
GET / HTTP/1.1
Host: localhost:8080
{
...
}
type Request struct {
Method string
Path string
Version string
Headers map[string]string
Body string
}
よしなに構造体に
パース
ソースコード(request parse)
9
response を構造体として定義
request のついでに response の書き込みも実装
10
Http/1.1 200 OK
Server: tiny server
Hello World
type Response struct {
Version string
StatusCode int
StatusMessage string
Headers map[string]string
Body string
}
よしなに
書き込み
ソースコード(response parse)
11
リクエストとレスポンスを関数に渡す
何か見たことある形に...
12
r := parseRequest(con)
w := Response{
Version: "Http/1.1",
Headers: map[string]string{},
}
ServeHTTP(&w, &r)
parseResponse(con, w)
ルーティング
時間が無いので...
一応選択肢としては
● 配列ループ(正気じゃない)
● map
● 基数木(殆どがこれ。説明するにはもう LT 必要)
13
まとめ
● Web サーバの流れ見て簡単そうな流れと思ったが簡単だった
● これのおかげで http パッケージが読みやすくなるかも?
● ルーティング実装の基数木は他の人に LT 任せたいです
● 今回のアプローチは簡単なものなので実装を読み直した方がいいです
14
ソースコード
下記リンクで今回の実装は見れます。中身変わっているかも…
https://github.com/komem3/tiny_server
15

More Related Content

What's hot

Command パターン
Command パターンCommand パターン
Command パターンAkio Nikaido
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメOda Shinsuke
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバーemasaka
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門Takashi Takizawa
 
apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったJunichi Ishida
 
ど素人向けエンジニア勉強会(第2回)
ど素人向けエンジニア勉強会(第2回)ど素人向けエンジニア勉強会(第2回)
ど素人向けエンジニア勉強会(第2回)YukiIwasaki2764
 
Alt#0x008 2017/5/20
Alt#0x008 2017/5/20Alt#0x008 2017/5/20
Alt#0x008 2017/5/20Koki Natsume
 
Rubyでバルクインサート
RubyでバルクインサートRubyでバルクインサート
RubyでバルクインサートFujimura Munehiko
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2azumakuniyuki 🐈
 
私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか 私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか Kenta Yamamoto
 
RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】qaz_id
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -Kazunori Hashikuchi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler についてTomoya Kawanishi
 
Janogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiJanogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiKeisuke Ishibashi
 
CategoLJについて
CategoLJについてCategoLJについて
CategoLJについてToshiaki Maki
 
Rustのタスクモデルについて
RustのタスクモデルについてRustのタスクモデルについて
Rustのタスクモデルについてzigen
 

What's hot (20)

MmapScanner
MmapScannerMmapScanner
MmapScanner
 
Command パターン
Command パターンCommand パターン
Command パターン
 
Transaction scopeまだダメ
Transaction scopeまだダメTransaction scopeまだダメ
Transaction scopeまだダメ
 
エコなWebサーバー
エコなWebサーバーエコなWebサーバー
エコなWebサーバー
 
#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門#mailerstudy 01 LT POP/IMAP入門
#mailerstudy 01 LT POP/IMAP入門
 
apachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin ServerっぽいやつをつくったapachehereというPHPのBuiltin Serverっぽいやつをつくった
apachehereというPHPのBuiltin Serverっぽいやつをつくった
 
ど素人向けエンジニア勉強会(第2回)
ど素人向けエンジニア勉強会(第2回)ど素人向けエンジニア勉強会(第2回)
ど素人向けエンジニア勉強会(第2回)
 
Alt#0x008 2017/5/20
Alt#0x008 2017/5/20Alt#0x008 2017/5/20
Alt#0x008 2017/5/20
 
Rubyでバルクインサート
RubyでバルクインサートRubyでバルクインサート
Rubyでバルクインサート
 
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
JSONでメール送信 | HTTP API Server ``Haineko''/YAPC::Asia Tokyo 2013 LT Day2
 
私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか 私たちは何を Web っぽいと感じているのか
私たちは何を Web っぽいと感じているのか
 
GGEasyMonitor技術情報
GGEasyMonitor技術情報GGEasyMonitor技術情報
GGEasyMonitor技術情報
 
RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】RPCノード構築方法【Litecoin】
RPCノード構築方法【Litecoin】
 
モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -モダン JavaScript における非同期処理 - Promise, async/await -
モダン JavaScript における非同期処理 - Promise, async/await -
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
RubyGems と Bundler について
RubyGems と Bundler についてRubyGems と Bundler について
RubyGems と Bundler について
 
20120525 mt websocket
20120525 mt websocket20120525 mt websocket
20120525 mt websocket
 
Janogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshiJanogia20120921 yoshinotakeshi
Janogia20120921 yoshinotakeshi
 
CategoLJについて
CategoLJについてCategoLJについて
CategoLJについて
 
Rustのタスクモデルについて
RustのタスクモデルについてRustのタスクモデルについて
Rustのタスクモデルについて
 

Similar to Tiny server

サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)ひとし あまの
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かShigekiYamada
 
[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他Yuto Takei
 
Html5, Web Applications 2
Html5, Web Applications 2Html5, Web Applications 2
Html5, Web Applications 2totty jp
 
これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocketAdvancedTechNight
 
Rancher2.0のコンテナ間通信を可視化してみた
Rancher2.0のコンテナ間通信を可視化してみたRancher2.0のコンテナ間通信を可視化してみた
Rancher2.0のコンテナ間通信を可視化してみたcloretsblack
 
CometPub20070223
CometPub20070223CometPub20070223
CometPub20070223Hiroshi Ono
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketYu Nobuoka
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニックinfinite_loop
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsYoshio Terada
 
JavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だったJavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だったiPride Co., Ltd.
 
非エンジニアでもわかる
非エンジニアでもわかる非エンジニアでもわかる
非エンジニアでもわかるssuser33820e
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Kikunaga Taishi
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009Muhammad Ali
 
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.YASUKAZU NAGATOMI
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうmganeko
 

Similar to Tiny server (20)

ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
Em synchrony について
Em synchrony についてEm synchrony について
Em synchrony について
 
サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)サーバーを作ろう (毎週のハンズオン勉強会の資料)
サーバーを作ろう (毎週のハンズオン勉強会の資料)
 
HttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何かHttpとTelnetをつなぐ何か
HttpとTelnetをつなぐ何か
 
[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他[Basic 6] DNS / ソケット通信 / その他
[Basic 6] DNS / ソケット通信 / その他
 
Html5, Web Applications 2
Html5, Web Applications 2Html5, Web Applications 2
Html5, Web Applications 2
 
10th jan 2013_miyazaki
10th jan 2013_miyazaki10th jan 2013_miyazaki
10th jan 2013_miyazaki
 
これから利用拡大?WebSocket
これから利用拡大?WebSocketこれから利用拡大?WebSocket
これから利用拡大?WebSocket
 
Rancher2.0のコンテナ間通信を可視化してみた
Rancher2.0のコンテナ間通信を可視化してみたRancher2.0のコンテナ間通信を可視化してみた
Rancher2.0のコンテナ間通信を可視化してみた
 
CometPub20070223
CometPub20070223CometPub20070223
CometPub20070223
 
WebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocketWebSocket Protocol と Plack::Middleware::WebSocket
WebSocket Protocol と Plack::Middleware::WebSocket
 
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
大規模ソーシャルゲーム開発から学んだPHP&MySQL実践テクニック
 
AKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab ContentsAKS (k8s) Hands on Lab Contents
AKS (k8s) Hands on Lab Contents
 
JavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だったJavaScriptでSQLを唱えたいだけの人生だった
JavaScriptでSQLを唱えたいだけの人生だった
 
非エンジニアでもわかる
非エンジニアでもわかる非エンジニアでもわかる
非エンジニアでもわかる
 
Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】Webサーバの基礎知識【編集済み】
Webサーバの基礎知識【編集済み】
 
18166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi200918166746-NeverBlock-RubyKaigi2009
18166746-NeverBlock-RubyKaigi2009
 
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
Webアプリ開発向け ゆるふわDocker使いが Cloud Naive開発に必要なetc.
 
Chromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそうChromebook 「だけ」で WebRTCを動かそう
Chromebook 「だけ」で WebRTCを動かそう
 
勉強会資料①
勉強会資料①勉強会資料①
勉強会資料①
 

Tiny server