class GET_REQUEST_HANDLER inherit HTTP_REQUEST_HANDLER HTTP_SERVER_SHARED_CONFIGURATION undefine default_create end SHARED_URI_CONTENTS_TYPES undefine default_create end HTTP_CONSTANTS undefine default_create end create make feature {NONE} -- Initialization make (a_input: like input; a_output: like output) do default_create input := a_input output := a_output end feature -- Access input: HTTP_INPUT_STREAM output: HTTP_OUTPUT_STREAM feature -- Execution process -- process the request and create an answer local fname: STRING_8 f: RAW_FILE ctype, extension: detachable STRING_8 do answer.reset if script_name.is_equal ("/") then process_default answer.set_content_type ("text/html") else create fname.make_from_string (Document_root) fname.append (script_name) debug print ("URI filename: " + fname) end create f.make (real_filename (fname)) if f.exists then extension := Ct_table.extension (script_name) ctype := Ct_table.content_types.item (extension) if f.is_directory then process_directory (f) else if ctype = Void then process_raw_file (f) answer.set_content_type ("text/html") else if ctype.is_equal ("text/html") then process_text_file (f) else process_raw_file (f) end answer.set_content_type (ctype) end end else answer.set_status_code (Not_found) answer.set_reason_phrase (Not_found_message) answer.set_reply_text ("Not found on this server") end end if attached answer.reply_text as t then answer.set_content_length (t.count) else answer.set_content_length (0) end --| Output the result output.put_string (answer.reply_header + answer.reply_text) end process_default -- Return a default response local html: STRING_8 do answer.set_reply_text ("") html := "
Default page " + "
" + " " + " " answer.append_reply_text (html) end process_text_file (f: FILE) -- send a text file reply require valid_f: f /= Void do f.open_read from answer.set_reply_text ("") f.read_line until f.end_of_file loop answer.append_reply_text (f.last_string) answer.append_reply_text (Crlf) f.read_line end f.close end process_raw_file (f: FILE) -- send a raw file reply require valid_f: f /= Void do f.open_read from answer.set_reply_text ("") until f.end_of_file loop f.read_stream_thread_aware (1024) answer.append_reply_text (f.last_string) end f.close end process_directory (f: FILE) --read the directory require is_directory: f.is_directory local l_dir: DIRECTORY files: ARRAYED_LIST [STRING_8] html1: STRING_8 html2: STRING_8 htmldir: STRING_8 path: STRING_8 do answer.set_reply_text ("") html1 := "Default page " html2 := "
" + " " + " " path := script_name if path[path.count] = '/' then path.remove_tail (1) end create l_dir.make_open_read (f.name) files := l_dir.linear_representation from files.start htmldir := "