@@ -2,10 +2,11 @@ use std::sync::atomic::{AtomicBool, Ordering};
2
2
use std:: sync:: mpsc:: { sync_channel, Receiver , SyncSender } ;
3
3
use std:: sync:: { Arc , Condvar , Mutex } ;
4
4
use std:: thread:: { self , JoinHandle } ;
5
- use std:: time:: { Duration , Instant , SystemTime } ;
5
+ use std:: time:: { Duration , SystemTime } ;
6
6
7
- use reqwest:: header:: { Headers , RetryAfter } ;
8
- use reqwest:: { Client , Proxy , StatusCode } ;
7
+ use httpdate:: parse_http_date;
8
+ use reqwest:: header:: RETRY_AFTER ;
9
+ use reqwest:: { Client , Proxy } ;
9
10
10
11
use api:: protocol:: Event ;
11
12
use client:: ClientOptions ;
@@ -109,6 +110,16 @@ pub struct HttpTransport {
109
110
_handle : Option < JoinHandle < ( ) > > ,
110
111
}
111
112
113
+ fn parse_retry_after ( s : & str ) -> Option < SystemTime > {
114
+ if let Ok ( value) = s. parse :: < f64 > ( ) {
115
+ Some ( SystemTime :: now ( ) + Duration :: from_secs ( value. ceil ( ) as u64 ) )
116
+ } else if let Ok ( value) = parse_http_date ( s) {
117
+ Some ( value)
118
+ } else {
119
+ None
120
+ }
121
+ }
122
+
112
123
fn spawn_http_sender (
113
124
client : Client ,
114
125
receiver : Receiver < Option < Event < ' static > > > ,
@@ -118,7 +129,7 @@ fn spawn_http_sender(
118
129
queue_size : Arc < Mutex < usize > > ,
119
130
user_agent : String ,
120
131
) -> JoinHandle < ( ) > {
121
- let mut disabled: Option < ( Instant , RetryAfter ) > = None ;
132
+ let mut disabled = SystemTime :: now ( ) ;
122
133
123
134
thread:: spawn ( move || {
124
135
let url = dsn. store_api_url ( ) . to_string ( ) ;
@@ -133,39 +144,25 @@ fn spawn_http_sender(
133
144
}
134
145
135
146
// while we are disabled due to rate limits, skip
136
- match disabled {
137
- Some ( ( disabled_at, RetryAfter :: Delay ( disabled_for) ) ) => {
138
- if disabled_at. elapsed ( ) > disabled_for {
139
- disabled = None ;
140
- } else {
141
- continue ;
142
- }
143
- }
144
- Some ( ( _, RetryAfter :: DateTime ( wait_until) ) ) => {
145
- if SystemTime :: from ( wait_until) > SystemTime :: now ( ) {
146
- disabled = None ;
147
- } else {
148
- continue ;
149
- }
150
- }
151
- None => { }
147
+ if disabled > SystemTime :: now ( ) {
148
+ continue ;
152
149
}
153
150
154
- let auth = dsn. to_auth ( Some ( & user_agent) ) ;
155
- let mut headers = Headers :: new ( ) ;
156
- headers. set_raw ( "X-Sentry-Auth" , auth. to_string ( ) ) ;
157
-
158
151
if let Ok ( resp) = client
159
152
. post ( url. as_str ( ) )
160
153
. json ( & event)
161
- . headers ( headers )
154
+ . header ( "X-Sentry-Auth" , dsn . to_auth ( Some ( & user_agent ) ) . to_string ( ) )
162
155
. send ( )
163
156
{
164
- if resp. status ( ) == StatusCode :: TooManyRequests {
165
- disabled = resp
157
+ if resp. status ( ) == 429 {
158
+ if let Some ( retry_after ) = resp
166
159
. headers ( )
167
- . get :: < RetryAfter > ( )
168
- . map ( |x| ( Instant :: now ( ) , * x) ) ;
160
+ . get ( RETRY_AFTER )
161
+ . and_then ( |x| x. to_str ( ) . ok ( ) )
162
+ . and_then ( parse_retry_after)
163
+ {
164
+ disabled = retry_after;
165
+ }
169
166
}
170
167
}
171
168
@@ -193,10 +190,10 @@ impl HttpTransport {
193
190
let queue_size = Arc :: new ( Mutex :: new ( 0 ) ) ;
194
191
let mut client = Client :: builder ( ) ;
195
192
if let Some ( url) = http_proxy {
196
- client. proxy ( Proxy :: http ( & url) . unwrap ( ) ) ;
193
+ client = client . proxy ( Proxy :: http ( & url) . unwrap ( ) ) ;
197
194
} ;
198
195
if let Some ( url) = https_proxy {
199
- client. proxy ( Proxy :: https ( & url) . unwrap ( ) ) ;
196
+ client = client . proxy ( Proxy :: https ( & url) . unwrap ( ) ) ;
200
197
} ;
201
198
let _handle = Some ( spawn_http_sender (
202
199
client. build ( ) . unwrap ( ) ,
0 commit comments