Skip to content

Instantly share code, notes, and snippets.

@shirok
Created February 10, 2011 13:47
Show Gist options
  • Save shirok/820526 to your computer and use it in GitHub Desktop.
Save shirok/820526 to your computer and use it in GitHub Desktop.
;; ストリーミングの受け取り方
;; httpレスポンスに対して呼ばれる。
;; - code : httpステータスコード
;; - headers : レスポンスヘッダ ((name value) ...)
;; - total : レスポンス全体のサイズ。streamingの場合はわからないので#fになってるはず
;; - retrieve : レスポンスボディを受け取るための手続き。後述。
(define (stream-receiver code headers total retrieve)
;; codeをチェック。200以外なら適切な処置を。
(receive (port size) (retrieve)
;; portは入力ポートで、サーバからのレスポンスを読み出せる
;; sizeはこの時点で#fのはず
;; portから好きなだけデータを読んで処理。
;; 終わりたくなったらもう一度retrieveを呼ぶ。
(receive (port size) (retrieve)
;; この時sizeは0のはず。
;; 適当に後始末をする。ここの戻り値がhttp-get等の戻り値になる。
))
;; http-get等の呼び出し時に:receiverキーワード引数でstream-receiverを渡す
(http-get "stream.twitter.com" :secure #t :receiver stream-receiver ...)
;; サーバのレスポンスの色々な返し方に対応できるように複雑になっていますが、ストリーミングと
;; わかってるならこれでいけるんじゃないかと思います。でも試してないので無保証。
;; receiverのその他の動作モードについては lib/rfc/http.scmのhttp-string-receiverとかhttp-file-receiver
;; あたりを見るとわかるかも。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment