27
27
*
28
28
* Not thread-safe
29
29
*/
30
- public class PayloadFragmenter implements Iterator <Frame >
30
+ public class PayloadFragmenter implements Iterable < Frame >, Iterator <Frame >
31
31
{
32
32
private enum Type
33
33
{
34
- RESPONSE , REQUEST_CHANNEL
34
+ RESPONSE , RESPONSE_COMPLETE , REQUEST_CHANNEL
35
35
}
36
36
37
37
private final int metadataMtu ;
@@ -56,13 +56,32 @@ public void resetForResponse(final int streamId, final Payload payload)
56
56
type = Type .RESPONSE ;
57
57
}
58
58
59
+ public void resetForResponseComplete (final int streamId , final Payload payload )
60
+ {
61
+ reset (streamId , payload );
62
+ type = Type .RESPONSE_COMPLETE ;
63
+ }
64
+
59
65
public void resetForRequestChannel (final int streamId , final Payload payload , final int initialRequestN )
60
66
{
61
67
reset (streamId , payload );
62
68
type = Type .REQUEST_CHANNEL ;
63
69
this .initialRequestN = initialRequestN ;
64
70
}
65
71
72
+ public static boolean requiresFragmenting (final int metadataMtu , final int dataMtu , final Payload payload )
73
+ {
74
+ final ByteBuffer metadata = payload .getMetadata ();
75
+ final ByteBuffer data = payload .getData ();
76
+
77
+ return (metadata .remaining () > metadataMtu || data .remaining () > dataMtu );
78
+ }
79
+
80
+ public Iterator <Frame > iterator ()
81
+ {
82
+ return this ;
83
+ }
84
+
66
85
public boolean hasNext ()
67
86
{
68
87
return (dataOffset < data .capacity () || metadataOffset < metadata .capacity ());
@@ -96,6 +115,15 @@ public Frame next()
96
115
97
116
result = Frame .Response .from (streamId , FrameType .NEXT , metadataBuffer , dataBuffer , flags );
98
117
}
118
+ if (Type .RESPONSE_COMPLETE == type )
119
+ {
120
+ if (isMoreFollowing )
121
+ {
122
+ flags |= FrameHeaderFlyweight .FLAGS_RESPONSE_F ;
123
+ }
124
+
125
+ result = Frame .Response .from (streamId , FrameType .NEXT_COMPLETE , metadataBuffer , dataBuffer , flags );
126
+ }
99
127
else if (Type .REQUEST_CHANNEL == type )
100
128
{
101
129
if (isMoreFollowing )
0 commit comments