// Based on https://github.com/ferrous-systems/espressif-trainings/blob/main/intro/http-client/src/main.rs
use core::str;
use bsc::wifi::wifi;
use embedded_svc::{
http::{
client::{Client, Request, RequestWrite, Response},
Headers, Status,
},
io::Read,
};
use esp32_c3_dkc02_bsc as bsc;
use esp_idf_svc::http::client::{EspHttpClient, EspHttpClientConfiguration, EspHttpRequest};
use esp_idf_sys as _; // If using the `binstart` feature of `esp-idf-sys`, always keep this module imported
#[toml_cfg::toml_config]
pub struct Config {
#[default("Wokwi-GUEST")]
wifi_ssid: &'static str,
#[default("")]
wifi_psk: &'static str,
}
fn main() -> anyhow::Result<()> {
esp_idf_sys::link_patches();
println!("starting");
let _wifi = wifi(CONFIG.wifi_ssid, CONFIG.wifi_psk)?;
println!("connected");
// TODO your code here
//get(...)?;
get("http://neverssl.com/")?;
Ok(())
}
fn get(url: impl AsRef<str>) -> anyhow::Result<()> {
//println!("getting {}", url.as_ref());
// 1. Create a new EspHttpClient. (Check documentation)
let mut client = match EspHttpClient::new_default() {
Ok(http_client) => http_client,
Err(error) => panic!("Problem creating EspHttpClient: {:?}", error),
};
// 2. Open a GET request to `url`
let request = match client.get(url.as_ref()) {
Ok(request) => request,
Err(error) => panic!("Problem creating EspHttpRequest: {:?}", error),
};
// 3. Requests *may* send data to the server. Turn the request into a writer, specifying 0 bytes as write length
// (since we don't send anything - but have to do the writer step anyway)
//
// https://docs.espressif.com/projects/esp-idf/en/latest/esp32/api-reference/protocols/esp_http_client.html
// If this were a POST request, you'd set a write length > 0 and then writer.do_write(&some_buf);
// let writer = request...;
let writer = match request.into_writer(0) {
Ok(writer) => writer,
Err(error) => panic!("Problem converting into writer : {:?}", error),
};
// 4. Turn the writer into a response and check its status. Successful http status codes are in the 200..=299 range.
// let response = writer...;
// let status = ...;
// println!("response code: {}\n", status);
let mut response = match writer.submit() {
Ok(response) => response,
Err(error) => panic!("Problem converting into response : {:?}", error),
};
match response.status() {
200..=299 => {
let mut buf = [0_u8; 256];
let mut string = String::new();
let mut reader = response.reader();
loop {
match reader.read(&mut buf) {
Ok(size) => {
string.push_str(&String::from_utf8_lossy(&buf));
if size == 0_usize {break;}
}
_ => anyhow::bail!("unexpected response code: {}", response.status()),
}
}
print!("{}", string);
}
_ => (),
};
// 5. If the status is OK, read response data chunk by chunk into a buffer and print it until done.
// 6. Try converting the bytes into a Rust (UTF-8) string and print it.
Ok(())
}
Loading
esp32-c3-rust-1
esp32-c3-rust-1