anchor.diff:     , backoff_ceiling := Ceiling
      } = State,
     GunConn = open_gun_connection(Connection),
  -  {ok, Timeout} = application:get_env(apns, timeout),
  +  Timeout = maps:get(timeout, Connection),
     case gun:await_up(GunConn, Timeout) of
       {ok, http2} ->
         Client ! {connection_up, self()},
  
positive.code: handle_call( {push_notification, DeviceId, Notification, Headers}
             , _From
             , State) ->
    #{gun_connection := GunConn} = State,
    Response = push(GunConn, DeviceId, Headers, Notification),
    {reply, Response, State};
  handle_call( {push_notification, Token, DeviceId, Notification, HeadersMap}
             , _From
             , State) ->
    #{gun_connection := GunConn} = State,
    Headers = add_authorization_header(HeadersMap, Token),
    Response = push(GunConn, DeviceId, Headers, Notification),
    {reply, Response, State};
  handle_call(_Request, _From, State) ->
    {reply, ok, State}.
  
negative.code: add_authorization_header(Headers, Token) ->
    Headers#{apns_auth_token => <<"bearer ", Token/binary>>}.
  
  -spec push(pid(), apns:device_id(), apns:headers(), notification(), integer()) ->
    apns:response().
  push(GunConn, DeviceId, HeadersMap, Notification, Timeout) ->
    Headers = get_headers(HeadersMap),
    Path = get_device_path(DeviceId),
    StreamRef = gun:post(GunConn, Path, Headers, Notification),
  