By continuing from this question ,
I am trying to convert [String : Any]
into String
and then passing that String
into forHTTPHeaderField
Attempt 1: Without Pretty
let encoder = JSONEncoder()
if let json = try? encoder.encode(jsonDict) {
convertedString = String(data: json, encoding: .utf8)!
}
print("JsonStringFormat ", convertedString )
let url = NSURL(string: getMenuURL)
let request = NSMutableURLRequest(url: url! as URL)
request.setValue(convertedString, forHTTPHeaderField: "SessionInfo")
print("\nHEADer__reQQ__ ", request.allHTTPHeaderFields)
OUTPUT:
JsonStringFormat {"Token":"96FFC5B994514B3D","UICulture":"en-CA ","LanguageCode":"ENG","CompanyID":"QAP","IMEINo":"1jzBG3TSrMzj\/tKihlEv8g=="}
HEADer__reQQ__ ["SessionInfo": "{\"Token\":\"96FFC5B994514B3D\",\"LanguageCode\":\"ENG\",\"UICulture\":\"en-CA \",\"CompanyID\":\"QAP\",\"IMEINo\":\"1jzBG3TSrMzj\\/tKihlEv8g==\"}"]
Attempt 2: With .pretty printed
let encoder = JSONEncoder()
// ADDING PRETTY FORMAT
encoder.outputFormatting = .prettyPrinted
if let json = try? encoder.encode(jsonDict) {
convertedString = String(data: json, encoding: .utf8)!
}
print("PrettyJsonStringFormat ", convertedString )
let url = NSURL(string: getMenuURL)
let request = NSMutableURLRequest(url: url! as URL)
request.setValue(convertedString, forHTTPHeaderField: "SessionInfo")
print("\nPrettyHeader__ ", request.allHTTPHeaderFields)
OUTPUT:
PrettyJsonStringFormat {
"Token" : "70E277954143414A",
"UICulture" : "en-CA ",
"LanguageCode" : "ENG",
"CompanyID" : "QAP",
"IMEINo" : "1jzBG3TSrMzj\/tKihlEv8g=="
}
PrettyHeader__ [:]
If I go with Attempt 1, BackSlash \
is appending in that value. To avoid that I go with Attempt 2, [Pretty Printed]
.
I don't know why request.allHTTPHeaderFields
not having that added header values.
Kindly guide me.
That's because convertedString
in Attempt2
has multiple line.
RFC says header field value having multiple lines are deprecated.
Historically, HTTP header field values could be extended over multiple lines by preceding each extra line with at least one space or horizontal tab (obs-fold). This specification deprecates such line folding except within the message/http media type (Section 8.3.1). A sender MUST NOT generate a message that includes line folding (i.e., that has any field-value that contains a match to the obs-fold rule) unless the message is intended for packaging within the message/http media type.
And, setValue(_:forHTTPHeaderField:)
seems to ignore such values.
// This does nothing. Just ignoring the value "A\nB"
request.setValue("A\nB", forHTTPHeaderField: "C")
In addition, backslash in Attempt1
will have no problem. The server that receives the request will handle the value properly.