+
Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 27 additions & 2 deletions src/net/http.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,10 @@ use crate::net::session::SessionStream;
use crate::net::tls::wrap_rustls;
use crate::tools::time;

/// User-Agent for HTTP requests if a resource usage policy requires it.
/// By default we do not set User-Agent.
const USER_AGENT: &str = "chatmail/2 (+https://github.com/chatmail/core/)";

/// HTTP(S) GET response.
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Response {
Expand Down Expand Up @@ -102,6 +106,13 @@ fn http_url_cache_timestamps(url: &str, mimetype: Option<&str>) -> (i64, i64) {
let stale = if url.ends_with(".xdc") {
// WebXDCs are never stale, they just expire.
expires
} else if url.starts_with("https://tile.openstreetmap.org/")
|| url.starts_with("https://vector.openstreetmap.org/")
{
// Policy at <https://operations.osmfoundation.org/policies/tiles/>
// requires that we cache tiles for at least 7 days.
// Do not revalidate earlier than that.
now + 3600 * 24 * 7
} else if mimetype.is_some_and(|s| s.starts_with("image/")) {
// Cache images for 1 day.
//
Expand Down Expand Up @@ -243,8 +254,22 @@ async fn fetch_url(context: &Context, original_url: &str) -> Result<Response> {
.context("URL has no authority")?
.clone();

let req = hyper::Request::builder()
.uri(parsed_url)
let req = hyper::Request::builder().uri(parsed_url);

// OSM usage policy requires
// that User-Agent is set for HTTP GET requests
// to tile servers:
// <https://operations.osmfoundation.org/policies/tiles/>
// Same for vectory tiles
// at <https://operations.osmfoundation.org/policies/vector/>.
let req =
if authority == "tile.openstreetmap.org" || authority == "vector.openstreetmap.org" {
req.header("User-Agent", USER_AGENT)
} else {
req
};

let req = req
.header(hyper::header::HOST, authority.as_str())
.body(http_body_util::Empty::<Bytes>::new())?;
let response = sender.send_request(req).await?;
Expand Down
点击 这是indexloc提供的php浏览器服务,不要输入任何密码和下载