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

« back to all changes in this revision

Viewing changes to ivle/dispatch/request.py

  • Committer: Matt Giuca
  • Date: 2009-05-26 04:15:23 UTC
  • mto: This revision was merged to the branch mainline in revision 1322.
  • Revision ID: matt.giuca@gmail.com-20090526041523-hsg5q2enlhvjb5y2
doc/man/architecture.rst: User management server.

Show diffs side-by-side

added added

removed removed

Lines of Context:
33
33
    # This needs to be importable from outside Apache.
34
34
    pass
35
35
 
 
36
import os.path
 
37
 
36
38
import ivle.util
37
 
import ivle.conf
38
39
import ivle.database
39
40
from ivle.webapp.base.plugins import CookiePlugin
40
41
 
78
79
        location (write)
79
80
            String. Response "Location" header value. Used with HTTP redirect
80
81
            responses.
81
 
        title (write)
82
 
            String. HTML page title. Used if write_html_head_foot is True, in
83
 
            the HTML title element text.
84
82
        styles (write)
85
83
            List of strings. Write a list of URLs to CSS files here, and they
86
84
            will be incorporated as <link rel="stylesheet" type="text/css">
99
97
            in the head, if write_html_head_foot is True.
100
98
            This is the propper way to specify functions that need to run at 
101
99
            page load time.
102
 
        write_html_head_foot (write)
103
 
            Boolean. If True, dispatch assumes that this is an XHTML page, and
104
 
            will immediately write a full HTML head, open the body element,
105
 
            and write heading contents to the page, before any bytes are
106
 
            written. It will then write footer contents and close the body and
107
 
            html elements at the end of execution.  
108
 
 
109
 
            This value should be set to true by all applications for all HTML
110
 
            output (unless there is a good reason, eg. exec). The
111
 
            applications should therefore output HTML content assuming that
112
 
            it will be written inside the body tag. Do not write opening or
113
 
            closing <html> or <body> tags.
114
100
    """
115
101
 
116
102
    # Special code for an OK response.
169
155
    HTTP_INSUFFICIENT_STORAGE         = 507
170
156
    HTTP_NOT_EXTENDED                 = 510
171
157
 
172
 
    def __init__(self, req, write_html_head):
173
 
        """Builds an IVLE request object from a mod_python request object.
174
 
        This results in an object with all of the necessary methods and
175
 
        additional fields.
 
158
    def __init__(self, req, config):
 
159
        """Create an IVLE request from a mod_python one.
176
160
 
177
 
        req: A mod_python request object.
178
 
        write_html_head: Function which is called when writing the automatic
179
 
            HTML header. Accepts a single argument, the IVLE request object.
 
161
        @param req: A mod_python request.
 
162
        @param config: An IVLE configuration.
180
163
        """
181
164
 
182
165
        # Methods are mostly wrappers around the Apache request object
183
166
        self.apache_req = req
184
 
        self.func_write_html_head = write_html_head
 
167
        self.config = config
185
168
        self.headers_written = False
186
169
 
187
170
        # Determine if the browser used the public host name to make the
188
171
        # request (in which case we are in "public mode")
189
 
        if req.hostname == ivle.conf.public_host:
 
172
        if req.hostname == config['urls']['public_host']:
190
173
            self.publicmode = True
191
174
        else:
192
175
            self.publicmode = False
196
179
        self.uri = req.uri
197
180
        # Split the given path into the app (top-level dir) and sub-path
198
181
        # (after first stripping away the root directory)
199
 
        path = ivle.util.unmake_path(req.uri)
 
182
        path = self.unmake_path(req.uri)
200
183
        (self.app, self.path) = (ivle.util.split_path(path))
201
184
        self.user = None
202
185
        self.hostname = req.hostname
205
188
 
206
189
        # Open a database connection and transaction, keep it around for users
207
190
        # of the Request object to use
208
 
        self.store = ivle.database.get_store()
 
191
        self.store = ivle.database.get_store(config)
209
192
 
210
193
        # Default values for the output members
211
194
        self.status = Request.HTTP_OK
212
195
        self.content_type = None        # Use Apache's default
213
196
        self.location = None
214
 
        self.title = None     # Will be set by dispatch before passing to app
215
197
        self.styles = []
216
198
        self.scripts = []
217
199
        self.scripts_init = []
218
 
        self.write_html_head_foot = False
219
200
        # In some cases we don't want the template JS (such as the username
220
201
        # and public FQDN) in the output HTML. In that case, set this to 0.
221
202
        self.write_javascript_settings = True
229
210
        """Writes out the HTTP and HTML headers before any real data is
230
211
        written."""
231
212
        self.headers_written = True
232
 
        
233
 
        # app is the App object for the chosen app
234
 
        try:
235
 
            app = ivle.conf.apps.app_url[self.app]
236
 
        except KeyError:
237
 
            app = None
238
213
 
239
214
        # Prepare the HTTP and HTML headers before the first write is made
240
215
        if self.content_type != None:
242
217
        self.apache_req.status = self.status
243
218
        if self.location != None:
244
219
            self.apache_req.headers_out['Location'] = self.location
245
 
        if self.write_html_head_foot:
246
 
            # Write the HTML header, pass "self" (request object)
247
 
            self.func_write_html_head(self)
248
220
 
249
221
    def ensure_headers_written(self):
250
222
        """Writes out the HTTP and HTML headers if they haven't already been
277
249
            all_cookies = mod_python.Cookie.get_cookies(self)
278
250
 
279
251
            # Create cookies for plugins that might request them.
280
 
            for plugin in self.plugin_index[CookiePlugin]:
 
252
            for plugin in self.config.plugin_index[CookiePlugin]:
281
253
                for cookie in plugin.cookies:
282
254
                    self.add_cookie(mod_python.Cookie.Cookie(cookie, '',
283
255
                                                    expires=1, path='/'))
284
 
        self.throw_redirect(ivle.util.make_path('')) 
 
256
        self.throw_redirect(self.make_path(''))
285
257
 
286
258
 
287
259
    def flush(self):
302
274
        else:
303
275
            return self.apache_req.read(len)
304
276
 
305
 
    def throw_error(self, httpcode, message=None):
306
 
        """Writes out an HTTP error of the specified code. Raises an exception
307
 
        which is caught by the dispatch or web server, so any code following
308
 
        this call will not be executed.
309
 
 
310
 
        httpcode: An HTTP response status code. Pass a constant from the
311
 
        Request class.
312
 
        """
313
 
        raise ivle.util.IVLEError(httpcode, message)
314
 
 
315
277
    def throw_redirect(self, location):
316
278
        """Writes out an HTTP redirect to the specified URL. Raises an
317
279
        exception which is caught by the dispatch or web server, so any
331
293
        else:
332
294
            mod_python.Cookie.add_cookie(self.apache_req, cookie, value, **attributes)
333
295
 
 
296
    def make_path(self, path):
 
297
        """Prepend the IVLE URL prefix to the given path.
 
298
 
 
299
        This is used when generating URLs to send to the client.
 
300
 
 
301
        This method is DEPRECATED. We no longer support use of a prefix.
 
302
        """
 
303
        return os.path.join(self.config['urls']['root'], path)
 
304
 
 
305
    def unmake_path(self, path):
 
306
        """Strip the IVLE URL prefix from the given path, if present.
 
307
 
 
308
        Also normalises the path.
 
309
 
 
310
        This method is DEPRECATED. We no longer support use of a prefix.
 
311
        """
 
312
        path = os.path.normpath(path)
 
313
        root = os.path.normpath(self.config['urls']['root'])
 
314
 
 
315
        if path.startswith(root):
 
316
            path = path[len(root):]
 
317
            # Take out the slash as well
 
318
            if len(path) > 0 and path[0] == os.sep:
 
319
                path = path[1:]
 
320
 
 
321
        return path
 
322
 
334
323
    def get_session(self):
335
324
        """Returns a mod_python Session object for this request.
336
325
        Note that this is dependent on mod_python and may need to change
337
 
        interface if porting away from mod_python."""
 
326
        interface if porting away from mod_python.
 
327
 
 
328
        IMPORTANT: Call unlock() on the session as soon as you are done with
 
329
                   it! If you don't, all other requests will block!
 
330
        """
338
331
        # Cache the session object and set the timeout to 24 hours.
339
332
        if not hasattr(self, 'session'):
340
333
            self.session = mod_python.Session.FileSession(self.apache_req,