class Httpd < Formula desc "Apache HTTP server" homepage "https://httpd.apache.org/" url "https://www.apache.org/dyn/closer.cgi?path=httpd/httpd-2.4.34.tar.bz2" sha256 "fa53c95631febb08a9de41fd2864cfff815cf62d9306723ab0d4b8d7aa1638f0" bottle do sha256 "d93c6b2fe63d1be1cc9b14f6dfa3a5cff34b42f4b800405830b523a90f0046ea" => :mojave sha256 "b9222c17b32a71e50280e0c7b2abe4403ba4bbe798740384abfd6c2945f0ff1f" => :high_sierra sha256 "89ccaa244937376a776103f8e602748e77907894dac554e94e5c57c8eae36d00" => :sierra sha256 "4cade2e0cbc30a772272f88deb9aa2b335c637b16f0b11ab1531a644a7e3dff1" => :el_capitan end depends_on "apr" depends_on "apr-util" depends_on "brotli" depends_on "nghttp2" depends_on "openssl" depends_on "pcre" def install # fixup prefix references in favour of opt_prefix references inreplace "Makefile.in", '#@@ServerRoot@@#$(prefix)#', '#@@ServerRoot@@'"##{opt_prefix}#" inreplace "docs/conf/extra/httpd-autoindex.conf.in", "@exp_iconsdir@", "#{opt_pkgshare}/icons" inreplace "docs/conf/extra/httpd-multilang-errordoc.conf.in", "@exp_errordir@", "#{opt_pkgshare}/error" # fix default user/group when running as root inreplace "docs/conf/httpd.conf.in", /(User|Group) daemon/, "\\1 _www" # use Slackware-FHS layout as it's closest to what we want. # these values cannot be passed directly to configure, unfortunately. inreplace "config.layout" do |s| s.gsub! "${datadir}/htdocs", "${datadir}" s.gsub! "${htdocsdir}/manual", "#{pkgshare}/manual" s.gsub! "${datadir}/error", "#{pkgshare}/error" s.gsub! "${datadir}/icons", "#{pkgshare}/icons" end system "./configure", "--enable-layout=Slackware-FHS", "--prefix=#{prefix}", "--sbindir=#{bin}", "--mandir=#{man}", "--sysconfdir=#{etc}/httpd", "--datadir=#{var}/www", "--localstatedir=#{var}", "--enable-mpms-shared=all", "--enable-mods-shared=all", "--enable-authnz-fcgi", "--enable-cgi", "--enable-pie", "--enable-suexec", "--with-suexec-bin=#{opt_bin}/suexec", "--with-suexec-caller=_www", "--with-port=8080", "--with-sslport=8443", "--with-apr=#{Formula["apr"].opt_prefix}", "--with-apr-util=#{Formula["apr-util"].opt_prefix}", "--with-brotli=#{Formula["brotli"].opt_prefix}", "--with-mpm=prefork", "--with-nghttp2=#{Formula["nghttp2"].opt_prefix}", "--with-ssl=#{Formula["openssl"].opt_prefix}", "--with-pcre=#{Formula["pcre"].opt_prefix}", "--disable-lua", "--disable-luajit" system "make" system "make", "install" # suexec does not install without root bin.install "support/suexec" # remove non-executable files in bin dir (for brew audit) rm bin/"envvars" rm bin/"envvars-std" # avoid using Cellar paths inreplace %W[ #{include}/httpd/ap_config_layout.h #{lib}/httpd/build/config_vars.mk ] do |s| s.gsub! "#{lib}/httpd/modules", "#{HOMEBREW_PREFIX}/lib/httpd/modules" end inreplace %W[ #{bin}/apachectl #{bin}/apxs #{include}/httpd/ap_config_auto.h #{include}/httpd/ap_config_layout.h #{lib}/httpd/build/config_vars.mk #{lib}/httpd/build/config.nice ] do |s| s.gsub! prefix, opt_prefix end inreplace "#{lib}/httpd/build/config_vars.mk" do |s| pcre = Formula["pcre"] s.gsub! pcre.prefix.realpath, pcre.opt_prefix s.gsub! "${prefix}/lib/httpd/modules", "#{HOMEBREW_PREFIX}/lib/httpd/modules" end end def post_install (var/"cache/httpd").mkpath (var/"www").mkpath end def caveats <<~EOS DocumentRoot is #{var}/www. The default ports have been set in #{etc}/httpd/httpd.conf to 8080 and in #{etc}/httpd/extra/httpd-ssl.conf to 8443 so that httpd can run without sudo. EOS end plist_options :manual => "apachectl start" def plist; <<~EOS Label #{plist_name} ProgramArguments #{opt_bin}/httpd -D FOREGROUND RunAtLoad EOS end test do begin require "socket" server = TCPServer.new(0) port = server.addr[1] server.close expected_output = "Hello world!" (testpath/"index.html").write expected_output (testpath/"httpd.conf").write <<~EOS Listen #{port} ServerName localhost:#{port} DocumentRoot "#{testpath}" ErrorLog "#{testpath}/httpd-error.log" PidFile "#{testpath}/httpd.pid" LoadModule authz_core_module #{lib}/httpd/modules/mod_authz_core.so LoadModule unixd_module #{lib}/httpd/modules/mod_unixd.so LoadModule dir_module #{lib}/httpd/modules/mod_dir.so LoadModule mpm_prefork_module #{lib}/httpd/modules/mod_mpm_prefork.so EOS pid = fork do exec bin/"httpd", "-X", "-f", "#{testpath}/httpd.conf" end sleep 3 assert_match expected_output, shell_output("curl -s 127.0.0.1:#{port}") ensure Process.kill("TERM", pid) Process.wait(pid) end end end