@@ -113,7 +113,7 @@ impl PySocket {
113
113
} ;
114
114
self . kind . set ( socket_kind) ;
115
115
self . proto . set ( proto) ;
116
- Socket :: new ( domain, socket_type, None ) . map_err ( |err| convert_io_error ( vm, err) ) ?
116
+ Socket :: new ( domain, socket_type, None ) . map_err ( |err| convert_sock_error ( vm, err) ) ?
117
117
} ;
118
118
self . sock . replace ( sock) ;
119
119
Ok ( ( ) )
@@ -127,15 +127,15 @@ impl PySocket {
127
127
} else {
128
128
self . sock ( ) . connect ( & sock_addr)
129
129
} ;
130
- res. map_err ( |err| convert_io_error ( vm, err) )
130
+ res. map_err ( |err| convert_sock_error ( vm, err) )
131
131
}
132
132
133
133
#[ pymethod]
134
134
fn bind ( & self , address : Address , vm : & VirtualMachine ) -> PyResult < ( ) > {
135
135
let sock_addr = get_addr ( vm, address) ?;
136
136
self . sock ( )
137
137
. bind ( & sock_addr)
138
- . map_err ( |err| convert_io_error ( vm, err) )
138
+ . map_err ( |err| convert_sock_error ( vm, err) )
139
139
}
140
140
141
141
#[ pymethod]
@@ -144,70 +144,51 @@ impl PySocket {
144
144
let backlog = if backlog < 0 { 0 } else { backlog } ;
145
145
self . sock ( )
146
146
. listen ( backlog)
147
- . map_err ( |err| convert_io_error ( vm, err) )
147
+ . map_err ( |err| convert_sock_error ( vm, err) )
148
148
}
149
149
150
150
#[ pymethod]
151
- fn _accept ( & self , vm : & VirtualMachine ) -> PyResult {
151
+ fn _accept ( & self , vm : & VirtualMachine ) -> PyResult < ( RawSocket , AddrTuple ) > {
152
152
let ( sock, addr) = self
153
153
. sock ( )
154
154
. accept ( )
155
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
155
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
156
156
157
- let fd = vm. new_int ( into_sock_fileno ( sock) ) ;
158
- let addr_tuple = get_addr_tuple ( vm, addr) ;
159
-
160
- Ok ( vm. ctx . new_tuple ( vec ! [ fd, addr_tuple] ) )
157
+ let fd = into_sock_fileno ( sock) ;
158
+ Ok ( ( fd, get_addr_tuple ( addr) ) )
161
159
}
162
160
163
161
#[ pymethod]
164
162
fn recv ( & self , bufsize : usize , vm : & VirtualMachine ) -> PyResult {
165
163
let mut buffer = vec ! [ 0u8 ; bufsize] ;
166
164
match self . sock . borrow_mut ( ) . read_exact ( & mut buffer) {
167
165
Ok ( ( ) ) => Ok ( vm. ctx . new_bytes ( buffer) ) ,
168
- Err ( ref e) if e. kind ( ) == io:: ErrorKind :: TimedOut => {
169
- let socket_timeout = vm. class ( "_socket" , "timeout" ) ;
170
- Err ( vm. new_exception ( socket_timeout, "Timed out" . to_string ( ) ) )
171
- }
172
- Err ( err) => Err ( convert_io_error ( vm, err) ) ,
166
+ Err ( err) => Err ( convert_sock_error ( vm, err) ) ,
173
167
}
174
168
}
175
169
176
170
#[ pymethod]
177
- fn recvfrom ( & self , bufsize : usize , vm : & VirtualMachine ) -> PyResult {
171
+ fn recvfrom ( & self , bufsize : usize , vm : & VirtualMachine ) -> PyResult < ( Vec < u8 > , AddrTuple ) > {
178
172
let mut buffer = vec ! [ 0u8 ; bufsize] ;
179
- let addr = match self . sock ( ) . recv_from ( & mut buffer) {
180
- Ok ( ( _, addr) ) => addr,
181
- Err ( ref e) if e. kind ( ) == io:: ErrorKind :: TimedOut => {
182
- let socket_timeout = vm. class ( "_socket" , "timeout" ) ;
183
- return Err ( vm. new_exception ( socket_timeout, "Timed out" . to_string ( ) ) ) ;
184
- }
185
- Err ( err) => return Err ( convert_io_error ( vm, err) ) ,
186
- } ;
187
-
188
- let addr_tuple = get_addr_tuple ( vm, addr) ;
189
-
190
- Ok ( vm. ctx . new_tuple ( vec ! [ vm. ctx. new_bytes( buffer) , addr_tuple] ) )
173
+ match self . sock ( ) . recv_from ( & mut buffer) {
174
+ Ok ( ( _, addr) ) => Ok ( ( buffer, get_addr_tuple ( addr) ) ) ,
175
+ Err ( err) => Err ( convert_sock_error ( vm, err) ) ,
176
+ }
191
177
}
192
178
193
179
#[ pymethod]
194
180
fn send ( & self , bytes : PyBytesLike , vm : & VirtualMachine ) -> PyResult < usize > {
195
- match self . sock ( ) . send ( bytes. to_cow ( ) . as_ref ( ) ) {
196
- Ok ( i) => Ok ( i) ,
197
- Err ( ref e) if e. kind ( ) == io:: ErrorKind :: TimedOut => {
198
- let socket_timeout = vm. class ( "_socket" , "timeout" ) ;
199
- Err ( vm. new_exception ( socket_timeout, "Timed out" . to_string ( ) ) )
200
- }
201
- Err ( err) => Err ( convert_io_error ( vm, err) ) ,
202
- }
181
+ self . sock ( )
182
+ . send ( bytes. to_cow ( ) . as_ref ( ) )
183
+ . map_err ( |err| convert_sock_error ( vm, err) )
203
184
}
204
185
205
186
#[ pymethod]
206
187
fn sendto ( & self , bytes : PyBytesLike , address : Address , vm : & VirtualMachine ) -> PyResult < ( ) > {
207
188
let addr = get_addr ( vm, address) ?;
208
189
self . sock ( )
209
190
. send_to ( bytes. to_cow ( ) . as_ref ( ) , & addr)
210
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
191
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
211
192
Ok ( ( ) )
212
193
}
213
194
@@ -222,38 +203,38 @@ impl PySocket {
222
203
}
223
204
224
205
#[ pymethod]
225
- fn getsockname ( & self , vm : & VirtualMachine ) -> PyResult {
206
+ fn getsockname ( & self , vm : & VirtualMachine ) -> PyResult < AddrTuple > {
226
207
let addr = self
227
208
. sock ( )
228
209
. local_addr ( )
229
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
210
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
230
211
231
- Ok ( get_addr_tuple ( vm , addr) )
212
+ Ok ( get_addr_tuple ( addr) )
232
213
}
233
214
#[ pymethod]
234
- fn getpeername ( & self , vm : & VirtualMachine ) -> PyResult {
215
+ fn getpeername ( & self , vm : & VirtualMachine ) -> PyResult < AddrTuple > {
235
216
let addr = self
236
217
. sock ( )
237
218
. peer_addr ( )
238
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
219
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
239
220
240
- Ok ( get_addr_tuple ( vm , addr) )
221
+ Ok ( get_addr_tuple ( addr) )
241
222
}
242
223
243
224
#[ pymethod]
244
225
fn gettimeout ( & self , vm : & VirtualMachine ) -> PyResult < Option < f64 > > {
245
226
let dur = self
246
227
. sock ( )
247
228
. read_timeout ( )
248
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
229
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
249
230
Ok ( dur. map ( |d| d. as_secs_f64 ( ) ) )
250
231
}
251
232
252
233
#[ pymethod]
253
234
fn setblocking ( & self , block : bool , vm : & VirtualMachine ) -> PyResult < ( ) > {
254
235
self . sock ( )
255
236
. set_nonblocking ( !block)
256
- . map_err ( |err| convert_io_error ( vm, err) )
237
+ . map_err ( |err| convert_sock_error ( vm, err) )
257
238
}
258
239
259
240
#[ pymethod]
@@ -265,10 +246,10 @@ impl PySocket {
265
246
fn settimeout ( & self , timeout : Option < f64 > , vm : & VirtualMachine ) -> PyResult < ( ) > {
266
247
self . sock ( )
267
248
. set_read_timeout ( timeout. map ( Duration :: from_secs_f64) )
268
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
249
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
269
250
self . sock ( )
270
251
. set_write_timeout ( timeout. map ( Duration :: from_secs_f64) )
271
- . map_err ( |err| convert_io_error ( vm, err) ) ?;
252
+ . map_err ( |err| convert_sock_error ( vm, err) ) ?;
272
253
Ok ( ( ) )
273
254
}
274
255
@@ -286,7 +267,7 @@ impl PySocket {
286
267
} ;
287
268
self . sock ( )
288
269
. shutdown ( how)
289
- . map_err ( |err| convert_io_error ( vm, err) )
270
+ . map_err ( |err| convert_sock_error ( vm, err) )
290
271
}
291
272
292
273
#[ pyproperty( name = "type" ) ]
@@ -329,19 +310,17 @@ impl TryFromObject for Address {
329
310
}
330
311
}
331
312
332
- fn get_addr_tuple < A : Into < socket2:: SockAddr > > ( vm : & VirtualMachine , addr : A ) -> PyObjectRef {
313
+ type AddrTuple = ( String , u16 ) ;
314
+
315
+ fn get_addr_tuple < A : Into < socket2:: SockAddr > > ( addr : A ) -> AddrTuple {
333
316
let addr = addr. into ( ) ;
334
- let ( port , ip ) = if let Some ( addr) = addr. as_inet ( ) {
335
- ( addr. port ( ) , addr. ip ( ) . to_string ( ) )
317
+ if let Some ( addr) = addr. as_inet ( ) {
318
+ ( addr. ip ( ) . to_string ( ) , addr. port ( ) )
336
319
} else if let Some ( addr) = addr. as_inet6 ( ) {
337
- ( addr. port ( ) , addr. ip ( ) . to_string ( ) )
320
+ ( addr. ip ( ) . to_string ( ) , addr. port ( ) )
338
321
} else {
339
- ( 0 , String :: new ( ) )
340
- } ;
341
- let port = vm. ctx . new_int ( port) ;
342
- let ip = vm. ctx . new_str ( ip) ;
343
-
344
- vm. ctx . new_tuple ( vec ! [ ip, port] )
322
+ ( String :: new ( ) , 0 )
323
+ }
345
324
}
346
325
347
326
fn socket_gethostname ( vm : & VirtualMachine ) -> PyResult {
@@ -438,6 +417,15 @@ fn invalid_sock() -> Socket {
438
417
}
439
418
}
440
419
420
+ fn convert_sock_error ( vm : & VirtualMachine , err : io:: Error ) -> PyObjectRef {
421
+ if err. kind ( ) == io:: ErrorKind :: TimedOut {
422
+ let socket_timeout = vm. class ( "_socket" , "timeout" ) ;
423
+ vm. new_exception ( socket_timeout, "Timed out" . to_string ( ) )
424
+ } else {
425
+ convert_io_error ( vm, err)
426
+ }
427
+ }
428
+
441
429
pub fn make_module ( vm : & VirtualMachine ) -> PyObjectRef {
442
430
let ctx = & vm. ctx ;
443
431
let socket_timeout = ctx. new_class ( "socket.timeout" , vm. ctx . exceptions . os_error . clone ( ) ) ;
0 commit comments