Skip to content

Commit e3b5bbf

Browse files
committed
browser-rs: recieve a http response from a server
1 parent cc0ff3d commit e3b5bbf

File tree

2 files changed

+50
-12
lines changed

2 files changed

+50
-12
lines changed

app/browser-rs/src/main.rs

+22-3
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ impl ParsedUrl {
4646
path = v[1];
4747
} else if v.len() == 1 {
4848
host = v[0];
49-
path = "index.html";
49+
path = "/index.html";
5050
} else {
5151
panic!("invalid url {}", url);
5252
}
@@ -137,13 +137,32 @@ fn main() {
137137
Some(fd) => fd,
138138
None => panic!("can't create a socket file descriptor"),
139139
};
140-
let address = SockAddr::new(
140+
let mut address = SockAddr::new(
141141
AF_INET as u16,
142142
htons(parsed_url.port),
143143
inet_addr(&parsed_url.host),
144144
);
145145
let mut request = http_request.string();
146-
sendto(&socket_fd, &mut request, 0, &address);
146+
147+
println!("----- sending a request -----");
148+
println!("{}", request);
149+
150+
if sendto(&socket_fd, &mut request, 0, &address) < 0 {
151+
panic!("failed to send a request: {:?}", request);
152+
}
153+
154+
let mut buf = [0; 1000];
155+
let length = recvfrom(&socket_fd, &mut buf, 0, &mut address);
156+
if length < 0 {
157+
panic!("failed to receive a response");
158+
}
159+
let response = match String::from_utf8(buf.to_vec()) {
160+
Ok(s) => s,
161+
Err(e) => panic!("failed to convert u8 array to string: {}", e),
162+
};
163+
164+
println!("----- receiving a response -----");
165+
println!("{}", response);
147166

148167
close(&socket_fd);
149168
}

app/liumlib/src/lib.rs

+28-9
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ impl Drop for FileDescriptor {
4242
#[derive(Debug)]
4343
struct InAddr {
4444
/// IP address with big endian
45-
s_addr: u32
45+
s_addr: u32,
4646
}
4747

4848
impl InAddr {
@@ -86,15 +86,15 @@ extern "C" {
8686
flags: u32,
8787
dest_addr: &SockAddr,
8888
addrlen: usize,
89-
) -> usize;
90-
fn _sys_recvfrom(
89+
) -> i64;
90+
fn sys_recvfrom(
9191
sockfd: u32,
9292
buf: *mut u8,
9393
len: usize,
9494
flags: u32,
9595
src_addr: &mut SockAddr,
9696
addrlen: usize,
97-
) -> usize;
97+
) -> i64;
9898
fn sys_exit(code: i32) -> !;
9999
pub fn sys_getdents64(fd: u32, buf: *mut u8, buf_size: usize) -> i32;
100100
}
@@ -154,24 +154,43 @@ pub fn free_page(addr: *mut u8) -> i32 {
154154
}
155155

156156
pub fn socket(domain: u32, socket_type: u32, protocol: u32) -> Option<FileDescriptor> {
157-
let fd = unsafe {sys_socket(domain, socket_type, protocol) };
157+
let fd = unsafe { sys_socket(domain, socket_type, protocol) };
158158
if fd < 0 {
159159
None
160160
} else {
161161
Some(FileDescriptor { fd })
162162
}
163163
}
164164

165-
pub fn sendto(sockfd: &FileDescriptor, buf: &mut String, flags: u32, dest_addr: &SockAddr) -> usize {
165+
pub fn sendto(sockfd: &FileDescriptor, buf: &mut String, flags: u32, dest_addr: &SockAddr) -> i64 {
166166
unsafe {
167-
sys_sendto(sockfd.fd as u32, buf.as_bytes_mut().as_mut_ptr(), buf.len(), flags, dest_addr, 0)
167+
sys_sendto(
168+
sockfd.fd as u32,
169+
buf.as_mut_ptr(),
170+
buf.len(),
171+
flags,
172+
dest_addr,
173+
0,
174+
)
168175
}
169176
}
170177

171-
fn _recvfrom(sockfd: &FileDescriptor, buf: &mut String, flags: u32, src_addr: &mut SockAddr) -> usize {
178+
pub fn recvfrom(
179+
sockfd: &FileDescriptor,
180+
buf: &mut [u8],
181+
flags: u32,
182+
src_addr: &mut SockAddr,
183+
) -> i64 {
172184
let len = buf.len();
173185
unsafe {
174-
_sys_recvfrom(sockfd.fd as u32, buf.as_bytes_mut().as_mut_ptr(), len, flags, src_addr, 0)
186+
sys_recvfrom(
187+
sockfd.fd as u32,
188+
buf.as_mut_ptr(),
189+
len,
190+
flags,
191+
src_addr,
192+
0,
193+
)
175194
}
176195
}
177196

0 commit comments

Comments
 (0)