urllib wraps any error raised while connecting or sending the request in
URLError (AbstractHTTPHandler.do_open) and lets a timeout on the response
through bare. The accepted-turn branch also matched URLError(reason=
TimeoutError), so a peer that went down between the Bot Chat lookup and the
chat POST was reported as "already in its Bot Chat ... Do NOT resend" while
the message had never arrived.
Match only the bare TimeoutError. A second test drives both phases through
the real opener, so the signatures the branch depends on are pinned rather
than assumed; the HTTP-rejection case folds into the table as a row.
Reported by Enough1122 in review.