"github.com/anacrolix/torrent/metainfo"
)
+func trailingPath(infoName string, pathComps []string) string {
+ return path.Join(
+ func() (ret []string) {
+ for _, comp := range append([]string{infoName}, pathComps...) {
+ ret = append(ret, url.QueryEscape(comp))
+ }
+ return
+ }()...,
+ )
+}
+
// Creates a request per BEP 19.
func NewRequest(url_ string, fileIndex int, info *metainfo.Info, offset, length int64) (*http.Request, error) {
fileInfo := info.UpvertedFiles()[fileIndex]
if strings.HasSuffix(url_, "/") {
// BEP specifies that we append the file path. We need to escape each component of the path
// for things like spaces and '#'.
- url_ += path.Join(
- func() (ret []string) {
- for _, comp := range append([]string{info.Name}, fileInfo.Path...) {
- ret = append(ret, url.PathEscape(comp))
- }
- return
- }()...,
- )
+ url_ += trailingPath(info.Name, fileInfo.Path)
}
req, err := http.NewRequest(http.MethodGet, url_, nil)
if err != nil {
--- /dev/null
+package webseed
+
+import (
+ "net/url"
+ "testing"
+
+ qt "github.com/frankban/quicktest"
+)
+
+func TestTrailingPath(t *testing.T) {
+ c := qt.New(t)
+ test := func(parts []string, result string) {
+ unescaped, err := url.QueryUnescape(trailingPath(parts[0], parts[1:]))
+ if !c.Check(err, qt.IsNil) {
+ return
+ }
+ c.Check(unescaped, qt.Equals, result)
+ }
+ test([]string{"a_b-c", "d + e.f"}, "a_b-c/d + e.f")
+ test([]string{"a_1-b_c2", "d 3. (e, f).g"},
+ "a_1-b_c2/d 3. (e, f).g",
+ )
+}