-
Notifications
You must be signed in to change notification settings - Fork 267
/
yaws_ls.erl
127 lines (101 loc) · 3.22 KB
/
yaws_ls.erl
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
%%%----------------------------------------------------------------------
%%% File : yaws_ls.erl
%%% Author : Claes Wikstrom <klacke@hyber.org>
%%% Purpose :
%%% Created : 5 Feb 2002 by Claes Wikstrom <klacke@hyber.org>
%%%----------------------------------------------------------------------
-module(yaws_ls).
-author('klacke@hyber.org').
-compile(export_all).
-include("yaws.hrl").
-include_lib("kernel/include/file.hrl").
list_directory(CliSock, List, DirName, Req, GC, SC) ->
?Debug("List=~p", [List]),
L = lists:zf(
fun(F) ->
File = SC#sconf.docroot ++ DirName ++ [$/|F],
FI = file:read_file_info(File),
file_entry(FI, DirName, F)
end, [".." | List]),
Body = [doc_head(DirName),
list_head(),
L,
"\n</pre>\n<hr>\n",
yaws:address(GC, SC),
"</body>\n</html>\n"],
B = list_to_binary(Body),
yaws_server:make_date_and_server_headers(),
yaws_server:make_connection_close(true),
yaws_server:make_content_length(size(B)),
yaws_server:make_content_type("text/html"),
yaws_server:close_if_HEAD(
Req,
fun() ->
yaws_server:deliver_accumulated(#dcc{}, CliSock, GC, SC),
yaws_server:do_tcp_close(CliSock, SC),
throw({ok, 1})
end),
yaws_server:accumulate_content(B),
yaws_server:deliver_accumulated(#dcc{}, CliSock, GC, SC),
done.
doc_head(DirName) ->
?F("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 3.2 Final//EN\"> \n"
"<html> \n"
" <head> \n"
" <title>Index of ~s </title> \n"
" </head> \n"
" <body>\n"
" <h1>Index of ~s </h1>\n", [DirName, DirName]).
list_head() ->
" <pre><img SRC=\"/icons/blank.gif\" ALT=\" \"> "
"<a HREF=\"?N=D\">Name</a> "
"<a HREF=\"?M=A\">Last modified</a> "
" <a HREF=\"?S=A\">Size</a> "
"<a HREF=\"?D=A\">Description</a> \n"
"<hr> \n".
file_entry({ok, FI}, DirName, Name) ->
?Debug("file_entry(~p) ", [Name]),
Ext = filename:extension(Name),
{Gif, Alt} = list_gif(FI#file_info.type, Ext),
Trim = trim(Name, 20),
Entry = ?F("<img SRC=~p ALT=~p> <a HREF=~p>~s</a> ~s~s ~s~n",
["/icons/" ++ Gif,
Alt,
DirName ++ [$/|Name],
Trim,
lists:duplicate(20 - length(Trim), $\s),
datestr(FI),
sizestr(FI)]),
?Debug("Entry:~p", [Entry]),
{true, Entry};
file_entry(_Err, _, _Name) ->
?Debug("no entry for ~p: ~p", [_Name, _Err]),
false.
trim([_H|_T], 5) ->
"..>";
trim([H|T], I) ->
[H|trim(T,I-1)];
trim([], _) ->
[].
datestr(FI) ->
yaws:time_to_string(FI#file_info.mtime, []).
sizestr(FI) when FI#file_info.size > 1000000 ->
?F("~.1f M", [FI#file_info.size / 1000000]);
sizestr(FI) when FI#file_info.size > 1000 ->
?F("~w k", [trunc(FI#file_info.size / 1000)]);
sizestr(FI) ->
?F("~w ", [FI#file_info.size]).
list_gif(directory, ".") ->
{"back.gif", "[DIR]"};
list_gif(regular, ".txt") ->
{"text.gif", "[TXT]"};
list_gif(regular, ".c") ->
{"c.gif", "[ ]"};
list_gif(regular, ".dvi") ->
{"dvi.gif", "[ ]"};
list_gif(regular, ".pdf") ->
{"pdf.gif", "[ ]"};
list_gif(regular, _) ->
{"layout.gif", "[ ]"};
list_gif(directory, _) ->
{"dir.gif", "[DIR]"}.