Skip to content

Commit 7b28da1

Browse files
author
Ed Paulosky
authored
fix: Reading from a DataStreamReader with rewind: true properly rewinds the stream allowing for subsequent reads. (#539)
* Fixes an issue where reading with rewind true didn't work * Adds test for writing+read-with-rewind
1 parent e634e3e commit 7b28da1

File tree

2 files changed

+65
-4
lines changed

2 files changed

+65
-4
lines changed

Sources/ClientRuntime/Networking/Streaming/DataStreamReader.swift

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public class DataStreamReader: StreamReader {
3636

3737
init(byteBuffer: ByteBuffer = ByteBuffer(size: 0)) {
3838
self.byteBuffer = byteBuffer
39-
self._availableForRead = 0
39+
self._availableForRead = UInt(byteBuffer.length())
4040
self.offset = 0
4141
self._hasFinishedWriting = false
4242
}
@@ -51,9 +51,16 @@ public class DataStreamReader: StreamReader {
5151
bytesRead = byteBuffer.read(buffer: typedBuffer)
5252
}
5353

54-
if !rewind, let bytesRead = bytesRead {
55-
_availableForRead -= UInt(bytesRead)
56-
offset += UInt(bytesRead)
54+
if let bytesRead = bytesRead {
55+
if rewind {
56+
try? byteBuffer.seek(
57+
offset: Int64(offset),
58+
streamSeekType: .begin
59+
)
60+
} else {
61+
_availableForRead -= UInt(bytesRead)
62+
offset += UInt(bytesRead)
63+
}
5764
}
5865
}
5966
return ByteBuffer(data: data)
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
@testable import ClientRuntime
9+
import AwsCommonRuntimeKit
10+
import XCTest
11+
12+
class DataStreamReaderTests: XCTestCase {
13+
let testData = Data([0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A])
14+
15+
func testRead() {
16+
let byteBuffer = ByteBuffer(data: testData)
17+
let dataStreamReader = DataStreamReader(byteBuffer: byteBuffer)
18+
19+
let firstRead = dataStreamReader.read().getData()
20+
XCTAssertEqual(firstRead, testData)
21+
22+
let secondRead = dataStreamReader.read().getData()
23+
XCTAssertNotEqual(secondRead, testData)
24+
XCTAssertEqual(secondRead, Data())
25+
}
26+
27+
func testReadWithRewind() {
28+
let byteBuffer = ByteBuffer(data: testData)
29+
let dataStreamReader = DataStreamReader(byteBuffer: byteBuffer)
30+
31+
let firstRead = dataStreamReader.read(rewind: true).getData()
32+
XCTAssertEqual(firstRead, testData)
33+
34+
let secondRead = dataStreamReader.read().getData()
35+
XCTAssertEqual(secondRead, testData)
36+
}
37+
38+
func testWriteThenReadWithRewind() {
39+
let dataStreamReader = DataStreamReader()
40+
41+
let byteBuffer = ByteBuffer(data: testData)
42+
dataStreamReader.write(buffer: byteBuffer)
43+
44+
let firstRead = dataStreamReader.read(rewind: true).getData()
45+
XCTAssertEqual(firstRead, testData)
46+
47+
let secondRead = dataStreamReader.read().getData()
48+
XCTAssertEqual(secondRead, testData)
49+
50+
let thirdRead = dataStreamReader.read().getData()
51+
XCTAssertNotEqual(thirdRead, testData)
52+
XCTAssertEqual(thirdRead, Data())
53+
}
54+
}

0 commit comments

Comments
 (0)