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

« back to all changes in this revision

Viewing changes to www/dispatch/request.py

  • Committer: wagrant
  • Date: 2008-09-20 07:02:28 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:1053
www.apps.server: Bail out early if the user doesn't exist. This
                 has frequently been crashing.

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)
 
28
from mod_python import (util, Session, Cookie)
29
29
import conf
 
30
import plugins.console
30
31
 
31
32
class Request:
32
33
    """An IVLE request object. This is presented to the IVLE apps as a way of
43
44
            String. The path specified in the URL *not including* the
44
45
            application or the IVLE location prefix. eg. a URL of
45
46
            "/ivle/files/joe/myfiles" has a path of "joe/myfiles".
46
 
        username (read)
47
 
            String. Login name of the user who is currently logged in, or
 
47
        user (read)
 
48
            User object. Details of the user who is currently logged in, or
48
49
            None.
49
50
        hostname (read)
50
51
            String. Hostname the server is running on.
80
81
            in the head, if write_html_head_foot is True.
81
82
            URLs should be relative to the IVLE root; they will be fixed up
82
83
            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.
83
90
        write_html_head_foot (write)
84
91
            Boolean. If True, dispatch assumes that this is an XHTML page, and
85
92
            will immediately write a full HTML head, open the body element,
178
185
        # Split the given path into the app (top-level dir) and sub-path
179
186
        # (after first stripping away the root directory)
180
187
        path = common.util.unmake_path(req.uri)
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
 
188
        (self.app, self.path) = (common.util.split_path(path))
 
189
        self.user = None
187
190
        self.hostname = req.hostname
188
191
        self.headers_in = req.headers_in
189
192
        self.headers_out = req.headers_out
195
198
        self.title = None     # Will be set by dispatch before passing to app
196
199
        self.styles = []
197
200
        self.scripts = []
 
201
        self.scripts_init = []
198
202
        self.write_html_head_foot = False
199
203
        self.got_common_vars = False
200
204
 
202
206
        """Writes out the HTTP and HTML headers before any real data is
203
207
        written."""
204
208
        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
 
205
221
        # Prepare the HTTP and HTML headers before the first write is made
206
222
        if self.content_type != None:
207
223
            self.apache_req.content_type = self.content_type
251
267
        else:
252
268
            return self.apache_req.read(len)
253
269
 
254
 
    def throw_error(self, httpcode):
 
270
    def throw_error(self, httpcode, message=None):
255
271
        """Writes out an HTTP error of the specified code. Raises an exception
256
272
        which is caught by the dispatch or web server, so any code following
257
273
        this call will not be executed.
259
275
        httpcode: An HTTP response status code. Pass a constant from the
260
276
        Request class.
261
277
        """
262
 
        raise mod_python.apache.SERVER_RETURN, httpcode
 
278
        raise common.util.IVLEError(httpcode, message)
263
279
 
264
280
    def throw_redirect(self, location):
265
281
        """Writes out an HTTP redirect to the specified URL. Raises an
271
287
        """
272
288
        mod_python.util.redirect(self.apache_req, location)
273
289
 
 
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
 
274
297
    def get_session(self):
275
298
        """Returns a mod_python Session object for this request.
276
299
        Note that this is dependent on mod_python and may need to change
277
300
        interface if porting away from mod_python."""
278
 
        # Cache the session object
 
301
        # Cache the session object and set the timeout to 24 hours.
279
302
        if not hasattr(self, 'session'):
280
 
            self.session = Session.FileSession(self.apache_req)
 
303
            self.session = Session.FileSession(self.apache_req,
 
304
                                               timeout = 60 * 60 * 24)
281
305
        return self.session
282
306
 
283
307
    def get_fieldstorage(self):
297
321
            self.apache_req.add_common_vars()
298
322
            self.got_common_vars = True
299
323
        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
}