Gophermoon 0.2 - a Gopher-Server in Lua – Part 3
Gophermoon on Github
the sourcecode is now on Github @ https://github.com/cstrotm/gophermoon
With every blog post, I will post the link to the commit associated with the blog post.
Serving static text files
Today Gophermoon learned how to serve static text files. The program first looks at the selector send by the client. If the selector is empty, and uses the root directory.
--- read the selector from the client selector = io.read() --- remove CR (13/$0D) from input selector=selector:sub(1, -2) --- if an empty selector has been send, use the root if selector == '' then selector = "/" end --- make selector relative to the gopher root filepath = gopherroot .. selector
Next, if the selector points to a directory, it looks if there is a
file names gophermap in the direcory. A gophermap file is a
Gopher-Document describing the resources available in this directory
(as well as links outside the directory). Gophermoon uses the same
gophermap format as Gophernicus (see
https://github.com/prologic/gophernicus/blob/master/README.Gophermap)
Welcome to GopherMoon @ defaultroutes.de ---------------------------------------- 0Gophermoon 0.1 - a Gopher-Server in Lua -- Part 1 /gophermoon01.txt blog.defaultroutes.de 70 0Gophermoon 0.1 - a Gopher-Server in Lua -- Part 2 /gophermoon02.txt blog.defaultroutes.de 70 0Gophermoon 0.2 - a Gopher-Server in Lua -- Part 3 /gophermoon03.txt blog.defaultroutes.de 70 0Gophermoon Sourcecode /gophermoon blog.defaultroutes.de 70
Lines that do not contain a tabulator are formatted as "i" (Information) file type.
--- if the selector points to a directory,
--- do we have a "gophermap" file? If "yes",
--- send that file. Else, if the selector
--- points to a (text-) file, send it
--- if both are false, send an error message
if isDir(filepath) then
gophermap = filepath .. "/gophermap"
if isReadable(gophermap) then
send_gophermap(gophermap)
end
else
if isReadable(filepath) then
send_textfile(filepath)
else
send_info("Welcome to GopherMoon @ defaultroutes.de")
send_info("----------------------------------------")
send_info("Error: Selector not found")
send_end()
end
end
If the selector isn't a directory, the program checks the selector is a readable file, and if it is, it sends the file gopher-style (with CR/LF and terminating the file with ".").
--- send a Textfile Gopher-style
function send_textfile(filepath)
local f=io.open(filepath,"r")
if f~=nil then
for line in io.lines(filepath) do
io.write(line .. "\r\n")
end
io.close(f)
end
send_end()
end
The commit from today is https://github.com/cstrotm/gophermoon/commit/f300e28677059c9364151a89b36afe552d858700