From 19194b8f0b2a6253f8d32a09bc04ecc23e3fc19a Mon Sep 17 00:00:00 2001 From: helge Date: Mon, 18 Jul 2005 15:27:20 +0000 Subject: [PATCH] improved query string handling git-svn-id: http://svn.opengroupware.org/SOPE/trunk@912 e4a50df8-12e2-0310-a44c-efbce7f8a7e3 --- sope-appserver/NGObjWeb/ChangeLog | 11 +++++ .../NGObjWeb/DynamicElements/WOFileUpload.m | 19 ++++---- .../DynamicElements/_WOComplexHyperlink.m | 8 ++-- .../NGObjWeb/SoObjects/SoLookupAssociation.h | 2 +- sope-appserver/NGObjWeb/Version | 2 +- sope-appserver/NGObjWeb/WOElement.m | 43 ++++++++++++++----- sope-mime/NGImap4/TODO | 4 +- 7 files changed, 64 insertions(+), 25 deletions(-) diff --git a/sope-appserver/NGObjWeb/ChangeLog b/sope-appserver/NGObjWeb/ChangeLog index 6317cc2f..fbe97e3c 100644 --- a/sope-appserver/NGObjWeb/ChangeLog +++ b/sope-appserver/NGObjWeb/ChangeLog @@ -1,3 +1,14 @@ +2005-07-18 Helge Hess + + * v4.5.173 + + * DynamicElements/WOFileUpload.m: improved debug logging + + * DynamicElements/_WOComplexHyperlink.m: minor code cleanups + + * WOElement.m: improved handling of query parameters (now handles + arrays of form values) + 2005-07-13 Helge Hess * WebDAV/SoObject+SoDAV.m: changed not to return an etag per default diff --git a/sope-appserver/NGObjWeb/DynamicElements/WOFileUpload.m b/sope-appserver/NGObjWeb/DynamicElements/WOFileUpload.m index 693eaf5d..9e763c9d 100644 --- a/sope-appserver/NGObjWeb/DynamicElements/WOFileUpload.m +++ b/sope-appserver/NGObjWeb/DynamicElements/WOFileUpload.m @@ -85,28 +85,31 @@ static NGMimeType *multipartFormData = nil; if ([self->disabled boolValueInComponent:[_ctx component]]) return; - + currentId = OWFormElementName(self, _ctx); - + if ((formValue = [_rq formValueForKey:currentId]) == nil) return; contentType = [[_rq httpRequest] contentType]; if (![contentType hasSameType:multipartFormData]) { - NSLog(@"WARNING: tried to apply file-upload value of %@ from " - @"a non multipart-form request (value=%@) !", - [_ctx elementID], formValue); + [self warnWithFormat: + @"Tried to apply file-upload value of eid=%@ from " + @"a non multipart-form request (value=%@).", + [_ctx elementID], formValue]; return; } #if 0 NSLog(@"%@: value=%@ ..", [self elementID], formValue); #endif - + if ([self->data isValueSettable]) [self->data setValue:formValue inComponent:[_ctx component]]; - + + /* the remainder is for locating the file path */ + if (![self->filePath isValueSettable]) return; @@ -139,7 +142,7 @@ static NGMimeType *multipartFormData = nil; [[DispClass alloc] initWithString:[disposition stringValue]]; disposition = [disposition autorelease]; } - + formName = [(NGMimeContentDispositionHeaderField *)disposition name]; if ([formName isEqualToString:currentId]) { diff --git a/sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m b/sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m index 61c4ce76..e9cd262e 100644 --- a/sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m +++ b/sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m @@ -157,16 +157,16 @@ static Class NSURLClass = Nil; - (void)takeValuesFromRequest:(WORequest *)_rq inContext:(WOContext *)_ctx { /* links can take form values !!!! (for query-parameters) */ - if (self->queryParameters) { + if (self->queryParameters != nil) { /* apply values to ?style parameters */ WOComponent *sComponent = [_ctx component]; NSEnumerator *keys; NSString *key; - + keys = [self->queryParameters keyEnumerator]; - while ((key = [keys nextObject])) { + while ((key = [keys nextObject]) != nil) { id assoc, value; - + assoc = [self->queryParameters objectForKey:key]; if ([assoc isValueSettable]) { diff --git a/sope-appserver/NGObjWeb/SoObjects/SoLookupAssociation.h b/sope-appserver/NGObjWeb/SoObjects/SoLookupAssociation.h index 5baa44d0..1a6a842b 100644 --- a/sope-appserver/NGObjWeb/SoObjects/SoLookupAssociation.h +++ b/sope-appserver/NGObjWeb/SoObjects/SoLookupAssociation.h @@ -26,7 +26,7 @@ /* SoLookupAssociation - + This association is experimental, behaviour isn't fixed yet. TODO: this should probably traverse relative to the clientObject, not to the component?! diff --git a/sope-appserver/NGObjWeb/Version b/sope-appserver/NGObjWeb/Version index 812ccc05..cc693a19 100644 --- a/sope-appserver/NGObjWeb/Version +++ b/sope-appserver/NGObjWeb/Version @@ -1,6 +1,6 @@ # version file -SUBMINOR_VERSION:=172 +SUBMINOR_VERSION:=173 # v4.5.122 requires libNGExtensions v4.5.153 # v4.5.91 requires libNGExtensions v4.5.134 diff --git a/sope-appserver/NGObjWeb/WOElement.m b/sope-appserver/NGObjWeb/WOElement.m index 04dd92c8..2461122d 100644 --- a/sope-appserver/NGObjWeb/WOElement.m +++ b/sope-appserver/NGObjWeb/WOElement.m @@ -150,9 +150,7 @@ static id numStrings[100]; NSStringFromClass([self class]), self]; } -@end /* WOElement */ - -@implementation WOElement(QueryString) +/* QueryString */ - (NSString *)queryStringForQueryDictionary:(NSDictionary *)_queryDict andQueryParameters:(NSDictionary *)_paras @@ -174,11 +172,11 @@ static id numStrings[100]; isFirst = YES; paraKeys = [_paras allKeys]; - + /* ?style parameters */ keys = [_paras keyEnumerator]; - while ((key = [keys nextObject])) { + while ((key = [keys nextObject]) != nil) { value = [[_paras objectForKey:key] stringValueInComponent:sComponent]; value = value ? [value stringByEscapingURL] : @""; key = key ? [key stringByEscapingURL] : @""; @@ -192,15 +190,40 @@ static id numStrings[100]; } keys = [_queryDict keyEnumerator]; - while ((key = [keys nextObject])) { - if(![paraKeys containsObject:key]) { - value = [[_queryDict objectForKey:key] stringValue]; + while ((key = [keys nextObject]) != nil) { + if([paraKeys containsObject:key]) + /* overridden by a query parameter (?abc=abc) */ + continue; + + value = [_queryDict objectForKey:key]; + if ([value isKindOfClass:[NSArray class]]) { + /* if we bind the queryDictionary to request.formValues */ + NSArray *values; + unsigned i, count; + + values = (NSArray *)value; + for (i = 0, count = [values count]; i < count; i++) { + value = [values objectAtIndex:i]; + value = [value stringValue]; + value = value ? [value stringByEscapingURL] : @""; + key = key ? [key stringByEscapingURL] : @""; + + if (isFirst) isFirst = NO; + else [str appendString:@"&"]; + + [str appendString:key]; + [str appendString:@"="]; + [str appendString:value]; + } + } + else { + value = [value stringValue]; value = value ? [value stringByEscapingURL] : @""; key = key ? [key stringByEscapingURL] : @""; if (isFirst) isFirst = NO; else [str appendString:@"&"]; - + [str appendString:key]; [str appendString:@"="]; [str appendString:value]; @@ -210,7 +233,7 @@ static id numStrings[100]; return [str length] > 0 ? str : nil; } -@end /* WOElement(QueryString) */ +@end /* WOElement */ NGObjWeb_DECLARE id OWGetProperty(NSDictionary *_set, NSString *_name) { register id propValue; diff --git a/sope-mime/NGImap4/TODO b/sope-mime/NGImap4/TODO index 4888f6b3..f3cfe907 100644 --- a/sope-mime/NGImap4/TODO +++ b/sope-mime/NGImap4/TODO @@ -1,4 +1,6 @@ -# $Id$ +# TODO for NGImap4 + +TODO: update todo file! ;-) - OGo bug #660 -- 2.39.2