Skip to content
Snippets Groups Projects
Commit 6697e7f9 authored by Jorge Canizales's avatar Jorge Canizales
Browse files

Don’t append -bin automatically to binary request headers.

parent bbba491b
No related branches found
No related tags found
No related merge requests found
...@@ -40,8 +40,8 @@ ...@@ -40,8 +40,8 @@
@interface NSData (GRPCMetadata) @interface NSData (GRPCMetadata)
+ (instancetype)grpc_dataFromMetadataValue:(grpc_metadata *)metadata; + (instancetype)grpc_dataFromMetadataValue:(grpc_metadata *)metadata;
// Fill a metadata object with the binary value in this NSData and the given key. // Fill a metadata object with the binary value in this NSData.
- (void)grpc_initMetadata:(grpc_metadata *)metadata withKey:(NSString *)key; - (void)grpc_initMetadata:(grpc_metadata *)metadata;
@end @end
@implementation NSData (GRPCMetadata) @implementation NSData (GRPCMetadata)
...@@ -50,9 +50,7 @@ ...@@ -50,9 +50,7 @@
return [self dataWithBytes:metadata->value length:metadata->value_length]; return [self dataWithBytes:metadata->value length:metadata->value_length];
} }
- (void)grpc_initMetadata:(grpc_metadata *)metadata withKey:(NSString *)key { - (void)grpc_initMetadata:(grpc_metadata *)metadata {
// TODO(jcanizales): Encode Unicode chars as ASCII.
metadata->key = [key stringByAppendingString:@"-bin"].UTF8String;
metadata->value = self.bytes; metadata->value = self.bytes;
metadata->value_length = self.length; metadata->value_length = self.length;
} }
...@@ -63,8 +61,8 @@ ...@@ -63,8 +61,8 @@
@interface NSString (GRPCMetadata) @interface NSString (GRPCMetadata)
+ (instancetype)grpc_stringFromMetadataValue:(grpc_metadata *)metadata; + (instancetype)grpc_stringFromMetadataValue:(grpc_metadata *)metadata;
// Fill a metadata object with the textual value in this NSString and the given key. // Fill a metadata object with the textual value in this NSString.
- (void)grpc_initMetadata:(grpc_metadata *)metadata withKey:(NSString *)key; - (void)grpc_initMetadata:(grpc_metadata *)metadata;
@end @end
@implementation NSString (GRPCMetadata) @implementation NSString (GRPCMetadata)
...@@ -74,22 +72,8 @@ ...@@ -74,22 +72,8 @@
encoding:NSASCIIStringEncoding]; encoding:NSASCIIStringEncoding];
} }
- (void)grpc_initMetadata:(grpc_metadata *)metadata withKey:(NSString *)key { // Precondition: This object contains only ASCII characters.
if ([key hasSuffix:@"-bin"]) { - (void)grpc_initMetadata:(grpc_metadata *)metadata {
// Disallow this, as at best it will confuse the server. If the app really needs to send a
// textual header with a name ending in "-bin", it can be done by removing the suffix and
// encoding the NSString as a NSData object.
//
// Why raise an exception: In the most common case, the developer knows this won't happen in
// their code, so the exception isn't triggered. In the rare cases when the developer can't
// tell, it's easy enough to add a sanitizing filter before the header is set. There, the
// developer can choose whether to drop such a header, or trim its name. Doing either ourselves,
// silently, would be very unintuitive for the user.
[NSException raise:NSInvalidArgumentException
format:@"Metadata keys ending in '-bin' are reserved for NSData values."];
}
// TODO(jcanizales): Encode Unicode chars as ASCII.
metadata->key = key.UTF8String;
metadata->value = self.UTF8String; metadata->value = self.UTF8String;
metadata->value_length = self.length; metadata->value_length = self.length;
} }
...@@ -124,19 +108,21 @@ ...@@ -124,19 +108,21 @@
return metadata; return metadata;
} }
// Preconditions: All keys are ASCII strings. Keys ending in -bin have NSData values; the others
// have NSString values.
- (grpc_metadata *)grpc_metadataArray { - (grpc_metadata *)grpc_metadataArray {
grpc_metadata *metadata = gpr_malloc([self count] * sizeof(grpc_metadata)); grpc_metadata *metadata = gpr_malloc([self count] * sizeof(grpc_metadata));
int i = 0; grpc_metadata *current = metadata;
for (id key in self) { for (NSString* key in self) {
id value = self[key]; id value = self[key];
grpc_metadata *current = &metadata[i]; current->key = key.UTF8String;
if ([value respondsToSelector:@selector(grpc_initMetadata:withKey:)]) { if ([value respondsToSelector:@selector(grpc_initMetadata:)]) {
[value grpc_initMetadata:current withKey:key]; [value grpc_initMetadata:current];
} else { } else {
[NSException raise:NSInvalidArgumentException [NSException raise:NSInvalidArgumentException
format:@"Metadata values must be NSString or NSData."]; format:@"Metadata values must be NSString or NSData."];
} }
i += 1; ++current;
} }
return metadata; return metadata;
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment