mostly so trailing path forward slash is optional