|
1 | 1 | use extra::url::Url;
|
2 | 2 | use method::Method;
|
3 | 3 | use std::rt::io::{Reader, Writer};
|
4 |
| -use std::rt::io::net::ip::SocketAddr; |
| 4 | +use std::rt::io::net::get_host_addresses; |
| 5 | +use std::rt::io::net::ip::{SocketAddr, Ipv4Addr}; |
5 | 6 | use std::rt::io::net::tcp::TcpStream;
|
6 | 7 | use buffer::BufferedStream;
|
7 | 8 | use headers::request::HeaderCollection;
|
@@ -70,10 +71,39 @@ impl<S: Reader + Writer> RequestWriter<S> {
|
70 | 71 | },
|
71 | 72 | };
|
72 | 73 |
|
| 74 | + let remote_addr = url_to_socket_addr(&url); |
| 75 | + info!("using ip address %s for %s", remote_addr.to_str(), url.host); |
| 76 | + |
| 77 | + fn url_to_socket_addr(url: &Url) -> SocketAddr { |
| 78 | + // Just grab the first IPv4 address |
| 79 | + let addrs = get_host_addresses(url.host); |
| 80 | + // TODO: Error handling |
| 81 | + let addrs = addrs.unwrap(); |
| 82 | + let addr = do addrs.move_iter().find |&a| { |
| 83 | + match a { |
| 84 | + Ipv4Addr(*) => true, |
| 85 | + _ => false |
| 86 | + } |
| 87 | + }; |
| 88 | + |
| 89 | + // TODO: Error handling |
| 90 | + let addr = addr.unwrap(); |
| 91 | + |
| 92 | + let port = url.port.clone().unwrap_or_default(~"80"); |
| 93 | + let port = FromStr::from_str(port); |
| 94 | + // TODO: Error handling |
| 95 | + let port = port.unwrap(); |
| 96 | + |
| 97 | + SocketAddr { |
| 98 | + ip: addr, |
| 99 | + port: port |
| 100 | + } |
| 101 | + } |
| 102 | + |
73 | 103 | let mut request = RequestWriter {
|
74 | 104 | stream: None,
|
75 | 105 | headers_written: false,
|
76 |
| - remote_addr: None, |
| 106 | + remote_addr: Some(remote_addr), |
77 | 107 | headers: ~HeaderCollection::new(),
|
78 | 108 | method: method,
|
79 | 109 | url: url,
|
|
0 commit comments