0001 import Vaquita
0002
0003 class JSONParser| Application.swift:33 | use(middleware: JSONParser()) |
: Middleware {
0004
0005 func handle(request: Request, response: Response, next: () -> ()) {
0006
0007 defer { next() }
0008
0009 guard let contentTypeHeader = request.headers["content-type"] else {
0010 return
0011 }
0012
0013 let contentTypeTokens = contentTypeHeader.split(";").map { $0.trim() }
0014 guard let contentType = contentTypeTokens.first where
0015 contentType == "application/json" else { return }
0016
0017 do {
0018
0019 let jsonString = try request.body.toString()
0020 let json = parseJsonString(jsonString)
0021
0022 for (key, value) in json {
0023 request.data[key] = value
0024 }
0025 } catch {
0026
0027 }
0028 }
0029
0030
0031 func boolValue| BodyParser.swift:211 | return boolValue(string: string) |
(string string: String) -> Bool {
0032 return string == "true"
0033 }
0034
0035 func isBoolValue| BodyParser.swift:210 | } else if isBoolValue(string: string) { |
(string string: String) -> Bool {
0036 return string == "true" || string == "false"
0037 }
0038
0039 func isDoubleValue| BodyParser.swift:212 | } else if isDoubleValue(string: string) { |
(string string: String) -> Bool {
0040 return string.containsString(".")
0041 }
0042
0043 func isStringValue| BodyParser.swift:207 | if isStringValue(string: string) { |
(string string: String) -> Bool {
0044 return (string.hasPrefix("'") && string.hasSuffix("'")) || (string.hasPrefix("\"") && string.hasSuffix("\""))
0045 }
0046
0047 func cleanString| BodyParser.swift:115 | key = cleanString(buffer.trim()) |
| BodyParser.swift:208 | let value = cleanString(string) |
(string: String) -> String {
0048 if (string.hasPrefix("'") && string.hasSuffix("'")) || (string.hasPrefix("\"") && string.hasSuffix("\"")) {
0049 var value = string
0050 value.removeAtIndex(value.startIndex)
0051 value.removeAtIndex(value.endIndex.predecessor())
0052 return value
0053 } else {
0054 return string
0055 }
0056 }
0057
0058 func splitIntoKeyValues| BodyParser.swift:148 | let pairs = splitIntoKeyValues(string) |
(string: String) -> [(key: String?, value: String?)] {
0059
0060 var pairs = [(key: String?, value: String?)]()
0061
0062 var string = string
0063 if string.hasPrefix("{") {
0064 string.removeAtIndex(string.startIndex)
0065 }
0066
0067 if string.hasSuffix("}") {
0068 string.removeAtIndex(string.endIndex.predecessor())
0069 }
0070
0071 let characters = string.characters
0072
0073 var key: String? = nil
0074
0075 var inString = false
0076 var inObject = false
0077 var objectLevel = 0
0078 var arrayLevel = 0
0079
0080 var buffer = ""
0081
0082 var escapeCharacter = false
0083
0084 for c in characters {
0085
0086 if c == "{" {
0087
0088 inObject = true
0089
0090 objectLevel += 1
0091 }
0092
0093 if c == "}" {
0094
0095 objectLevel -= 1
0096
0097 inObject = objectLevel != 0
0098 }
0099
0100 if c == "[" {
0101 arrayLevel += 1
0102 }
0103
0104 if c == "]" {
0105 arrayLevel -= 1
0106 }
0107
0108
0109 if c == "\"" || c == "'" && !escapeCharacter {
0110 inString = !inString
0111 }
0112
0113 if c == ":" && !inString && key == nil && !inObject && arrayLevel == 0 {
0114 if key == nil {
0115 key = cleanString(buffer.trim())
0116 }
0117 buffer = ""
0118 } else if c == "," && !inString && !inObject && arrayLevel == 0 {
0119 pairs.append((key: key, value: buffer.trim()))
0120 buffer = ""
0121 key = nil
0122 } else {
0123 buffer.append(c)
0124 }
0125
0126 if escapeCharacter {
0127 escapeCharacter = false
0128 }
0129
0130 if c == "\\" {
0131 escapeCharacter = true
0132 }
0133 }
0134
0135 if let key = key {
0136 pairs.append((key: key, value: buffer.trim()))
0137 }
0138
0139
0140
0141 return pairs
0142
0143 }
0144
0145 func parseJsonString| BodyParser.swift:157 | json[key] = parseJsonString(value) |
| BodyParser.swift:186 | value = parseJsonString(component) |
(string: String) -> [String: Any] {
0146 var json = [String: Any]()
0147
0148 let pairs = splitIntoKeyValues(string)
0149
0150 for pair in pairs {
0151 if let key = pair.key, value = pair.value {
0152 if let value = valueForProperty(value) {
0153 json[key] = value
0154 } else if let value = arrayForString(value) {
0155 json[key] = value
0156 } else {
0157 json[key] = parseJsonString(value)
0158 }
0159 }
0160 }
0161
0162 return json
0163 }
0164
0165 func arrayForString| BodyParser.swift:154 | } else if let value = arrayForString(value) { |
(string: String) -> [Any]? {
0166
0167 var string = string
0168
0169 if !string.hasPrefix("[") {
0170 return nil
0171 } else {
0172 string.removeAtIndex(string.startIndex)
0173 }
0174
0175 if string.hasSuffix("]") {
0176 string.removeAtIndex(string.endIndex.predecessor())
0177 }
0178
0179 var array = [Any]()
0180 let components = string.componentsSeparatedByString(",")
0181
0182 for component in components {
0183 let component = component.trim()
0184 let value: Any?
0185 if component.hasPrefix("{") {
0186 value = parseJsonString(component)
0187 } else {
0188 value = valueForProperty(component)
0189 }
0190
0191 if let value = value {
0192 array.append(value)
0193 }
0194 }
0195 return array
0196 }
0197
0198 func valueForProperty| BodyParser.swift:152 | if let value = valueForProperty(value) { |
| BodyParser.swift:188 | value = valueForProperty(component) |
(string: String) -> Any? {
0199 if string.hasPrefix("{") {
0200 return nil
0201 }
0202
0203 if string.hasPrefix("[") {
0204 return nil
0205 }
0206
0207 if isStringValue(string: string) {
0208 let value = cleanString(string)
0209 return value
0210 } else if isBoolValue(string: string) {
0211 return boolValue(string: string)
0212 } else if isDoubleValue(string: string) {
0213 return Double(string)
0214 } else if let value = Int(string) {
0215 return value
0216 }
0217
0218 return nil
0219 }
0220
0221
0222 }
0223