|
16 | 16 |
|
17 | 17 | package io.rsocket; |
18 | 18 |
|
| 19 | +import static io.rsocket.Frame.Request.initialRequestN; |
19 | 20 | import static io.rsocket.frame.FrameHeaderFlyweight.FLAGS_C; |
20 | 21 | import static io.rsocket.frame.FrameHeaderFlyweight.FLAGS_M; |
21 | 22 |
|
22 | 23 | import io.netty.buffer.ByteBuf; |
23 | 24 | import io.netty.buffer.Unpooled; |
24 | 25 | import io.netty.util.collection.IntObjectHashMap; |
25 | | -import io.rsocket.Frame.Request; |
26 | 26 | import io.rsocket.exceptions.ApplicationException; |
27 | 27 | import io.rsocket.internal.LimitableRequestPublisher; |
28 | 28 | import io.rsocket.util.PayloadImpl; |
@@ -157,7 +157,8 @@ private Mono<Void> handleFrame(Frame frame) { |
157 | 157 | case REQUEST_N: |
158 | 158 | return handleRequestN(streamId, frame); |
159 | 159 | case REQUEST_STREAM: |
160 | | - return handleStream(streamId, requestStream(new PayloadImpl(frame)), frame); |
| 160 | + return handleStream( |
| 161 | + streamId, requestStream(new PayloadImpl(frame)), initialRequestN(frame)); |
161 | 162 | case REQUEST_CHANNEL: |
162 | 163 | return handleChannel(streamId, frame); |
163 | 164 | case PAYLOAD: |
@@ -235,8 +236,7 @@ private Mono<Void> handleRequestResponse(int streamId, Mono<Payload> response) { |
235 | 236 | return responseFrame.flatMap(connection::sendOne); |
236 | 237 | } |
237 | 238 |
|
238 | | - private Mono<Void> handleStream(int streamId, Flux<Payload> response, Frame firstFrame) { |
239 | | - int initialRequestN = Request.initialRequestN(firstFrame); |
| 239 | + private Mono<Void> handleStream(int streamId, Flux<Payload> response, int initialRequestN) { |
240 | 240 | Flux<Frame> responseFrames = |
241 | 241 | response |
242 | 242 | .map(payload -> Frame.PayloadFrame.from(streamId, FrameType.NEXT, payload)) |
@@ -287,7 +287,11 @@ private Mono<Void> handleChannel(int streamId, Frame firstFrame) { |
287 | 287 | }) |
288 | 288 | .doFinally(signalType -> removeChannelProcessor(streamId)); |
289 | 289 |
|
290 | | - return handleStream(streamId, requestChannel(payloads), firstFrame); |
| 290 | + // not chained, as the payload should be enqueued in the Unicast processor before this method returns |
| 291 | + // and any later payload can be processed |
| 292 | + frames.onNext(new PayloadImpl(firstFrame)); |
| 293 | + |
| 294 | + return handleStream(streamId, requestChannel(payloads), initialRequestN(firstFrame)); |
291 | 295 | } |
292 | 296 |
|
293 | 297 | private Mono<Void> handleKeepAliveFrame(Frame frame) { |
|
0 commit comments