~azzar1/unity/add-show-desktop-key

« back to all changes in this revision

Viewing changes to www/dispatch/request.py

  • Committer: mattgiuca
  • Date: 2008-01-25 03:53:12 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:308
util.js: Multipart/form-data output: Newlines are \r\n instead of \n.
    \n caused mod_python's handler to complain.

Show diffs side-by-side

added added

removed removed

Lines of Context:
25
25
 
26
26
import common.util
27
27
import mod_python
28
 
from mod_python import (util, Session, Cookie)
 
28
from mod_python import (util, Session)
29
29
import conf
30
 
import plugins.console
31
30
 
32
31
class Request:
33
32
    """An IVLE request object. This is presented to the IVLE apps as a way of
44
43
            String. The path specified in the URL *not including* the
45
44
            application or the IVLE location prefix. eg. a URL of
46
45
            "/ivle/files/joe/myfiles" has a path of "joe/myfiles".
47
 
        user (read)
48
 
            User object. Details of the user who is currently logged in, or
 
46
        username (read)
 
47
            String. Login name of the user who is currently logged in, or
49
48
            None.
50
49
        hostname (read)
51
50
            String. Hostname the server is running on.
81
80
            in the head, if write_html_head_foot is True.
82
81
            URLs should be relative to the IVLE root; they will be fixed up
83
82
            to be site-relative.
84
 
        scripts_init (write)
85
 
            List of strings. Write a list of JS function names, and they
86
 
            will be added as window.addListener('load', ..., false); calls
87
 
            in the head, if write_html_head_foot is True.
88
 
            This is the propper way to specify functions that need to run at 
89
 
            page load time.
90
83
        write_html_head_foot (write)
91
84
            Boolean. If True, dispatch assumes that this is an XHTML page, and
92
85
            will immediately write a full HTML head, open the body element,
185
178
        # Split the given path into the app (top-level dir) and sub-path
186
179
        # (after first stripping away the root directory)
187
180
        path = common.util.unmake_path(req.uri)
188
 
        (self.app, self.path) = (common.util.split_path(path))
189
 
        self.user = None
 
181
        if self.publicmode:
 
182
            self.app = None
 
183
            self.path = path
 
184
        else:
 
185
            (self.app, self.path) = (common.util.split_path(path))
 
186
        self.username = None
190
187
        self.hostname = req.hostname
191
188
        self.headers_in = req.headers_in
192
189
        self.headers_out = req.headers_out
198
195
        self.title = None     # Will be set by dispatch before passing to app
199
196
        self.styles = []
200
197
        self.scripts = []
201
 
        self.scripts_init = []
202
198
        self.write_html_head_foot = False
203
199
        self.got_common_vars = False
204
200
 
206
202
        """Writes out the HTTP and HTML headers before any real data is
207
203
        written."""
208
204
        self.headers_written = True
209
 
        
210
 
        # app is the App object for the chosen app
211
 
        try:
212
 
            app = conf.apps.app_url[self.app]
213
 
        except KeyError:
214
 
            app = None
215
 
 
216
 
        # Write any final modifications to header content
217
 
        if app and app.useconsole and self.user:
218
 
            plugins.console.insert_scripts_styles(self.scripts, self.styles, \
219
 
                self.scripts_init)
220
 
 
221
205
        # Prepare the HTTP and HTML headers before the first write is made
222
206
        if self.content_type != None:
223
207
            self.apache_req.content_type = self.content_type
240
224
 
241
225
        if not self.headers_written:
242
226
            self.__writeheaders()
243
 
        if isinstance(string, unicode):
244
 
            # Encode unicode strings as UTF-8
245
 
            # (Otherwise cannot handle being written to a bytestream)
246
 
            self.apache_req.write(string.encode('utf8'), flush)
247
 
        else:
248
 
            # 8-bit clean strings just get written directly.
249
 
            # This includes binary strings.
250
 
            self.apache_req.write(string, flush)
 
227
        self.apache_req.write(string, flush)
251
228
 
252
229
    def flush(self):
253
230
        """Flushes the output buffer."""
267
244
        else:
268
245
            return self.apache_req.read(len)
269
246
 
270
 
    def throw_error(self, httpcode, message=None):
 
247
    def throw_error(self, httpcode):
271
248
        """Writes out an HTTP error of the specified code. Raises an exception
272
249
        which is caught by the dispatch or web server, so any code following
273
250
        this call will not be executed.
275
252
        httpcode: An HTTP response status code. Pass a constant from the
276
253
        Request class.
277
254
        """
278
 
        raise common.util.IVLEError(httpcode, message)
 
255
        raise mod_python.apache.SERVER_RETURN, httpcode
279
256
 
280
257
    def throw_redirect(self, location):
281
258
        """Writes out an HTTP redirect to the specified URL. Raises an
287
264
        """
288
265
        mod_python.util.redirect(self.apache_req, location)
289
266
 
290
 
    def add_cookie(self, cookie, value=None, **attributes):
291
 
        """Inserts a cookie into this request object's headers."""
292
 
        if value is None:
293
 
            Cookie.add_cookie(self.apache_req, cookie)
294
 
        else:
295
 
            Cookie.add_cookie(self.apache_req, cookie, value, **attributes)
296
 
 
297
267
    def get_session(self):
298
268
        """Returns a mod_python Session object for this request.
299
269
        Note that this is dependent on mod_python and may need to change
300
270
        interface if porting away from mod_python."""
301
 
        # Cache the session object and set the timeout to 24 hours.
 
271
        # Cache the session object
302
272
        if not hasattr(self, 'session'):
303
 
            self.session = Session.FileSession(self.apache_req,
304
 
                                               timeout = 60 * 60 * 24)
 
273
            self.session = Session.Session(self.apache_req)
305
274
        return self.session
306
275
 
307
276
    def get_fieldstorage(self):
321
290
            self.apache_req.add_common_vars()
322
291
            self.got_common_vars = True
323
292
        return self.apache_req.subprocess_env
324
 
 
325
 
    @staticmethod
326
 
    def get_http_codename(code):
327
 
        """Given a HTTP error code int, returns a (name, description)
328
 
        pair, suitable for displaying to the user.
329
 
        May return (None,None) if code is unknown.
330
 
        Only lists common 4xx and 5xx codes (since this is just used
331
 
        to display throw_error error messages).
332
 
        """
333
 
        try:
334
 
            return http_codenames[code]
335
 
        except KeyError:
336
 
            return None, None
337
 
 
338
 
# Human strings for HTTP response codes
339
 
http_codenames = {
340
 
    Request.HTTP_BAD_REQUEST:
341
 
        ("Bad Request",
342
 
        "Your browser sent a request IVLE did not understand."),
343
 
    Request.HTTP_UNAUTHORIZED:
344
 
        ("Unauthorized",
345
 
        "You are not allowed to view this part of IVLE."),
346
 
    Request.HTTP_FORBIDDEN:
347
 
        ("Forbidden",
348
 
        "You are not allowed to view this part of IVLE."),
349
 
    Request.HTTP_NOT_FOUND:
350
 
        ("Not Found",
351
 
        "The application or file you requested does not exist."),
352
 
    Request.HTTP_METHOD_NOT_ALLOWED:
353
 
        ("Method Not Allowed",
354
 
        "Your browser is interacting with IVLE in the wrong way."
355
 
        "This is probably a bug in IVLE. "
356
 
        "Please report it to the administrators."),
357
 
    Request.HTTP_INTERNAL_SERVER_ERROR:
358
 
        ("Internal Server Error",
359
 
        "An unknown error occured in IVLE."),
360
 
    Request.HTTP_NOT_IMPLEMENTED:
361
 
        ("Not Implemented",
362
 
        "The application or file you requested has not been implemented "
363
 
        "in IVLE."),
364
 
    Request.HTTP_SERVICE_UNAVAILABLE:
365
 
        ("Service Unavailable",
366
 
        "IVLE is currently experiencing technical difficulties. "
367
 
        "Please try again later."),
368
 
}