@@ -16,6 +16,10 @@ use crate::net::session::SessionStream;
1616use crate :: net:: tls:: wrap_rustls;
1717use crate :: tools:: time;
1818
19+ /// User-Agent for HTTP requests if a resource usage policy requires it.
20+ /// By default we do not set User-Agent.
21+ const USER_AGENT : & str = "chatmail/2 (+https://github.com/chatmail/core/)" ;
22+
1923/// HTTP(S) GET response.
2024#[ derive( Debug , Clone , PartialEq , Eq ) ]
2125pub struct Response {
@@ -245,8 +249,22 @@ async fn fetch_url(context: &Context, original_url: &str) -> Result<Response> {
245249 . context ( "URL has no authority" ) ?
246250 . clone ( ) ;
247251
248- let req = hyper:: Request :: builder ( )
249- . uri ( parsed_url)
252+ let req = hyper:: Request :: builder ( ) . uri ( parsed_url) ;
253+
254+ // OSM usage policy requires
255+ // that User-Agent is set for HTTP GET requests
256+ // to tile servers:
257+ // <https://operations.osmfoundation.org/policies/tiles/>
258+ // Same for vectory tiles
259+ // at <https://operations.osmfoundation.org/policies/vector/>.
260+ let req =
261+ if authority == "tile.openstreetmap.org" || authority == "vector.openstreetmap.org" {
262+ req. header ( "User-Agent" , USER_AGENT )
263+ } else {
264+ req
265+ } ;
266+
267+ let req = req
250268 . header ( hyper:: header:: HOST , authority. as_str ( ) )
251269 . body ( http_body_util:: Empty :: < Bytes > :: new ( ) ) ?;
252270 let response = sender. send_request ( req) . await ?;
0 commit comments