2016-04-12 10 views
4

私は現在フェニックスのウェブサイトを開発しており、バックグラウンドで再生すべきビデオセクションを持っています。phoenixでHTTP範囲リクエストを処理していますか?

FirefoxのChrome &で正常に動作しますが、Safariでは動作しません。

カウボーイがHTTP範囲要求を正しく処理していないためと思われます。

有効にする方法はありますか(デフォルトでは無効に設定されている場合)。

$ curl -H Range:bytes=16- -I http://localhost:4000/videos/vid_home_1.mp4 
HTTP/1.1 200 OK 
server: Cowboy 
date: Tue, 12 Apr 2016 14:41:20 GMT 
content-length: 633787 
cache-control: public 
etag: 480A03F 
content-type: video/mp4 

それはnginxのサーバーに示すように、206のようになります。

$ curl -H Range:bytes=16- -I http://localhost/videos/vid_home_1.mp4 
HTTP/1.1 206 Partial Content 
Server: nginx/1.8.0 
Date: Tue, 12 Apr 2016 14:46:17 GMT 
Content-Type: video/mp4 
Content-Length: 633771 
Last-Modified: Mon, 11 Apr 2016 12:26:26 GMT 
Connection: keep-alive 
ETag: "570b97f2-9abbb" 
Content-Range: bytes 16-633786/633787 
+0

理由による静的なコンテンツを提供しますカウボーイ? – ardhitama

+0

@ardhitama:まあ、ほとんどがフェニックスを使用しているので、私はまだ初期の開発段階にあります。また、私の知る限り、カウボーイは静的コンテンツをかなり上手く提供します。しかし、範囲リクエストを処理できない場合は、nginxとリバースプロキシ経由でphoenixサーバーにアクセスする可能性がありますが、これを修正することをお勧めします。 – TheSquad

答えて

0

私はプラグでそれを自分で行う方法を発見した... 誰がフェニックス/エリクサーと範囲要求を提供したい場合は、ここではこれはかなり基本的なものとし(あなたがしなければならないものですあなたが今、見ることができるように、それが唯一の「ビデオ/ MP4」のContent-Typeを送信しますが、あなたは簡単にすべてのために何かの作業を行うことができます)アカウントのRFCに

defmodule Plug.Range do                      
    @behaviour Plug                        
    @allowed_methods ~w(GET HEAD)                    
    import Plug.Conn                        

    def init(options) do                       
    options                         
    end                           

    def call(conn, _opts) do                      
    if (Enum.empty?(Plug.Conn.get_req_header(conn, "range"))) do            
     conn                          
    else                          
     file_path = "priv/static" <> conn.request_path               
     if File.exists? file_path do                    

     stats = File.stat! file_path                   
     filesize = stats.size                     

     req = Regex.run(~r/bytes=([0-9]+)-([0-9]+)?/, conn |> Plug.Conn.get_req_header("range") |> List.first) 

     {req_start, _} = req |> Enum.at(1) |> Integer.parse             
     {req_end, _} = req |> Enum.at(2, filesize |> to_string) |> Integer.parse        

     file_end = (filesize - 2) |> to_string                

     length = req_end - req_start + 1                  

     conn                         
     |> Plug.Conn.put_resp_header("Content-Type", "video/mp4")            
     |> Plug.Conn.put_resp_header("Accept-Ranges", "bytes")             
     |> Plug.Conn.put_resp_header("Content-Range", "bytes #{req_start}-#{req_end}/#{filesize}")    
     |> Plug.Conn.send_file(206, file_path, req_start, length)            
     |> Plug.Conn.halt                      
     else                          
     conn                         
     end                          
    end                          
    end                           
end   

を取ることはありませ...

最後にプラグが機能するためには、 Project EndpointファイルのPlug.staticの直前に配置する必要があります。興味がある人のために 、私はこのためのgithubの/ hex.pmパッケージを作成しました:

は、それが誰か...

EDITがお役に立てば幸い Hex link
github link

0

カウボーイは(まだ)Rangeヘッダをサポートしていないので、あなたが使用する必要がありますように見えますこのために別のWebサーバー。

出典:だからhttps://github.com/ninenines/cowboy/issues/306

+0

あなたは正しいですが、範囲はまだサポートされていませんが、私はプラグでそうする方法を見つけました。私の答えは以下を参照してください... – TheSquad

+0

私個人的には、しかし、それはあなたのために働く場合、素晴らしい!乾杯する;-) –

+0

これは開発目的のためだけです...今は残念ながらRFC準拠の実装を作成する時間がありません... RFC準拠のプラグで月にgithubを作成しますが、今それは私のために働くでしょう;-) – TheSquad

関連する問題