- (void)_setCurrentContext:(WOContext *)_ctx;
@end
+@interface WORequestHandler(URI)
+- (BOOL)doesRejectFavicon;
+@end
+
@implementation WOComponentRequestHandler
+ (int)version {
*/
- (WOResponse *)handleRequest:(WORequest *)_request {
+ // TODO: this should be integrated into the WORequestHandler default
+ // mechanism
NSString *sessionID = nil;
WOApplication *application = nil;
- WOContext *context = nil;
+ WOContext *context;
WOResponse *response = nil;
WOSession *session = nil;
WOComponent *component = nil;
NSString *handlerPath = nil;
if (_request == nil) return nil;
-
+
+ if ([self doesRejectFavicon] && [[_request uri] isNotNull]) {
+ // TODO: code copied from WORequestHandler ...
+ if ([@"/favicon.ico" isEqualToString:[_request uri]]) {
+ response = [WOResponse responseWithRequest:_request];
+ [response setStatus:404 /* not found */];
+ [self debugWithFormat:@"rejected favicon request: %@", [_request uri]];
+ return response;
+ }
+ }
+
application = [WOApplication application];
handlerPath = [_request requestHandlerPath];
-
+
#if 0
- NSLog(@"[component request handler] path=%@ ..", handlerPath);
+ [self logWithFormat:@"[component request handler] path: '%@'", handlerPath];
#endif
if (![application allowsConcurrentRequestHandling]) {
if ([sessionID length] == 0)
sessionID = [application sessionIDFromRequest:_request];
-#if 0
- NSLog(@"%s: made context %@ (cid=%@, sn=%@) ..", __PRETTY_FUNCTION__
- context, [context contextID], sessionID);
+#if 1
+ [self logWithFormat:@"%s: made context %@ (cid=%@, sn=%@) ..",
+ __PRETTY_FUNCTION__, context, [context contextID], sessionID];
#endif
[application awake];
/* restore or create session */
- if (sessionID) {
+ if ([sessionID isNotNull]) {
response = [self restoreSessionWithID:sessionID inContext:context];
- session = response ? nil : [context session];
+ session = response ? nil : [context session];
+
+ //[self logWithFormat:@"restored session (id=%@): %@", sessionID, session];
- if (session) {
+ if ([session isNotNull]) {
/* awake stored page */
component = [session restorePageForContextID:[context currentElementID]];
response = [application handlePageRestorationErrorInContext:context];
#if DEBUG
else {
- NSLog(@"%s: restored request component %@", __PRETTY_FUNCTION__,
- component);
+ [self logWithFormat:@"%s: restored request component: %@",
+ __PRETTY_FUNCTION__, component];
}
#endif
}
else {
/* create new session */
session = [application _initializeSessionInContext:context];
- if (session) {
+ if ([session isNotNull]) {
/* awake created session */
[session awake];
component = [application pageWithName:nil inContext:context];
/* run invoke-action phase */
newPage = [application invokeActionForRequest:_request inContext:context];
-
+
/* process resulting page */
if (newPage == nil) {
if ((newPage = [context page]) == nil) {
#endif
/* generate response */
-#if 1 /* new code, ensure that _fixupResponse is called */
+
response = [self generateResponseForComponent:[context page]
inContext:context
application:application];
-#else /* old code */
- response = [context response];
- [application appendToResponse:response inContext:context];
-#endif
}
else {
[self warnWithFormat:@"%s: did not enter request/response transaction ...",
__PRETTY_FUNCTION__];
}
-
+
/* tear down */
/* sleep objects */
[session sleep];
/* save objects */
- if (session) {
+
+ if (session != nil) {
if ([context savePageRequired])
[session savePage:[context page]];
- NSLog(@"saving session %@", [session sessionID]);
+ [self logWithFormat:@"saving session %@", [session sessionID]];
+
+ if ([session storesIDsInCookies]) {
+ [self logInfoWithFormat:@"add cookie to session: %@", session];
+ [self addCookiesForSession:session
+ toResponse:response
+ inContext:context];
+ }
+
+#if 1
[application saveSessionForContext:context];
+#else
+ [self saveSession:session
+ inContext:context
+ withResponse:response
+ application:application];
+#endif
}
[application sleep];