view cpack/dml/lib/httpfiles.pl @ 0:718306e29690 tip

commiting public release
author Daniel Wolff
date Tue, 09 Feb 2016 21:05:06 +0100
parents
children
line wrap: on
line source
/* Part of DML (Digital Music Laboratory)
	Copyright 2014-2015 Samer Abdallah, University of London
	 
	This program is free software; you can redistribute it and/or
	modify it under the terms of the GNU General Public License
	as published by the Free Software Foundation; either version 2
	of the License, or (at your option) any later version.

	This program is distributed in the hope that it will be useful,
	but WITHOUT ANY WARRANTY; without even the implied warranty of
	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
	GNU General Public License for more details.

	You should have received a copy of the GNU General Public
	License along with this library; if not, write to the Free Software
	Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
*/

:- module(httpfiles, 
   [  reply_file/2
   ,  reply_file/3
   ,  reply_stream/2
   ,  reply_stream/3
   ,  reply_html_page/4
   ,  write_headers/1
   ,  mime_type/2
   ]).

:- use_module(library(http/html_write)).

:- meta_predicate reply_html_page(+,:,:,+).

write_headers(Headers) :- maplist(write_header,Headers), nl.

write_header(length(L)) :- write_header('Content-Length'-L).
write_header(no_ranges) :- write_header('Accept-Ranges'-none).
write_header(stable)    :- write_header('Cache-Control'-'max-age=31536000, public').
write_header(unstable)  :- write_header('Cache-Control'-'max-age=0, public').
write_header(error)     :- write_header('Cache-Control'-'max-age=0, private, must-revalidate').
write_header(html) :-
   html_current_option(content_type(ContentType)),
   write_header('Content-Type'-ContentType).
write_header(type(Type)) :- 
   mime_type(Type,MimeType),
   write_header('Content-Type'-MimeType).
write_header(cookie(Name,Value,Expires)) :-
   format(atom(Cookie),'~w=~w; path=/; Expires=~w',[Name,Value,Expires]),
   write_header('Set-Cookie'-Cookie).
write_header(no_cache) :-
   maplist( write_header, 
      [ 'Cache-Control'-'no-cache, no-store, must-revalidate'
      , 'Pragma'-'no-cache'
      , 'Expires'-'0'
      ]).

write_header(Name-Value) :-
   format('~w: ~w~n',[Name,Value]).

reply_html_page(Style,Head,Body,Headers) :-
   phrase(page(Style,Head,Body),Tokens),
   write_headers([html|Headers]),
   print_html(Tokens).

reply_file(File,Type) :- reply_file(File,Type,[stable]).
reply_file(File,Type,Headers) :-
   write_headers([type(Type)|Headers]),
   debug(httpfiles,"Sending ~w with type ~w...",[File,Type]),
   setup_call_cleanup(
      open(File, read, In, [type(binary)]),
      copy_stream_data(In, current_output),
      close(In)),
   debug(httpfiles,"Finished sending.",[]).

with_tmp_stream(Enc,File,Str,Goal) :-
   setup_call_cleanup( 
      tmp_file_stream(Enc,File,Str), Goal,
      (close(Str,[force(true)]), delete_file(File))).

reply_stream(In,Type) :- reply_stream(In,Type,[stable]).
reply_stream(In,Type,Headers) :-
   (  memberchk(length(Length),Headers), var(Length)
   -> debug(httpfiles,"Stream length unknown - buffering to file...",[]),
      with_tmp_stream( octet, TmpFile, ToTmp, 
         (  copy_stream_data(In,ToTmp), close(ToTmp),
            size_file(TmpFile,Length),
            debug(httpfiles,"Stream length was ~d bytes",[Length]),
            reply_file(TmpFile,Type,Headers)
         ))
   ;  write_headers([type(Type)|Headers]),
      copy_stream_data(In, current_output)
   ),
   debug(httpfiles,"Finished sending stream.",[]).

% debug_stream(S,Label,Prop) :- stream_property(S,Prop), debug(httpfiles,"Stream property (~w): ~w",[Label,Prop]).

% copy_stream_length(In,Out,Len) :- 
   % copy_stream_data(In,Out).
   % copy_stream_length(In,Out,0,Len).

% copy_stream_length(In,_,Len,Len) :- at_end_of_stream(In), !.
% copy_stream_length(In,Out,L1,L3) :- 
%    debug(httpfiles,"Reading...",[]),
%    read_pending_input(In,Codes,[]),
%    length(Codes,N), L2 is L1+N,
%    debug(httpfiles,"Transferring ~d bytes...",[N]),
%    format(Out,'~s',[Codes]),
%    flush_output(Out),
%    copy_stream_length(In,Out,L2,L3).

mime_type(csv , "text/csv").
mime_type(ogg , "audio/ogg").
mime_type(mp3 , "audio/mp3").
mime_type(aac , "audio/aac").
mime_type(svg,  "image/svg+xml; charset=UTF-8").
mime_type(pdf,  "application/pdf").
mime_type(eps,  "application/postscript").
mime_type(ps,   "application/postscript").
mime_type(kern, "text/plain; charset=UTF-8").
mime_type(abc,  "text/plain; charset=UTF-8"). % vnd.abc
mime_type(mxml, "text/xml; charset=UTF-8").
mime_type(lily, "text/plain; charset=UTF-8").
mime_type(midi, "audio/midi").
mime_type(png,  "image/png").
mime_type(mp4,  "video/mp4").
mime_type(json, "application/json; charset=UTF-8").
mime_type(jsonp,"application/javascript; charset=UTF-8").

% httpfiles:mime_type(mxml, "application/vnd.recordare.musicxml+xml; charset=UTF-8").
% httpfiles:mime_type(lily, "text/x-lilypond; charset=UTF-8").