-- vim:set ft=lua:
-- mp4などのトランスコードしないファイルを転送するスクリプト

dofile(mg.script_name:gsub('[^\\/]*$','')..'util.lua')

query=mg.request_info.query_string
fpath=GetFilePath(query)

f=nil
if fpath then
  fname='xcode'..(fpath:match('%.[0-9A-Za-z]+$') or '')
  f=edcb.io.open(fpath, 'rb')
  if f then
    offset=tonumber(mg.get_var(query,'offset')) or 0
    if offset~=0 then
      fsec,fsize=GetDurationSec(f)
      if offset~=100 and SeekSec(f,fsec*offset/100,fsec,fsize) then
        offset=f:seek('cur',0) or 0
      else
        offset=math.floor(fsize*offset/100/188)*188
      end
    end
    f:seek('set', offset)
  end
end

if not f then
  mg.write(Response(404,'text/html','utf-8')..'\r\n')
else
  mg.write(Response(200,mg.get_mime_type(fname))..'Content-Disposition: filename='..fname..'\r\n\r\n')
  if mg.request_info.request_method~='HEAD' then
    retry=0
    while true do
      buf=f:read(48128)
      if buf and #buf ~= 0 then
        retry=0
        if not mg.write(buf) then
          -- キャンセルされた
          mg.cry('canceled')
          break
        end
      else
        -- 終端に達した。4秒間この状態が続けば対象ファイルへの追記が終息したとみなす
        retry=retry+1
        if retry > 20 then
          mg.cry('end')
          break
        end
        edcb.Sleep(200)
      end
    end
  end
  f:close()
end
