@@ -37,23 +37,79 @@ public class PerplexityApiSwift {
37
37
frequencyPenalty: 1
38
38
)
39
39
40
- request. httpBody = try JSONEncoder ( ) . encode ( body)
40
+ // Log request details
41
+ print ( " Request URL: \( url) " )
42
+ print ( " Request Headers: " )
43
+ request. allHTTPHeaderFields? . forEach { key, value in
44
+ print ( " \( key) : \( value) " )
45
+ }
46
+
47
+ do {
48
+ let encoder = JSONEncoder ( )
49
+ encoder. outputFormatting = . prettyPrinted
50
+ let jsonData = try encoder. encode ( body)
51
+ request. httpBody = jsonData
52
+
53
+ print ( " Request Body: " )
54
+ if let jsonString = String ( data: jsonData, encoding: . utf8) {
55
+ print ( jsonString)
56
+ }
57
+ } catch {
58
+ throw PerplexityError . encodingError ( error)
59
+ }
41
60
42
61
let ( data, response) = try await URLSession . shared. data ( for: request)
43
62
44
- guard let httpResponse = response as? HTTPURLResponse , 200 ... 299 ~= httpResponse. statusCode else {
45
- throw PerplexityError . invalidResponse ( statusCode: ( response as? HTTPURLResponse ) ? . statusCode ?? 500 )
63
+ guard let httpResponse = response as? HTTPURLResponse else {
64
+ throw PerplexityError . invalidResponse ( statusCode: 0 )
65
+ }
66
+
67
+ print ( " Response Status Code: \( httpResponse. statusCode) " )
68
+ print ( " Response Headers: " )
69
+ httpResponse. allHeaderFields. forEach { key, value in
70
+ print ( " \( key) : \( value) " )
71
+ }
72
+
73
+ print ( " Response Body: " )
74
+ if let responseString = String ( data: data, encoding: . utf8) {
75
+ print ( responseString)
46
76
}
47
77
48
- let perplexityResponse = try JSONDecoder ( ) . decode ( PerplexityResponse . self, from: data)
49
- return perplexityResponse
78
+ if !( 200 ... 299 ) . contains ( httpResponse. statusCode) {
79
+ throw PerplexityError . apiError ( statusCode: httpResponse. statusCode, data: data)
80
+ }
81
+
82
+ do {
83
+ let perplexityResponse = try JSONDecoder ( ) . decode ( PerplexityResponse . self, from: data)
84
+ return perplexityResponse
85
+ } catch {
86
+ throw PerplexityError . decodingError ( error)
87
+ }
50
88
}
51
89
}
52
90
53
91
// MARK: - Error Handling
54
92
55
- public enum PerplexityError : Error {
93
+ public enum PerplexityError : Error , LocalizedError {
56
94
case tokenNotSet
57
95
case invalidResponse( statusCode: Int )
58
- case invalidResponseFormat
96
+ case apiError( statusCode: Int , data: Data )
97
+ case encodingError( Error )
98
+ case decodingError( Error )
99
+
100
+ public var errorDescription : String ? {
101
+ switch self {
102
+ case . tokenNotSet:
103
+ return " API token not set "
104
+ case . invalidResponse( let statusCode) :
105
+ return " Invalid response (Status \( statusCode) ) "
106
+ case . apiError( let statusCode, let data) :
107
+ let message = String ( data: data, encoding: . utf8) ?? " No error message "
108
+ return " API error (Status \( statusCode) ): \( message) "
109
+ case . encodingError( let error) :
110
+ return " Error encoding request: \( error. localizedDescription) "
111
+ case . decodingError( let error) :
112
+ return " Error decoding response: \( error. localizedDescription) "
113
+ }
114
+ }
59
115
}
0 commit comments