Skip to content

Commit 87f8361

Browse files
authored
Merge pull request #54 from SpectraLogic/content_length_fix
Sepcial casing content-length header when length is 0
2 parents 7c0288e + 43b83dd commit 87f8361

File tree

2 files changed

+63
-0
lines changed

2 files changed

+63
-0
lines changed

ds3/networking/httpRequestBuilder.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,14 @@ func (builder *HttpRequestBuilder) Build(conn *ConnectionInfo) (*http.Request, e
104104

105105
if builder.contentLength != nil {
106106
httpRequest.ContentLength = *builder.contentLength
107+
108+
// Special casing for content length == 0. Go won't include the content length header
109+
// if the length is 0, but BlackPearl needs the content length header to be there and be 0
110+
// to create a folder.
111+
// See https://github.com/golang/go/issues/20257
112+
if *builder.contentLength == 0 {
113+
httpRequest.Body = http.NoBody
114+
}
107115
}
108116

109117
builder.signatureFields.Date = getCurrentTime()

ds3_integration/smoke_test.go

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ import (
2222
"bytes"
2323
"spectra/ds3_go_sdk/ds3_utils/ds3Testing"
2424
"strconv"
25+
"spectra/core/ioutils"
2526
)
2627

2728
var client *ds3.Client
@@ -470,3 +471,57 @@ func TestDataPersistenceRule(t *testing.T) {
470471
t.Fatalf("Expected DataIsolationLevel to be '%s' but was '%s'.", dataIsolationLevel.String(), response.DataPersistenceRule.IsolationLevel.String())
471472
}
472473
}
474+
475+
func TestPuttingFolder(t *testing.T) {
476+
bucketName := "GoTestPuttingFolder"
477+
err := testutils.PutBucketLogError(t, client, bucketName)
478+
ds3Testing.AssertNilError(t, err)
479+
480+
defer deleteBucketAndContent(t, bucketName)
481+
482+
const folderPath = "Gracie/Eskimo/"
483+
484+
readSizer := ioutils.NewReadSizer(nil, 0)
485+
putObjectRequest := models.NewPutObjectRequest(bucketName, folderPath, &readSizer)
486+
_, err = client.PutObject(putObjectRequest)
487+
ds3Testing.AssertNilError(t, err)
488+
489+
getBucketRequest := models.NewGetBucketRequest(bucketName)
490+
getBucketResponse, err := client.GetBucket(getBucketRequest)
491+
ds3Testing.AssertNilError(t, err)
492+
493+
ds3Testing.AssertInt(t, "Number of objects in bucket", 1, len(getBucketResponse.ListBucketResult.Objects))
494+
ds3Testing.AssertString(t, "Folder names equal", folderPath, *getBucketResponse.ListBucketResult.Objects[0].Key)
495+
}
496+
497+
func deleteBucketAndContent(t *testing.T, bucketName string) {
498+
testutils.DeleteBucketContents(client, bucketName)
499+
testutils.DeleteBucketLogError(t, client, bucketName)
500+
}
501+
502+
func TestPuttingZeroLengthObject(t *testing.T) {
503+
bucketName := "GoTestPuttingZeroLengthObject"
504+
err := testutils.PutBucketLogError(t, client, bucketName)
505+
ds3Testing.AssertNilError(t, err)
506+
507+
defer deleteBucketAndContent(t, bucketName)
508+
509+
const objectName = "Gracie"
510+
511+
zeroBytes := make([]byte, 0)
512+
513+
putObjectRequest := models.NewPutObjectRequest(bucketName, objectName, ds3.BuildByteReaderWithSizeDecorator(zeroBytes))
514+
515+
_, err = client.PutObject(putObjectRequest)
516+
517+
ds3Testing.AssertNilError(t, err)
518+
519+
getBucketRequest := models.NewGetBucketRequest(bucketName)
520+
getBucketResponse, err := client.GetBucket(getBucketRequest)
521+
ds3Testing.AssertNilError(t, err)
522+
523+
ds3Testing.AssertInt(t, "Number of objects in bucket", 1, len(getBucketResponse.ListBucketResult.Objects))
524+
ds3Testing.AssertString(t, "Object names equal", objectName, *getBucketResponse.ListBucketResult.Objects[0].Key)
525+
ds3Testing.AssertInt64(t, "Object size equal", 0, getBucketResponse.ListBucketResult.Objects[0].Size)
526+
}
527+

0 commit comments

Comments
 (0)