These are chat archives for rpscala/rpscala

27th
Jun 2016
Yoshiteru Takeshita
@takezoux2
Jun 27 2016 03:00
akka-httpをHttpクライアントとして使う場合に、gzipのResponseを展開するのはどうすれば良いか知ってる方いますか?
今のコードは下の感じです。
import akka.http.scaladsl.Http
import akka.http.scaladsl.model._
import akka.http.scaladsl.model.headers._
Http().singleRequest(
      HttpRequest(
        uri = "http://gzipを返すurl",
        headers = List(headers.`Accept-Encoding`(HttpEncodings.gzip,HttpEncodings.deflate)
    )).flatMap( r => {
      r.status match{
        case StatusCodes.Success(statusCode) => {
          r.entity.dataBytes.runReduce(_ ++ _).map{ body =>
            println(body.utf8String) // 文字化け
          }
        }
      })
KAWACHI Takashi
@tkawachi
Jun 27 2016 04:09
やったことないですけど、最悪 java.util.zip あたりで展開すれば…
Yasuo Nakanishi
@Saisse
Jun 27 2016 04:17
java.util.zipだと日本語のファイル名がアレだったりするので、commons-compress使った方がいいかもですね。状況が許せばローカルに保存してコマンド叩いた方が早いかもです。
KAWACHI Takashi
@tkawachi
Jun 27 2016 04:18
HTTP の中身なのでファイル名は無いのでは。
Yasuo Nakanishi
@Saisse
Jun 27 2016 04:20
あ、中のエントリの名前の方ですー。エンコーディングを指定出来なかった気が・・・
KAWACHI Takashi
@tkawachi
Jun 27 2016 14:52
Flow[ByteString, ByteString] 見たいの作れば良さそう。と思って試しにやってみようとしたけど、難しかった…
GraphStage[FlowShape[ByteString, ByteString]] の subclass 実装して Flow.fromGraph() すると良さそうなんだけど、主に GZIPInputStream の扱いに慣れてなくて…
Manabu Nakamura
@gakuzzzz
Jun 27 2016 14:56
spray だと pipeline に gzip decorator かませたけど akka-http だとどうやるんだろう?
decoderFlow 使えばよさそう?
KAWACHI Takashi
@tkawachi
Jun 27 2016 14:57
あ、動きましたねw
さすがに用意されていた
Manabu Nakamura
@gakuzzzz
Jun 27 2016 14:58
:)
KAWACHI Takashi
@tkawachi
Jun 27 2016 14:58
r.entity.dataBytes.via(Gzip.decoderFlow).runForeach { bs => println(bs.utf8String) } という感じで全文印字できました
https://github.com/akka/akka/blob/v2.4.7/akka-http/src/main/scala/akka/http/scaladsl/coding/Gzip.scala#L62 Inflater を直に使っていた。自分もそうしようかと思ったのだけど、gzip header のチェック面倒なので GZIPInputStream でなんとかならないかと格闘していました
KAWACHI Takashi
@tkawachi
Jun 27 2016 15:05
ところで akka http などで ByteString が出てくるところ、ByteString は utf8 の文字の切れ目でちゃんと切れるんでしょうか?
切れないとしたら↑のようなことはしてはいけない、ということになりますよね…
実際のところ、あんまり切れる気はしてないのですが