Skip to content
This repository was archived by the owner on Mar 29, 2023. It is now read-only.

Commit c5ec693

Browse files
committed
create implicit directories from multipart requests
Also, introduce a multipart walker to simplify some things. fixes #5
1 parent 267cdfe commit c5ec693

File tree

3 files changed

+137
-197
lines changed

3 files changed

+137
-197
lines changed

file_test.go

+29-39
Original file line numberDiff line numberDiff line change
@@ -88,24 +88,27 @@ anotherfile
8888

8989
reader := strings.NewReader(data)
9090
mpReader := multipart.NewReader(reader, "Boundary!")
91+
dir, err := NewFileFromPartReader(mpReader, multipartFormdataType)
92+
if err != nil {
93+
t.Fatal(err)
94+
}
95+
9196
buf := make([]byte, 20)
9297

98+
it := dir.Entries()
99+
93100
// test properties of a file created from the first part
94-
part, err := mpReader.NextPart()
95-
if part == nil || err != nil {
96-
t.Fatal("Expected non-nil part, nil error")
97-
}
98-
mpname, mpf, err := newFileFromPart("", part, &peekReader{r: mpReader})
99-
if mpf == nil || err != nil {
100-
t.Fatal("Expected non-nil multipartFile, nil error")
101+
if !it.Next() {
102+
t.Fatal("expected an entry:", it.Err())
101103
}
102-
mf, ok := mpf.(File)
104+
mf, ok := it.Node().(File)
103105
if !ok {
104-
t.Fatal("Expected file to not be a directory")
106+
t.Fatal("Expected file to not be a directory", it.Node())
105107
}
106-
if mpname != "name" {
108+
if it.Name() != "name" {
107109
t.Fatal("Expected filename to be \"name\"")
108110
}
111+
109112
if n, err := mf.Read(buf); n != 4 || !(err == io.EOF || err == nil) {
110113
t.Fatal("Expected to be able to read 4 bytes", n, err)
111114
}
@@ -114,62 +117,49 @@ anotherfile
114117
}
115118

116119
// test properties of file created from second part (directory)
117-
part, err = mpReader.NextPart()
118-
if part == nil || err != nil {
119-
t.Fatal("Expected non-nil part, nil error")
120-
}
121-
mpname, mpf, err = newFileFromPart("", part, &peekReader{r: mpReader})
122-
if mpf == nil || err != nil {
123-
t.Fatal("Expected non-nil multipartFile, nil error")
120+
if !it.Next() {
121+
t.Fatal("expected an entry:", it.Err())
124122
}
125-
md, ok := mpf.(Directory)
123+
md, ok := it.Node().(Directory)
126124
if !ok {
127125
t.Fatal("Expected file to be a directory")
128126
}
129-
if mpname != "dir" {
127+
if it.Name() != "dir" {
130128
t.Fatal("Expected filename to be \"dir\"")
131129
}
132130
if err := md.Close(); err != nil {
133131
t.Fatal("Should be able to call `Close` on a directory")
134132
}
135133

134+
it = md.Entries()
135+
136136
// test properties of file created from third part (nested file)
137-
part, err = mpReader.NextPart()
138-
if part == nil || err != nil {
139-
t.Fatal("Expected non-nil part, nil error")
140-
}
141-
mpname, mpf, err = newFileFromPart("dir/", part, &peekReader{r: mpReader})
142-
if mpf == nil || err != nil {
143-
t.Fatal("Expected non-nil multipartFile, nil error")
137+
if !it.Next() {
138+
t.Fatal("expected an entry:", it.Err())
144139
}
145-
mf, ok = mpf.(File)
140+
mf, ok = it.Node().(File)
146141
if !ok {
147142
t.Fatal("Expected file to not be a directory")
148143
}
149-
if mpname != "nested" {
150-
t.Fatalf("Expected filename to be \"nested\", got %s", mpname)
144+
if it.Name() != "nested" {
145+
t.Fatalf("Expected filename to be \"nested\", got %s", it.Name())
151146
}
152147
if n, err := mf.Read(buf); n != 12 || !(err == nil || err == io.EOF) {
153148
t.Fatalf("expected to be able to read 12 bytes from file: %s (got %d)", err, n)
154149
}
155-
if err := mpf.Close(); err != nil {
150+
if err := mf.Close(); err != nil {
156151
t.Fatalf("should be able to close file: %s", err)
157152
}
158153

159154
// test properties of symlink created from fourth part (symlink)
160-
part, err = mpReader.NextPart()
161-
if part == nil || err != nil {
162-
t.Fatal("Expected non-nil part, nil error")
163-
}
164-
mpname, mpf, err = newFileFromPart("dir/", part, &peekReader{r: mpReader})
165-
if mpf == nil || err != nil {
166-
t.Fatal("Expected non-nil multipartFile, nil error")
155+
if !it.Next() {
156+
t.Fatal("expected an entry:", it.Err())
167157
}
168-
ms, ok := mpf.(*Symlink)
158+
ms, ok := it.Node().(*Symlink)
169159
if !ok {
170160
t.Fatal("Expected file to not be a directory")
171161
}
172-
if mpname != "simlynk" {
162+
if it.Name() != "simlynk" {
173163
t.Fatal("Expected filename to be \"dir/simlynk\"")
174164
}
175165
if ms.Target != "anotherfile" {

multifilereader_test.go

+7-42
Original file line numberDiff line numberDiff line change
@@ -105,95 +105,60 @@ func TestMultiFileReaderToMultiFileSkip(t *testing.T) {
105105

106106
func TestOutput(t *testing.T) {
107107
mfr := getTestMultiFileReader(t)
108-
mpReader := &peekReader{r: multipart.NewReader(mfr, mfr.Boundary())}
108+
walker := &multipartWalker{reader: multipart.NewReader(mfr, mfr.Boundary())}
109109
buf := make([]byte, 20)
110110

111-
part, err := mpReader.NextPart()
112-
if part == nil || err != nil {
113-
t.Fatal("Expected non-nil part, nil error")
114-
}
115-
mpname, mpf, err := newFileFromPart("", part, mpReader)
111+
mpf, err := nextFile(walker)
116112
if mpf == nil || err != nil {
117113
t.Fatal("Expected non-nil multipartFile, nil error")
118114
}
119115
mpr, ok := mpf.(File)
120116
if !ok {
121117
t.Fatal("Expected file to be a regular file")
122118
}
123-
if mpname != "beep.txt" {
124-
t.Fatal("Expected filename to be \"file.txt\"")
125-
}
126119
if n, err := mpr.Read(buf); n != 4 || err != nil {
127120
t.Fatal("Expected to read from file", n, err)
128121
}
129122
if string(buf[:4]) != "beep" {
130123
t.Fatal("Data read was different than expected")
131124
}
132125

133-
part, err = mpReader.NextPart()
134-
if part == nil || err != nil {
135-
t.Fatal("Expected non-nil part, nil error")
136-
}
137-
mpname, mpf, err = newFileFromPart("", part, mpReader)
126+
mpf, err = nextFile(walker)
138127
if mpf == nil || err != nil {
139128
t.Fatal("Expected non-nil multipartFile, nil error")
140129
}
141130
mpd, ok := mpf.(Directory)
142131
if !ok {
143132
t.Fatal("Expected file to be a directory")
144133
}
145-
if mpname != "boop" {
146-
t.Fatal("Expected filename to be \"boop\"")
147-
}
148134

149-
part, err = mpReader.NextPart()
150-
if part == nil || err != nil {
151-
t.Fatal("Expected non-nil part, nil error")
152-
}
153-
cname, child, err := newFileFromPart("boop", part, mpReader)
135+
child, err := nextFile(walker)
154136
if child == nil || err != nil {
155137
t.Fatal("Expected to be able to read a child file")
156138
}
157139
if _, ok := child.(File); !ok {
158140
t.Fatal("Expected file to not be a directory")
159141
}
160-
if cname != "a.txt" {
161-
t.Fatal("Expected filename to be \"a.txt\"")
162-
}
163142

164-
part, err = mpReader.NextPart()
165-
if part == nil || err != nil {
166-
t.Fatal("Expected non-nil part, nil error")
167-
}
168-
cname, child, err = newFileFromPart("boop", part, mpReader)
143+
child, err = nextFile(walker)
169144
if child == nil || err != nil {
170145
t.Fatal("Expected to be able to read a child file")
171146
}
172147
if _, ok := child.(File); !ok {
173148
t.Fatal("Expected file to not be a directory")
174149
}
175-
if cname != "b.txt" {
176-
t.Fatal("Expected filename to be \"b.txt\"")
177-
}
178150

179151
it := mpd.Entries()
180152
if it.Next() {
181153
t.Fatal("Expected to get false")
182154
}
183155

184-
part, err = mpReader.NextPart()
185-
if part == nil || err != nil {
186-
t.Fatal("Expected non-nil part, nil error")
187-
}
188-
mpname, mpf, err = newFileFromPart("", part, mpReader)
156+
mpf, err = nextFile(walker)
189157
if mpf == nil || err != nil {
190158
t.Fatal("Expected non-nil multipartFile, nil error")
191159
}
192-
if mpname != "file.txt" {
193-
t.Fatal("Expected filename to be \"b.txt\"")
194-
}
195160

196-
part, err = mpReader.NextPart()
161+
part, err := walker.getPart()
197162
if part != nil || err != io.EOF {
198163
t.Fatal("Expected to get (nil, io.EOF)")
199164
}

0 commit comments

Comments
 (0)