Changeset 7031 for ceda_http_fileserver


Ignore:
Timestamp:
15/06/10 14:34:23 (9 years ago)
Author:
pjkersha
Message:

Incomplete - task 9: Data Browser Replacement

  • Major fix for handling environSCRIPT_NAME?
  • removed reconstruct_url function - not needed.
Location:
ceda_http_fileserver/trunk/ceda_http_fileserver
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • ceda_http_fileserver/trunk/ceda_http_fileserver/ceda/server/wsgi/fileserver/app.py

    r7024 r7031  
    3333 
    3434log = logging.getLogger(__name__) 
    35  
    36  
    37 def reconstruct_url(environ): 
    38     """Make URL from environ keys""" 
    39     # From WSGI spec, PEP 333 
    40     url = environ['wsgi.url_scheme']+'://' 
    41     if environ.get('HTTP_HOST'):  
    42         url += environ['HTTP_HOST'] 
    43     else: 
    44         url += environ['SERVER_NAME'] 
    45         if environ['wsgi.url_scheme'] == 'https': 
    46             if environ['SERVER_PORT'] != '443': 
    47                 url += ':' + environ['SERVER_PORT'] 
    48         else: 
    49             if environ['SERVER_PORT'] != '80': 
    50                 url += ':' + environ['SERVER_PORT'] 
    51                 
    52     url += urllib.quote(environ.get('SCRIPT_NAME','')) 
    53      
    54     pathInfo = environ.get('PATH_INFO','') 
    55     url += urllib.quote(pathInfo).replace(url.replace(':', '%3A'), '') 
    56      
    57     if environ.get('QUERY_STRING'): 
    58         url += '?' + environ['QUERY_STRING'] 
    59     environ['reconstructed_url'] = url 
    60      
    61     return url 
    6235     
    6336     
     
    11083    DEFAULT_WRITE_BLK_SIZE = 1024 
    11184    DEFAULT_CONTENT_TYPE = 'text/plain; charset=utf-8' 
    112     DEFAULT_MOUNT_POINT = '/' 
     85    DEFAULT_MOUNT_POINT = '' 
    11386     
    11487    statusCode2Msg = staticmethod(_statusCode2Msg) 
     
    301274     
    302275    def handler(self, environ, start_response): 
    303         """Application to serve out windmill provided""" 
    304         url = urlparse(reconstruct_url(environ)) 
    305          
    306         if self.mountPoint is not None: 
    307             #split_url = url.path.split(self.mountPoint, 1) 
    308             split_url = url[2].split(self.mountPoint, 1) 
    309              
    310             if len(split_url) < 2: 
    311                 log.error('Error splitting URI %r with mount point %r: ' 
    312                           'returning 404 Not Found response', 
    313                           url, self.mountPoint) 
    314                  
    315                 status = FileServerApp.statusCode2Msg(httplib.NOT_FOUND) 
    316                 response = status 
    317                 start_response(status, 
    318                                [('Content-length', str(len(response))), 
    319                                 ('Content-type', 'text/plain')]) 
    320                 return [response] 
    321                  
    322             relativeURI = split_url[1] 
     276        """Translate URI path to local file system path and map correct  
     277        callback from the HTTP request method 
     278        """ 
     279        if self.mountPoint: 
     280            splitPath = environ['PATH_INFO'].split(self.mountPoint, 1) 
     281            if len(splitPath) < 2: 
     282                log.error('Error splitting environ["PATH_INFO"]=%r with mount ' 
     283                          'point %r: returning 404 Not Found response', 
     284                          environ['PATH_INFO'], self.mountPoint) 
     285              
     286            relativeURI = splitPath[1] 
    323287        else: 
    324             relativeURI = url[2] 
    325          
     288            relativeURI = environ['PATH_INFO'] 
     289             
    326290        fileSysSubDir = urllib.url2pathname(relativeURI) 
    327291         
     
    366330                           [('Content-Type', 'text/plain'), 
    367331                            ('Content-length', str(len(response)))]) 
     332            return [response] 
     333         
     334        elif not os.path.exists(filePath): 
     335            response = status = FileServerApp.statusCode2Msg(httplib.NOT_FOUND) 
     336            log.error('Requesting URI path %r, corresponding file path %r ' 
     337                      'doesn\'t exist: returning %s response', 
     338                      environ['PATH_INFO'], 
     339                      filePath, 
     340                      status) 
     341            start_response(status,  
     342                           [('Content-Type', 'text/plain'), 
     343                            ('Content-Length', str(len(response)))]) 
     344             
    368345            return [response] 
    369346             
     
    387364                        '<br>'.join(lines)) 
    388365     
    389             start_response('200 OK',  
     366            start_response(FileServerApp.statusCode2Msg(httplib.OK),  
    390367                           [('Cache-Control','no-cache'),  
    391368                            ('Pragma','no-cache'), 
  • ceda_http_fileserver/trunk/ceda_http_fileserver/ceda/server/wsgi/fileserver/test/test_fileserver.py

    r7028 r7031  
    179179        # Test with alternative mount point to the default '/' 
    180180        self.fileServerApp.mountPoint = '/file-server' 
    181         requestPath = '/file-server'+ self.__class__.HTDOCS_SUBDIR3_URIPATH 
     181        requestPath = '/file-server' + self.__class__.HTDOCS_SUBDIR3_URIPATH 
    182182         
    183183        response = self.app.get(requestPath, status=httplib.OK) 
    184184        print(response.body) 
    185185        self.assert_(self.__class__.PDF_FILENAME in response.body) 
     186         
     187    def test13WithEnvironScriptName(self): 
     188        # Test with the application mounted at environ['SCRIPT_NAME'] 
     189        extra_environ = {'SCRIPT_NAME': '/myfileserver'} 
     190        requestPath = '/myfileserver' + self.__class__.HTDOCS_SUBDIR3_URIPATH 
     191         
     192        app = paste.fixture.TestApp(self.fileServerApp, 
     193                                    extra_environ=extra_environ) 
     194         
     195        response = app.get(requestPath, 
     196           extra_environ = {'PATH_INFO': self.__class__.HTDOCS_SUBDIR3_URIPATH}, 
     197           status=httplib.OK) 
     198        print(response.body) 
     199        self.assert_(self.__class__.PDF_FILENAME in response.body) 
     200         
    186201                
    187202         
  • ceda_http_fileserver/trunk/ceda_http_fileserver/setup.py

    r7030 r7031  
    2020setup( 
    2121    name =              'ceda_http_file_server', 
    22     version =           '0.1.0', 
     22    version =           '0.2.0', 
    2323    description =       'CEDA HTTP File Server WSGI Application', 
    2424    long_description =  '''\ 
Note: See TracChangeset for help on using the changeset viewer.