From 088c4da660ff7eb381a7ed31083ac20dad335e62 Mon Sep 17 00:00:00 2001 From: Manuel Guesdon Date: Mon, 24 Nov 2003 09:57:33 +0000 Subject: [PATCH] o added git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gsweb/trunk@18148 72102866-910b-0410-8b05-ffd578937521 --- .../GSWStaticResourceRequestHandler.h | 54 +++++++ .../GSWStaticResourceRequestHandler.m | 143 ++++++++++++++++++ 2 files changed, 197 insertions(+) create mode 100644 GSWeb.framework/GSWStaticResourceRequestHandler.h create mode 100644 GSWeb.framework/GSWStaticResourceRequestHandler.m diff --git a/GSWeb.framework/GSWStaticResourceRequestHandler.h b/GSWeb.framework/GSWStaticResourceRequestHandler.h new file mode 100644 index 0000000..b35fc35 --- /dev/null +++ b/GSWeb.framework/GSWStaticResourceRequestHandler.h @@ -0,0 +1,54 @@ +/** GSWStaticResourceRequestHandler.h - GSWeb: Class GSWStaticResourceRequestHandler + + Copyright (C) 2003 Free Software Foundation, Inc. + + Written by: Manuel Guesdon + Date: Jul 2003 + + $Revision$ + $Date$ + + This file is part of the GNUstep Web Library. + + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +**/ + +// $Id$ + +#ifndef _GSWStaticResourceRequestHandler_h__ + #define _GSWStaticResourceRequestHandler_h__ + + +@interface GSWStaticResourceRequestHandler: GSWRequestHandler +{ + NSString* _documentRoot; +}; + +-(GSWResponse*)handleRequest:(GSWRequest*)aRequest; +-(NSString*)_documentRoot; +-(GSWResponse*)_generateResponseForFileHandle:(NSFileHandle*)fileHandle + length:(unsigned long)length + contentType:(NSString*)contentType; + +@end + +//==================================================================== +@interface GSWStaticResourceRequestHandler (GSWRequestHandlerClassAA) ++(id)handler; +@end + +#endif //GSWStaticResourceRequestHandler diff --git a/GSWeb.framework/GSWStaticResourceRequestHandler.m b/GSWeb.framework/GSWStaticResourceRequestHandler.m new file mode 100644 index 0000000..a1ce531 --- /dev/null +++ b/GSWeb.framework/GSWStaticResourceRequestHandler.m @@ -0,0 +1,143 @@ +/** GSWStaticResourceRequestHandler.m - GSWeb: Class GSWStaticResourceRequestHandler + + Copyright (C) 2003 Free Software Foundation, Inc. + + Written by: Manuel Guesdon + Date: Jul 2003 + + $Revision$ + $Date$ + $Id$ + + This file is part of the GNUstep Web Library. + + + This library is free software; you can redistribute it and/or + modify it under the terms of the GNU Library General Public + License as published by the Free Software Foundation; either + version 2 of the License, or (at your option) any later version. + + This library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Library General Public License for more details. + + You should have received a copy of the GNU Library General Public + License along with this library; if not, write to the Free + Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. + +**/ + +#include "config.h" + +RCS_ID("$Id$") + +#include "GSWeb.h" + +//==================================================================== +@implementation GSWStaticResourceRequestHandler + +-(void)dealloc +{ + DESTROY(_documentRoot); + [super dealloc]; +}; + +//-------------------------------------------------------------------- +-(GSWResponse*)handleRequest:(GSWRequest*)aRequest +{ + GSWResponse* response=nil; + NSString* uri=nil; + NSFileHandle* resourceFileHandle = nil; + unsigned long resourceLength=0; + NSString* contentType = nil; + uri = [aRequest uri]; + if ([uri hasPrefix:@"/"]) + { + NSMutableString* resourcePath=nil; + GSWResourceManager* rmanager = [[GSWApplication application] resourceManager]; + NSString* documentRoot = [self _documentRoot]; + [resourcePath appendString:documentRoot]; + [resourcePath appendString:uri]; + NS_DURING + { + NSDictionary* fileAttributes=[[NSFileManager defaultManager]fileAttributesAtPath:resourcePath + traverseLink:YES]; + resourceLength=(unsigned long)[fileAttributes fileSize]; + + resourceFileHandle=[NSFileHandle fileHandleForReadingAtPath:resourcePath]; + contentType = [rmanager contentTypeForResourcePath:resourcePath]; + } + NS_HANDLER + { + localException=ExceptionByAddingUserInfoObjectFrameInfo0(localException, + @"globalLock tmplockBeforeDate"); + LOGException(@"%@ (%@)",localException,[localException reason]); + [localException raise]; + } + NS_ENDHANDLER; + } + response = [self _generateResponseForFileHandle:resourceFileHandle + length:resourceLength + contentType:contentType]; + [[NSNotificationCenter defaultCenter]postNotificationName:@"DidHandleRequestNotification" + object:response]; + [response _finalizeInContext:nil]; + return response; +}; + +-(GSWResponse*)_generateResponseForFileHandle:(NSFileHandle*)fileHandle + length:(unsigned long)length + contentType:(NSString*)contentType +{ + GSWResponse* response = [[GSWApplication application]createResponseInContext:nil]; + if (fileHandle) + { + if(length>0) + [response setContentStreamFileHandle:fileHandle + bufferSize:4096 + length:length]; + } + else + { + // Not found ==> 404 + [response setStatus:404]; + } + if (contentType) + [response setHeader:contentType + forKey:GSWHTTPHeader_ContentType]; + + [response setHeader:[NSString stringWithFormat:@"%lu",(unsigned long)length] + forKey:GSWHTTPHeader_ContentLength]; + return response; +} + +-(NSString*)_documentRoot +{ + if (!_documentRoot) + { + NSString* configFilePath=[[[GSWApplication application] resourceManager] + pathForResourceNamed:@"WebServerConfig.plist" + inFramework:nil]; + if (configFilePath) + { + NSDictionary* config=[NSDictionary dictionaryWithContentsOfFile:configFilePath]; + ASSIGN(_documentRoot,[config objectForKey:@"DocumentRoot"]); + }; + }; + return _documentRoot; +} + + +@end + +//==================================================================== +@implementation GSWStaticResourceRequestHandler (GSWRequestHandlerClassA) + +//-------------------------------------------------------------------- ++(id)handler +{ + return [[GSWStaticResourceRequestHandler new] autorelease]; +}; + +@end