# frozen_string_literal: true

namespace :action_mailbox do
  namespace :ingress do
    desc "Pipe an inbound email from STDIN to the Postfix ingress at the given URL"
    task :postfix do
      require "active_support"
      require "active_support/core_ext/object/blank"
      require "http"

      url, password = ENV.values_at("URL", "INGRESS_PASSWORD")

      if url.blank? || password.blank?
        abort "4.3.5 URL and INGRESS_PASSWORD are required"
      end

      begin
        response = HTTP.basic_auth(user: "actionmailbox", pass: password)
          .timeout(connect: 1, write: 10, read: 10)
          .post(url, headers: { "Content-Type" => "message/rfc822", "User-Agent" => ENV.fetch("USER_AGENT", "Postfix") }, body: STDIN)

        case
        when response.status.success?
          puts "2.0.0 HTTP #{response.status}"
        when response.status.unauthorized?
          abort "4.7.0 HTTP #{response.status}"
        when response.status.unsupported_media_type?
          abort "5.6.1 HTTP #{response.status}"
        else
          abort "4.0.0 HTTP #{response.status}"
        end
      rescue HTTP::ConnectionError => error
        abort "4.4.2 Error connecting to the Postfix ingress: #{error.message}"
      rescue HTTP::TimeoutError
        abort "4.4.7 Timed out piping to the Postfix ingress"
      end
    end
  end
end

# frozen_string_literal: true

namespace :action_mailbox do
  namespace :ingress do
    desc "Pipe an inbound email from STDIN to the Postfix ingress at the given URL"
    task :postfix do
      require "active_support"
      require "active_support/core_ext/object/blank"
      require "http"

      url, password = ENV.values_at("URL", "INGRESS_PASSWORD")

      if url.blank? || password.blank?
        abort "4.3.5 URL and INGRESS_PASSWORD are required"
      end

      begin
        response = HTTP.basic_auth(user: "actionmailbox", pass: password)
          .timeout(connect: 1, write: 10, read: 10)
          .post(url, body: STDIN.read,
            headers: { "Content-Type" => "message/rfc822", "User-Agent" => ENV.fetch("USER_AGENT", "Postfix") })

        case
        when response.status.success?
          puts "2.0.0 HTTP #{response.status}"
        when response.status.unauthorized?
          abort "4.7.0 HTTP #{response.status}"
        when response.status.unsupported_media_type?
          abort "5.6.1 HTTP #{response.status}"
        else
          abort "4.0.0 HTTP #{response.status}"
        end
      rescue HTTP::ConnectionError => error
        abort "4.4.2 Error connecting to the Postfix ingress: #{error.message}"
      rescue HTTP::TimeoutError
        abort "4.4.7 Timed out piping to the Postfix ingress"
      end
    end
  end
end

Read STDIN to upload it
Read STDIN to upload it

http.rb can't stream from pipes.
