• Computed URL Example
  • In this example, the client receives an HTML+ page that the server computes by listing a remote directory and repackaging the file names in a friendlier format. Below, we see the Common LISP definition for the response function that is invoked when a client sends the server a GET for the computed URL.

    ;; Export the computed URL and provide its response function.
    (export-url "http://clinton.ai.mit.edu/radio-addresses.html"
    	    :html-computed
    	    #'compute-clinton-audio-page)
    
    ;; Writes HTML+ directly to the client over STREAM, which is a live
    ;; HTTP connection to the client.
    (defmethod compute-clinton-audio-page ((url url:http-computed-url) stream)
      (flet ;; Abstract the internal function that writes an entry.
        ((write-pathname (pathname stream)
           (let ((url (url:pathname-ftp-url-string pathname))
    	     (friendly-date (uu-radio-address-anchor-date pathname)))
    	 (when friendly-date
    	   ;; Encapsulate text within an enumeration entry.
    	   (html+:enumerating-item (stream)
    	     ;; Change the text style to bold.
    	     (html+:with-rendition (:bold :stream stream)
    	       ;; Write an HTML+ anchor spec using the friendly name.
    	       (html+:note-anchor
    		 friendly-date :reference url :stream stream)))))))
        ;; Main body of method.
        (let ((directory-list (www-utils:ftp-directory-info
    			    *saturday-radio-addresses-audio-directory*
    			    "anonymous"
    			    (www-utils:user-mail-address))))
          (if directory-list
    	  ;; Inform the client that we're winning and returning HTML+.
    	  (with-successful-response (stream :html)
    	    ;; Provide the header info that goes in the HTML+.
    	    (html+:with-document-preamble (:stream stream)
    	      (html+:declare-base-reference url :stream stream)
    	      (html+:declare-title "Saturday Radio Addresses" :stream stream))
    	    ;; Use the body environment.
    	    (html+:with-document-body (:stream stream)
    	      (html+:with-section-heading
    		((html+:image
    		   "http://clinton.ai.mit.edu/icons/sound-icon.xbm"
    		   "The President's Saturday Radio Addresses to the Nation"
    		   :stream nil))
    		(html+:new-paragraph :stream stream)
    		;; Provide the instructions for the WWW page.
    		(write-string "By clicking on a date, you can listen to
                                   the audio for a Saturday radio address
    	                       by President Clinton." stream)
    		(html+:horizontal-line :stream stream)
    		(html+:new-paragraph :stream stream)
    		;; Enter an environment for enumerating items.
    		(html+:with-enumeration (stream :itemize)
    		  ;; Map over files and write them as bullets.
    		  (loop for (pathname) in directory-list
    			do (write-pathname pathname stream))))))
    	  ;; Signal that the server cannot connect to the remote host.
    	  (error "Unable to connect to UU.NET to get file list.")))))