def __serve_wn(self, wn, storagedir):
     print_enter('worknoteBookServer.__serve_wn')
     from tempfile import gettempdir
     from os.path import join, exists
     from cherrypy.lib.static import serve_download
     from worknoteBookHelpers import zip_worknote
     wn_dir, wn_title, wn_date = wn
     print 'Preparing to serve "{:s}" from "{:s}"...'.format(wn_dir, storagedir)
     tmpdir = gettempdir()
     fn_wnzip = '{wn_dir:s}.zip'.format(wn_dir=wn_dir)
     dl_filepath = join(tmpdir, fn_wnzip)
     print 'Zipping worknote...'
     zip_worknote(join(storagedir, wn_dir), dl_filepath)
     if exists(dl_filepath):
         print 'Serving file "{:s}"...'.format(dl_filepath)
         return serve_download(dl_filepath, name=fn_wnzip)    
     else:
         print 'ERROR: Zip file not created'
         return 'Error creating ZIP archive for download'
 try:        
     response = urlopen(request)
     response.read()
     response.close()
 except HTTPError, e:
     print 'ERROR: Upload failed ({:s})'.format(str(e))
     return
 except URLError, e:
     print 'ERROR: Upload failed ({:s})'.format(str(e))
     return        
 tmpdir = gettempdir()
 zip_fn = join(tmpdir, 'worknoteBook_upload.zip')
 if not exists(workdir):
     print 'ERROR: Directory "{:s}" does not exist.'.format(workdir)
     return
 zip_worknote(workdir, zip_fn)
 up_file = FileLenIO(zip_fn, 'rb')
 request_url = 'http://{:s}/upload'.format(self.get_server(servername))
 if not chapter == '':
     request_url += '?chapter={:s}'.format(chapter.replace(' ', '+'))
 request = Request(request_url, up_file)
 request.add_header('Content-Type', 'application/octet-stream')
 request.add_header('X-Worknote-Workdir', workdir)
 request.add_header('X-Worknote-Overwrite', str(overwrite))
 try:        
     response = urlopen(request)
     response = response.read()
 except HTTPError, e:
     print 'ERROR: Upload failed ({:s})'.format(str(e))
     return
 except URLError, e: