1
0

HttpResponse.swift 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. //
  2. // HttpResponse.swift
  3. // Swifter
  4. // Copyright (c) 2014 Damian Kołakowski. All rights reserved.
  5. //
  6. import Foundation
  7. enum HttpResponseBody {
  8. case JSON(AnyObject)
  9. case XML(AnyObject)
  10. case PLIST(AnyObject)
  11. case HTML(String)
  12. case RAW(String)
  13. func data() -> String? {
  14. switch self {
  15. case .JSON(let object):
  16. if NSJSONSerialization.isValidJSONObject(object) {
  17. var serializationError: NSError?
  18. if let json = NSJSONSerialization.dataWithJSONObject(object, options: NSJSONWritingOptions.PrettyPrinted, error: &serializationError) {
  19. if let nsString = NSString(data: json, encoding: NSUTF8StringEncoding) {
  20. return nsString as String
  21. }
  22. }
  23. return "Serialisation error: \(serializationError)"
  24. }
  25. return "Invalid object to serialise."
  26. case .XML(let data):
  27. return "XML serialization not supported."
  28. case .PLIST(let object):
  29. let format = NSPropertyListFormat.XMLFormat_v1_0
  30. if NSPropertyListSerialization.propertyList(object, isValidForFormat: format) {
  31. var serializationError: NSError?
  32. if let plist = NSPropertyListSerialization.dataWithPropertyList(object, format: format, options: 0, error: &serializationError) {
  33. if let nsString = NSString(data: plist, encoding: NSUTF8StringEncoding) {
  34. return nsString as String
  35. }
  36. }
  37. return "Serialisation error: \(serializationError)"
  38. }
  39. return "Invalid object to serialise."
  40. case .RAW(let body):
  41. return body
  42. case .HTML(let body):
  43. return "<html><body>\(body)</body></html>"
  44. }
  45. }
  46. }
  47. enum HttpResponse {
  48. case OK(HttpResponseBody), Created, Accepted
  49. case MovedPermanently(String)
  50. case BadRequest, Unauthorized, Forbidden, NotFound
  51. case InternalServerError
  52. case RAW(Int, NSData)
  53. func statusCode() -> Int {
  54. switch self {
  55. case .OK(_) : return 200
  56. case .Created : return 201
  57. case .Accepted : return 202
  58. case .MovedPermanently : return 301
  59. case .BadRequest : return 400
  60. case .Unauthorized : return 401
  61. case .Forbidden : return 403
  62. case .NotFound : return 404
  63. case .InternalServerError : return 500
  64. case .RAW(let code, _) : return code
  65. }
  66. }
  67. func reasonPhrase() -> String {
  68. switch self {
  69. case .OK(_) : return "OK"
  70. case .Created : return "Created"
  71. case .Accepted : return "Accepted"
  72. case .MovedPermanently : return "Moved Permanently"
  73. case .BadRequest : return "Bad Request"
  74. case .Unauthorized : return "Unauthorized"
  75. case .Forbidden : return "Forbidden"
  76. case .NotFound : return "Not Found"
  77. case .InternalServerError : return "Internal Server Error"
  78. case .RAW(_,_) : return "Custom"
  79. }
  80. }
  81. func headers() -> [String: String] {
  82. var headers = [String:String]()
  83. headers["Server"] = "Swifter"
  84. switch self {
  85. case .MovedPermanently(let location) : headers["Location"] = location
  86. default:[]
  87. }
  88. return headers
  89. }
  90. func body() -> NSData? {
  91. switch self {
  92. case .OK(let body) : return body.data()?.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)
  93. case .RAW(_, let data) : return data
  94. default : return nil
  95. }
  96. }
  97. }