@@ -104,7 +104,7 @@ func chompUnbalanced(left, right rune, s string) string {
104
104
}
105
105
106
106
func checkURL (client * http.Client , url string ) error {
107
- resp , err := client . Head ( url )
107
+ resp , err := httpDo ( client , "HEAD" , url )
108
108
if err != nil {
109
109
return err
110
110
}
@@ -121,7 +121,7 @@ func checkURL(client *http.Client, url string) error {
121
121
// for any other error. Still, we link to several misconfigured servers that
122
122
// return 403 Forbidden or 500 Internal Server Error for HEAD requests, but
123
123
// not for GET requests.
124
- resp , err = client . Get ( url )
124
+ resp , err = httpDo ( client , "GET" , url )
125
125
if err != nil {
126
126
return err
127
127
}
@@ -136,6 +136,21 @@ func checkURL(client *http.Client, url string) error {
136
136
return errors .Newf ("%s" , errors .Safe (resp .Status ))
137
137
}
138
138
139
+ // N.B. we set custom User-Agent header to avoid being blocked.
140
+ // E.g., as of 08/25/25, Wikipedia blocks default UAs [1].
141
+ // [1] https://phabricator.wikimedia.org/T400119
142
+ func httpDo (c * http.Client , requestType string , url string ) (resp * http.Response , err error ) {
143
+ req , err := http .NewRequest (requestType , url , nil )
144
+ if err != nil {
145
+ return nil , err
146
+ }
147
+ // This UA seems to comply with Wikipedia's policy [1].
148
+ // [1] https://foundation.wikimedia.org/wiki/Policy:Wikimedia_Foundation_User-Agent_Policy
149
+ req .
Header .
Set (
"User-Agent" ,
"MyGoApplication/1.0 (https://example.com/myapp; [email protected] )" )
150
+
151
+ return c .Do (req )
152
+ }
153
+
139
154
func checkURLWithRetries (client * http.Client , url string ) error {
140
155
for i := 0 ; i < timeoutRetries ; i ++ {
141
156
err := checkURL (client , url )
0 commit comments