]> err.no Git - scalable-opengroupware.org/blob - SOPE/sope-patchset-r1546.diff
git-svn-id: http://svn.opengroupware.org/SOGo/inverse/trunk@1199 d1b88da0-ebda-0310...
[scalable-opengroupware.org] / SOPE / sope-patchset-r1546.diff
1 Index: sope-mime/NGImap4/NGImap4Connection.m
2 ===================================================================
3 --- sope-mime/NGImap4/NGImap4Connection.m       (révision 1546)
4 +++ sope-mime/NGImap4/NGImap4Connection.m       (copie de travail)
5 @@ -381,7 +381,7 @@
6    
7    if (debugCache) [self logWithFormat:@"  no folders cached yet .."];
8    
9 -  result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"*")
10 +  result = [[self client] list:(onlyFetchInbox ? @"INBOX" : @"")
11                           pattern:@"*"];
12    if (![[result valueForKey:@"result"] boolValue]) {
13      [self errorWithFormat:@"Could not list mailbox hierarchy!"];
14 Index: sope-mime/NGImap4/NGImap4ResponseNormalizer.m
15 ===================================================================
16 --- sope-mime/NGImap4/NGImap4ResponseNormalizer.m       (révision 1546)
17 +++ sope-mime/NGImap4/NGImap4ResponseNormalizer.m       (copie de travail)
18 @@ -648,14 +648,13 @@
19    enumerator = [_flags objectEnumerator];
20    cnt = 0;
21    while ((obj = [enumerator nextObject])) {
22 -    if (![obj isNotEmpty])
23 -      continue;
24 -    
25 -    if (![[obj substringToIndex:1] isEqualToString:@"\\"])
26 -      continue;
27 -
28 -    objs[cnt] = [obj substringFromIndex:1];
29 -    cnt++;
30 +    if ([obj isNotEmpty]) {
31 +      if ([obj hasPrefix:@"\\"])
32 +       objs[cnt] = [obj substringFromIndex:1];
33 +      else
34 +       objs[cnt] = obj;
35 +      cnt++;
36 +    }
37    }
38    result = [NSArray arrayWithObjects:objs count:cnt];
39    if (objs) free(objs);
40 Index: sope-mime/NGImap4/NGImap4ResponseParser.m
41 ===================================================================
42 --- sope-mime/NGImap4/NGImap4ResponseParser.m   (révision 1546)
43 +++ sope-mime/NGImap4/NGImap4ResponseParser.m   (copie de travail)
44 @@ -84,6 +84,8 @@
45  static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self,
46                                          BOOL isBodyStructure);
47  
48 +static NSArray *_parseLanguages();
49 +
50  static NSString *_parseBodyString(NGImap4ResponseParser *self,
51                                    BOOL _convertString);
52  static NSString *_parseBodyDecodeString(NGImap4ResponseParser *self,
53 @@ -111,6 +113,7 @@
54  static NSNumber *_parseUnsigned(NGImap4ResponseParser *self);
55  static NSString *_parseUntil(NGImap4ResponseParser *self, char _c);
56  static NSString *_parseUntil2(NGImap4ResponseParser *self, char _c1, char _c2);
57 +static BOOL _endsWithCQuote(NSString *_string);
58  
59  static __inline__ NSException *_consumeIfMatch
60    (NGImap4ResponseParser *self, unsigned char _m);
61 @@ -649,12 +652,31 @@
62  }
63  
64  - (NSString *)_parseQuotedString {
65 +  NSMutableString *quotedString;
66 +  NSString *tmpString;
67 +  BOOL stop;
68 +
69    /* parse a quoted string, eg '"' */
70    if (_la(self, 0) == '"') {
71      _consume(self, 1);
72 -    return _parseUntil(self, '"');
73 +    quotedString = [NSMutableString string];
74 +    stop = NO;
75 +    while (!stop) {
76 +      tmpString = _parseUntil(self, '"');
77 +      [quotedString appendString: tmpString];
78 +      if(_endsWithCQuote(tmpString)) {
79 +       [quotedString deleteSuffix: @"\\"];
80 +       [quotedString appendString: @"\""];
81 +      }
82 +      else {
83 +       stop = YES;
84 +      }
85 +    }
86    }
87 -  return nil;
88 +  else {
89 +    quotedString = nil;
90 +  }
91 +  return quotedString;
92  }
93  - (void)_consumeOptionalSpace {
94    if (_la(self, 0) == ' ') _consume(self, 1);
95 @@ -1185,7 +1207,7 @@
96    route   = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
97    mailbox = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
98    host    = [self _parseQuotedStringOrNIL]; [self _consumeOptionalSpace];
99 -  
100 +
101    if (_la(self, 0) != ')') {
102      [self logWithFormat:@"WARNING: IMAP4 envelope "
103             @"address not properly closed (c0=%c,c1=%c): %@",
104 @@ -1197,6 +1219,7 @@
105    address = [[NGImap4EnvelopeAddress alloc] initWithPersonalName:pname
106                                             sourceRoute:route mailbox:mailbox
107                                             host:host];
108 +
109    return address;
110  }
111  
112 @@ -1627,6 +1650,29 @@
113    return _parseBodyDecodeString(self, _convertString, NO /* no decode */);
114  }
115  
116 +static NSArray *_parseLanguages(NGImap4ResponseParser *self) {
117 +  NSMutableArray *languages;
118 +  NSString *language;
119 +
120 +  languages = [NSMutableArray array];
121 +  if (_la(self, 0) == '(') {
122 +    while (_la(self, 0) != ')') {
123 +      _consume(self,1);
124 +      language = _parseBodyString(self, YES);
125 +      if ([language length])
126 +       [languages addObject: language];
127 +    }
128 +    _consume(self,1);
129 +  }
130 +  else {
131 +    language = _parseBodyString(self, YES);
132 +    if ([language length])
133 +      [languages addObject: language];
134 +  }
135 +
136 +  return languages;
137 +}
138 +
139  static NSDictionary *_parseBodyParameterList(NGImap4ResponseParser *self)
140  {
141    NSMutableDictionary *list;
142 @@ -1734,10 +1780,11 @@
143                       *encoding, *bodysize;
144    NSDictionary        *parameterList;
145    NSMutableDictionary *dict;
146 +  NSArray            *languages;
147  
148    type = [_parseBodyString(self, YES) lowercaseString];
149    _consumeIfMatch(self, ' ');
150 -  subtype = _parseBodyString(self, YES);
151 +  subtype = [_parseBodyString(self, YES) lowercaseString];
152    _consumeIfMatch(self, ' ');
153    parameterList = _parseBodyParameterList(self);
154    _consumeIfMatch(self, ' ');
155 @@ -1762,7 +1809,8 @@
156      _consumeIfMatch(self, ' ');
157      [dict setObject:_parseBodyString(self, YES) forKey:@"lines"];
158    }
159 -  else if ([type isEqualToString:@"message"]) {
160 +  else if ([type isEqualToString:@"message"]
161 +          && [subtype isEqualToString:@"rfc822"]) {
162      if (_la(self, 0) != ')') {
163        _consumeIfMatch(self, ' ');
164        _consumeIfMatch(self, '(');
165 @@ -1805,14 +1853,9 @@
166               forKey: @"disposition"];
167         if (_la(self, 0) != ')') {
168           _consume(self,1);
169 -         if (_la(self, 0) == '(') {
170 -           [dict setObject: _parseBodyParameterList(self)
171 -                 forKey: @"language"];
172 -         }
173 -         else {
174 -           [dict setObject: _parseBodyString(self, YES)
175 -                 forKey: @"language"];
176 -         }
177 +         languages = _parseLanguages(self);
178 +         if ([languages count])
179 +           [dict setObject: languages forKey: @"languages"];
180           if (_la(self, 0) != ')') {
181             _consume(self,1);
182             [dict setObject: _parseBodyString(self, YES)
183 @@ -1829,6 +1872,7 @@
184  static NSDictionary *_parseMultipartBody(NGImap4ResponseParser *self,
185                                          BOOL isBodyStructure) {
186    NSMutableArray *parts;
187 +  NSArray       *languages;
188    NSString       *kind;
189    NSMutableDictionary *dict;
190  
191 @@ -1854,14 +1898,9 @@
192               forKey: @"disposition"];
193         if (_la(self, 0) != ')') {
194           _consume(self,1);
195 -         if (_la(self, 0) == '(') {
196 -           [dict setObject: _parseBodyParameterList(self)
197 -                 forKey: @"language"];
198 -         }
199 -         else {
200 -           [dict setObject: _parseBodyString(self, YES)
201 -                 forKey: @"language"];
202 -         }
203 +         languages = _parseLanguages(self);
204 +         if ([languages count])
205 +           [dict setObject: languages forKey: @"languages"];
206           if (_la(self, 0) != ')') {
207             _consume(self,1);
208             [dict setObject: _parseBodyString(self, YES)
209 @@ -2170,6 +2209,21 @@
210    }
211  }
212  
213 +static BOOL _endsWithCQuote(NSString *_string){
214 +  unsigned int quoteSlashes;
215 +  int pos;
216 +
217 +  quoteSlashes = 0;
218 +  pos = [_string length] - 1;
219 +  while (pos > -1
220 +        && [_string characterAtIndex: pos] == '\\') {
221 +    quoteSlashes++;
222 +    pos--;
223 +  }
224 +
225 +  return ((quoteSlashes % 2) == 1);
226 +}
227 +
228  - (NSException *)exceptionForFailedMatch:(unsigned char)_match
229    got:(unsigned char)_avail
230  {
231 Index: sope-mime/NGMime/NGMimeBodyPart.m
232 ===================================================================
233 --- sope-mime/NGMime/NGMimeBodyPart.m   (révision 1546)
234 +++ sope-mime/NGMime/NGMimeBodyPart.m   (copie de travail)
235 @@ -31,18 +31,6 @@
236    return 2;
237  }
238  
239 -static NGMimeType *defaultType = nil;
240 -
241 -+ (void)initialize {
242 -  static BOOL isInitialized = NO;
243 -  if (!isInitialized) {
244 -    isInitialized = YES;
245 -    
246 -    defaultType =
247 -      [[NGMimeType mimeType:@"text/plain; charset=us-ascii"] retain];
248 -  }
249 -}
250 -  
251  + (id)bodyPartWithHeader:(NGHashMap *)_header {
252    return [[[self alloc] initWithHeader:_header] autorelease];
253  }
254 @@ -156,13 +144,12 @@
255    if (!Fields)
256      Fields = (NGMimeHeaderNames *)[NGMimePartParser headerFieldNames];
257    
258 -  
259    type = [self->header objectForKey:Fields->contentType];
260    
261    if (![type isKindOfClass:[NGMimeType class]])
262      type = [NGMimeType mimeType:[type stringValue]];
263    
264 -  return (type != nil ? type : (id)defaultType);
265 +  return type;
266  }
267  
268  - (NSString *)contentId {
269 Index: sope-mime/NGMime/NGMimeBodyParser.m
270 ===================================================================
271 --- sope-mime/NGMime/NGMimeBodyParser.m (révision 1546)
272 +++ sope-mime/NGMime/NGMimeBodyParser.m (copie de travail)
273 @@ -67,7 +67,10 @@
274    if (_data == nil) return nil;
275    
276    ctype = [_part contentType];
277 -  
278 +  if (!ctype
279 +      && [_d respondsToSelector: @selector(parser:contentTypeOfPart:)])
280 +    ctype = [_d parser: self contentTypeOfPart: _part];
281 +
282    if (![ctype isKindOfClass:[NGMimeType class]])
283      ctype = [NGMimeType mimeType:[ctype stringValue]];
284    
285 Index: sope-mime/NGMime/NGMimePartParser.h
286 ===================================================================
287 --- sope-mime/NGMime/NGMimePartParser.h (révision 1546)
288 +++ sope-mime/NGMime/NGMimePartParser.h (copie de travail)
289 @@ -117,6 +117,7 @@
290      BOOL parserParseRawBodyDataOfPart:1;
291      BOOL parserBodyParserForPart:1;
292      BOOL parserDecodeBodyOfPart:1;
293 +    BOOL parserContentTypeOfPart:1;
294    } delegateRespondsTo;
295  
296    
297 @@ -275,6 +276,9 @@
298  - (id<NGMimeBodyParser>)parser:(NGMimePartParser *)_parser
299    bodyParserForPart:(id<NGMimePart>)_part;
300  
301 +- (NGMimeType *)parser:(id)_parser
302 +  contentTypeOfPart:(id<NGMimePart>)_part;
303 +
304  @end /* NSObject(NGMimePartParserDelegate) */
305  
306  @interface NSObject(NGMimePartParser)
307 Index: sope-mime/NGMime/NGMimePartParser.m
308 ===================================================================
309 --- sope-mime/NGMime/NGMimePartParser.m (révision 1546)
310 +++ sope-mime/NGMime/NGMimePartParser.m (copie de travail)
311 @@ -1091,7 +1091,10 @@
312    id<NGMimeBodyParser> bodyParser   = nil;
313    
314    ctype = [_p contentType];
315 -  
316 +  if (!ctype
317 +      && self->delegateRespondsTo.parserContentTypeOfPart)
318 +    ctype = [self->delegate parser: self contentTypeOfPart: _p];
319 +
320    contentType = ([ctype isKindOfClass:[NGMimeType class]])
321      ? ctype
322      : [NGMimeType mimeType:[ctype stringValue]];
323 Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.h
324 ===================================================================
325 --- sope-gdl1/PostgreSQL/PostgreSQL72Channel.h  (révision 1546)
326 +++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.h  (copie de travail)
327 @@ -28,6 +28,7 @@
328  #define ___PostgreSQL72_Channel_H___
329  
330  #include <GDLAccess/EOAdaptorChannel.h>
331 +#include <GDLContentStore/EOAdaptorChannel+GCS.h>
332  #include <libpq-fe.h>
333  
334  @class NSArray, NSString, NSMutableDictionary;
335 @@ -40,7 +41,7 @@
336    int        modification;
337  } PostgreSQL72FieldInfo;
338  
339 -@interface PostgreSQL72Channel : EOAdaptorChannel
340 +@interface PostgreSQL72Channel : EOAdaptorChannel <GCSEOAdaptorChannel>
341  {
342    // connection is valid after an openChannel call
343    PGConnection *connection;
344 Index: sope-gdl1/PostgreSQL/PostgreSQL72Channel.m
345 ===================================================================
346 --- sope-gdl1/PostgreSQL/PostgreSQL72Channel.m  (révision 1546)
347 +++ sope-gdl1/PostgreSQL/PostgreSQL72Channel.m  (copie de travail)
348 @@ -713,6 +713,39 @@
349    return ms;
350  }
351  
352 +/* GCSEOAdaptorChannel protocol */
353 +static NSString *sqlFolderFormat = (@"CREATE TABLE %@ (\n"     \
354 +                                   @"  c_name VARCHAR (256) NOT NULL,\n"
355 +                                   @"  c_content VARCHAR (100000) NOT NULL,\n"
356 +                                   @"  c_creationdate INT4 NOT NULL,\n"
357 +                                   @"  c_lastmodified INT4 NOT NULL,\n"
358 +                                   @"  c_version INT4 NOT NULL,\n"
359 +                                   @"  c_deleted INT4 NULL\n"
360 +                                   @")");
361 +static NSString *sqlFolderACLFormat = (@"CREATE TABLE %@ (\n"  \
362 +                                      @"  c_uid VARCHAR (256) NOT NULL,\n"
363 +                                      @"  c_object VARCHAR (256) NOT NULL,\n"
364 +                                      @"  c_role VARCHAR (80) NOT NULL\n"
365 +                                      @")");
366 +
367 +- (NSException *) createGCSFolderTableWithName: (NSString *) tableName
368 +{
369 +  NSString *sql;
370 +
371 +  sql = [NSString stringWithFormat: sqlFolderFormat, tableName];
372 +
373 +  return [self evaluateExpressionX: sql];
374 +}
375 +
376 +- (NSException *) createGCSFolderACLTableWithName: (NSString *) tableName
377 +{
378 +  NSString *sql;
379 +
380 +  sql = [NSString stringWithFormat: sqlFolderACLFormat, tableName];
381 +
382 +  return [self evaluateExpressionX: sql];
383 +}
384 +
385  @end /* PostgreSQL72Channel */
386  
387  @implementation PostgreSQL72Channel(PrimaryKeyGeneration)
388 Index: sope-appserver/NGObjWeb/GNUmakefile.postamble
389 ===================================================================
390 --- sope-appserver/NGObjWeb/GNUmakefile.postamble       (révision 1546)
391 +++ sope-appserver/NGObjWeb/GNUmakefile.postamble       (copie de travail)
392 @@ -23,14 +23,20 @@
393  
394  # install makefiles
395  
396 -after-install ::
397 +after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make
398 +
399 +ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0)
400 +after-install :: $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make
401 +endif
402 +
403 +$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make: ngobjweb.make
404         $(MKDIRS) $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/
405         $(INSTALL_DATA) ngobjweb.make $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/Additional/ngobjweb.make
406  
407 -ifneq ($(GNUSTEP_MAKE_VERSION),1.3.0)
408 -after-install ::
409 +$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make: woapp-gs.make
410         $(INSTALL_DATA) woapp-gs.make    \
411                 $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/woapp.make
412 +
413 +$(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make: wobundle-gs.make
414         $(INSTALL_DATA) wobundle-gs.make \
415                 $(INSTALL_ROOT_DIR)/$(GNUSTEP_MAKEFILES)/wobundle.make
416 -endif
417 Index: sope-appserver/NGObjWeb/WOContext.m
418 ===================================================================
419 --- sope-appserver/NGObjWeb/WOContext.m (révision 1546)
420 +++ sope-appserver/NGObjWeb/WOContext.m (copie de travail)
421 @@ -64,11 +64,13 @@
422  static BOOL     testNSURLs           = NO;
423  static BOOL     newCURLStyle         = NO;
424  static NSString *WOApplicationSuffix = nil;
425 +static NSURL    *redirectURL         = nil;
426  
427  + (void)initialize {
428    static BOOL    didInit = NO;
429    NSUserDefaults *ud;
430    NSString       *cn;
431 +  NSString       *url;
432  
433    if (didInit) return;
434  
435 @@ -91,6 +93,9 @@
436    debugCursor         = [ud boolForKey:@"WODebugCursor"] ? 1 : 0;
437    debugComponentAwake = [ud boolForKey:@"WODebugComponentAwake"];
438    WOApplicationSuffix = [[ud stringForKey:@"WOApplicationSuffix"] copy];
439 +  url                 = [ud stringForKey:@"WOApplicationRedirectURL"];
440 +  if (url != nil)
441 +    redirectURL       = [NSURL URLWithString: url];
442  }
443  
444  + (id)contextWithRequest:(WORequest *)_r {
445 @@ -503,6 +508,11 @@
446      return nil;
447    }
448    
449 +  if (redirectURL) {
450 +    // Use URL from user defaults (WOApplicationRedirectURL)
451 +    return redirectURL;
452 +  }
453 +  
454    if ((serverURL = [rq headerForKey:@"x-webobjects-server-url"]) == nil) {
455      if ((host = [rq headerForKey:@"host"]))
456        serverURL = [@"http://" stringByAppendingString:host];
457 Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m
458 ===================================================================
459 --- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m   (révision 1546)
460 +++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.m   (copie de travail)
461 @@ -216,6 +216,12 @@
462        assocCount++;
463      }
464    }
465 +  if (count > 0) {
466 +    if ((self->isAbsolute = OWGetProperty(_config, @"absolute"))) {
467 +      count--;
468 +      assocCount++;
469 +    }
470 +  }
471    
472    self->rest = _config;
473    
474 Index: sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m
475 ===================================================================
476 --- sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m       (révision 1546)
477 +++ sope-appserver/NGObjWeb/DynamicElements/_WOComplexHyperlink.m       (copie de travail)
478 @@ -40,6 +40,7 @@
479    WOAssociation *string;
480    WOAssociation *target;
481    WOAssociation *disabled;
482 +  WOAssociation *isAbsolute;
483    WOElement     *template;
484    
485    /* new in WO4: */
486 @@ -359,6 +360,7 @@
487  {
488    if ((self = [super initWithName:_name hyperlinkInfo:_info template:_t])) {
489      self->href = _info->href;
490 +    self->isAbsolute = _info->isAbsolute;
491    }
492    return self;
493  }
494 @@ -374,6 +376,9 @@
495    // TODO: we need a binding to disable rewriting!
496    NSRange  r;
497    
498 +  if ([[self->isAbsolute valueInContext:_ctx] boolValue] == YES)
499 +    return NO;
500 +
501    r = [_s rangeOfString:@":"];
502    if (r.length == 0) 
503      return YES;
504 Index: sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h
505 ===================================================================
506 --- sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h   (révision 1546)
507 +++ sope-appserver/NGObjWeb/DynamicElements/WOHyperlinkInfo.h   (copie de travail)
508 @@ -41,7 +41,8 @@
509    WOAssociation *pageName;
510    WOAssociation *actionClass;
511    WOAssociation *directActionName;
512 -  
513 +  WOAssociation *isAbsolute;
514 +
515    BOOL          sidInUrl;
516  
517    /* 'ivar' associations */
518 Index: sope-appserver/NGObjWeb/SoObjects/SoObject.m
519 ===================================================================
520 --- sope-appserver/NGObjWeb/SoObjects/SoObject.m        (révision 1546)
521 +++ sope-appserver/NGObjWeb/SoObjects/SoObject.m        (copie de travail)
522 @@ -39,22 +39,34 @@
523  static int debugLookup  = -1;
524  static int debugBaseURL = -1;
525  static int useRelativeURLs = -1;
526 +static int redirectInitted = -1;
527 +static NSURL *redirectURL = nil;
528 +
529  static void _initialize(void) {
530 +  NSString *url;
531 +  NSUserDefaults *ud;
532 +
533 +  ud = [NSUserDefaults standardUserDefaults];
534 +
535    if (debugLookup == -1) {
536 -    debugLookup = [[NSUserDefaults standardUserDefaults]
537 -                                  boolForKey:@"SoDebugKeyLookup"] ? 1 : 0;
538 +    debugLookup = [ud boolForKey:@"SoDebugKeyLookup"] ? 1 : 0;
539      NSLog(@"Note(SoObject): SoDebugKeyLookup is enabled!");
540    }
541    if (debugBaseURL == -1) {
542 -    debugBaseURL = [[NSUserDefaults standardUserDefaults]
543 -                                    boolForKey:@"SoDebugBaseURL"] ? 1 : 0;
544 +    debugBaseURL = [ud boolForKey:@"SoDebugBaseURL"] ? 1 : 0;
545      NSLog(@"Note(SoObject): SoDebugBaseURL is enabled!");
546    }
547    if (useRelativeURLs == -1) {
548 -    useRelativeURLs = [[NSUserDefaults standardUserDefaults]
549 -                                      boolForKey:@"WOUseRelativeURLs"] ?1:0;
550 +    useRelativeURLs = [ud boolForKey:@"WOUseRelativeURLs"] ?1:0;
551      NSLog(@"Note(SoObject): relative base URLs are enabled.");
552    }
553 +  if (redirectInitted == -1) {
554 +    url = [ud stringForKey:@"WOApplicationRedirectURL"];
555 +    if ([url length]) {
556 +      redirectURL = [[NSURL alloc] initWithString: url];
557 +    }
558 +    redirectInitted = 1;
559 +  }
560  }
561  
562  /* classes */
563 @@ -318,56 +330,61 @@
564    
565    rq = [_ctx request];
566    ms = [[NSMutableString alloc] initWithCapacity:128];
567 +
568 +  if (redirectURL) {
569 +    [ms appendString: [redirectURL absoluteString]];
570 +  }
571 +  else {  
572 +    if (!useRelativeURLs) {
573 +      port = [[rq headerForKey:@"x-webobjects-server-port"] intValue];
574    
575 -  if (!useRelativeURLs) {
576 -    port = [[rq headerForKey:@"x-webobjects-server-port"] intValue];
577 -  
578 -    /* this is actually a bug in Apache */
579 -    if (port == 0) {
580 -      static BOOL didWarn = NO;
581 -      if (!didWarn) {
582 -       [self warnWithFormat:@"(%s:%i): got an empty port from Apache!",
583 -              __PRETTY_FUNCTION__, __LINE__];
584 -       didWarn = YES;
585 +      /* this is actually a bug in Apache */
586 +      if (port == 0) {
587 +       static BOOL didWarn = NO;
588 +       if (!didWarn) {
589 +         [self warnWithFormat:@"(%s:%i): got an empty port from Apache!",
590 +               __PRETTY_FUNCTION__, __LINE__];
591 +         didWarn = YES;
592 +       }
593 +       port = 80;
594        }
595 -      port = 80;
596 -    }
597    
598 -    if ((tmp = [rq headerForKey:@"host"]) != nil) { 
599 -      /* check whether we have a host header with port */
600 -      if ([tmp rangeOfString:@":"].length == 0)
601 -       tmp = nil;
602 -    }
603 -    if (tmp != nil) { /* we have a host header with port */
604 -      isHTTPS = 
605 -       [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"];
606 -      [ms appendString:isHTTPS ? @"https://" : @"http://"]; 
607 -      [ms appendString:tmp];
608 -    }
609 -    else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) {
610 -      /* sometimes the URL is just wrong! (suggests port 80) */
611 -      if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad
612 -       [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'",
613 -             __PRETTY_FUNCTION__, tmp];
614 -       tmp = [tmp substringToIndex:([tmp length] - 2)];
615 +      if ((tmp = [rq headerForKey:@"host"]) != nil) { 
616 +       /* check whether we have a host header with port */
617 +       if ([tmp rangeOfString:@":"].length == 0)
618 +         tmp = nil;
619        }
620 -      else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) {
621 -       /* see OGo bug #1435, Debian Apache hack */
622 -       [self warnWithFormat:@"%s: got 'http' protocol but 443 port, "
623 -             @"assuming Debian/Apache bug (OGo #1435): '%@'",
624 -             __PRETTY_FUNCTION__, tmp];
625 -       tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)];
626 -       tmp = [@"https" stringByAppendingString:tmp];
627 +      if (tmp != nil) { /* we have a host header with port */
628 +       isHTTPS = 
629 +         [[rq headerForKey:@"x-webobjects-server-url"] hasPrefix:@"https"];
630 +       [ms appendString:isHTTPS ? @"https://" : @"http://"]; 
631 +       [ms appendString:tmp];
632        }
633 -      [ms appendString:tmp];
634 -    }
635 -    else {
636 -      // TODO: isHTTPS always no in this case?
637 -      [ms appendString:isHTTPS ? @"https://" : @"http://"]; 
638 +      else if ((tmp = [rq headerForKey:@"x-webobjects-server-url"]) != nil) {
639 +       /* sometimes the URL is just wrong! (suggests port 80) */
640 +       if ([tmp hasSuffix:@":0"] && [tmp length] > 2) { // TODO: bad bad bad
641 +         [self warnWithFormat:@"%s: got incorrect URL from Apache: '%@'",
642 +               __PRETTY_FUNCTION__, tmp];
643 +         tmp = [tmp substringToIndex:([tmp length] - 2)];
644 +       }
645 +       else if ([tmp hasSuffix:@":443"] && [tmp hasPrefix:@"http://"]) {
646 +         /* see OGo bug #1435, Debian Apache hack */
647 +         [self warnWithFormat:@"%s: got 'http' protocol but 443 port, "
648 +               @"assuming Debian/Apache bug (OGo #1435): '%@'",
649 +               __PRETTY_FUNCTION__, tmp];
650 +         tmp = [tmp substringWithRange:NSMakeRange(4, [tmp length] - 4 - 4)];
651 +         tmp = [@"https" stringByAppendingString:tmp];
652 +       }
653 +       [ms appendString:tmp];
654 +      }
655 +      else {
656 +       // TODO: isHTTPS always no in this case?
657 +       [ms appendString:isHTTPS ? @"https://" : @"http://"]; 
658    
659 -      [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]];
660 -      if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0)
661 -       [ms appendFormat:@":%i", port];
662 +       [ms appendString:[rq headerForKey:@"x-webobjects-server-name"]];
663 +       if ((isHTTPS ? (port != 443) : (port != 80)) && port != 0)
664 +         [ms appendFormat:@":%i", port];
665 +      }
666      }
667    }
668    
669 Index: sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m
670 ===================================================================
671 --- sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m   (révision 1546)
672 +++ sope-appserver/NGObjWeb/WOHttpAdaptor/WOHttpTransaction.m   (copie de travail)
673 @@ -31,6 +31,7 @@
674  #include <NGObjWeb/WOCookie.h>
675  #include <NGExtensions/NSData+gzip.h>
676  #include <NGHttp/NGHttp.h>
677 +#include <NGMime/NGMimeType.h>
678  #include "common.h"
679  
680  #include <string.h>
681 @@ -1016,6 +1017,12 @@
682  - (void)parser:(NGMimePartParser *)_parser didParseHeader:(NGHashMap *)_header {
683  }
684  
685 +- (NGMimeType *)parser:(id)_parser
686 +  contentTypeOfPart:(id<NGMimePart>)_part
687 +{
688 +  return [NGMimeType mimeType: @"text/plain; charset=utf-8"];
689 +}
690 +
691  @end /* WOHttpAdaptor */
692  
693  @implementation WOCoreApplication(SimpleParserSelection)