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