Author: rfm
Date: Fri Jun 17 14:36:20 2016
New Revision: 39873

URL: http://svn.gna.org/viewcvs/gnustep?rev=39873&view=rev
Log:
Try to ensure that headers with non-ascii characters are encoded properly (and 
at least don't cause an exception).

Modified:
    libs/base/trunk/ChangeLog
    libs/base/trunk/Source/GSHTTPURLHandle.m
    libs/base/trunk/Source/NSURLProtocol.m

Modified: libs/base/trunk/ChangeLog
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/ChangeLog?rev=39873&r1=39872&r2=39873&view=diff
==============================================================================
--- libs/base/trunk/ChangeLog   (original)
+++ libs/base/trunk/ChangeLog   Fri Jun 17 14:36:20 2016
@@ -1,3 +1,10 @@
+2016-06-17  Richard Frith-Macdonald <[email protected]>
+
+       * Source/GSHTTPURLHandle.m:
+       * Source/NSURLprotocol.m:
+       When sending HTTP headers, use RFC2047 rules (as specified in HTTP/1.1
+       RFC2616) to encode non-ascii characters.
+
 2016-06-17  Niels Grewe <[email protected]>
 
        * Headers/Foundation/NSRegularExpression.h

Modified: libs/base/trunk/Source/GSHTTPURLHandle.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/GSHTTPURLHandle.m?rev=39873&r1=39872&r2=39873&view=diff
==============================================================================
--- libs/base/trunk/Source/GSHTTPURLHandle.m    (original)
+++ libs/base/trunk/Source/GSHTTPURLHandle.m    Fri Jun 17 14:36:20 2016
@@ -547,15 +547,20 @@
        }
     }
 
+  buf = [[s dataUsingEncoding: NSISOLatin1StringEncoding] mutableCopy];
+
   enumerator = NSEnumerateMapTable(wProperties);
   while (NSNextMapEnumeratorPair(&enumerator, (void **)(&key), (void**)&val))
     {
-      [s appendFormat: @"%@: %@\r\n", key, val];
+      GSMimeHeader      *h;
+
+      h = [[GSMimeHeader alloc] initWithName: key value: val parameters: nil];
+      [buf appendData: [h rawMimeDataPreservingCase: YES foldedAt: 0]];
+      RELEASE(h);
     }
   NSEndMapTableEnumeration(&enumerator);
 
-  [s appendString: @"\r\n"];
-  buf = [[s dataUsingEncoding: NSASCIIStringEncoding] mutableCopy];
+  [buf appendBytes: "\r\n" length: 2];
 
   /*
    * Append any data to be sent

Modified: libs/base/trunk/Source/NSURLProtocol.m
URL: 
http://svn.gna.org/viewcvs/gnustep/libs/base/trunk/Source/NSURLProtocol.m?rev=39873&r1=39872&r2=39873&view=diff
==============================================================================
--- libs/base/trunk/Source/NSURLProtocol.m      (original)
+++ libs/base/trunk/Source/NSURLProtocol.m      Fri Jun 17 14:36:20 2016
@@ -1428,11 +1428,11 @@
     }
   else if (stream == this->output)
     {
-      switch(event)
+      switch (event)
        {
          case NSStreamEventOpenCompleted: 
            {
-             NSMutableString   *m;
+             NSMutableData     *m;
              NSDictionary      *d;
              NSEnumerator      *e;
              NSString          *s;
@@ -1459,39 +1459,46 @@
                  _shouldClose = YES;
                }
 
-             m = [[NSMutableString alloc] initWithCapacity: 1024];
+             m = [[NSMutableData alloc] initWithCapacity: 1024];
 
              /* The request line is of the form:
               * method /path?query HTTP/version
               * where the query part may be missing
               */
-             [m appendString: [this->request HTTPMethod]];
-             [m appendString: @" "];
+             [m appendData: [[this->request HTTPMethod]
+                dataUsingEncoding: NSASCIIStringEncoding]];
+             [m appendBytes: " " length: 1];
              u = [this->request URL];
              s = [[u fullPath] stringByAddingPercentEscapesUsingEncoding:
                NSUTF8StringEncoding];
              if ([s hasPrefix: @"/"] == NO)
                {
-                 [m appendString: @"/"];
-               }
-             [m appendString: s];
+                 [m appendBytes: "/" length: 1];
+               }
+             [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]];
              s = [u query];
              if ([s length] > 0)
                {
-                 [m appendString: @"?"];
-                 [m appendString: s];
-               }
-             [m appendFormat: @" HTTP/%0.1f\r\n", _version];
+                 [m appendBytes: "?" length: 1];
+                 [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]];
+               }
+             s = [NSString stringWithFormat: @" HTTP/%0.1f\r\n", _version];
+             [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]];
 
              d = [this->request allHTTPHeaderFields];
              e = [d keyEnumerator];
              while ((s = [e nextObject]) != nil)
                {
-                 [m appendString: s];
-                 [m appendString: @": "];
-                 [m appendString: [d objectForKey: s]];
-                 [m appendString: @"\r\n"];
-               }
+                  GSMimeHeader      *h;
+
+                  h = [[GSMimeHeader alloc] initWithName: s
+                                                   value: [d objectForKey: s]
+                                              parameters: nil];
+                  [m appendData:
+                    [h rawMimeDataPreservingCase: YES foldedAt: 0]];
+                  RELEASE(h);
+               }
+
              /* Use valueForHTTPHeaderField: to check for content-type
               * header as that does a case insensitive comparison and
               * we therefore won't end up adding a second header by
@@ -1502,8 +1509,9 @@
                  @"Content-Type"] == nil)
                {
                  /* On MacOSX, this is automatically added to POST methods */
-                 [m appendString:
-                   @"Content-Type: application/x-www-form-urlencoded\r\n"];
+                  static char   ct[]
+                    = "Content-Type: application/x-www-form-urlencoded\r\n";
+                 [m appendBytes: ct length: sizeof(ct)];
                }
              if ([this->request valueForHTTPHeaderField: @"Host"] == nil)
                {
@@ -1527,21 +1535,22 @@
                     }
                  if (nil == p)
                    {
-                     [m appendFormat: @"Host: %@\r\n", h];
+                     s = [NSString stringWithFormat: @"Host: %@\r\n", h];
                    }
                  else
                    {
-                     [m appendFormat: @"Host: %@:%@\r\n", h, p];
+                     s = [NSString stringWithFormat: @"Host: %@:%@\r\n", h, p];
                    }
+                  [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]];
                }
              if (l >= 0 && [this->request
                valueForHTTPHeaderField: @"Content-Length"] == nil)
                {
-                 [m appendFormat: @"Content-Length: %d\r\n", l];
-               }
-             [m appendString: @"\r\n"];        // End of headers
-             _writeData = RETAIN([m dataUsingEncoding: NSASCIIStringEncoding]);
-             RELEASE(m);
+                  s = [NSString stringWithFormat: @"Content-Length: %d\r\n", 
l];
+                  [m appendData: [s dataUsingEncoding: NSASCIIStringEncoding]];
+               }
+             [m appendBytes: "\r\n" length: 2];        // End of headers
+             _writeData  = m;
            }                   // Fall through to do the write
 
          case NSStreamEventHasSpaceAvailable: 


_______________________________________________
Gnustep-cvs mailing list
[email protected]
https://mail.gna.org/listinfo/gnustep-cvs

Reply via email to