Blob Blame History Raw
From c31b89a042e54000516ce01779a0bd6f5bb53c1f Mon Sep 17 00:00:00 2001
From: Stepan Broz <sbroz@redhat.com>
Date: Tue, 6 Feb 2024 14:12:32 +0100
Subject: [PATCH] Remove gopher support

---
 doc/debug-sections.txt                   |   1 -
 errors/af/ERR_UNSUP_REQ                  |   2 +-
 errors/ar/ERR_UNSUP_REQ                  |   2 +-
 errors/az/ERR_UNSUP_REQ                  |   2 +-
 errors/bg/ERR_UNSUP_REQ                  |   2 +-
 errors/ca/ERR_UNSUP_REQ                  |   2 +-
 errors/cs/ERR_UNSUP_REQ                  |   2 +-
 errors/da/ERR_UNSUP_REQ                  |   2 +-
 errors/de/ERR_UNSUP_REQ                  |   2 +-
 errors/el/ERR_UNSUP_REQ                  |   2 +-
 errors/en/ERR_UNSUP_REQ                  |   2 +-
 errors/errorpage.css                     |   2 +-
 errors/es/ERR_UNSUP_REQ                  |   2 +-
 errors/et/ERR_UNSUP_REQ                  |   2 +-
 errors/fa/ERR_UNSUP_REQ                  |   2 +-
 errors/fi/ERR_UNSUP_REQ                  |   2 +-
 errors/fr/ERR_UNSUP_REQ                  |   2 +-
 errors/he/ERR_UNSUP_REQ                  |   2 +-
 errors/hu/ERR_UNSUP_REQ                  |   2 +-
 errors/hy/ERR_UNSUP_REQ                  |   2 +-
 errors/id/ERR_UNSUP_REQ                  |   2 +-
 errors/it/ERR_UNSUP_REQ                  |   2 +-
 errors/ja/ERR_UNSUP_REQ                  |   2 +-
 errors/ka/ERR_UNSUP_REQ                  |   2 +-
 errors/ko/ERR_UNSUP_REQ                  |   2 +-
 errors/lt/ERR_UNSUP_REQ                  |   2 +-
 errors/lv/ERR_UNSUP_REQ                  |   2 +-
 errors/ms/ERR_UNSUP_REQ                  |   2 +-
 errors/nl/ERR_UNSUP_REQ                  |   2 +-
 errors/oc/ERR_UNSUP_REQ                  |   2 +-
 errors/pl/ERR_UNSUP_REQ                  |   2 +-
 errors/pt-br/ERR_UNSUP_REQ               |   2 +-
 errors/pt/ERR_UNSUP_REQ                  |   2 +-
 errors/ro/ERR_UNSUP_REQ                  |   2 +-
 errors/ru/ERR_UNSUP_REQ                  |   2 +-
 errors/sk/ERR_UNSUP_REQ                  |   2 +-
 errors/sl/ERR_UNSUP_REQ                  |   2 +-
 errors/sr-cyrl/ERR_UNSUP_REQ             |   2 +-
 errors/sr-latn/ERR_UNSUP_REQ             |   2 +-
 errors/sv/ERR_UNSUP_REQ                  |   2 +-
 errors/templates/ERR_UNSUP_REQ           |   2 +-
 errors/th/ERR_UNSUP_REQ                  |   2 +-
 errors/tr/ERR_UNSUP_REQ                  |   2 +-
 errors/uk/ERR_UNSUP_REQ                  |   2 +-
 errors/uz/ERR_UNSUP_REQ                  |   2 +-
 errors/vi/ERR_UNSUP_REQ                  |   2 +-
 errors/zh-hans/ERR_UNSUP_REQ             |   2 +-
 errors/zh-hant/ERR_UNSUP_REQ             |   2 +-
 src/FwdState.cc                          |   5 -
 src/HttpRequest.cc                       |   6 -
 src/IoStats.h                            |   2 +-
 src/Makefile.am                          |  14 -
 src/Makefile.in                          |  51 +-
 src/adaptation/ecap/Host.cc              |   1 -
 src/adaptation/ecap/MessageRep.cc        |   2 -
 src/anyp/ProtocolType.cc                 |   1 -
 src/anyp/ProtocolType.h                  |   1 -
 src/cf.data.pre                          |   6 +-
 src/client_side_request.cc               |   4 -
 src/err_type.h                           |   2 +-
 src/gopher.cc                            | 982 -----------------------
 src/gopher.h                             |  29 -
 src/mgr/IoAction.cc                      |   3 -
 src/mgr/IoAction.h                       |   2 -
 src/squid.8.in                           |   2 +-
 src/stat.cc                              |  19 -
 src/url.cc                               |   8 -
 test-suite/squidconf/regressions-3.4.0.1 |   1 -
 68 files changed, 71 insertions(+), 1165 deletions(-)
 delete mode 100644 src/gopher.cc
 delete mode 100644 src/gopher.h

diff --git a/doc/debug-sections.txt b/doc/debug-sections.txt
index 8f3be05..bea80e1 100644
--- a/doc/debug-sections.txt
+++ b/doc/debug-sections.txt
@@ -27,7 +27,6 @@ section 06    Disk I/O Routines
 section 07    Multicast
 section 08    Swap File Bitmap
 section 09    File Transfer Protocol (FTP)
-section 10    Gopher
 section 11    Hypertext Transfer Protocol (HTTP)
 section 12    Internet Cache Protocol (ICP)
 section 13    High Level Memory Pool Management
diff --git a/errors/af/ERR_UNSUP_REQ b/errors/af/ERR_UNSUP_REQ
index e17daed..6851f71 100644
--- a/errors/af/ERR_UNSUP_REQ
+++ b/errors/af/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Niegesteunde versoekmetode en -protokol</b></p>
 </blockquote>
 
-<p>Squid ondersteun nie alle navraagmetodes vir alle toegangsprotokolle nie. Mens kan by voorbeeld nie 'n Gopher-navraag POST nie.</p>
+<p>Squid ondersteun nie alle navraagmetodes vir alle toegangsprotokolle nie.</p>
 
 <p>Die kasbediener se administrateur is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ar/ERR_UNSUP_REQ b/errors/ar/ERR_UNSUP_REQ
index 2a85404..96ba37a 100644
--- a/errors/ar/ERR_UNSUP_REQ
+++ b/errors/ar/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/az/ERR_UNSUP_REQ b/errors/az/ERR_UNSUP_REQ
index add8654..937babf 100644
--- a/errors/az/ERR_UNSUP_REQ
+++ b/errors/az/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Dəstəklənməyən sorğu metodu və protokol</b></p>
 </blockquote>
 
-<p>Squid bütün sorğu metodları və bütün protokollardəstəkləmir. Məsələn, Gopher protokolu üzrə siz POST sorğu metodunu yerinə yetirə bilməzsiniz.</p>
+<p>Squid bütün sorğu metodları və bütün protokollardəstəkləmir.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/bg/ERR_UNSUP_REQ b/errors/bg/ERR_UNSUP_REQ
index c5d7220..97d386a 100644
--- a/errors/bg/ERR_UNSUP_REQ
+++ b/errors/bg/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Сървърът не поддържа метода и/или протокола, посочен в заявката</b></p>
 </blockquote>
 
-<p>Кеш сървърът не поддържа всички методи на заявка за всички протоколи. Например, не можете да заявите метод POST за протокол Gopher.</p>
+<p>Кеш сървърът не поддържа всички методи на заявка за всички протоколи.</p>
 
 <p>Вашият кеш администратор е <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ca/ERR_UNSUP_REQ b/errors/ca/ERR_UNSUP_REQ
index 8115246..2a1cb55 100644
--- a/errors/ca/ERR_UNSUP_REQ
+++ b/errors/ca/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>M&egrave;tode i protocol no admesos</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>L'administrador d'aquesta cache &eacute;s <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/cs/ERR_UNSUP_REQ b/errors/cs/ERR_UNSUP_REQ
index 4f87e8e..ff1664d 100644
--- a/errors/cs/ERR_UNSUP_REQ
+++ b/errors/cs/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid nepodporuje všechny typy metod u všech protokolů. Např. není možno použit metodu POST u služby GOPHER.</p>
+<p>Squid nepodporuje všechny typy metod u všech protokolů.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/da/ERR_UNSUP_REQ b/errors/da/ERR_UNSUP_REQ
index 1773ae6..2a49b94 100644
--- a/errors/da/ERR_UNSUP_REQ
+++ b/errors/da/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Uunderst&oslash;ttet Foresp&oslash;rgsels Metode og Protokol</b></p>
 </blockquote>
 
-<p>Proxy'en Squid underst&oslash;tter ikke alle foresp&oslash;rgselsmetoder for alle adgangs protokoller. For eksempel kan du ikke POST en Gopher foresp&oslash;rgsel.</p>
+<p>Proxy'en Squid underst&oslash;tter ikke alle foresp&oslash;rgselsmetoder for alle adgangs protokoller.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/de/ERR_UNSUP_REQ b/errors/de/ERR_UNSUP_REQ
index e07cc92..d3e5462 100644
--- a/errors/de/ERR_UNSUP_REQ
+++ b/errors/de/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Anfragemethode und Protokoll nicht unterstützt</b></p>
 </blockquote>
 
-<p>Squid unterstützt nicht alle Anfragemethoden für alle Protokolle. Sie können zum Beispiel keine POST Anfrage über das Gopher Protokoll senden.</p>
+<p>Squid unterstützt nicht alle Anfragemethoden für alle Protokolle.</p>
 
 <p>Ihr Cache Administrator ist <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/el/ERR_UNSUP_REQ b/errors/el/ERR_UNSUP_REQ
index e784f0d..0eba042 100644
--- a/errors/el/ERR_UNSUP_REQ
+++ b/errors/el/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Μη υποστηριζόμενη μέθοδος αίτησης και πρωτόκολλο</b></p>
 </blockquote>
 
-<p>Το Squid δεν υποστηρίζει όλες τις μεθόδους αιτήσεων για όλα τα πρωτόκολλα πρόσβασης. Για παράδειγμα, το POST για Gopher δεν υποστηρίζεται.</p>
+<p>Το Squid δεν υποστηρίζει όλες τις μεθόδους αιτήσεων για όλα τα πρωτόκολλα πρόσβασης.</p>
 
 <p>Ο διαχειριστής του μεσολαβητή σας είναι ο <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/en/ERR_UNSUP_REQ b/errors/en/ERR_UNSUP_REQ
index 059b073..70a3b4e 100644
--- a/errors/en/ERR_UNSUP_REQ
+++ b/errors/en/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/errorpage.css b/errors/errorpage.css
index 3b392fe..9762c6c 100644
--- a/errors/errorpage.css
+++ b/errors/errorpage.css
@@ -74,7 +74,7 @@ pre {
     font-family:sans-serif;
 }
 
-/* special event: FTP / Gopher directory listing */
+/* special event: FTP directory listing */
 #dirmsg {
     font-family: courier;
     color: black;
diff --git a/errors/es/ERR_UNSUP_REQ b/errors/es/ERR_UNSUP_REQ
index 0671f65..b03dba6 100644
--- a/errors/es/ERR_UNSUP_REQ
+++ b/errors/es/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>M&eacute;todo de la petici&oacute;n y protocolo no soportados.</b></p>
 </blockquote>
 
-<p>Squid no admite todos los m&eacute;todos para todos los protocolos de acceso. Por ejemplo, no se puede hacer un POST a un servidor Gopher.</p>
+<p>Squid no admite todos los m&eacute;todos para todos los protocolos de acceso.</p>
 
 <p>Su administrador del cach&eacute; es <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/et/ERR_UNSUP_REQ b/errors/et/ERR_UNSUP_REQ
index e44db4a..bb53957 100644
--- a/errors/et/ERR_UNSUP_REQ
+++ b/errors/et/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Tundmatu p&auml;ringu meetod ja protokoll</b></p>
 </blockquote>
 
-<p>Squid ei toeta k&otilde;iki p&auml;ringu meetodeid k&otilde;ikide protokollidega. N&auml;iteks, te ei saa teha POST operatsiooni Gopher p&auml;ringus.</p>
+<p>Squid ei toeta k&otilde;iki p&auml;ringu meetodeid k&otilde;ikide protokollidega.</p>
 
 <p>Teie teenusepakkuja aadress on <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/fa/ERR_UNSUP_REQ b/errors/fa/ERR_UNSUP_REQ
index f88dbfd..81b38f8 100644
--- a/errors/fa/ERR_UNSUP_REQ
+++ b/errors/fa/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>روش پشتیبانی‌نشده درخواست و قرارداد</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/fi/ERR_UNSUP_REQ b/errors/fi/ERR_UNSUP_REQ
index 6cfc3e8..1cd4164 100644
--- a/errors/fi/ERR_UNSUP_REQ
+++ b/errors/fi/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Hakupyynnon tyyppi ja yhteyskäytäntö ei tuettu</b></p>
 </blockquote>
 
-<p>Squid ei tue kaikkia hakupyynnon tyyppejä kaikilla protokollilla. Et voi esimerkiksi käyttää POST-pyyntöä gopherilla.</p>
+<p>Squid ei tue kaikkia hakupyynnon tyyppejä kaikilla protokollilla.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/fr/ERR_UNSUP_REQ b/errors/fr/ERR_UNSUP_REQ
index b714037..fbadc39 100644
--- a/errors/fr/ERR_UNSUP_REQ
+++ b/errors/fr/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>La méthode de requête et le protocole ne sont pas pris en charge.</b></p>
 </blockquote>
 
-<p>Squid ne prend pas en charge tous les types de requêtes par rapport à tous les protocoles d'accès. Vous ne pouvez pas par exemple utiliser une requête POST avec le protocole Gopher.</p>
+<p>Squid ne prend pas en charge tous les types de requêtes par rapport à tous les protocoles d'accès.</p>
 
 <p>Votre administrateur proxy est <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/he/ERR_UNSUP_REQ b/errors/he/ERR_UNSUP_REQ
index 2d0eafa..a96e3b8 100644
--- a/errors/he/ERR_UNSUP_REQ
+++ b/errors/he/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>שיטת בקשה ופרוטוקול לא נתמכים</b></p>
 </blockquote>
 
-<p>שרת ה Squid אינו תומך בכל שיטות הבקשה לכל הפרוטוקולים. לדוגמא אינך יכול לשלוח בקשת POST ב-Gopher.</p>
+<p>שרת ה Squid אינו תומך בכל שיטות הבקשה לכל הפרוטוקולים.</p>
 
 <p>מנהל השרת הוא <a href="mailto:%w%W">%w</a>. </p>
 <br>
diff --git a/errors/hu/ERR_UNSUP_REQ b/errors/hu/ERR_UNSUP_REQ
index d7f9223..c8d2871 100644
--- a/errors/hu/ERR_UNSUP_REQ
+++ b/errors/hu/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Nem támogatott kéréstípus vagy protokoll</b></p>
 </blockquote>
 
-<p>A proxyszerver nem támogat minden létező kéréstípus és protokoll kombinációt, így pl. nem lehet POST kéréstípust használni egy Gopher kérésben.</p>
+<p>A proxyszerver nem támogat minden létező kéréstípus és protokoll kombinációt.</p>
 
 <p>A proxyszerver üzemeltetőjének e-mail címe: <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/hy/ERR_UNSUP_REQ b/errors/hy/ERR_UNSUP_REQ
index ee2a38f..77d48e3 100644
--- a/errors/hy/ERR_UNSUP_REQ
+++ b/errors/hy/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Հարցում իրականացնելու մեթոդը և արձանագրությունը չեն աջակցվում</b></p>
 </blockquote>
 
-<p>Squid-ը բոլոր արձանագրությունների համար բոլոր հարցման մեթոդները չի աջակցում. Օրինակ, Gopher արձանագրության համար չեք կարող POST հարցում կատարել.</p>
+<p>Squid-ը բոլոր արձանագրությունների համար բոլոր հարցման մեթոդները չի աջակցում.</p>
 
 <p>Ձեր քեշի կառավարիչը <a href="mailto:%w%W">%w</a> է.</p>
 <br>
diff --git a/errors/id/ERR_UNSUP_REQ b/errors/id/ERR_UNSUP_REQ
index 059b073..70a3b4e 100644
--- a/errors/id/ERR_UNSUP_REQ
+++ b/errors/id/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/it/ERR_UNSUP_REQ b/errors/it/ERR_UNSUP_REQ
index 7a7594e..898201c 100644
--- a/errors/it/ERR_UNSUP_REQ
+++ b/errors/it/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Metodo e protocollo della richiesta non sono supportati.</b></p>
 </blockquote>
 
-<p>Squid non consente di utilizzare qualsiasi tipo di richiesta per qualsiasi protocollo (a esempio non consente una richiesta POST su protocollo Gopher).</p>
+<p>Squid non consente di utilizzare qualsiasi tipo di richiesta per qualsiasi protocollo.</p>
 
 <p>L'amministratore del proxy è <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ja/ERR_UNSUP_REQ b/errors/ja/ERR_UNSUP_REQ
index 22ed098..92993e7 100644
--- a/errors/ja/ERR_UNSUP_REQ
+++ b/errors/ja/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>サポートしていないリクエストメソッドとプロトコルです。</b></p>
 </blockquote>
 
-<p>Squidはすべてのアクセス・プロトコルに対して、すべてのリクエストメソッドをサポートしているわけではありません。例えば、POSTをGopherのリクエストで行うことはできません。</p>
+<p>Squidはすべてのアクセス・プロトコルに対して、すべてのリクエストメソッドをサポートしているわけではありません。</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ka/ERR_UNSUP_REQ b/errors/ka/ERR_UNSUP_REQ
index 059b073..70a3b4e 100644
--- a/errors/ka/ERR_UNSUP_REQ
+++ b/errors/ka/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ko/ERR_UNSUP_REQ b/errors/ko/ERR_UNSUP_REQ
index 723f304..e892352 100644
--- a/errors/ko/ERR_UNSUP_REQ
+++ b/errors/ko/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>지원되지 않는 Request Method와 프로토콜입니다.</b></p>
 </blockquote>
 
-<p>Squid는 모든 접속 프로토콜에 대한 request method를 지원하지 않습니다. 한가지 예로, Gopher에서 POST request를 사용할 수 없습니다.</p>
+<p>Squid는 모든 접속 프로토콜에 대한 request method를 지원하지 않습니다.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/lt/ERR_UNSUP_REQ b/errors/lt/ERR_UNSUP_REQ
index c5759e6..bb006c0 100644
--- a/errors/lt/ERR_UNSUP_REQ
+++ b/errors/lt/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Nepalaikomas užklausos metodas ir protokolas</b></p>
 </blockquote>
 
-<p>Squid palaiko ne visus užklausos metodus daliai protokolų. Pavyzdžiui, jūs negalite vykdyti POST Gopher tipo užklausoje.</p>
+<p>Squid palaiko ne visus užklausos metodus daliai protokolų.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/lv/ERR_UNSUP_REQ b/errors/lv/ERR_UNSUP_REQ
index 1bd5dc6..3f60b6c 100644
--- a/errors/lv/ERR_UNSUP_REQ
+++ b/errors/lv/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Neatbalstīta pieprasījuma metode un protokols</b></p>
 </blockquote>
 
-<p>Squid neatbalsta visas pieprasījuma metodes visiem protokoliem. Piemēram, Jūs nevarat veikt POST pieprasījumu izmantojot Gopher protokolu.</p>
+<p>Squid neatbalsta visas pieprasījuma metodes visiem protokoliem.</p>
 
 <p>Jūsu kešatmiņas administrators ir <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ms/ERR_UNSUP_REQ b/errors/ms/ERR_UNSUP_REQ
index ee6d67a..57c073e 100644
--- a/errors/ms/ERR_UNSUP_REQ
+++ b/errors/ms/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Pengurus Proxy anda ialah <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/nl/ERR_UNSUP_REQ b/errors/nl/ERR_UNSUP_REQ
index f0a0107..e086cd0 100644
--- a/errors/nl/ERR_UNSUP_REQ
+++ b/errors/nl/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Niet ondersteunde verzoekmethode of protocol</b></p>
 </blockquote>
 
-<p>Squid ondersteunt niet alle verzoekmethoden voor alle toegangsprotocollen. U kunt bijvoorbeeld geen Gopher verzoek POSTen.</p>
+<p>Squid ondersteunt niet alle verzoekmethoden voor alle toegangsprotocollen.</p>
 
 <p>De beheerder van deze cache is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/oc/ERR_UNSUP_REQ b/errors/oc/ERR_UNSUP_REQ
index af183ce..ff39a8f 100644
--- a/errors/oc/ERR_UNSUP_REQ
+++ b/errors/oc/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Vòstre administrator d'amagatal es <a href="mailto:%w">%w</a>.</p>
 <br>
diff --git a/errors/pl/ERR_UNSUP_REQ b/errors/pl/ERR_UNSUP_REQ
index 77e9350..9e84117 100644
--- a/errors/pl/ERR_UNSUP_REQ
+++ b/errors/pl/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>użyta w żądaniu kombinacja metoda/protokół jest niewłaściwa</b></p>
 </blockquote>
 
-<p>Squid nie wspiera wszystkich metod we wszystkich protokołach. Na przykład nie możesz użyć metody POST w żądaniu skierowanym do usługi Gopher.</p>
+<p>Squid nie wspiera wszystkich metod we wszystkich protokołach.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/pt-br/ERR_UNSUP_REQ b/errors/pt-br/ERR_UNSUP_REQ
index e2948f9..ce9b632 100644
--- a/errors/pt-br/ERR_UNSUP_REQ
+++ b/errors/pt-br/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Método e Protocolo de Requisição Não-Suportado</b></p>
 </blockquote>
 
-<p>Squid não suporta todos os métodos de requisição para todos os protocolos de acesso. Por exemplo, você não pode emitir uma requisição POST ao protocolo Gopher.</p>
+<p>Squid não suporta todos os métodos de requisição para todos os protocolos de acesso.</p>
 
 <p>Seu administrador do cache é <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/pt/ERR_UNSUP_REQ b/errors/pt/ERR_UNSUP_REQ
index 5201d24..3a744c1 100644
--- a/errors/pt/ERR_UNSUP_REQ
+++ b/errors/pt/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Método ou protocolo não suportado.</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ro/ERR_UNSUP_REQ b/errors/ro/ERR_UNSUP_REQ
index 8ca0502..51324e9 100644
--- a/errors/ro/ERR_UNSUP_REQ
+++ b/errors/ro/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Metodă de cerere şi protocol nesuportată</b></p>
 </blockquote>
 
-<p>Squid nu suportă toate metodele de cerere pentru toate protocoalele de acces. De exemplu, nu puteţi face o cerere de tip POST pentru Gopher.</p>
+<p>Squid nu suportă toate metodele de cerere pentru toate protocoalele de acces.</p>
 
 <p>Administratorul cache-ului este <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/ru/ERR_UNSUP_REQ b/errors/ru/ERR_UNSUP_REQ
index 5bd256a..a42d2e2 100644
--- a/errors/ru/ERR_UNSUP_REQ
+++ b/errors/ru/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Неподдерживаемый метод запроса или протокол</b></p>
 </blockquote>
 
-<p>Squid не поддерживает все методы запросов для всех протоколов. К примеру, для протокола Gopher Вы не можете выполнить запрос POST.</p>
+<p>Squid не поддерживает все методы запросов для всех протоколов.</p>
 
 <p>Администратор Вашего кэша: <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/sk/ERR_UNSUP_REQ b/errors/sk/ERR_UNSUP_REQ
index 91718dc..9abbca8 100644
--- a/errors/sk/ERR_UNSUP_REQ
+++ b/errors/sk/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Nepodporovaná metóda a protokol požiadavky</b></p>
 </blockquote>
 
-<p>Squid nepodporuje všetky typy metód pri všetkých protokoloch. Napríklad: nie je možné použiť metódu POST pri službe Gopher.</p>
+<p>Squid nepodporuje všetky typy metód pri všetkých protokoloch.</p>
 
 <p>Vaším správcom cache je <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/sl/ERR_UNSUP_REQ b/errors/sl/ERR_UNSUP_REQ
index e26d86f..bfc6a10 100644
--- a/errors/sl/ERR_UNSUP_REQ
+++ b/errors/sl/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Nepodprta metoda zahteve in protokol</b></p>
 </blockquote>
 
-<p>Squid ne podpira vseh metod zahtev za vse protokole dostopa. Tako npr. metode POST ne morete uporabiti za zahtevo Gopher.</p>
+<p>Squid ne podpira vseh metod zahtev za vse protokole dostopa.</p>
 
 <p>Skrbnik vašega predpomnilnika je <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/sr-cyrl/ERR_UNSUP_REQ b/errors/sr-cyrl/ERR_UNSUP_REQ
index 059b073..70a3b4e 100644
--- a/errors/sr-cyrl/ERR_UNSUP_REQ
+++ b/errors/sr-cyrl/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/sr-latn/ERR_UNSUP_REQ b/errors/sr-latn/ERR_UNSUP_REQ
index 78b0484..bfa783c 100644
--- a/errors/sr-latn/ERR_UNSUP_REQ
+++ b/errors/sr-latn/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Nepodržan metod ili protokol zahteva (Request)</b></p>
 </blockquote>
 
-<p>Squid Proksi server ne podržava sve metode zahteva za sve moguæe pristupne protokole. Na primer ne možete da uradite POST na Gopher zahtev.</p>
+<p>Squid Proksi server ne podržava sve metode zahteva za sve moguæe pristupne protokole.</p>
 
 <p>Vaš keš/proksi administrator je: <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/sv/ERR_UNSUP_REQ b/errors/sv/ERR_UNSUP_REQ
index b8be6fb..48ecc87 100644
--- a/errors/sv/ERR_UNSUP_REQ
+++ b/errors/sv/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Ej st&ouml;d f&ouml;r beg&auml;rd Metod och Protokoll</b></p>
 </blockquote>
 
-<p>Squid st&ouml;djer inte alla fr&aring;gemetoder f&ouml;r alla protokoll. Till exempel, Ni kan inte POST'a en Gopher f&ouml;rfr&aring;gan.</p>
+<p>Squid st&ouml;djer inte alla fr&aring;gemetoder f&ouml;r alla protokoll.</p>
 
 <p>Din cacheserver administrat&ouml;r &auml;r <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/templates/ERR_UNSUP_REQ b/errors/templates/ERR_UNSUP_REQ
index 68b60c9..aaf6fe9 100644
--- a/errors/templates/ERR_UNSUP_REQ
+++ b/errors/templates/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/th/ERR_UNSUP_REQ b/errors/th/ERR_UNSUP_REQ
index 3d71c0a..d0adcdb 100644
--- a/errors/th/ERR_UNSUP_REQ
+++ b/errors/th/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>ไม่รองรับโปรโตคอลและวิธีการหรือคำสั่งที่เรียกมา (request method)</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>ผู้ดูแลระบบแคชของคุณคือ <a href="mailto:%w%W">%w</a></p>
 <br>
diff --git a/errors/tr/ERR_UNSUP_REQ b/errors/tr/ERR_UNSUP_REQ
index 22e0b48..c985248 100644
--- a/errors/tr/ERR_UNSUP_REQ
+++ b/errors/tr/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Desteklenmeyen istek yöntemi ve protokol.</b></p>
 </blockquote>
 
-<p>Squid, bazı erişim protokollerin, bazı istek yöntemlerini desteklemiyor. Örneğin Gopher isteğinizde POST yapamazsınız.</p>
+<p>Squid, bazı erişim protokollerin, bazı istek yöntemlerini desteklemiyor.</p>
 
 <p>Önbellk yöneticiniz <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/uk/ERR_UNSUP_REQ b/errors/uk/ERR_UNSUP_REQ
index 7deb9b9..f1bc7b4 100644
--- a/errors/uk/ERR_UNSUP_REQ
+++ b/errors/uk/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Метод запиту чи протокол не підтримуються</b></p>
 </blockquote>
 
-<p>Squid не підтримує всі методи запитів для всіх наявних протоколів. Як приклад, Ви не можете виконати запит POST для протоколу Gopher.</p>
+<p>Squid не підтримує всі методи запитів для всіх наявних протоколів.</p>
 
 <p>Адміністратор даного кешу <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/uz/ERR_UNSUP_REQ b/errors/uz/ERR_UNSUP_REQ
index db3799e..c2c66dd 100644
--- a/errors/uz/ERR_UNSUP_REQ
+++ b/errors/uz/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid does not support all request methods for all access protocols. For example, you can not POST a Gopher request.</p>
+<p>Squid does not support all request methods for all access protocols.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/vi/ERR_UNSUP_REQ b/errors/vi/ERR_UNSUP_REQ
index 4fbe5b2..6c6631a 100644
--- a/errors/vi/ERR_UNSUP_REQ
+++ b/errors/vi/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>Unsupported Request Method and Protocol</b></p>
 </blockquote>
 
-<p>Squid không hỗ trợ tất cả các phương pháp yêu cầu cho mỗi giao thức truy cập. Chẳng hạn, bạn không có khả năng POST một yêu cầu Gopher.</p>
+<p>Squid không hỗ trợ tất cả các phương pháp yêu cầu cho mỗi giao thức truy cập.</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/zh-hans/ERR_UNSUP_REQ b/errors/zh-hans/ERR_UNSUP_REQ
index 263cffd..2fa387f 100644
--- a/errors/zh-hans/ERR_UNSUP_REQ
+++ b/errors/zh-hans/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>不支持的请求方式和协议</b></p>
 </blockquote>
 
-<p>Squid (缓存服务器)不能对所有的存取协议支持所有的请求方式。比如说,你不能对 GOPHER 进行一个 POST 请求。</p>
+<p>Squid (缓存服务器)不能对所有的存取协议支持所有的请求方式。</p>
 
 <p>缓存服务器的管理员 <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/errors/zh-hant/ERR_UNSUP_REQ b/errors/zh-hant/ERR_UNSUP_REQ
index 8b56127..272219b 100644
--- a/errors/zh-hant/ERR_UNSUP_REQ
+++ b/errors/zh-hant/ERR_UNSUP_REQ
@@ -24,7 +24,7 @@ body
 <p><b>尚未支援的要求方式或通訊協定</b></p>
 </blockquote>
 
-<p>因為 Squid (網路快取程式)並未支援所有的連結要求方式在各式通訊協定上。比如說,你不能要求一個 GOPHER 的 POST 連結要求。</p>
+<p>因為 Squid (網路快取程式)並未支援所有的連結要求方式在各式通訊協定上。</p>
 
 <p>Your cache administrator is <a href="mailto:%w%W">%w</a>.</p>
 <br>
diff --git a/src/FwdState.cc b/src/FwdState.cc
index c1d8a0f..42dfe20 100644
--- a/src/FwdState.cc
+++ b/src/FwdState.cc
@@ -28,7 +28,6 @@
 #include "fde.h"
 #include "FwdState.h"
 #include "globals.h"
-#include "gopher.h"
 #include "hier_code.h"
 #include "http.h"
 #include "HttpReply.h"
@@ -978,10 +977,6 @@ FwdState::dispatch()
             httpStart(this);
             break;
 
-        case AnyP::PROTO_GOPHER:
-            gopherStart(this);
-            break;
-
         case AnyP::PROTO_FTP:
             if (request->flags.ftpNative)
                 Ftp::StartRelay(this);
diff --git a/src/HttpRequest.cc b/src/HttpRequest.cc
index f686251..abddd2b 100644
--- a/src/HttpRequest.cc
+++ b/src/HttpRequest.cc
@@ -16,7 +16,6 @@
 #include "DnsLookupDetails.h"
 #include "err_detail_type.h"
 #include "globals.h"
-#include "gopher.h"
 #include "http.h"
 #include "HttpHdrCc.h"
 #include "HttpHeaderRange.h"
@@ -580,11 +579,6 @@ HttpRequest::maybeCacheable()
         //      no-store, private and related which block cacheability
         break;
 
-    case AnyP::PROTO_GOPHER:
-        if (!gopherCachable(this))
-            return false;
-        break;
-
     case AnyP::PROTO_CACHE_OBJECT:
         return false;
 
diff --git a/src/IoStats.h b/src/IoStats.h
index 0383c09..3fbd0a2 100644
--- a/src/IoStats.h
+++ b/src/IoStats.h
@@ -22,7 +22,7 @@ public:
         int writes;
         int write_hist[histSize];
     }
-    Http, Ftp, Gopher;
+    Http, Ftp;
 };
 
 #endif /* SQUID_IOSTATS_H_ */
diff --git a/src/Makefile.am b/src/Makefile.am
index c21032e..f34ace3 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -367,8 +367,6 @@ squid_SOURCES = \
 	FwdState.h \
 	Generic.h \
 	globals.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	helper.h \
 	hier_code.h \
@@ -1482,8 +1480,6 @@ tests_testCacheManager_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	hier_code.h \
 	helper.cc \
 	$(HTCPSOURCE) \
@@ -1898,8 +1894,6 @@ tests_testEvent_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -2145,8 +2139,6 @@ tests_testEventLoop_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -2388,8 +2380,6 @@ tests_test_http_range_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -2716,8 +2706,6 @@ tests_testHttpRequest_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -3568,8 +3556,6 @@ tests_testURL_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
diff --git a/src/Makefile.in b/src/Makefile.in
index 0e1c453..21bceff 100644
--- a/src/Makefile.in
+++ b/src/Makefile.in
@@ -341,7 +341,7 @@ am__squid_SOURCES_DIST = AclRegs.cc AuthReg.cc AccessLogEntry.cc \
 	ExternalACLEntry.h FadingCounter.h FadingCounter.cc fatal.h \
 	fatal.cc fd.h fd.cc fde.cc fde.h FileMap.h filemap.cc \
 	fqdncache.h fqdncache.cc FwdState.cc FwdState.h Generic.h \
-	globals.h gopher.h gopher.cc helper.cc helper.h hier_code.h \
+	globals.h helper.cc helper.h hier_code.h \
 	HierarchyLogEntry.h htcp.cc htcp.h HttpStateFlags.h http.cc \
 	http.h HttpHeaderFieldStat.h HttpHdrCc.h HttpHdrCc.cc \
 	HttpHdrCc.cci HttpHdrRange.cc HttpHdrSc.cc HttpHdrSc.h \
@@ -437,7 +437,7 @@ am_squid_OBJECTS = $(am__objects_4) AccessLogEntry.$(OBJEXT) \
 	event.$(OBJEXT) EventLoop.$(OBJEXT) external_acl.$(OBJEXT) \
 	ExternalACLEntry.$(OBJEXT) FadingCounter.$(OBJEXT) \
 	fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) filemap.$(OBJEXT) \
-	fqdncache.$(OBJEXT) FwdState.$(OBJEXT) gopher.$(OBJEXT) \
+	fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
 	helper.$(OBJEXT) $(am__objects_9) http.$(OBJEXT) \
 	HttpHdrCc.$(OBJEXT) HttpHdrRange.$(OBJEXT) HttpHdrSc.$(OBJEXT) \
 	HttpHdrScTarget.$(OBJEXT) HttpHdrContRange.$(OBJEXT) \
@@ -612,8 +612,8 @@ am__tests_testCacheManager_SOURCES_DIST = AccessLogEntry.cc debug.cc \
 	DnsLookupDetails.cc errorpage.cc tests/stub_ETag.cc event.cc \
 	external_acl.cc ExternalACLEntry.cc fatal.h \
 	tests/stub_fatal.cc fd.h fd.cc fde.cc FileMap.h filemap.cc \
-	fqdncache.h fqdncache.cc FwdState.cc FwdState.h gopher.h \
-	gopher.cc hier_code.h helper.cc htcp.cc htcp.h \
+	fqdncache.h fqdncache.cc FwdState.cc FwdState.h \
+	hier_code.h helper.cc htcp.cc htcp.h \
 	HttpStateFlags.h http.cc HttpBody.h HttpBody.cc HttpHeader.h \
 	HttpHeader.cc HttpHeaderFieldInfo.h HttpHeaderTools.h \
 	HttpHeaderTools.cc HttpHeaderFieldStat.h HttpHdrCc.h \
@@ -672,7 +672,7 @@ am_tests_testCacheManager_OBJECTS = AccessLogEntry.$(OBJEXT) \
 	external_acl.$(OBJEXT) ExternalACLEntry.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
 	filemap.$(OBJEXT) fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
-	gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_9) \
+	helper.$(OBJEXT) $(am__objects_9) \
 	http.$(OBJEXT) HttpBody.$(OBJEXT) HttpHeader.$(OBJEXT) \
 	HttpHeaderTools.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
 	HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \
@@ -881,7 +881,7 @@ am__tests_testEvent_SOURCES_DIST = AccessLogEntry.cc BodyPipe.cc \
 	EventLoop.h EventLoop.cc external_acl.cc ExternalACLEntry.cc \
 	FadingCounter.cc fatal.h tests/stub_fatal.cc fd.h fd.cc fde.cc \
 	FileMap.h filemap.cc fqdncache.h fqdncache.cc FwdState.cc \
-	FwdState.h gopher.h gopher.cc helper.cc hier_code.h htcp.cc \
+	FwdState.h helper.cc hier_code.h htcp.cc \
 	htcp.h http.cc HttpBody.h HttpBody.cc HttpHeader.h \
 	HttpHeader.cc HttpHeaderFieldInfo.h HttpHeaderTools.h \
 	HttpHeaderTools.cc HttpHeaderFieldStat.h HttpHdrCc.h \
@@ -939,7 +939,7 @@ am_tests_testEvent_OBJECTS = AccessLogEntry.$(OBJEXT) \
 	ExternalACLEntry.$(OBJEXT) FadingCounter.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
 	filemap.$(OBJEXT) fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
-	gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_9) \
+	helper.$(OBJEXT) $(am__objects_9) \
 	http.$(OBJEXT) HttpBody.$(OBJEXT) HttpHeader.$(OBJEXT) \
 	HttpHeaderTools.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
 	HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \
@@ -1012,8 +1012,8 @@ am__tests_testEventLoop_SOURCES_DIST = AccessLogEntry.cc BodyPipe.cc \
 	EventLoop.h EventLoop.cc event.cc external_acl.cc \
 	ExternalACLEntry.cc FadingCounter.cc fatal.h \
 	tests/stub_fatal.cc fd.h fd.cc fde.cc FileMap.h filemap.cc \
-	fqdncache.h fqdncache.cc FwdState.cc FwdState.h gopher.h \
-	gopher.cc helper.cc hier_code.h htcp.cc htcp.h http.cc \
+	fqdncache.h fqdncache.cc FwdState.cc FwdState.h \
+	helper.cc hier_code.h htcp.cc htcp.h http.cc \
 	HttpBody.h HttpBody.cc HttpHeader.h HttpHeader.cc \
 	HttpHeaderFieldInfo.h HttpHeaderTools.h HttpHeaderTools.cc \
 	HttpHeaderFieldStat.h HttpHdrCc.h HttpHdrCc.cc HttpHdrCc.cci \
@@ -1070,7 +1070,7 @@ am_tests_testEventLoop_OBJECTS = AccessLogEntry.$(OBJEXT) \
 	ExternalACLEntry.$(OBJEXT) FadingCounter.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
 	filemap.$(OBJEXT) fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
-	gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_9) \
+	helper.$(OBJEXT) $(am__objects_9) \
 	http.$(OBJEXT) HttpBody.$(OBJEXT) HttpHeader.$(OBJEXT) \
 	HttpHeaderTools.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
 	HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \
@@ -1197,7 +1197,7 @@ am__tests_testHttpRequest_SOURCES_DIST = AccessLogEntry.cc \
 	DnsLookupDetails.cc errorpage.cc tests/stub_ETag.cc \
 	external_acl.cc ExternalACLEntry.cc fatal.h \
 	tests/stub_fatal.cc fd.h fd.cc fde.cc fqdncache.h fqdncache.cc \
-	FwdState.cc FwdState.h gopher.h gopher.cc helper.cc \
+	FwdState.cc FwdState.h helper.cc \
 	hier_code.h htcp.cc htcp.h http.cc HttpBody.h HttpBody.cc \
 	HttpHeader.h HttpHeader.cc HttpHeaderFieldInfo.h \
 	HttpHeaderTools.h HttpHeaderTools.cc HttpHeaderFieldStat.h \
@@ -1257,7 +1257,7 @@ am_tests_testHttpRequest_OBJECTS = AccessLogEntry.$(OBJEXT) \
 	$(am__objects_8) errorpage.$(OBJEXT) tests/stub_ETag.$(OBJEXT) \
 	external_acl.$(OBJEXT) ExternalACLEntry.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
-	fqdncache.$(OBJEXT) FwdState.$(OBJEXT) gopher.$(OBJEXT) \
+	fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
 	helper.$(OBJEXT) $(am__objects_9) http.$(OBJEXT) \
 	HttpBody.$(OBJEXT) HttpHeader.$(OBJEXT) \
 	HttpHeaderTools.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
@@ -1648,8 +1648,8 @@ am__tests_testURL_SOURCES_DIST = AccessLogEntry.cc BodyPipe.cc \
 	DnsLookupDetails.cc errorpage.cc ETag.cc event.cc \
 	external_acl.cc ExternalACLEntry.cc fatal.h \
 	tests/stub_fatal.cc fd.h fd.cc fde.cc FileMap.h filemap.cc \
-	fqdncache.h fqdncache.cc FwdState.cc FwdState.h gopher.h \
-	gopher.cc helper.cc hier_code.h htcp.cc htcp.h http.cc \
+	fqdncache.h fqdncache.cc FwdState.cc FwdState.h \
+	helper.cc hier_code.h htcp.cc htcp.h http.cc \
 	HttpBody.h HttpBody.cc HttpHeaderFieldStat.h HttpHdrCc.h \
 	HttpHdrCc.cc HttpHdrCc.cci HttpHdrContRange.cc HttpHdrRange.cc \
 	HttpHdrSc.cc HttpHdrScTarget.cc HttpHeader.h HttpHeader.cc \
@@ -1708,7 +1708,7 @@ am_tests_testURL_OBJECTS = AccessLogEntry.$(OBJEXT) BodyPipe.$(OBJEXT) \
 	external_acl.$(OBJEXT) ExternalACLEntry.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
 	filemap.$(OBJEXT) fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
-	gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_9) \
+	helper.$(OBJEXT) $(am__objects_9) \
 	http.$(OBJEXT) HttpBody.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
 	HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \
 	HttpHdrSc.$(OBJEXT) HttpHdrScTarget.$(OBJEXT) \
@@ -1891,8 +1891,8 @@ am__tests_test_http_range_SOURCES_DIST = AccessLogEntry.cc BodyPipe.cc \
 	DnsLookupDetails.cc errorpage.cc tests/stub_ETag.cc event.cc \
 	FadingCounter.cc fatal.h tests/stub_libauth.cc \
 	tests/stub_fatal.cc fd.h fd.cc fde.cc FileMap.h filemap.cc \
-	fqdncache.h fqdncache.cc FwdState.cc FwdState.h gopher.h \
-	gopher.cc helper.cc hier_code.h htcp.cc htcp.h http.cc \
+	fqdncache.h fqdncache.cc FwdState.cc FwdState.h \
+	helper.cc hier_code.h htcp.cc htcp.h http.cc \
 	HttpBody.h HttpBody.cc HttpHeaderFieldStat.h HttpHdrCc.h \
 	HttpHdrCc.cc HttpHdrCc.cci HttpHdrContRange.cc HttpHdrRange.cc \
 	HttpHdrSc.cc HttpHdrScTarget.cc HttpHeader.h HttpHeader.cc \
@@ -1948,7 +1948,7 @@ am_tests_test_http_range_OBJECTS = AccessLogEntry.$(OBJEXT) \
 	FadingCounter.$(OBJEXT) tests/stub_libauth.$(OBJEXT) \
 	tests/stub_fatal.$(OBJEXT) fd.$(OBJEXT) fde.$(OBJEXT) \
 	filemap.$(OBJEXT) fqdncache.$(OBJEXT) FwdState.$(OBJEXT) \
-	gopher.$(OBJEXT) helper.$(OBJEXT) $(am__objects_9) \
+	helper.$(OBJEXT) $(am__objects_9) \
 	http.$(OBJEXT) HttpBody.$(OBJEXT) HttpHdrCc.$(OBJEXT) \
 	HttpHdrContRange.$(OBJEXT) HttpHdrRange.$(OBJEXT) \
 	HttpHdrSc.$(OBJEXT) HttpHdrScTarget.$(OBJEXT) \
@@ -2865,7 +2865,7 @@ squid_SOURCES = $(ACL_REGISTRATION_SOURCES) AccessLogEntry.cc \
 	ExternalACLEntry.cc ExternalACLEntry.h FadingCounter.h \
 	FadingCounter.cc fatal.h fatal.cc fd.h fd.cc fde.cc fde.h \
 	FileMap.h filemap.cc fqdncache.h fqdncache.cc FwdState.cc \
-	FwdState.h Generic.h globals.h gopher.h gopher.cc helper.cc \
+	FwdState.h Generic.h globals.h helper.cc \
 	helper.h hier_code.h HierarchyLogEntry.h $(HTCPSOURCE) \
 	HttpStateFlags.h http.cc http.h HttpHeaderFieldStat.h \
 	HttpHdrCc.h HttpHdrCc.cc HttpHdrCc.cci HttpHdrRange.cc \
@@ -3673,8 +3673,6 @@ tests_testCacheManager_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	hier_code.h \
 	helper.cc \
 	$(HTCPSOURCE) \
@@ -4093,8 +4091,6 @@ tests_testEvent_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -4342,8 +4338,6 @@ tests_testEventLoop_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -4588,8 +4582,6 @@ tests_test_http_range_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -4922,8 +4914,6 @@ tests_testHttpRequest_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -5782,8 +5772,6 @@ tests_testURL_SOURCES = \
 	fqdncache.cc \
 	FwdState.cc \
 	FwdState.h \
-	gopher.h \
-	gopher.cc \
 	helper.cc \
 	hier_code.h \
 	$(HTCPSOURCE) \
@@ -6970,7 +6958,6 @@ distclean-compile:
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/filemap.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fqdncache.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/globals.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gopher.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/helper.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hier_code.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/htcp.Po@am__quote@
diff --git a/src/adaptation/ecap/Host.cc b/src/adaptation/ecap/Host.cc
index 30b9661..0a9f745 100644
--- a/src/adaptation/ecap/Host.cc
+++ b/src/adaptation/ecap/Host.cc
@@ -48,7 +48,6 @@ Adaptation::Ecap::Host::Host()
     libecap::protocolHttp.assignHostId(AnyP::PROTO_HTTP);
     libecap::protocolHttps.assignHostId(AnyP::PROTO_HTTPS);
     libecap::protocolFtp.assignHostId(AnyP::PROTO_FTP);
-    libecap::protocolGopher.assignHostId(AnyP::PROTO_GOPHER);
     libecap::protocolWais.assignHostId(AnyP::PROTO_WAIS);
     libecap::protocolUrn.assignHostId(AnyP::PROTO_URN);
     libecap::protocolWhois.assignHostId(AnyP::PROTO_WHOIS);
diff --git a/src/adaptation/ecap/MessageRep.cc b/src/adaptation/ecap/MessageRep.cc
index cff44d4..b9c783e 100644
--- a/src/adaptation/ecap/MessageRep.cc
+++ b/src/adaptation/ecap/MessageRep.cc
@@ -149,8 +149,6 @@ Adaptation::Ecap::FirstLineRep::protocol() const
         return libecap::protocolHttps;
     case AnyP::PROTO_FTP:
         return libecap::protocolFtp;
-    case AnyP::PROTO_GOPHER:
-        return libecap::protocolGopher;
     case AnyP::PROTO_WAIS:
         return libecap::protocolWais;
     case AnyP::PROTO_WHOIS:
diff --git a/src/anyp/ProtocolType.cc b/src/anyp/ProtocolType.cc
index 5b4fca3..304c0fd 100644
--- a/src/anyp/ProtocolType.cc
+++ b/src/anyp/ProtocolType.cc
@@ -13,7 +13,6 @@ const char * ProtocolType_str[] = {
 	"HTTPS",
 	"COAP",
 	"COAPS",
-	"GOPHER",
 	"WAIS",
 	"CACHE_OBJECT",
 	"ICP",
diff --git a/src/anyp/ProtocolType.h b/src/anyp/ProtocolType.h
index 1235521..aa68dda 100644
--- a/src/anyp/ProtocolType.h
+++ b/src/anyp/ProtocolType.h
@@ -26,7 +26,6 @@ typedef enum {
     PROTO_HTTPS,
     PROTO_COAP,
     PROTO_COAPS,
-    PROTO_GOPHER,
     PROTO_WAIS,
     PROTO_CACHE_OBJECT,
     PROTO_ICP,
diff --git a/src/cf.data.pre b/src/cf.data.pre
index f47dcd9..5bdef86 100644
--- a/src/cf.data.pre
+++ b/src/cf.data.pre
@@ -1220,7 +1220,6 @@ acl SSL_ports port 443
 acl Safe_ports port 80		# http
 acl Safe_ports port 21		# ftp
 acl Safe_ports port 443		# https
-acl Safe_ports port 70		# gopher
 acl Safe_ports port 210		# wais
 acl Safe_ports port 1025-65535	# unregistered ports
 acl Safe_ports port 280		# http-mgmt
@@ -4211,7 +4210,7 @@ DOC_START
 		[http::]<bs	Number of HTTP-equivalent message body bytes 
 				received from the next hop, excluding chunked
 				transfer encoding and control messages.
-				Generated FTP/Gopher listings are treated as
+				Generated FTP listings are treated as
 				received bodies.
 
 
@@ -5479,7 +5478,6 @@ NOCOMMENT_START
 # Add any of your own refresh_pattern entries above these.
 #
 refresh_pattern ^ftp:		1440	20%	10080
-refresh_pattern ^gopher:	1440	0%	1440
 refresh_pattern -i (/cgi-bin/|\?) 0	0%	0
 refresh_pattern .		0	20%	4320
 NOCOMMENT_END
@@ -8053,7 +8051,7 @@ DOC_START
 	client IP can use. Any more than this and Squid will begin to drop
 	new connections from the client until it closes some links.
 
-	Note that this is a global limit. It affects all HTTP, HTCP, Gopher and FTP
+	Note that this is a global limit. It affects all HTTP, HTCP, and FTP
 	connections from the client. For finer control use the ACL access controls.
 
 	Requires client_db to be enabled (the default).
diff --git a/src/client_side_request.cc b/src/client_side_request.cc
index 2de3cb5..57d8975 100644
--- a/src/client_side_request.cc
+++ b/src/client_side_request.cc
@@ -33,7 +33,6 @@
 #include "fd.h"
 #include "fde.h"
 #include "format/Token.h"
-#include "gopher.h"
 #include "helper.h"
 #include "helper/Reply.h"
 #include "http.h"
@@ -960,9 +959,6 @@ clientHierarchical(ClientHttpRequest * http)
     if (request->url.getScheme() == AnyP::PROTO_HTTP)
         return method.respMaybeCacheable();
 
-    if (request->url.getScheme() == AnyP::PROTO_GOPHER)
-        return gopherCachable(request);
-
     if (request->url.getScheme() == AnyP::PROTO_CACHE_OBJECT)
         return 0;
 
diff --git a/src/err_type.h b/src/err_type.h
index c6f0dae..5c634ee 100644
--- a/src/err_type.h
+++ b/src/err_type.h
@@ -65,7 +65,7 @@ typedef enum {
     ERR_GATEWAY_FAILURE,
 
     /* Special Cases */
-    ERR_DIR_LISTING,            /* Display of remote directory (FTP, Gopher) */
+    ERR_DIR_LISTING,            /* Display of remote directory (FTP) */
     ERR_SQUID_SIGNATURE,        /* not really an error */
     ERR_SHUTTING_DOWN,
 
diff --git a/src/gopher.cc b/src/gopher.cc
deleted file mode 100644
index 07acdba..0000000
--- a/src/gopher.cc
+++ /dev/null
@@ -1,982 +0,0 @@
-/*
- * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
- *
- * Squid software is distributed under GPLv2+ license and includes
- * contributions from numerous individuals and organizations.
- * Please see the COPYING and CONTRIBUTORS files for details.
- */
-
-/* DEBUG: section 10    Gopher */
-
-#include "squid.h"
-#include "comm.h"
-#include "comm/Read.h"
-#include "comm/Write.h"
-#include "errorpage.h"
-#include "fd.h"
-#include "FwdState.h"
-#include "globals.h"
-#include "html_quote.h"
-#include "HttpReply.h"
-#include "HttpRequest.h"
-#include "Mem.h"
-#include "MemBuf.h"
-#include "mime.h"
-#include "rfc1738.h"
-#include "SquidConfig.h"
-#include "SquidTime.h"
-#include "StatCounters.h"
-#include "Store.h"
-#include "tools.h"
-
-#if USE_DELAY_POOLS
-#include "DelayPools.h"
-#include "MemObject.h"
-#endif
-
-/**
- \defgroup ServerProtocolGopherInternal Server-Side Gopher Internals
- \ingroup ServerProtocolGopherAPI
- * Gopher is somewhat complex and gross because it must convert from
- * the Gopher protocol to HTTP.
- */
-
-/* gopher type code from rfc. Anawat. */
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_FILE         '0'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_DIRECTORY    '1'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_CSO          '2'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_ERROR        '3'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_MACBINHEX    '4'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_DOSBIN       '5'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_UUENCODED    '6'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_INDEX        '7'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_TELNET       '8'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_BIN          '9'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_REDUNT       '+'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_3270         'T'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_GIF          'g'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_IMAGE        'I'
-
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_HTML         'h' /* HTML */
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_INFO         'i'
-/**
-  \ingroup ServerProtocolGopherInternal
-  W3 address
- */
-#define GOPHER_WWW          'w'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_SOUND        's'
-
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_PLUS_IMAGE   ':'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_PLUS_MOVIE   ';'
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_PLUS_SOUND   '<'
-
-/// \ingroup ServerProtocolGopherInternal
-#define GOPHER_PORT         70
-
-/// \ingroup ServerProtocolGopherInternal
-#define TAB                 '\t'
-/// \ingroup ServerProtocolGopherInternal
-/// \todo CODE: should this be a protocol-specific thing?
-#define TEMP_BUF_SIZE       4096
-/// \ingroup ServerProtocolGopherInternal
-#define MAX_CSO_RESULT      1024
-
-/// \ingroup ServerProtocolGopherInternal
-typedef struct gopher_ds {
-    StoreEntry *entry;
-    enum {
-        NORMAL,
-        HTML_DIR,
-        HTML_INDEX_RESULT,
-        HTML_CSO_RESULT,
-        HTML_INDEX_PAGE,
-        HTML_CSO_PAGE
-    } conversion;
-    int HTML_header_added;
-    int HTML_pre;
-    char type_id;
-    char request[MAX_URL];
-    int cso_recno;
-    int len;
-    char *buf;          /* pts to a 4k page */
-    Comm::ConnectionPointer serverConn;
-    HttpRequest *req;
-    FwdState::Pointer fwd;
-    char replybuf[BUFSIZ];
-} GopherStateData;
-
-static CLCB gopherStateFree;
-static void gopherMimeCreate(GopherStateData *);
-static void gopher_request_parse(const HttpRequest * req,
-                                 char *type_id,
-                                 char *request);
-static void gopherEndHTML(GopherStateData *);
-static void gopherToHTML(GopherStateData *, char *inbuf, int len);
-static CTCB gopherTimeout;
-static IOCB gopherReadReply;
-static IOCB gopherSendComplete;
-static PF gopherSendRequest;
-
-/// \ingroup ServerProtocolGopherInternal
-static char def_gopher_bin[] = "www/unknown";
-
-/// \ingroup ServerProtocolGopherInternal
-static char def_gopher_text[] = "text/plain";
-
-/// \ingroup ServerProtocolGopherInternal
-static void
-gopherStateFree(const CommCloseCbParams &params)
-{
-    GopherStateData *gopherState = (GopherStateData *)params.data;
-
-    if (gopherState == NULL)
-        return;
-
-    if (gopherState->entry) {
-        gopherState->entry->unlock("gopherState");
-    }
-
-    HTTPMSGUNLOCK(gopherState->req);
-
-    gopherState->fwd = NULL;    // refcounted
-
-    memFree(gopherState->buf, MEM_4K_BUF);
-    gopherState->buf = NULL;
-    cbdataFree(gopherState);
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * Create MIME Header for Gopher Data
- */
-static void
-gopherMimeCreate(GopherStateData * gopherState)
-{
-    StoreEntry *entry = gopherState->entry;
-    const char *mime_type = NULL;
-    const char *mime_enc = NULL;
-
-    switch (gopherState->type_id) {
-
-    case GOPHER_DIRECTORY:
-
-    case GOPHER_INDEX:
-
-    case GOPHER_HTML:
-
-    case GOPHER_WWW:
-
-    case GOPHER_CSO:
-        mime_type = "text/html";
-        break;
-
-    case GOPHER_GIF:
-
-    case GOPHER_IMAGE:
-
-    case GOPHER_PLUS_IMAGE:
-        mime_type = "image/gif";
-        break;
-
-    case GOPHER_SOUND:
-
-    case GOPHER_PLUS_SOUND:
-        mime_type = "audio/basic";
-        break;
-
-    case GOPHER_PLUS_MOVIE:
-        mime_type = "video/mpeg";
-        break;
-
-    case GOPHER_MACBINHEX:
-
-    case GOPHER_DOSBIN:
-
-    case GOPHER_UUENCODED:
-
-    case GOPHER_BIN:
-        /* Rightnow We have no idea what it is. */
-        mime_enc = mimeGetContentEncoding(gopherState->request);
-        mime_type = mimeGetContentType(gopherState->request);
-        if (!mime_type)
-            mime_type = def_gopher_bin;
-        break;
-
-    case GOPHER_FILE:
-
-    default:
-        mime_enc = mimeGetContentEncoding(gopherState->request);
-        mime_type = mimeGetContentType(gopherState->request);
-        if (!mime_type)
-            mime_type = def_gopher_text;
-        break;
-    }
-
-    assert(entry->isEmpty());
-
-    HttpReply *reply = new HttpReply;
-    entry->buffer();
-    reply->setHeaders(Http::scOkay, "Gatewaying", mime_type, -1, -1, -2);
-    if (mime_enc)
-        reply->header.putStr(HDR_CONTENT_ENCODING, mime_enc);
-
-    entry->replaceHttpReply(reply);
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * Parse a gopher request into components.  By Anawat.
- */
-static void
-gopher_request_parse(const HttpRequest * req, char *type_id, char *request)
-{
-    const char *path = req->urlpath.termedBuf();
-
-    if (request)
-        request[0] = '\0';
-
-    if (path && (*path == '/'))
-        ++path;
-
-    if (!path || !*path) {
-        *type_id = GOPHER_DIRECTORY;
-        return;
-    }
-
-    *type_id = path[0];
-
-    if (request) {
-        xstrncpy(request, path + 1, MAX_URL);
-        /* convert %xx to char */
-        rfc1738_unescape(request);
-    }
-}
-
-/**
- \ingroup ServerProtocolGopherAPI
- * Parse the request to determine whether it is cachable.
- *
- \param req Request data.
- \retval 0  Not cachable.
- \retval 1  Cachable.
- */
-int
-gopherCachable(const HttpRequest * req)
-{
-    int cachable = 1;
-    char type_id;
-    /* parse to see type */
-    gopher_request_parse(req,
-                         &type_id,
-                         NULL);
-
-    switch (type_id) {
-
-    case GOPHER_INDEX:
-
-    case GOPHER_CSO:
-
-    case GOPHER_TELNET:
-
-    case GOPHER_3270:
-        cachable = 0;
-        break;
-
-    default:
-        cachable = 1;
-    }
-
-    return cachable;
-}
-
-/// \ingroup ServerProtocolGopherInternal
-static void
-gopherHTMLHeader(StoreEntry * e, const char *title, const char *substring)
-{
-    storeAppendPrintf(e, "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\" \"http://www.w3.org/TR/html4/loose.dtd\">\n");
-    storeAppendPrintf(e, "<HTML><HEAD><TITLE>");
-    storeAppendPrintf(e, title, substring);
-    storeAppendPrintf(e, "</TITLE>");
-    storeAppendPrintf(e, "<STYLE type=\"text/css\"><!--BODY{background-color:#ffffff;font-family:verdana,sans-serif}--></STYLE>\n");
-    storeAppendPrintf(e, "</HEAD>\n<BODY><H1>");
-    storeAppendPrintf(e, title, substring);
-    storeAppendPrintf(e, "</H1>\n");
-}
-
-/// \ingroup ServerProtocolGopherInternal
-static void
-gopherHTMLFooter(StoreEntry * e)
-{
-    storeAppendPrintf(e, "<HR noshade size=\"1px\">\n");
-    storeAppendPrintf(e, "<ADDRESS>\n");
-    storeAppendPrintf(e, "Generated %s by %s (%s)\n",
-                      mkrfc1123(squid_curtime),
-                      getMyHostname(),
-                      visible_appname_string);
-    storeAppendPrintf(e, "</ADDRESS></BODY></HTML>\n");
-}
-
-/// \ingroup ServerProtocolGopherInternal
-static void
-gopherEndHTML(GopherStateData * gopherState)
-{
-    StoreEntry *e = gopherState->entry;
-
-    if (!gopherState->HTML_header_added) {
-        gopherHTMLHeader(e, "Server Return Nothing", NULL);
-        storeAppendPrintf(e, "<P>The Gopher query resulted in a blank response</P>");
-    } else if (gopherState->HTML_pre) {
-        storeAppendPrintf(e, "</PRE>\n");
-    }
-
-    gopherHTMLFooter(e);
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * Convert Gopher to HTML.
- \par
- * Borrow part of code from libwww2 came with Mosaic distribution.
- */
-static void
-gopherToHTML(GopherStateData * gopherState, char *inbuf, int len)
-{
-    char *pos = inbuf;
-    char *lpos = NULL;
-    char *tline = NULL;
-    LOCAL_ARRAY(char, line, TEMP_BUF_SIZE);
-    char *name = NULL;
-    char *selector = NULL;
-    char *host = NULL;
-    char *port = NULL;
-    char *escaped_selector = NULL;
-    const char *icon_url = NULL;
-    char gtype;
-    StoreEntry *entry = NULL;
-
-    memset(line, '\0', TEMP_BUF_SIZE);
-
-    entry = gopherState->entry;
-
-    if (gopherState->conversion == gopher_ds::HTML_INDEX_PAGE) {
-        char *html_url = html_quote(entry->url());
-        gopherHTMLHeader(entry, "Gopher Index %s", html_url);
-        storeAppendPrintf(entry,
-                          "<p>This is a searchable Gopher index. Use the search\n"
-                          "function of your browser to enter search terms.\n"
-                          "<ISINDEX>\n");
-        gopherHTMLFooter(entry);
-        /* now let start sending stuff to client */
-        entry->flush();
-        gopherState->HTML_header_added = 1;
-
-        return;
-    }
-
-    if (gopherState->conversion == gopher_ds::HTML_CSO_PAGE) {
-        char *html_url = html_quote(entry->url());
-        gopherHTMLHeader(entry, "CSO Search of %s", html_url);
-        storeAppendPrintf(entry,
-                          "<P>A CSO database usually contains a phonebook or\n"
-                          "directory.  Use the search function of your browser to enter\n"
-                          "search terms.</P><ISINDEX>\n");
-        gopherHTMLFooter(entry);
-        /* now let start sending stuff to client */
-        entry->flush();
-        gopherState->HTML_header_added = 1;
-
-        return;
-    }
-
-    SBuf outbuf;
-
-    if (!gopherState->HTML_header_added) {
-        if (gopherState->conversion == gopher_ds::HTML_CSO_RESULT)
-            gopherHTMLHeader(entry, "CSO Search Result", NULL);
-        else
-            gopherHTMLHeader(entry, "Gopher Menu", NULL);
-
-        outbuf.append ("<PRE>");
-
-        gopherState->HTML_header_added = 1;
-
-        gopherState->HTML_pre = 1;
-    }
-
-    while (pos < inbuf + len) {
-        int llen;
-        int left = len - (pos - inbuf);
-        lpos = (char *)memchr(pos, '\n', left);
-        if (lpos) {
-            ++lpos;             /* Next line is after \n */
-            llen = lpos - pos;
-        } else {
-            llen = left;
-        }
-        if (gopherState->len + llen >= TEMP_BUF_SIZE) {
-            debugs(10, DBG_IMPORTANT, "GopherHTML: Buffer overflow. Lost some data on URL: " << entry->url()  );
-            llen = TEMP_BUF_SIZE - gopherState->len - 1;
-        }
-        if (!lpos) {
-            /* there is no complete line in inbuf */
-            /* copy it to temp buffer */
-            /* note: llen is adjusted above */
-            memcpy(gopherState->buf + gopherState->len, pos, llen);
-            gopherState->len += llen;
-            break;
-        }
-        if (gopherState->len != 0) {
-            /* there is something left from last tx. */
-            memcpy(line, gopherState->buf, gopherState->len);
-            memcpy(line + gopherState->len, pos, llen);
-            llen += gopherState->len;
-            gopherState->len = 0;
-        } else {
-            memcpy(line, pos, llen);
-        }
-        line[llen + 1] = '\0';
-        /* move input to next line */
-        pos = lpos;
-
-        /* at this point. We should have one line in buffer to process */
-
-        if (*line == '.') {
-            /* skip it */
-            memset(line, '\0', TEMP_BUF_SIZE);
-            continue;
-        }
-
-        switch (gopherState->conversion) {
-
-        case gopher_ds::HTML_INDEX_RESULT:
-
-        case gopher_ds::HTML_DIR: {
-            tline = line;
-            gtype = *tline;
-            ++tline;
-            name = tline;
-            selector = strchr(tline, TAB);
-
-            if (selector) {
-                *selector = '\0';
-                ++selector;
-                host = strchr(selector, TAB);
-
-                if (host) {
-                    *host = '\0';
-                    ++host;
-                    port = strchr(host, TAB);
-
-                    if (port) {
-                        char *junk;
-                        port[0] = ':';
-                        junk = strchr(host, TAB);
-
-                        if (junk)
-                            *junk++ = 0;    /* Chop port */
-                        else {
-                            junk = strchr(host, '\r');
-
-                            if (junk)
-                                *junk++ = 0;    /* Chop port */
-                            else {
-                                junk = strchr(host, '\n');
-
-                                if (junk)
-                                    *junk++ = 0;    /* Chop port */
-                            }
-                        }
-
-                        if ((port[1] == '0') && (!port[2]))
-                            port[0] = 0;    /* 0 means none */
-                    }
-
-                    /* escape a selector here */
-                    escaped_selector = xstrdup(rfc1738_escape_part(selector));
-
-                    switch (gtype) {
-
-                    case GOPHER_DIRECTORY:
-                        icon_url = mimeGetIconURL("internal-menu");
-                        break;
-
-                    case GOPHER_HTML:
-
-                    case GOPHER_FILE:
-                        icon_url = mimeGetIconURL("internal-text");
-                        break;
-
-                    case GOPHER_INDEX:
-
-                    case GOPHER_CSO:
-                        icon_url = mimeGetIconURL("internal-index");
-                        break;
-
-                    case GOPHER_IMAGE:
-
-                    case GOPHER_GIF:
-
-                    case GOPHER_PLUS_IMAGE:
-                        icon_url = mimeGetIconURL("internal-image");
-                        break;
-
-                    case GOPHER_SOUND:
-
-                    case GOPHER_PLUS_SOUND:
-                        icon_url = mimeGetIconURL("internal-sound");
-                        break;
-
-                    case GOPHER_PLUS_MOVIE:
-                        icon_url = mimeGetIconURL("internal-movie");
-                        break;
-
-                    case GOPHER_TELNET:
-
-                    case GOPHER_3270:
-                        icon_url = mimeGetIconURL("internal-telnet");
-                        break;
-
-                    case GOPHER_BIN:
-
-                    case GOPHER_MACBINHEX:
-
-                    case GOPHER_DOSBIN:
-
-                    case GOPHER_UUENCODED:
-                        icon_url = mimeGetIconURL("internal-binary");
-                        break;
-
-                    case GOPHER_INFO:
-                        icon_url = NULL;
-                        break;
-
-                    default:
-                        icon_url = mimeGetIconURL("internal-unknown");
-                        break;
-                    }
-
-                    if ((gtype == GOPHER_TELNET) || (gtype == GOPHER_3270)) {
-                        if (strlen(escaped_selector) != 0)
-                            outbuf.appendf("<IMG border=\"0\" SRC=\"%s\"> <A HREF=\"telnet://%s@%s%s%s/\">%s</A>\n",
-                                           icon_url, escaped_selector, rfc1738_escape_part(host),
-                                           *port ? ":" : "", port, html_quote(name));
-                        else
-                            outbuf.appendf("<IMG border=\"0\" SRC=\"%s\"> <A HREF=\"telnet://%s%s%s/\">%s</A>\n",
-                                           icon_url, rfc1738_escape_part(host), *port ? ":" : "",
-                                           port, html_quote(name));
-
-                    } else if (gtype == GOPHER_INFO) {
-                        outbuf.appendf("\t%s\n", html_quote(name));
-                    } else {
-                        if (strncmp(selector, "GET /", 5) == 0) {
-                            /* WWW link */
-                            outbuf.appendf("<IMG border=\"0\" SRC=\"%s\"> <A HREF=\"http://%s/%s\">%s</A>\n",
-                                           icon_url, host, rfc1738_escape_unescaped(selector + 5), html_quote(name));
-                        } else if (gtype == GOPHER_WWW) {
-                            outbuf.appendf("<IMG border=\"0\" SRC=\"%s\"> <A HREF=\"gopher://%s/%c%s\">%s</A>\n",
-                                           icon_url, rfc1738_escape_unescaped(selector), html_quote(name));
-                        } else {
-                            /* Standard link */
-                            outbuf.appendf("<IMG border=\"0\" SRC=\"%s\"> <A HREF=\"gopher://%s/%c%s\">%s</A>\n",
-                                           icon_url, host, gtype, escaped_selector, html_quote(name));
-                        }
-                    }
-
-                    safe_free(escaped_selector);
-                } else {
-                    memset(line, '\0', TEMP_BUF_SIZE);
-                    continue;
-                }
-            } else {
-                memset(line, '\0', TEMP_BUF_SIZE);
-                continue;
-            }
-
-            break;
-            }           /* HTML_DIR, HTML_INDEX_RESULT */
-
-        case gopher_ds::HTML_CSO_RESULT: {
-            if (line[0] == '-') {
-                int code, recno;
-                char *s_code, *s_recno, *result;
-
-                s_code = strtok(line + 1, ":\n");
-                s_recno = strtok(NULL, ":\n");
-                result = strtok(NULL, "\n");
-
-                if (!result)
-                    break;
-
-                code = atoi(s_code);
-
-                recno = atoi(s_recno);
-
-                if (code != 200)
-                    break;
-
-                if (gopherState->cso_recno != recno) {
-                    outbuf.appendf("</PRE><HR noshade size=\"1px\"><H2>Record# %d<br><i>%s</i></H2>\n<PRE>", recno, html_quote(result));
-                    gopherState->cso_recno = recno;
-                } else {
-                    outbuf.appendf("%s\n", html_quote(result));
-                }
-
-                break;
-            } else {
-                int code;
-                char *s_code, *result;
-
-                s_code = strtok(line, ":");
-                result = strtok(NULL, "\n");
-
-                if (!result)
-                    break;
-
-                code = atoi(s_code);
-
-                switch (code) {
-
-                case 200: {
-                    /* OK */
-                    /* Do nothing here */
-                    break;
-                }
-
-                case 102:   /* Number of matches */
-
-                case 501:   /* No Match */
-
-                case 502: { /* Too Many Matches */
-                    /* Print the message the server returns */
-                    outbuf.appendf("</PRE><HR noshade size=\"1px\"><H2>%s</H2>\n<PRE>", html_quote(result));
-                    break;
-                }
-
-                }
-            }
-
-            }           /* HTML_CSO_RESULT */
-
-        default:
-            break;      /* do nothing */
-
-        }           /* switch */
-
-    }               /* while loop */
-
-    if (outbuf.length() > 0) {
-        entry->append(outbuf.rawContent(), outbuf.length());
-        /* now let start sending stuff to client */
-        entry->flush();
-    }
-
-    return;
-}
-
-/// \ingroup ServerProtocolGopherInternal
-static void
-gopherTimeout(const CommTimeoutCbParams &io)
-{
-    GopherStateData *gopherState = static_cast<GopherStateData *>(io.data);
-    debugs(10, 4, HERE << io.conn << ": '" << gopherState->entry->url() << "'" );
-
-    gopherState->fwd->fail(new ErrorState(ERR_READ_TIMEOUT, Http::scGatewayTimeout, gopherState->fwd->request));
-
-    if (Comm::IsConnOpen(io.conn))
-        io.conn->close();
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * This will be called when data is ready to be read from fd.
- * Read until error or connection closed.
- */
-static void
-gopherReadReply(const Comm::ConnectionPointer &conn, char *buf, size_t len, Comm::Flag flag, int xerrno, void *data)
-{
-    GopherStateData *gopherState = (GopherStateData *)data;
-    StoreEntry *entry = gopherState->entry;
-    int clen;
-    int bin;
-    size_t read_sz = BUFSIZ;
-#if USE_DELAY_POOLS
-    DelayId delayId = entry->mem_obj->mostBytesAllowed();
-#endif
-
-    /* Bail out early on Comm::ERR_CLOSING - close handlers will tidy up for us */
-
-    if (flag == Comm::ERR_CLOSING) {
-        return;
-    }
-
-    assert(buf == gopherState->replybuf);
-
-    if (EBIT_TEST(entry->flags, ENTRY_ABORTED)) {
-        gopherState->serverConn->close();
-        return;
-    }
-
-#if USE_DELAY_POOLS
-    read_sz = delayId.bytesWanted(1, read_sz);
-#endif
-
-    /* leave one space for \0 in gopherToHTML */
-
-    if (flag == Comm::OK && len > 0) {
-#if USE_DELAY_POOLS
-        delayId.bytesIn(len);
-#endif
-
-        kb_incr(&(statCounter.server.all.kbytes_in), len);
-        kb_incr(&(statCounter.server.other.kbytes_in), len);
-    }
-
-    debugs(10, 5, HERE << conn << " read len=" << len);
-
-    if (flag == Comm::OK && len > 0) {
-        AsyncCall::Pointer nil;
-        commSetConnTimeout(conn, Config.Timeout.read, nil);
-        ++IOStats.Gopher.reads;
-
-        for (clen = len - 1, bin = 0; clen; ++bin)
-            clen >>= 1;
-
-        ++IOStats.Gopher.read_hist[bin];
-
-        HttpRequest *req = gopherState->fwd->request;
-        if (req->hier.bodyBytesRead < 0)
-            req->hier.bodyBytesRead = 0;
-
-        req->hier.bodyBytesRead += len;
-    }
-
-    if (flag != Comm::OK) {
-        debugs(50, DBG_IMPORTANT, "gopherReadReply: error reading: " << xstrerror());
-
-        if (ignoreErrno(xerrno)) {
-            AsyncCall::Pointer call = commCbCall(5,4, "gopherReadReply",
-                                                 CommIoCbPtrFun(gopherReadReply, gopherState));
-            comm_read(conn, buf, read_sz, call);
-        } else {
-            ErrorState *err = new ErrorState(ERR_READ_ERROR, Http::scInternalServerError, gopherState->fwd->request);
-            err->xerrno = xerrno;
-            gopherState->fwd->fail(err);
-            gopherState->serverConn->close();
-        }
-    } else if (len == 0 && entry->isEmpty()) {
-        gopherState->fwd->fail(new ErrorState(ERR_ZERO_SIZE_OBJECT, Http::scServiceUnavailable, gopherState->fwd->request));
-        gopherState->serverConn->close();
-    } else if (len == 0) {
-        /* Connection closed; retrieval done. */
-        /* flush the rest of data in temp buf if there is one. */
-
-        if (gopherState->conversion != gopher_ds::NORMAL)
-            gopherEndHTML(gopherState);
-
-        entry->timestampsSet();
-        entry->flush();
-        gopherState->fwd->complete();
-        gopherState->serverConn->close();
-    } else {
-        if (gopherState->conversion != gopher_ds::NORMAL) {
-            gopherToHTML(gopherState, buf, len);
-        } else {
-            entry->append(buf, len);
-        }
-        AsyncCall::Pointer call = commCbCall(5,4, "gopherReadReply",
-                                             CommIoCbPtrFun(gopherReadReply, gopherState));
-        comm_read(conn, buf, read_sz, call);
-    }
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * This will be called when request write is complete. Schedule read of reply.
- */
-static void
-gopherSendComplete(const Comm::ConnectionPointer &conn, char *buf, size_t size, Comm::Flag errflag, int xerrno, void *data)
-{
-    GopherStateData *gopherState = (GopherStateData *) data;
-    StoreEntry *entry = gopherState->entry;
-    debugs(10, 5, HERE << conn << " size: " << size << " errflag: " << errflag);
-
-    if (size > 0) {
-        fd_bytes(conn->fd, size, FD_WRITE);
-        kb_incr(&(statCounter.server.all.kbytes_out), size);
-        kb_incr(&(statCounter.server.other.kbytes_out), size);
-    }
-
-    if (errflag) {
-        ErrorState *err;
-        err = new ErrorState(ERR_WRITE_ERROR, Http::scServiceUnavailable, gopherState->fwd->request);
-        err->xerrno = xerrno;
-        err->port = gopherState->fwd->request->port;
-        err->url = xstrdup(entry->url());
-        gopherState->fwd->fail(err);
-        gopherState->serverConn->close();
-
-        if (buf)
-            memFree(buf, MEM_4K_BUF);   /* Allocated by gopherSendRequest. */
-
-        return;
-    }
-
-    /*
-     * OK. We successfully reach remote site.  Start MIME typing
-     * stuff.  Do it anyway even though request is not HTML type.
-     */
-    entry->buffer();
-
-    gopherMimeCreate(gopherState);
-
-    switch (gopherState->type_id) {
-
-    case GOPHER_DIRECTORY:
-        /* we got to convert it first */
-        gopherState->conversion = gopher_ds::HTML_DIR;
-        gopherState->HTML_header_added = 0;
-        break;
-
-    case GOPHER_INDEX:
-        /* we got to convert it first */
-        gopherState->conversion = gopher_ds::HTML_INDEX_RESULT;
-        gopherState->HTML_header_added = 0;
-        break;
-
-    case GOPHER_CSO:
-        /* we got to convert it first */
-        gopherState->conversion = gopher_ds::HTML_CSO_RESULT;
-        gopherState->cso_recno = 0;
-        gopherState->HTML_header_added = 0;
-        break;
-
-    default:
-        gopherState->conversion = gopher_ds::NORMAL;
-        entry->flush();
-    }
-
-    /* Schedule read reply. */
-    AsyncCall::Pointer call =  commCbCall(5,5, "gopherReadReply",
-                                          CommIoCbPtrFun(gopherReadReply, gopherState));
-    entry->delayAwareRead(conn, gopherState->replybuf, BUFSIZ, call);
-
-    if (buf)
-        memFree(buf, MEM_4K_BUF);   /* Allocated by gopherSendRequest. */
-}
-
-/**
- \ingroup ServerProtocolGopherInternal
- * This will be called when connect completes. Write request.
- */
-static void
-gopherSendRequest(int fd, void *data)
-{
-    GopherStateData *gopherState = (GopherStateData *)data;
-    char *buf = (char *)memAllocate(MEM_4K_BUF);
-
-    if (gopherState->type_id == GOPHER_CSO) {
-        const char *t = strchr(gopherState->request, '?');
-
-        if (t != NULL)
-            ++t;        /* skip the ? */
-        else
-            t = "";
-
-        snprintf(buf, 4096, "query %s\r\nquit\r\n", t);
-    } else if (gopherState->type_id == GOPHER_INDEX) {
-        char *t = strchr(gopherState->request, '?');
-
-        if (t != NULL)
-            *t = '\t';
-
-        snprintf(buf, 4096, "%s\r\n", gopherState->request);
-    } else {
-        snprintf(buf, 4096, "%s\r\n", gopherState->request);
-    }
-
-    debugs(10, 5, HERE << gopherState->serverConn);
-    AsyncCall::Pointer call = commCbCall(5,5, "gopherSendComplete",
-                                         CommIoCbPtrFun(gopherSendComplete, gopherState));
-    Comm::Write(gopherState->serverConn, buf, strlen(buf), call, NULL);
-
-    gopherState->entry->makePublic();
-}
-
-/// \ingroup ServerProtocolGopherInternal
-CBDATA_TYPE(GopherStateData);
-
-/// \ingroup ServerProtocolGopherAPI
-void
-gopherStart(FwdState * fwd)
-{
-    StoreEntry *entry = fwd->entry;
-    GopherStateData *gopherState;
-    CBDATA_INIT_TYPE(GopherStateData);
-    gopherState = cbdataAlloc(GopherStateData);
-    gopherState->buf = (char *)memAllocate(MEM_4K_BUF);
-
-    entry->lock("gopherState");
-    gopherState->entry = entry;
-
-    gopherState->fwd = fwd;
-
-    debugs(10, 3, "gopherStart: " << entry->url()  );
-
-    ++ statCounter.server.all.requests;
-
-    ++ statCounter.server.other.requests;
-
-    /* Parse url. */
-    gopher_request_parse(fwd->request,
-                         &gopherState->type_id, gopherState->request);
-
-    comm_add_close_handler(fwd->serverConnection()->fd, gopherStateFree, gopherState);
-
-    if (((gopherState->type_id == GOPHER_INDEX) || (gopherState->type_id == GOPHER_CSO))
-            && (strchr(gopherState->request, '?') == NULL)) {
-        /* Index URL without query word */
-        /* We have to generate search page back to client. No need for connection */
-        gopherMimeCreate(gopherState);
-
-        if (gopherState->type_id == GOPHER_INDEX) {
-            gopherState->conversion = gopher_ds::HTML_INDEX_PAGE;
-        } else {
-            if (gopherState->type_id == GOPHER_CSO) {
-                gopherState->conversion = gopher_ds::HTML_CSO_PAGE;
-            } else {
-                gopherState->conversion = gopher_ds::HTML_INDEX_PAGE;
-            }
-        }
-
-        gopherToHTML(gopherState, (char *) NULL, 0);
-        fwd->complete();
-        return;
-    }
-
-    gopherState->serverConn = fwd->serverConnection();
-    gopherSendRequest(fwd->serverConnection()->fd, gopherState);
-    AsyncCall::Pointer timeoutCall = commCbCall(5, 4, "gopherTimeout",
-                                     CommTimeoutCbPtrFun(gopherTimeout, gopherState));
-    commSetConnTimeout(fwd->serverConnection(), Config.Timeout.read, timeoutCall);
-}
-
diff --git a/src/gopher.h b/src/gopher.h
deleted file mode 100644
index b68e465..0000000
--- a/src/gopher.h
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 1996-2016 The Squid Software Foundation and contributors
- *
- * Squid software is distributed under GPLv2+ license and includes
- * contributions from numerous individuals and organizations.
- * Please see the COPYING and CONTRIBUTORS files for details.
- */
-
-/* DEBUG: section 10    Gopher */
-
-#ifndef SQUID_GOPHER_H_
-#define SQUID_GOPHER_H_
-
-class FwdState;
-class HttpRequest;
-
-/**
- \defgroup ServerProtocolGopherAPI Server-Side Gopher API
- \ingroup ServerProtocol
- */
-
-/// \ingroup ServerProtocolGopherAPI
-void gopherStart(FwdState *);
-
-/// \ingroup ServerProtocolGopherAPI
-int gopherCachable(const HttpRequest *);
-
-#endif /* SQUID_GOPHER_H_ */
-
diff --git a/src/mgr/IoAction.cc b/src/mgr/IoAction.cc
index bf32fe2..a8008da 100644
--- a/src/mgr/IoAction.cc
+++ b/src/mgr/IoAction.cc
@@ -35,9 +35,6 @@ Mgr::IoActionData::operator += (const IoActionData& stats)
     ftp_reads += stats.ftp_reads;
     for (int i = 0; i < IoStats::histSize; ++i)
         ftp_read_hist[i] += stats.ftp_read_hist[i];
-    gopher_reads += stats.gopher_reads;
-    for (int i = 0; i < IoStats::histSize; ++i)
-        gopher_read_hist[i] += stats.gopher_read_hist[i];
 
     return *this;
 }
diff --git a/src/mgr/IoAction.h b/src/mgr/IoAction.h
index 8a5a9f9..ff0c7d5 100644
--- a/src/mgr/IoAction.h
+++ b/src/mgr/IoAction.h
@@ -27,10 +27,8 @@ public:
 public:
     double http_reads;
     double ftp_reads;
-    double gopher_reads;
     double http_read_hist[IoStats::histSize];
     double ftp_read_hist[IoStats::histSize];
-    double gopher_read_hist[IoStats::histSize];
 };
 
 /// implement aggregated 'io' action
diff --git a/src/squid.8.in b/src/squid.8.in
index a3c101f..0f0ffa3 100644
--- a/src/squid.8.in
+++ b/src/squid.8.in
@@ -24,7 +24,7 @@ command\-line
 .PP
 .B squid
 is a high\-performance proxy caching server for web clients,
-supporting FTP, gopher, ICAP, ICP, HTCP and HTTP data objects.
+supporting FTP, ICAP, ICP, HTCP and HTTP data objects.
 Unlike traditional caching software, 
 Squid handles all requests in a single, non-blocking process.
 .PP
diff --git a/src/stat.cc b/src/stat.cc
index ae3dd69..309de52 100644
--- a/src/stat.cc
+++ b/src/stat.cc
@@ -209,12 +209,6 @@ GetIoStats(Mgr::IoActionData& stats)
     for (i = 0; i < IoStats::histSize; ++i) {
         stats.ftp_read_hist[i] = IOStats.Ftp.read_hist[i];
     }
-
-    stats.gopher_reads = IOStats.Gopher.reads;
-
-    for (i = 0; i < IoStats::histSize; ++i) {
-        stats.gopher_read_hist[i] = IOStats.Gopher.read_hist[i];
-    }
 }
 
 void
@@ -247,19 +241,6 @@ DumpIoStats(Mgr::IoActionData& stats, StoreEntry* sentry)
                           Math::doublePercent(stats.ftp_read_hist[i], stats.ftp_reads));
     }
 
-    storeAppendPrintf(sentry, "\n");
-    storeAppendPrintf(sentry, "Gopher I/O\n");
-    storeAppendPrintf(sentry, "number of reads: %.0f\n", stats.gopher_reads);
-    storeAppendPrintf(sentry, "Read Histogram:\n");
-
-    for (i = 0; i < IoStats::histSize; ++i) {
-        storeAppendPrintf(sentry, "%5d-%5d: %9.0f %2.0f%%\n",
-                          i ? (1 << (i - 1)) + 1 : 1,
-                          1 << i,
-                          stats.gopher_read_hist[i],
-                          Math::doublePercent(stats.gopher_read_hist[i], stats.gopher_reads));
-    }
-
     storeAppendPrintf(sentry, "\n");
 }
 
diff --git a/src/url.cc b/src/url.cc
index 44255c2..1e14d05 100644
--- a/src/url.cc
+++ b/src/url.cc
@@ -108,9 +108,6 @@ urlParseProtocol(const char *b, const char *e)
     if (strncasecmp(b, "coaps", len) == 0)
         return AnyP::PROTO_COAPS;
 
-    if (strncasecmp(b, "gopher", len) == 0)
-        return AnyP::PROTO_GOPHER;
-
     if (strncasecmp(b, "wais", len) == 0)
         return AnyP::PROTO_WAIS;
 
@@ -146,9 +143,6 @@ urlDefaultPort(AnyP::ProtocolType p)
         // Assuming IANA policy of allocating same port for base and TLS protocol versions will occur.
         return 5683;
 
-    case AnyP::PROTO_GOPHER:
-        return 70;
-
     case AnyP::PROTO_WAIS:
         return 210;
 
@@ -809,8 +803,6 @@ urlCheckRequest(const HttpRequest * r)
         if (r->method == Http::METHOD_PUT)
             rc = 1;
 
-    case AnyP::PROTO_GOPHER:
-
     case AnyP::PROTO_WAIS:
 
     case AnyP::PROTO_WHOIS:
diff --git a/test-suite/squidconf/regressions-3.4.0.1 b/test-suite/squidconf/regressions-3.4.0.1
index 35a3fe1..c0ad827 100644
--- a/test-suite/squidconf/regressions-3.4.0.1
+++ b/test-suite/squidconf/regressions-3.4.0.1
@@ -44,6 +44,5 @@ refresh_pattern -i \.(gif|png|jpg|jpeg|ico)$ 40320 75% 86400
 refresh_pattern -i \.(iso|avi|wav|mp3|mpeg|swf|flv|x-flv)$ 1440 40% 40320
 
 refresh_pattern ^ftp:           1440    20%     10080
-refresh_pattern ^gopher:        1440    0%      1440
 refresh_pattern -i (/cgi-bin/|\?)       0       0%      0
 refresh_pattern .       0       20%     4320
-- 
2.43.0