スポンサーサイト 

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

難解なGolang 

本格的にGolangに取り憑かれたようなので、
WebSocketのバグも直ったところでサーバーの構築を始めました。
でも、チャンネルって奴が難解すぐる。
インターフェースって奴もあるしね。
スポンサーサイト

WebSocket解決編 

解決しました!!
$GOROOT/src/pkg/server.go
の"ServeHTTP"関数を
/ ServeHTTP implements the http.Handler interface for a Web Socket.
func (f Handler) ServeHTTP(c *http.Conn, req *http.Request) {
var _, ok = req.Header["Upgrade"];
if ok == false {
c.WriteHeader(http.StatusNotFound)
io.WriteString(c, "must use websocket to connect here")
return
}
_, ok = req.Header["Connection"];
if ok == false {
c.WriteHeader(http.StatusNotFound)
io.WriteString(c, "must use websocket to connect here")
return
}
if req.Method != "GET" || req.Proto != "HTTP/1.1" ||
req.Header["Upgrade"] != "WebSocket" ||
req.Header["Connection"] != "Upgrade" {
c.WriteHeader(http.StatusNotFound)
io.WriteString(c, "must use websocket to connect here")
return
}
rwc, buf, err := c.Hijack()
if err != nil {
panic("Hijack failed: ", err.String())
return
}
defer rwc.Close()
origin := req.Header["Origin"]
location := "ws://" + req.Host + req.URL.Path

// TODO(ukai): verify origin,location,protocol.

buf.WriteString("HTTP/1.1 101 Web Socket Protocol Handshake\r\n")
buf.WriteString("Upgrade: WebSocket\r\n")
buf.WriteString("Connection: Upgrade\r\n")
buf.WriteString("WebSocket-Origin: " + origin + "\r\n")
buf.WriteString("WebSocket-Location: " + location + "\r\n")
protocol := ""
// canonical header key of WebSocket-Protocol.
if protocol, found := req.Header["Websocket-Protocol"]; found {
buf.WriteString("WebSocket-Protocol: " + protocol + "\r\n")
}
buf.WriteString("\r\n")
if err := buf.Flush(); err != nil {
return
}
ws := newConn(origin, location, protocol, buf, rwc)
f(ws)
}

と書き換えて再コンパイル。
で、
再コンパイルの時に今までは、
$ cd $GOROOT/src
$ make all

だったのですが、最新リリースでは
$ cd $GOROOT/src
$ ./all.bash

に変わったようです。
よくわかんねぇけど。

オープンソース最強だお 

Golangで組んだWebSocketにHTTPを蹴るとプロセスが落ちるって話の続き。
割とすぐに原因が見つかった。
もう少しエラー処理に気を遣おうZE☆

if req.Method != "GET" || req.Proto != "HTTP/1.1" ||
req.Header["Upgrade"] != "WebSocket" ||
req.Header["Connection"] != "Upgrade" {
c.WriteHeader(http.StatusNotFound)
io.WriteString(c, "must use websocket to connect here")
return
}

うーん、なるほど。こりゃひでぇなww
req.Header["Upgrade"]ってUpgradeって項目がある前提で話が進んでるよ。
無論、HTTPにそんな項目無いからここでkey not in mapって叫んで落ちてたわけだ。
ということはここに存在チェックを仕込んで再コンパイルすりゃいいのかね。
ちょっくらやってみる。
#一部分だけ再コンパイルする方法を教えてくだしぇ、っと

WebSocket諦めるか 

WebSocketすげーとか思いつつ、
GolangでWebSocketを使ったチャットサーバーを立ててそこにHTTPで接続したら見事に落ちやがった。
ハンドシェイクが間違ってるからだと思うが、なにもサーバーごと落ちなくてもいいだろww
コネクションが切れて「はい、おしまい」ならいいんだが、プロセスがkillしちゃ目も当てられない。
というわけでWebSocketではなく、ネイティブなTCP/IPでつなげてみようとか思う。

BlogにTwitterを組み込みたいわけだが 

アクセス数が増えるとTwitterの負荷が大きくなってヤバいんじゃないの?
とか思ったりで。
まぁ、その辺は大丈夫だとしてもAjaxが動かない環境ではもちろんサーバーサイドで取得するという作業が必須になるわけなんだけれども、その時のデータをキャッシュして、賞味期限的なものを3分やら5分やらで適当に設定しとけば、
ある程度はリアルタイム、そんでもってTwitterに優しい。ついでにほぼすべてのブラウザで動作保障。
TwitterからAPI叩きすぎエラーを吐かれることもなく快適。

自鯖の負荷?
キニシナイ(殴

うん、これで行こう。
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。