http timeout config #307
6 changed files with 50 additions and 3 deletions
|
@ -6,6 +6,9 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
||||||
|
|
||||||
## Unreleased
|
## Unreleased
|
||||||
|
|
||||||
|
## Added
|
||||||
|
- Config: HTTP timeout options, :pool\_timeout and :receive\_timeout
|
||||||
|
|
||||||
## Changed
|
## Changed
|
||||||
- MastoAPI: Accept BooleanLike input on `/api/v1/accounts/:id/follow` (fixes follows with mastodon.py)
|
- MastoAPI: Accept BooleanLike input on `/api/v1/accounts/:id/follow` (fixes follows with mastodon.py)
|
||||||
|
|
||||||
|
|
|
@ -180,6 +180,8 @@
|
||||||
|
|
||||||
# Configures http settings, upstream proxy etc.
|
# Configures http settings, upstream proxy etc.
|
||||||
config :pleroma, :http,
|
config :pleroma, :http,
|
||||||
|
pool_timeout: :timer.seconds(5),
|
||||||
|
receive_timeout: :timer.seconds(15),
|
||||||
proxy_url: nil,
|
proxy_url: nil,
|
||||||
user_agent: :default,
|
user_agent: :default,
|
||||||
adapter: []
|
adapter: []
|
||||||
|
|
|
@ -2658,6 +2658,21 @@
|
||||||
type: :group,
|
type: :group,
|
||||||
description: "HTTP settings",
|
description: "HTTP settings",
|
||||||
children: [
|
children: [
|
||||||
|
%{
|
||||||
|
key: :pool_timeout,
|
||||||
|
label: "HTTP Pool Request Timeout",
|
||||||
|
type: :integer,
|
||||||
|
description: "Timeout for initiating HTTP requests (in ms, default 5000)",
|
||||||
|
suggestions: [5000]
|
||||||
|
},
|
||||||
|
%{
|
||||||
|
key: :receive_timeout,
|
||||||
|
label: "HTTP Receive Timeout",
|
||||||
|
type: :integer,
|
||||||
|
description:
|
||||||
|
"Timeout for waiting on remote servers to respond to HTTP requests (in ms, default 15000)",
|
||||||
|
suggestions: [15000]
|
||||||
|
},
|
||||||
%{
|
%{
|
||||||
key: :proxy_url,
|
key: :proxy_url,
|
||||||
label: "Proxy URL",
|
label: "Proxy URL",
|
||||||
|
|
|
@ -523,6 +523,8 @@ Available caches:
|
||||||
|
|
||||||
### :http
|
### :http
|
||||||
|
|
||||||
|
* `receive_timeout`: the amount of time, in ms, to wait for a remote server to respond to a request. (default: `15000`)
|
||||||
|
* `pool_timeout`: the amount of time, in ms, to wait to check out an HTTP connection from the pool. This likely does not need changing unless your instance is _very_ busy with outbound requests. (default `5000`)
|
||||||
* `proxy_url`: an upstream proxy to fetch posts and/or media with, (default: `nil`); for example `http://127.0.0.1:3192`. Does not support SOCKS5 proxy, only http(s).
|
* `proxy_url`: an upstream proxy to fetch posts and/or media with, (default: `nil`); for example `http://127.0.0.1:3192`. Does not support SOCKS5 proxy, only http(s).
|
||||||
* `send_user_agent`: should we include a user agent with HTTP requests? (default: `true`)
|
* `send_user_agent`: should we include a user agent with HTTP requests? (default: `true`)
|
||||||
* `user_agent`: what user agent should we use? (default: `:default`), must be string or `:default`
|
* `user_agent`: what user agent should we use? (default: `:default`), must be string or `:default`
|
||||||
|
|
|
@ -10,7 +10,13 @@ defmodule Pleroma.HTTP.AdapterHelper.Default do
|
||||||
@spec options(keyword(), URI.t()) :: keyword()
|
@spec options(keyword(), URI.t()) :: keyword()
|
||||||
def options(opts, _uri) do
|
def options(opts, _uri) do
|
||||||
proxy = Pleroma.Config.get([:http, :proxy_url])
|
proxy = Pleroma.Config.get([:http, :proxy_url])
|
||||||
AdapterHelper.maybe_add_proxy(opts, AdapterHelper.format_proxy(proxy))
|
pool_timeout = Pleroma.Config.get([:http, :pool_timeout], 5000)
|
||||||
|
receive_timeout = Pleroma.Config.get([:http, :receive_timeout], 15_000)
|
||||||
|
|
||||||
|
opts
|
||||||
|
|> AdapterHelper.maybe_add_proxy(AdapterHelper.format_proxy(proxy))
|
||||||
|
|> Keyword.put(:pool_timeout, pool_timeout)
|
||||||
|
|> Keyword.put(:receive_timeout, receive_timeout)
|
||||||
end
|
end
|
||||||
|
|
||||||
@spec get_conn(URI.t(), keyword()) :: {:ok, keyword()}
|
@spec get_conn(URI.t(), keyword()) :: {:ok, keyword()}
|
||||||
|
|
|
@ -3,8 +3,7 @@
|
||||||
# SPDX-License-Identifier: AGPL-3.0-only
|
# SPDX-License-Identifier: AGPL-3.0-only
|
||||||
|
|
||||||
defmodule Pleroma.HTTP.AdapterHelperTest do
|
defmodule Pleroma.HTTP.AdapterHelperTest do
|
||||||
use ExUnit.Case, async: true
|
use Pleroma.DataCase, async: true
|
||||||
|
|
||||||
alias Pleroma.HTTP.AdapterHelper
|
alias Pleroma.HTTP.AdapterHelper
|
||||||
|
|
||||||
describe "format_proxy/1" do
|
describe "format_proxy/1" do
|
||||||
|
@ -47,4 +46,24 @@ test "should not override conn_opts if set" do
|
||||||
]
|
]
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "timeout settings" do
|
||||||
|
test "should default to 5000/15000" do
|
||||||
|
options = AdapterHelper.options(%URI{host: 'somewhere'})
|
||||||
|
assert options[:pool_timeout] == 5000
|
||||||
|
assert options[:receive_timeout] == 15_000
|
||||||
|
end
|
||||||
|
|
||||||
|
test "pool_timeout should be overridden by :http, :pool_timeout" do
|
||||||
|
clear_config([:http, :pool_timeout], 10_000)
|
||||||
|
options = AdapterHelper.options(%URI{host: 'somewhere'})
|
||||||
|
assert options[:pool_timeout] == 10_000
|
||||||
|
end
|
||||||
|
|
||||||
|
test "receive_timeout should be overridden by :http, :receive_timeout" do
|
||||||
|
clear_config([:http, :receive_timeout], 20_000)
|
||||||
|
options = AdapterHelper.options(%URI{host: 'somewhere'})
|
||||||
|
assert options[:receive_timeout] == 20_000
|
||||||
|
end
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
Loading…
Reference in a new issue