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

« back to all changes in this revision

Viewing changes to www/dispatch/request.py

  • Committer: drtomc
  • Date: 2008-02-04 23:18:34 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:405
Version 0 of the file manipulation tools to allow us to get the permissions right.

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
267
251
        else:
268
252
            return self.apache_req.read(len)
269
253
 
270
 
    def throw_error(self, httpcode, message=None):
 
254
    def throw_error(self, httpcode):
271
255
        """Writes out an HTTP error of the specified code. Raises an exception
272
256
        which is caught by the dispatch or web server, so any code following
273
257
        this call will not be executed.
275
259
        httpcode: An HTTP response status code. Pass a constant from the
276
260
        Request class.
277
261
        """
278
 
        raise common.util.IVLEError(httpcode, message)
 
262
        raise mod_python.apache.SERVER_RETURN, httpcode
279
263
 
280
264
    def throw_redirect(self, location):
281
265
        """Writes out an HTTP redirect to the specified URL. Raises an
287
271
        """
288
272
        mod_python.util.redirect(self.apache_req, location)
289
273
 
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
274
    def get_session(self):
298
275
        """Returns a mod_python Session object for this request.
299
276
        Note that this is dependent on mod_python and may need to change
300
277
        interface if porting away from mod_python."""
301
 
        # Cache the session object and set the timeout to 24 hours.
 
278
        # Cache the session object
302
279
        if not hasattr(self, 'session'):
303
 
            self.session = Session.FileSession(self.apache_req,
304
 
                                               timeout = 60 * 60 * 24)
 
280
            self.session = Session.FileSession(self.apache_req)
305
281
        return self.session
306
282
 
307
283
    def get_fieldstorage(self):
321
297
            self.apache_req.add_common_vars()
322
298
            self.got_common_vars = True
323
299
        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
 
}