SVN: r25692 - trunk/quixote/doc

David Binger <dbinger-fVcApmY9cLvQ3/1i3zOLAti2O/[email protected]> Mon, 6 Dec 2004 19:01:59 -0500
Newsgroups gmane.comp.web.quixote.cvs
Message-ID <[email protected]>
Author: dbinger
Date: 2004-11-30 15:34:34 -0500 (Tue, 30 Nov 2004)
New Revision: 25692

Removed:
   trunk/quixote/doc/upload.txt
Log:
Remove upload.txt. 


Deleted: trunk/quixote/doc/upload.txt
===================================================================
--- trunk/quixote/doc/upload.txt	2004-11-30 20:25:28 UTC (rev 25691)
+++ trunk/quixote/doc/upload.txt	2004-11-30 20:34:34 UTC (rev 25692)
@@ -1,168 +0,0 @@
-HTTP Upload with Quixote
-========================
-
-Starting with Quixote 0.5.1, Quixote has a new mechanism for handling
-HTTP upload requests.  The bad news is that Quixote applications that
-already handle file uploads will have to change; the good news is that
-the new way is much simpler, saner, and more efficient.
-
-As (vaguely) specified by RFC 1867, HTTP upload requests are implemented
-by transmitting requests with a Content-Type header of
-``multipart/form-data``.  (Normal HTTP form-processing requests have a
-Content-Type of ``application/x-www-form-urlencoded``.)  Since this type
-of request is generally only used for file uploads, Quixote 0.5.1
-introduced a new class for dealing with it: HTTPUploadRequest, a
-subclass of HTTPRequest.
-
-
-Upload Form
------------
-
-Here's how it works: first, you create a form that will be encoded
-according to RFC 1867, ie. with ``multipart/form-data``.  You can put
-any ordinary form elements there, but for a file upload to take place,
-you need to supply at least one ``file`` form element.  Here's an
-example::
-
-    def upload_form [html] (request):
-        '''
-        <form enctype="multipart/form-data"
-              method="POST" 
-              action="receive">
-          Your name:<br>
-          <input type="text" name="name"><br>
-          File to upload:<br>
-          <input type="file" name="upload"><br>
-          <input type="submit" value="Upload">
-        </form>
-        '''
-
-(You can use Quixote's widget classes to construct the non-``file`` form
-elements, but the Form class currently doesn't know about the
-``enctype`` attribute, so it's not much use here.  Also, you can supply
-multiple ``file`` widgets to upload multiple files simultaneously.)
-
-The user fills out this form as usual; most browsers let the user either
-enter a filename or select a file from a dialog box.  But when the form
-is submitted, the browser creates an HTTP request that is different from
-other HTTP requests in two ways:
-
-* it's encoded according to RFC 1867, i.e. as a MIME message where each
-  sub-part is one form variable (this is irrelevant to you -- Quixote's
-  HTTPUploadRequest takes care of the details)
-
-* it's arbitrarily large -- even for very large and complicated HTML
-  forms, the HTTP request is usually no more than a few hundred bytes.
-  With file upload, the uploaded file is included right in the request,
-  so the HTTP request is as large as the upload, plus a bit of overhead.
-
-
-How Quixote Handles the Upload Request
---------------------------------------
-
-When Quixote sees an HTTP request with a Content-Type of
-``multipart/form-data``, it creates an HTTPUploadRequest object instead
-of the usual HTTPRequest.  (This happens even if there's not an uploaded
-file in the request -- Quixote doesn't know this when the request object
-is created, and ``multipart/form-data`` requests are oddballs that are
-better handled by a completely separate class, whether they actually
-include an upload or not.)  This is the ``request`` object that will be
-passed to your form-handling function or template, eg. ::
-
-    def receive [html] (request):
-        print request
-
-should print an HTTPUploadRequest object to the debug log, assuming that
-``receive()`` is being invoked as a result of the above form.
-
-However, since upload requests can be arbitrarily large, it might be
-some time before Quixote actually calls ``receive()``.  And Quixote has
-to interact with the real world in a number of ways in order to parse
-the request, so there are a number of opportunities for things to go
-wrong.  In particular, whenever Quixote sees a file upload variable in
-the request, it:
-
-* checks that the ``UPLOAD_DIR`` configuration variable was defined.
-  If not, it raises ConfigError.
-
-* ensures that ``UPLOAD_DIR`` exists, and creates it if not. (It's
-  created with the mode specified by ``UPLOAD_DIR_MODE``, which defaults
-  to ``0755``.  I have no idea what this should be on Windows.) If this
-  fails, your application will presumably crash with an OSError.
-
-* opens a temporary file in ``UPLOAD_DIR`` and write the contents
-  of the uploaded file to it.  Either opening or writing could fail
-  with IOError.
-
-Furthermore, if there are any problems parsing the request body -- which
-could be the result of either a broken/malicious client or of a bug in
-HTTPUploadRequest -- then Quixote raises RequestError.
-
-These errors are treated the same as any other exception Quixote
-encounters: RequestError (which is a subclass of PublishError) is
-transformed into a "400 Invalid request" HTTP response, and the others
-become some form of "internal server error" response, with traceback
-optionally shown to the user, emailed to you, etc.
-
-
-Processing the Upload Request
------------------------------
-
-If Quixote successfully parses the upload request, then it passes a
-``request`` object to some function or PTL template that you supply, as
-usual.  Of course, that ``request`` object will be an instance of
-HTTPUploadRequest rather than HTTPRequest, but that doesn't make much
-difference to you.  You can access form variables, cookies, etc. just as
-you usually do.  The only difference is that form variables associated
-with uploaded files are represented as Upload objects.  Here's an
-example that goes with the above upload form::
-
-    def receive [html] (request):
-        name = request.form.get("name")
-        if name:
-            "<p>Thanks, %s!</p>\n" % name
-
-        upload = request.form.get("upload")
-        size = os.stat(upload.tmp_filename)[stat.ST_SIZE]
-        if not upload.base_filename or size == 0:
-            "<p>You appear not to have uploaded anything.</p>\n"
-        else:
-            '''\
-            <p>You just uploaded <code>%s</code> (%d bytes)<br>
-            which is temporarily stored in <code>%s</code>.</p>
-            ''' % (upload.base_filename, size, upload.tmp_filename)
-
-Upload objects provide three attributes of interest:
-
-``orig_filename``
-  the complete filename supplied by the user-agent in the request that
-  uploaded this file.  Depending on the browser, this might have the
-  complete path of the original file on the client system, in the client
-  system's syntax -- eg.  ``C:\foo\bar\upload_this`` or
-  ``/foo/bar/upload_this`` or ``foo:bar:upload_this``.
-
-``base_filename``
-  the base component of orig_filename, shorn of MS-DOS, Mac OS, and Unix
-  path components and with "unsafe" characters replaced with
-  underscores.  (The "safe" characters are ``A-Z``, ``a-z``, ``0-9``,
-  ``- @ & + = _ .``, and space.  Thus, this is "safe" in the sense that
-  it's OK to create a filename with any of those characters on Unix, Mac
-  OS, and Windows, *not* in the sense that you can use the filename in
-  an HTML document without quoting it!)
-  
-``tmp_filename``
-  where you'll actually find the file on the current system
-
-Thus, you could open the file directly using ``tmp_filename``, or move
-it to a permanent location using ``tmp_filename`` and ``base_filename``
--- whatever.
-
-
-Upload Demo
------------
-
-The above upload form and form-processor are available, in a slightly
-different form, in ``demo/upload.cgi``.  Install that file to your usual
-``cgi-bin`` directory and play around.
-
-$Id$