~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-12 15:35:53 UTC
  • Revision ID: svn-v3-trunk0:2b9c9e99-6f39-0410-b283-7f802c844ae2:trunk:201
Added "test" directory.
Added make_date_test.py, a short script I wrote to test the date format
algorithm committed in the previous revision.

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)
29
 
import conf
30
 
import plugins.console
 
28
from mod_python import (util, Session)
31
29
 
32
30
class Request:
33
31
    """An IVLE request object. This is presented to the IVLE apps as a way of
44
42
            String. The path specified in the URL *not including* the
45
43
            application or the IVLE location prefix. eg. a URL of
46
44
            "/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
 
45
        username (read)
 
46
            String. Login name of the user who is currently logged in, or
49
47
            None.
50
 
        hostname (read)
51
 
            String. Hostname the server is running on.
52
48
        headers_in (read)
53
49
            Table object representing headers sent by the client.
54
50
        headers_out (read, can be written to)
55
51
            Table object representing headers to be sent to the client.
56
 
        publicmode (read)
57
 
            Bool. True if the request came for the "public host" as
58
 
            configured in conf.py. Note that public mode requests do not
59
 
            have an app (app is set to None).
60
52
 
61
53
        status (write)
62
54
            Int. Response status number. Use one of the status codes defined
81
73
            in the head, if write_html_head_foot is True.
82
74
            URLs should be relative to the IVLE root; they will be fixed up
83
75
            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
76
        write_html_head_foot (write)
91
77
            Boolean. If True, dispatch assumes that this is an XHTML page, and
92
78
            will immediately write a full HTML head, open the body element,
172
158
        self.func_write_html_head = write_html_head
173
159
        self.headers_written = False
174
160
 
175
 
        # Determine if the browser used the public host name to make the
176
 
        # request (in which case we are in "public mode")
177
 
        if req.hostname == conf.public_host:
178
 
            self.publicmode = True
179
 
        else:
180
 
            self.publicmode = False
181
 
 
182
161
        # Inherit values for the input members
183
162
        self.method = req.method
184
163
        self.uri = req.uri
185
164
        # Split the given path into the app (top-level dir) and sub-path
186
165
        # (after first stripping away the root directory)
187
 
        path = common.util.unmake_path(req.uri)
188
 
        (self.app, self.path) = (common.util.split_path(path))
189
 
        self.user = None
190
 
        self.hostname = req.hostname
 
166
        (self.app, self.path) = (
 
167
            common.util.split_path(common.util.unmake_path(req.uri)))
 
168
        self.username = None
191
169
        self.headers_in = req.headers_in
192
170
        self.headers_out = req.headers_out
193
171
 
198
176
        self.title = None     # Will be set by dispatch before passing to app
199
177
        self.styles = []
200
178
        self.scripts = []
201
 
        self.scripts_init = []
202
179
        self.write_html_head_foot = False
203
 
        self.got_common_vars = False
204
180
 
205
181
    def __writeheaders(self):
206
182
        """Writes out the HTTP and HTML headers before any real data is
207
183
        written."""
208
184
        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
185
        # Prepare the HTTP and HTML headers before the first write is made
222
186
        if self.content_type != None:
223
187
            self.apache_req.content_type = self.content_type
240
204
 
241
205
        if not self.headers_written:
242
206
            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)
 
207
        self.apache_req.write(string, flush)
251
208
 
252
209
    def flush(self):
253
210
        """Flushes the output buffer."""
263
220
        """Reads at most len bytes directly from the client. (See mod_python
264
221
        Request.read)."""
265
222
        if len is None:
266
 
            return self.apache_req.read()
 
223
            self.apache_req.read()
267
224
        else:
268
 
            return self.apache_req.read(len)
 
225
            self.apache_req.read(len)
269
226
 
270
 
    def throw_error(self, httpcode, message=None):
 
227
    def throw_error(self, httpcode):
271
228
        """Writes out an HTTP error of the specified code. Raises an exception
272
229
        which is caught by the dispatch or web server, so any code following
273
230
        this call will not be executed.
275
232
        httpcode: An HTTP response status code. Pass a constant from the
276
233
        Request class.
277
234
        """
278
 
        raise common.util.IVLEError(httpcode, message)
 
235
        raise mod_python.apache.SERVER_RETURN, httpcode
279
236
 
280
237
    def throw_redirect(self, location):
281
238
        """Writes out an HTTP redirect to the specified URL. Raises an
287
244
        """
288
245
        mod_python.util.redirect(self.apache_req, location)
289
246
 
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
247
    def get_session(self):
298
248
        """Returns a mod_python Session object for this request.
299
249
        Note that this is dependent on mod_python and may need to change
300
250
        interface if porting away from mod_python."""
301
 
        # Cache the session object and set the timeout to 24 hours.
 
251
        # Cache the session object
302
252
        if not hasattr(self, 'session'):
303
 
            self.session = Session.FileSession(self.apache_req,
304
 
                                               timeout = 60 * 60 * 24)
 
253
            self.session = Session.Session(self.apache_req)
305
254
        return self.session
306
255
 
307
256
    def get_fieldstorage(self):
312
261
        if not hasattr(self, 'fields'):
313
262
            self.fields = util.FieldStorage(self.apache_req)
314
263
        return self.fields
315
 
 
316
 
    def get_cgi_environ(self):
317
 
        """Returns the CGI environment emulation for this request. (Calls
318
 
        add_common_vars). The environment is returned as a mapping
319
 
        compatible with os.environ."""
320
 
        if not self.got_common_vars:
321
 
            self.apache_req.add_common_vars()
322
 
            self.got_common_vars = True
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
 
}