Index: twisted/web/http.py
===================================================================
--- twisted/web/http.py	(revision 27546)
+++ twisted/web/http.py	(working copy)
@@ -535,7 +535,7 @@
     sentLength = 0 # content-length of response, or total bytes sent via chunking
     etag = None
     lastModified = None
-    args = None
+    _args = None
     path = None
     content = None
     _forceSSL = 0
@@ -693,26 +693,36 @@
         @param version: The HTTP version of this request.
         """
         self.content.seek(0,0)
-        self.args = {}
         self.stack = []
 
         self.method, self.uri = command, path
         self.clientproto = version
         x = self.uri.split('?', 1)
-
         if len(x) == 1:
             self.path = self.uri
         else:
             self.path, argstring = x
-            self.args = parse_qs(argstring, 1)
 
         # cache the client and server information, we'll need this later to be
         # serialized and sent with the request so CGIs will work remotely
         self.client = self.channel.transport.getPeer()
         self.host = self.channel.transport.getHost()
+        
+        self.process()
 
+    @property
+    def args(self):
+        if(self._args is not None):
+            return self._args
+        
+        x = self.uri.split('?', 1)
+        if len(x) != 1:
+            self._args = parse_qs(x[1], 1)
+        
         # Argument processing
-        args = self.args
+        if(self._args is None):
+            self._args = {}
+        args = self._args
         ctype = self.requestHeaders.getRawHeaders('content-type')
         if ctype is not None:
             ctype = ctype[0]
@@ -737,10 +747,9 @@
                         return
                     raise
             self.content.seek(0, 0)
-
-        self.process()
-
-
+        
+        return self._args
+    
     def __repr__(self):
         return '<%s %s %s>'% (self.method, self.uri, self.clientproto)
 
Index: twisted/web/test/test_web.py
===================================================================
--- twisted/web/test/test_web.py	(revision 27546)
+++ twisted/web/test/test_web.py	(working copy)
@@ -20,7 +20,7 @@
 from twisted.python import log
 
 
-class DummyRequest:
+class DummyRequest(http.Request):
     """
     Represents a dummy or fake request.
 
@@ -64,7 +64,7 @@
         self.prepath = []
         self.session = None
         self.protoSession = session or server.Session(0, self)
-        self.args = {}
+        self._args = None
         self.outgoingHeaders = {}
         self.responseHeaders = http_headers.Headers()
         self.responseCode = None
