Example Code using lua-httpd
Here are some simple samples of code demonstrating how the library may be used. For more details on the specific functions available and their accepted parameters please see the API documentation.
The library includes a couple of small samples of its own which have better error handling, and more complete functionality. However these samples are simpler for demonstration purposes.
Simple Server
The following code implements a simple single-threaded "echo server", which will accept connections upon a port and merely echo back everything it recieves to the connected client.
#!/usr/bin/lua50 -- Load the library socket = require( "libhttpd" ); -- Start listening upon a socket listener = socket.bind( 9999 ); -- Show instructions! print( "Echo server running on port 9999" ); -- Loop waiting for connections while true do -- Accept a new connection. client,ip = socket.accept( listener ); -- Read from the client. length, data = socket.read(client); while( length > 0 ) do -- Echo data back to client. socket.write( client, data ); length, data = socket.read( client ); end -- Now close the socket. socket.close( client ); end
(You may download example-server.lua.)
Simple Client
The following implements a simple client, connecting to http://localhost/ and retrieving the header and contents of a page request.
-- Load the library socket = require( "libhttpd" ); -- Make a connection to http://localhost/ sock = socket.connect( "localhost", 80 ); -- Send the request. socket.write( sock, "GET / HTTP/1.0\n\n" ); -- Read the response and print it repeat len,line = socket.read( sock ) print( line ); until len <= 0 -- Close up socket.close( sock );
(You may download example-client.lua.)
Working With Files
The following example prints out a recursive tree of your current directory:
#!/usr/bin/lua50 -- Load the library socket = require( "libhttpd" ); function showPath( dir, level ) -- Read directory entries. local entries = socket.readdir( dir ); -- For each entry for i=0,table.getn(entries) do -- The sub-entry item = entries[i]; -- If it is a file then show it. if ( socket.is_file( dir .. "/" .. item ) ) then -- Print filename with indentation ind = level; txt = ""; while( ind > 0 ) do txt = txt .. " " ; ind = ind - 1; end print( txt .. item ); end end -- Now do the same for subdirectories for i=0,table.getn(entries) do -- The sub-entry item = entries[i]; -- Make sure we have a valid directory which isn't '.', or '..'. if ( ( item ~= nil ) and ( item ~= "." ) and ( item ~= ".." ) ) then if ( socket.is_dir( dir .. "/" .. item ) ) then -- Print it out. print ( dir .. "/" .. item .. "/" ); -- Now recurse: showPath( dir .. "/" .. item, (level + 1) ); end end end end -- Now show the current directory recursively showPath( ".", 1 );
(You may download example-tree.lua.)
Sample usage looks like this:
skx@lappy:~/cvs/lua-httpd$ lua ./docs/example-tree.lua | head Makefile README client.lua libhttpd.c default.lua .cvsignore httpd.lua ./CVS/ Root Repository