80 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			80 lines
		
	
	
	
		
			1.9 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
| # Pleroma: A lightweight social networking server
 | |
| # Copyright © 2017-2018 Pleroma Authors <https://pleroma.social/>
 | |
| # SPDX-License-Identifier: AGPL-3.0-only
 | |
| 
 | |
| defmodule Pleroma.HTTP do
 | |
|   @moduledoc """
 | |
| 
 | |
|   """
 | |
| 
 | |
|   alias Pleroma.HTTP.Connection
 | |
|   alias Pleroma.HTTP.RequestBuilder, as: Builder
 | |
| 
 | |
|   @doc """
 | |
|   Builds and perform http request.
 | |
| 
 | |
|   # Arguments:
 | |
|   `method` - :get, :post, :put, :delete
 | |
|   `url`
 | |
|   `body`
 | |
|   `headers` - a keyworld list of headers, e.g. `[{"content-type", "text/plain"}]`
 | |
|   `options` - custom, per-request middleware or adapter options
 | |
| 
 | |
|   # Returns:
 | |
|   `{:ok, %Tesla.Env{}}` or `{:error, error}`
 | |
| 
 | |
|   """
 | |
|   def request(method, url, body \\ "", headers \\ [], options \\ []) do
 | |
|     options =
 | |
|       process_request_options(options)
 | |
|       |> process_sni_options(url)
 | |
| 
 | |
|     %{}
 | |
|     |> Builder.method(method)
 | |
|     |> Builder.headers(headers)
 | |
|     |> Builder.opts(options)
 | |
|     |> Builder.url(url)
 | |
|     |> Builder.add_param(:body, :body, body)
 | |
|     |> Enum.into([])
 | |
|     |> (&Tesla.request(Connection.new(), &1)).()
 | |
|   end
 | |
| 
 | |
|   defp process_sni_options(options, nil), do: options
 | |
| 
 | |
|   defp process_sni_options(options, url) do
 | |
|     uri = URI.parse(url)
 | |
|     host = uri.host |> to_charlist()
 | |
| 
 | |
|     case uri.scheme do
 | |
|       "https" -> options ++ [ssl: [server_name_indication: host]]
 | |
|       _ -> options
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   def process_request_options(options) do
 | |
|     config = Application.get_env(:pleroma, :http, [])
 | |
|     proxy = Keyword.get(config, :proxy_url, nil)
 | |
|     options = options ++ [adapter: [pool: :default]]
 | |
| 
 | |
|     case proxy do
 | |
|       nil -> options
 | |
|       _ -> options ++ [proxy: proxy]
 | |
|     end
 | |
|   end
 | |
| 
 | |
|   @doc """
 | |
|   Performs GET request.
 | |
| 
 | |
|   See `Pleroma.HTTP.request/5`
 | |
|   """
 | |
|   def get(url, headers \\ [], options \\ []),
 | |
|     do: request(:get, url, "", headers, options)
 | |
| 
 | |
|   @doc """
 | |
|   Performs POST request.
 | |
| 
 | |
|   See `Pleroma.HTTP.request/5`
 | |
|   """
 | |
|   def post(url, body, headers \\ [], options \\ []),
 | |
|     do: request(:post, url, body, headers, options)
 | |
| end
 | 
