From 2bb828acb76a5d6cdeb8dd1cfa17bd133ea4411c Mon Sep 17 00:00:00 2001 From: David Wetzel Date: Sun, 19 Nov 2017 13:45:05 -0500 Subject: [PATCH] * GSWeb/GSWAjaxRequestHandler.* new files * GSWeb/GNUmakefile add GSWAjaxRequestHandler.*, WOAjaxRequestHandler.h * GSWeb/GSWApplication+Defaults.* add AjaxRequestHanderKey * GSWeb/GSWApplication.h add +ajaxRequestHandlerKey add +setAjaxRequestHandlerKey: * GSWeb/GSWApplication.m create ajax request handler in registerRequestHandlers * GSWeb/GSWComponentRequestHandler.m return current class instance in +handler (works in subclasses too..) * GSWConstants.* added ajax * GSWContext.* added +shouldNotStorePageInBacktrackCache * GSWeb/GSWMessage.* added storePageInBacktrackCache * GSWeb/GSWRequest.* added -isAjaxSubmit, ajaxFormSubmitKey * GSWeb/GSWSession.m * GSWeb/GSWeb.h * GSWeb/GSWWOCompatibility.h ajax adjustments --- ChangeLog | 27 +++++ GSWeb/GNUmakefile | 3 + GSWeb/GSWApplication+Defaults.m | 27 ++++- GSWeb/GSWApplication.h | 2 + GSWeb/GSWApplication.m | 157 +++++++++++++++-------------- GSWeb/GSWComponentRequestHandler.m | 2 +- GSWeb/GSWConstants.h | 4 + GSWeb/GSWConstants.m | 4 + GSWeb/GSWContext.h | 2 + GSWeb/GSWContext.m | 15 +++ GSWeb/GSWMessage.h | 31 +++--- GSWeb/GSWMessage.m | 11 ++ GSWeb/GSWRequest.h | 44 ++++---- GSWeb/GSWRequest.m | 26 ++++- GSWeb/GSWSession.m | 15 +++ GSWeb/GSWWOCompatibility.h | 1 + GSWeb/GSWeb.h | 2 + 17 files changed, 260 insertions(+), 113 deletions(-) diff --git a/ChangeLog b/ChangeLog index 0c89ef1..8fb958c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,30 @@ +2017-11-19 David Wetzel + * GSWeb/GSWAjaxRequestHandler.* + new files + * GSWeb/GNUmakefile + add GSWAjaxRequestHandler.*, WOAjaxRequestHandler.h + * GSWeb/GSWApplication+Defaults.* + add AjaxRequestHanderKey + * GSWeb/GSWApplication.h + add +ajaxRequestHandlerKey + add +setAjaxRequestHandlerKey: + * GSWeb/GSWApplication.m + create ajax request handler in registerRequestHandlers + * GSWeb/GSWComponentRequestHandler.m + return current class instance in +handler (works in subclasses too..) + * GSWConstants.* + added ajax + * GSWContext.* + added +shouldNotStorePageInBacktrackCache + * GSWeb/GSWMessage.* + added storePageInBacktrackCache + * GSWeb/GSWRequest.* + added -isAjaxSubmit, ajaxFormSubmitKey + * GSWeb/GSWSession.m + * GSWeb/GSWeb.h + * GSWeb/GSWWOCompatibility.h + ajax adjustments + 2017-11-16 David Wetzel * GSWExtensions/GSWSessionRestorationErrorPage.gswc/GSWSessionRestorationErrorPage.html * GSWExtensions/GSWExceptionPage.gswc/GSWExceptionPage.html diff --git a/GSWeb/GNUmakefile b/GSWeb/GNUmakefile index 861fe28..94214b1 100644 --- a/GSWeb/GNUmakefile +++ b/GSWeb/GNUmakefile @@ -122,6 +122,7 @@ GSWDefaultAdaptor.m \ GSWUtils.m \ GSWClientSideScript.m \ GSWActiveImage.m \ +GSWAjaxRequestHandler.m \ GSWBody.m \ GSWTextField.m \ GSWForm.m \ @@ -213,6 +214,7 @@ GSWeb_HEADER_FILES = \ GSWeb.h \ GSWActiveImage.h \ GSWAdaptor.h \ +GSWAjaxRequestHandler.h \ GSWApplet.h \ GSWApplication.h \ GSWAssociation.h \ @@ -350,6 +352,7 @@ WO_HEADER_FILES = \ WOMailDelivery.h \ WORequest.h \ WORequestHandler.h \ + WOAjaxRequestHandler.h \ WOResourceManager.h \ WOResponse.h \ WOSession.h \ diff --git a/GSWeb/GSWApplication+Defaults.m b/GSWeb/GSWApplication+Defaults.m index 534d7d9..0e65308 100644 --- a/GSWeb/GSWApplication+Defaults.m +++ b/GSWeb/GSWApplication+Defaults.m @@ -261,6 +261,10 @@ GSWeb_InitializeGlobalAppDefaultOptions(void) LOGOPT_NC(GSWOPTValue_DirectActionRequestHandlerKey); LOGOPT_NC(GSWOPT_DirectActionRequestHandlerKey); + // ajax + LOGOPT_NC(GSWOPTValue_AjaxRequestHanderKey); + LOGOPT_NC(GSWOPT_AjaxRequestHandlerKey); + LOGOPT_NC(GSWOPTValue_PingActionRequestHandlerKey); LOGOPT_NC(GSWOPT_PingActionRequestHandlerKey); @@ -386,7 +390,10 @@ GSWeb_InitializeGlobalAppDefaultOptions(void) GSWOPTValue_DirectActionRequestHandlerKey[GSWebNamingConv], GSWOPT_DirectActionRequestHandlerKey[GSWebNamingConv], - + + GSWOPTValue_AjaxRequestHanderKey[GSWebNamingConv], + GSWOPT_AjaxRequestHandlerKey[GSWebNamingConv], + GSWOPTValue_StreamActionRequestHandlerKey[GSWebNamingConv], GSWOPT_StreamActionRequestHandlerKey[GSWebNamingConv], @@ -1082,13 +1089,29 @@ static NSString *_dflt_directActionRequestHandlerKey; GSWOPT_DirectActionRequestHandlerKey[GSWebNamingConv]); return _dflt_directActionRequestHandlerKey; }; - //-------------------------------------------------------------------- +(void)setDirectActionRequestHandlerKey:(NSString*)aKey { ASSIGNCOPY(_dflt_directActionRequestHandlerKey, aKey); _dflt_init_directActionRequestHandlerKey = YES; }; +//-------------------------------------------------------------------- + +static BOOL _dflt_init_ajaxRequestHandlerKey = NO; +static NSString *_dflt_ajaxRequestHandlerKey; ++(NSString*)ajaxRequestHandlerKey +{ + INIT_DFLT_OBJ(ajaxRequestHandlerKey, + GSWOPT_AjaxRequestHandlerKey[GSWebNamingConv]); + return _dflt_ajaxRequestHandlerKey; +}; + ++(void)setAjaxRequestHandlerKey:(NSString*)aKey +{ + ASSIGNCOPY(_dflt_ajaxRequestHandlerKey, aKey); + _dflt_init_ajaxRequestHandlerKey = YES; +}; + //-------------------------------------------------------------------- static BOOL _dflt_init_resourceRequestHandlerKey = NO; diff --git a/GSWeb/GSWApplication.h b/GSWeb/GSWApplication.h index ba7b015..2db7a99 100644 --- a/GSWeb/GSWApplication.h +++ b/GSWeb/GSWApplication.h @@ -615,6 +615,8 @@ GSWEB_EXPORT GSWApplication* GSWApp; +(void)setComponentRequestHandlerKey:(NSString*)aKey; +(NSString*)directActionRequestHandlerKey; +(void)setDirectActionRequestHandlerKey:(NSString*)aKey; ++(NSString*)ajaxRequestHandlerKey; ++(void)setAjaxRequestHandlerKey:(NSString*)aKey; +(NSString*)resourceRequestHandlerKey; +(void)setResourceRequestHandlerKey:(NSString*)aKey; +(NSString*)statisticsStoreClassName; diff --git a/GSWeb/GSWApplication.m b/GSWeb/GSWApplication.m index 5dd4b5b..1034068 100644 --- a/GSWeb/GSWApplication.m +++ b/GSWeb/GSWApplication.m @@ -583,91 +583,100 @@ int GSWApplicationMain(NSString* applicationClassName, //-------------------------------------------------------------------- -(void)registerRequestHandlers { - //OK - NSString* componentRequestHandlerKey=nil; - NSString* resourceRequestHandlerKey=nil; - NSString* directActionRequestHandlerKey=nil; - NSString* pingDirectActionRequestHandlerKey=nil; - NSString* streamDirectActionRequestHandlerKey=nil; + //OK + NSString* componentRequestHandlerKey=nil; + NSString* resourceRequestHandlerKey=nil; + NSString* directActionRequestHandlerKey=nil; + NSString* pingDirectActionRequestHandlerKey=nil; + NSString* streamDirectActionRequestHandlerKey=nil; + NSString* ajaxRequestHandlerKey=nil; - GSWRequestHandler* componentRequestHandler=nil; - GSWResourceRequestHandler* resourceRequestHandler=nil; - GSWDirectActionRequestHandler* directActionRequestHandler=nil; - GSWDirectActionRequestHandler* pingDirectActionRequestHandler=nil; - GSWDirectActionRequestHandler* streamDirectActionRequestHandler=nil; - GSWRequestHandler* defaultRequestHandler=nil; - - Class defaultRequestHandlerClass=nil; - - - - // Component Handler - componentRequestHandler=[[self class] _componentRequestHandler]; - componentRequestHandlerKey=[[self class] componentRequestHandlerKey]; - - - // Resource Handler - resourceRequestHandler=(GSWResourceRequestHandler*) + GSWRequestHandler* componentRequestHandler=nil; + GSWResourceRequestHandler* resourceRequestHandler=nil; + GSWDirectActionRequestHandler* directActionRequestHandler=nil; + GSWDirectActionRequestHandler* pingDirectActionRequestHandler=nil; + GSWDirectActionRequestHandler* streamDirectActionRequestHandler=nil; + GSWAjaxRequestHandler* ajaxRequestHander=nil; + GSWRequestHandler* defaultRequestHandler=nil; + + Class defaultRequestHandlerClass=nil; + + + + // Component Handler + componentRequestHandler=[[self class] _componentRequestHandler]; + componentRequestHandlerKey=[[self class] componentRequestHandlerKey]; + + + // Resource Handler + resourceRequestHandler=(GSWResourceRequestHandler*) [GSWResourceRequestHandler handler]; - - resourceRequestHandlerKey=[[self class] resourceRequestHandlerKey]; - - - // DirectAction Handler - directActionRequestHandler=(GSWDirectActionRequestHandler*) + + resourceRequestHandlerKey=[[self class] resourceRequestHandlerKey]; + + + // DirectAction Handler + directActionRequestHandler=(GSWDirectActionRequestHandler*) [GSWDirectActionRequestHandler handler]; - - directActionRequestHandlerKey=[[self class] directActionRequestHandlerKey]; - - - // "Ping" Handler - pingDirectActionRequestHandler=(GSWDirectActionRequestHandler*) + + directActionRequestHandlerKey=[[self class] directActionRequestHandlerKey]; + + + // "Ping" Handler + pingDirectActionRequestHandler=(GSWDirectActionRequestHandler*) [GSWDirectActionRequestHandler handlerWithDefaultActionClassName:@"GSWAdminAction" - defaultActionName:@"ping" - shouldAddToStatistics:NO]; - pingDirectActionRequestHandlerKey=[[self class] pingActionRequestHandlerKey]; - - - // Stream Handler - streamDirectActionRequestHandler=(GSWDirectActionRequestHandler*) + defaultActionName:@"ping" + shouldAddToStatistics:NO]; + pingDirectActionRequestHandlerKey=[[self class] pingActionRequestHandlerKey]; + + + // Stream Handler + streamDirectActionRequestHandler=(GSWDirectActionRequestHandler*) [GSWDirectActionRequestHandler handler]; + + streamDirectActionRequestHandlerKey=[[self class] streamActionRequestHandlerKey]; + [streamDirectActionRequestHandler setAllowsContentInputStream:YES]; + + // Ajax + + ajaxRequestHandlerKey = [[self class] ajaxRequestHandlerKey]; + ajaxRequestHander = [GSWAjaxRequestHandler handler]; + + [self registerRequestHandler:componentRequestHandler + forKey:componentRequestHandlerKey]; + [self registerRequestHandler:resourceRequestHandler + forKey:resourceRequestHandlerKey]; + [self registerRequestHandler:directActionRequestHandler + forKey:directActionRequestHandlerKey]; + [self registerRequestHandler:directActionRequestHandler + forKey:GSWDirectActionRequestHandlerKey[GSWebNamingConvInversed]]; + [self registerRequestHandler:pingDirectActionRequestHandler + forKey:pingDirectActionRequestHandlerKey]; + [self registerRequestHandler:streamDirectActionRequestHandler + forKey:streamDirectActionRequestHandlerKey]; + + [self registerRequestHandler:ajaxRequestHander + forKey:ajaxRequestHandlerKey]; - streamDirectActionRequestHandlerKey=[[self class] streamActionRequestHandlerKey]; - [streamDirectActionRequestHandler setAllowsContentInputStream:YES]; - - - [self registerRequestHandler:componentRequestHandler - forKey:componentRequestHandlerKey]; - [self registerRequestHandler:resourceRequestHandler - forKey:resourceRequestHandlerKey]; - [self registerRequestHandler:directActionRequestHandler - forKey:directActionRequestHandlerKey]; - [self registerRequestHandler:directActionRequestHandler - forKey:GSWDirectActionRequestHandlerKey[GSWebNamingConvInversed]]; - [self registerRequestHandler:pingDirectActionRequestHandler - forKey:pingDirectActionRequestHandlerKey]; - [self registerRequestHandler:streamDirectActionRequestHandler - forKey:streamDirectActionRequestHandlerKey]; - - // Default Request Handler - defaultRequestHandlerClass=[self defaultRequestHandlerClass]; - if (defaultRequestHandlerClass) + // Default Request Handler + defaultRequestHandlerClass=[self defaultRequestHandlerClass]; + if (defaultRequestHandlerClass) defaultRequestHandler=(GSWRequestHandler*)[defaultRequestHandlerClass handler]; - else + else defaultRequestHandler=componentRequestHandler; - [self setDefaultRequestHandler:defaultRequestHandler]; - - - // If direct connect enabled, add static resources handler - if ([[self class] isDirectConnectEnabled]) + [self setDefaultRequestHandler:defaultRequestHandler]; + + + // If direct connect enabled, add static resources handler + if ([[self class] isDirectConnectEnabled]) { - GSWStaticResourceRequestHandler* staticResourceRequestHandler = (GSWStaticResourceRequestHandler*) + GSWStaticResourceRequestHandler* staticResourceRequestHandler = (GSWStaticResourceRequestHandler*) [GSWStaticResourceRequestHandler handler]; - NSString* staticResourceRequestHandlerKey=[[self class] staticResourceRequestHandlerKey]; - [self registerRequestHandler:staticResourceRequestHandler - forKey:staticResourceRequestHandlerKey]; + NSString* staticResourceRequestHandlerKey=[[self class] staticResourceRequestHandlerKey]; + [self registerRequestHandler:staticResourceRequestHandler + forKey:staticResourceRequestHandlerKey]; }; - + }; diff --git a/GSWeb/GSWComponentRequestHandler.m b/GSWeb/GSWComponentRequestHandler.m index 0458043..b7af4ff 100644 --- a/GSWeb/GSWComponentRequestHandler.m +++ b/GSWeb/GSWComponentRequestHandler.m @@ -438,7 +438,7 @@ GSWResponse * _dispatchWithPreparedApplication(GSWApplication *app, GSWContext * // used in GSWApplication _componentRequestHandler +(id)handler { - return [[GSWComponentRequestHandler new] autorelease]; + return [[self new] autorelease]; } diff --git a/GSWeb/GSWConstants.h b/GSWeb/GSWConstants.h index 04e4e3d..c40656a 100644 --- a/GSWeb/GSWConstants.h +++ b/GSWeb/GSWConstants.h @@ -60,6 +60,8 @@ GSWEB_EXPORT NSString* GSWScriptPSuffix[2]; GSWEB_EXPORT NSString* GSWResourceRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWComponentRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWDirectActionRequestHandlerKey[2]; +GSWEB_EXPORT NSString* GSWAjaxRequestHandlerKey[2]; + GSWEB_EXPORT NSString* GSWPingActionRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWStaticResourceRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWComponentTemplateSuffix; @@ -207,6 +209,7 @@ GSWEB_EXPORT NSString* GSWOPT_DebuggingEnabled[2]; GSWEB_EXPORT NSString* GSWOPT_StatusDebuggingEnabled[2]; GSWEB_EXPORT NSString* GSWOPT_StatusLoggingEnabled[2]; GSWEB_EXPORT NSString* GSWOPT_DirectActionRequestHandlerKey[2]; +GSWEB_EXPORT NSString* GSWOPT_AjaxRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWOPT_DirectConnectEnabled[2]; GSWEB_EXPORT NSString* GSWOPT_FrameworksBaseURL[2]; GSWEB_EXPORT NSString* GSWOPT_OutputPath[2]; @@ -258,6 +261,7 @@ GSWEB_EXPORT NSString* GSWOPTValue_DefaultTemplateParser_RawHTML; GSWEB_EXPORT NSString* GSWOPTValue_ComponentRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWOPTValue_ResourceRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWOPTValue_DirectActionRequestHandlerKey[2]; +GSWEB_EXPORT NSString* GSWOPTValue_AjaxRequestHanderKey[2]; GSWEB_EXPORT NSString* GSWOPTValue_StreamActionRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWOPTValue_PingActionRequestHandlerKey[2]; GSWEB_EXPORT NSString* GSWOPTValue_StaticResourceRequestHandlerKey[2]; diff --git a/GSWeb/GSWConstants.m b/GSWeb/GSWConstants.m index 5b93cf7..a163fa6 100644 --- a/GSWeb/GSWConstants.m +++ b/GSWeb/GSWConstants.m @@ -57,6 +57,7 @@ NSString* GSWScriptPSuffix[2]={ @".gsws", @".wos" }; NSString* GSWResourceRequestHandlerKey[2]={ @"rr", @"wr" }; NSString* GSWComponentRequestHandlerKey[2]={ @"cr", @"wo" }; NSString* GSWDirectActionRequestHandlerKey[2]={ @"dr", @"wa" }; +NSString* GSWAjaxRequestHandlerKey[2]={ @"ja", @"ja" }; NSString* GSWPingActionRequestHandlerKey[2]={ @"lb", @"wlb" }; NSString* GSWComponentDeclarationsSuffix[2]={ @"gswd", @"wod" }; NSString* GSWComponentDeclarationsPSuffix[2]={ @".gswd", @".wod" }; @@ -202,6 +203,7 @@ NSString* GSWOPT_DebuggingEnabled[2]={ @"GSWDebuggingEnabled", @"WODebuggingEnab NSString* GSWOPT_StatusDebuggingEnabled[2]={ @"GSWStatusDebuggingEnabled", @"WOStatusDebuggingEnabled" };//NDFN NSString* GSWOPT_StatusLoggingEnabled[2]={ @"GSWStatusLoggingEnabled", @"WOStatusLoggingEnabled" };//NDFN NSString* GSWOPT_DirectActionRequestHandlerKey[2]={ @"GSWDirectActionRequestHandlerKey", @"WODirectActionRequestHandlerKey" }; +NSString* GSWOPT_AjaxRequestHandlerKey[2]={ @"AjaxRequestHandlerKey", @"AjaxRequestHandlerKey" }; NSString* GSWOPT_PingActionRequestHandlerKey[2]={ @"GSWPingActionRequestHandlerKey", @"WOPingActionRequestHandlerKey" }; NSString* GSWOPT_StaticResourceRequestHandlerKey[2]={ @"GSWStaticResourceRequestHandlerKey", @"WOStaticResourceRequestHandlerKey" }; NSString* GSWOPT_DirectConnectEnabled[2]={ @"GSWDirectConnectEnabled", @"WODirectConnectEnabled" }; @@ -253,6 +255,8 @@ NSString* GSWOPTValue_DefaultTemplateParser_RawHTML = @"RawHTML"; NSString* GSWOPTValue_ComponentRequestHandlerKey[2]={ @"cr", @"wo" }; NSString* GSWOPTValue_ResourceRequestHandlerKey[2]={ @"rr", @"wr" }; NSString* GSWOPTValue_DirectActionRequestHandlerKey[2]={ @"dr", @"wa" }; +// Ajax +NSString* GSWOPTValue_AjaxRequestHanderKey[2]={ @"ja", @"ja" }; NSString* GSWOPTValue_StreamActionRequestHandlerKey[2]={ @"sr", @"wis" }; NSString* GSWOPTValue_PingActionRequestHandlerKey[2]={ @"lb", @"wlb" }; NSString* GSWOPTValue_StaticResourceRequestHandlerKey[2]={ @"_rr_", @"_wr_" }; diff --git a/GSWeb/GSWContext.h b/GSWeb/GSWContext.h index 4a86fa8..aa1a9a2 100644 --- a/GSWeb/GSWContext.h +++ b/GSWeb/GSWContext.h @@ -177,6 +177,8 @@ GSWEB_EXPORT BOOL GSWContext_isSenderIDSearchOver(GSWContext* aContext); -(NSString*)docStructure; #endif +- (BOOL) shouldNotStorePageInBacktrackCache; + -(GSWDynamicURLString*)directActionURLForActionNamed:(NSString*)actionName urlPrefix:(NSString*)urlPrefix queryDictionary:(NSDictionary*)queryDictionary; diff --git a/GSWeb/GSWContext.m b/GSWeb/GSWContext.m index d621a1e..9f6df28 100644 --- a/GSWeb/GSWContext.m +++ b/GSWeb/GSWContext.m @@ -740,6 +740,21 @@ GSWEB_EXPORT BOOL GSWContext_isSenderIDSearchOver(GSWContext* aContext) } #endif +//-------------------------------------------------------------------- + +- (BOOL) shouldNotStorePageInBacktrackCache +{ + BOOL shouldNot = NO; + + BOOL requestNotStorePageInBacktrackCache = ((_request) && ([_request storePageInBacktrackCache] == NO)); + BOOL responseNotStorePageInBacktrackCache = ((_response) && ([_response storePageInBacktrackCache] == NO)); + BOOL requestIsAjaxSubmit = ((_request) && [_request isAjaxSubmit]); + + shouldNot = (responseNotStorePageInBacktrackCache || requestNotStorePageInBacktrackCache || requestIsAjaxSubmit); + + return shouldNot; +} + //-------------------------------------------------------------------- -(GSWDynamicURLString*)directActionURLForActionNamed:(NSString*)actionName urlPrefix:(NSString*)urlPrefix diff --git a/GSWeb/GSWMessage.h b/GSWeb/GSWMessage.h index 90900d0..72200de 100644 --- a/GSWeb/GSWMessage.h +++ b/GSWeb/GSWMessage.h @@ -84,22 +84,27 @@ GSWEB_EXPORT NSString* GSWMessage_stringByConvertingToHTML(GSWMessage* aMessage, //==================================================================== @interface GSWMessage : NSObject { - NSString* _httpVersion; - NSMutableDictionary* _headers; - NSMutableArray* _cookies; - NSStringEncoding _contentEncoding; - NSDictionary* _userInfo; - NSMutableData* _contentData; - IMP _contentDataADImp; - - NSMutableArray* _cachesStack; // Cache Stacks - NSMutableData* _currentCacheData; // Current Cache Data (last object of _cachesStack). Do not retain/release - IMP _currentCacheDataADImp; - + BOOL _storePageInBacktrackCache; + NSString* _httpVersion; + NSMutableDictionary* _headers; + NSMutableArray* _cookies; + NSStringEncoding _contentEncoding; + NSDictionary* _userInfo; + NSMutableData* _contentData; + IMP _contentDataADImp; + + NSMutableArray* _cachesStack; // Cache Stacks + NSMutableData* _currentCacheData; // Current Cache Data (last object of _cachesStack). Do not retain/release + IMP _currentCacheDataADImp; + @public // For functions - GSWMessageIMPs _selfMsgIMPs; + GSWMessageIMPs _selfMsgIMPs; }; +-(BOOL)storePageInBacktrackCache; + +-(void)setStorePageInBacktrackCache:(BOOL) yn; + -(void)setHTTPVersion:(NSString*)version; -(NSString*)httpVersion; diff --git a/GSWeb/GSWMessage.m b/GSWeb/GSWMessage.m index f522cf8..617a2af 100644 --- a/GSWeb/GSWMessage.m +++ b/GSWeb/GSWMessage.m @@ -455,6 +455,7 @@ static __inline__ NSMutableData *_checkBody(GSWMessage *self) { { GetGSWMessageIMPs(&_selfMsgIMPs,self); ASSIGN(_httpVersion,@"HTTP/1.0"); + _storePageInBacktrackCache = YES; _headers=[NSMutableDictionary new]; _contentEncoding=[[self class] defaultEncoding]; _checkBody(self); @@ -538,6 +539,16 @@ static __inline__ NSMutableData *_checkBody(GSWMessage *self) { return isEqual; } +-(BOOL)storePageInBacktrackCache +{ + return _storePageInBacktrackCache; +} + +-(void)setStorePageInBacktrackCache:(BOOL) yn +{ + _storePageInBacktrackCache = yn; +} + //-------------------------------------------------------------------- // setHTTPVersion: diff --git a/GSWeb/GSWRequest.h b/GSWeb/GSWRequest.h index 426cfbf..03e7c41 100644 --- a/GSWeb/GSWRequest.h +++ b/GSWeb/GSWRequest.h @@ -64,25 +64,25 @@ Cf RFC 2616 (http://www.rfc-editor.org/rfc/rfc2616.txt) @interface GSWRequest : GSWMessage { @private - NSString* _method; - GSWDynamicURLString* _uri; - NSStringEncoding _defaultFormValueEncoding; - NSStringEncoding _formValueEncoding; - NSDictionary* _formValues; - NSDictionary* _uriElements; - NSDictionary* _cookie; - BOOL _finishedParsingMultipartFormData; - NSString* _applicationURLPrefix; - NSArray* _requestHandlerPathArray; - NSArray* _browserLanguages; - NSArray* _browserAcceptedEncodings; - int _requestType; - NSString* _originatingAddress; - uint16_t _originatingPort; - BOOL _isUsingWebServer; - BOOL _formValueEncodingDetectionEnabled; - int _applicationNumber; - GSWContext* _context;//Don't retain/release because request is retained by context + NSString* _method; + GSWDynamicURLString* _uri; + NSStringEncoding _defaultFormValueEncoding; + NSStringEncoding _formValueEncoding; + NSDictionary* _formValues; + NSDictionary* _uriElements; + NSDictionary* _cookie; + BOOL _finishedParsingMultipartFormData; + NSString* _applicationURLPrefix; + NSArray* _requestHandlerPathArray; + NSArray* _browserLanguages; + NSArray* _browserAcceptedEncodings; + int _requestType; + NSString* _originatingAddress; + uint16_t _originatingPort; + BOOL _isUsingWebServer; + BOOL _formValueEncodingDetectionEnabled; + int _applicationNumber; + GSWContext* _context;//Don't retain/release because request is retained by context }; -(id)initWithMethod:(NSString*)aMethod @@ -166,6 +166,12 @@ Cf RFC 2616 (http://www.rfc-editor.org/rfc/rfc2616.txt) -(NSString*)_contentType; -(NSString*)_urlQueryString; +-(BOOL)isAjaxSubmit; + ++(NSString*)ajaxFormSubmitKey; + ++(void)setAjaxFormSubmitKey:(NSString*) value; + -(BOOL)_isUsingWebServer; -(BOOL)isUsingWebServer; diff --git a/GSWeb/GSWRequest.m b/GSWeb/GSWRequest.m index 7b61964..91efd41 100644 --- a/GSWeb/GSWRequest.m +++ b/GSWeb/GSWRequest.m @@ -4,10 +4,6 @@ Written by: Manuel Guesdon Date: Jan 1999 - - $Revision$ - $Date$ - $Id$ This file is part of the GNUstep Web Library. @@ -198,6 +194,8 @@ @implementation GSWRequest +static NSString * __AJAX_FORM_SUBMIT_KEY = @"AJAX_SUBMIT_BUTTON_NAME"; + //-------------------------------------------------------------------- // initWithMethod:uri:httpVersion:headers:content:userInfo: @@ -722,6 +720,10 @@ { id formValue=nil; NSArray* formValuesForKey=nil; + + if (!key) { + return nil; + } formValuesForKey=[self formValuesForKey:key]; NSAssert3(!formValuesForKey || [formValuesForKey isKindOfClass:[NSArray class]],@"formValues:%@ ForKey:%@ is not a NSArray it's a %@", @@ -1369,6 +1371,22 @@ }; //-------------------------------------------------------------------- + +-(BOOL) isAjaxSubmit +{ + return ([self formValueForKey:[[self class] ajaxFormSubmitKey]] != nil); +} + ++ (NSString*) ajaxFormSubmitKey +{ + return (__AJAX_FORM_SUBMIT_KEY == nil) ? @"" : __AJAX_FORM_SUBMIT_KEY; +} + ++ (void) setAjaxFormSubmitKey:(NSString*) value +{ + ASSIGN(__AJAX_FORM_SUBMIT_KEY,(value == nil) ? @"" : value); +} + // FIXME:check if that is needed for 4.5 compat -(BOOL)_isUsingWebServer { diff --git a/GSWeb/GSWSession.m b/GSWeb/GSWSession.m index 297dbcf..6e383d4 100644 --- a/GSWeb/GSWSession.m +++ b/GSWeb/GSWSession.m @@ -588,7 +588,22 @@ extern id gcObjectsToBeVisited; //-------------------------------------------------------------------- + +-(void)savePageInPageFragmentCache:(GSWComponent*)page +{ + // TODO +} + -(void)savePage:(GSWComponent*)page +{ + if ([_currentContext shouldNotStorePageInBacktrackCache]) { + [self savePageInPageFragmentCache:page]; + } else { + [self savePageInPageCache:page]; + } +} + +-(void)savePageInPageCache:(GSWComponent*)page { GSWTransactionRecord * transactionrec = nil; BOOL pageChanged = [_currentContext _pageChanged]; diff --git a/GSWeb/GSWWOCompatibility.h b/GSWeb/GSWWOCompatibility.h index 3586d55..f782fc8 100644 --- a/GSWeb/GSWWOCompatibility.h +++ b/GSWeb/GSWWOCompatibility.h @@ -66,6 +66,7 @@ #define GSWBundle WOBundle #define GSWMultiKeyDictionary WOMultiKeyDictionary #define GSWElementID WOElementIDString +#define GSWAjaxRequestHandler WOAjaxRequestHandler #define GSWComponentRequestHandler WOComponentRequestHandler #define GSWResourceRequestHandler WOResourceRequestHandler #define GSWDirectActionRequestHandler WODirectActionRequestHandler diff --git a/GSWeb/GSWeb.h b/GSWeb/GSWeb.h index 7a82389..db80880 100644 --- a/GSWeb/GSWeb.h +++ b/GSWeb/GSWeb.h @@ -111,6 +111,7 @@ @class GSWResourceRequestHandler; @class GSWStaticResourceRequestHandler; @class GSWActionRequestHandler; +@class GSWAjaxRequestHandler; @class GSWDirectActionRequestHandler; @class GSWKeyValueAssociation; @class GSWConstantValueAssociation; @@ -236,6 +237,7 @@ #include "GSWResourceRequestHandler.h" #include "GSWStaticResourceRequestHandler.h" #include "GSWActionRequestHandler.h" +#include "GSWAjaxRequestHandler.h" #include "GSWDirectActionRequestHandler.h" #include "GSWKeyValueAssociation.h" #include "GSWConstantValueAssociation.h"