1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.eclipse.jetty.websocket.common.extensions.compress;
20
21
22 import java.nio.ByteBuffer;
23
24 import org.eclipse.jetty.websocket.api.WriteCallback;
25 import org.eclipse.jetty.websocket.api.extensions.ExtensionConfig;
26 import org.eclipse.jetty.websocket.api.extensions.Frame;
27 import org.eclipse.jetty.websocket.common.WebSocketFrame;
28 import org.eclipse.jetty.websocket.common.extensions.AbstractExtension;
29
30
31
32
33
34 public class FrameCompressionExtension extends AbstractExtension
35 {
36 private CompressionMethod method = new DeflateCompressionMethod();
37
38 @Override
39 public synchronized void incomingFrame(Frame frame)
40 {
41 if (frame.getType().isControl() || !frame.isRsv1())
42 {
43
44 nextIncomingFrame(frame);
45 return;
46 }
47
48 ByteBuffer data = frame.getPayload();
49 method.decompress().input(data);
50 while (!method.decompress().isDone())
51 {
52 ByteBuffer uncompressed = method.decompress().process();
53 WebSocketFrame out = new WebSocketFrame(frame).setPayload(uncompressed);
54 if (!method.decompress().isDone())
55 {
56 out.setFin(false);
57 }
58 out.setRsv1(false);
59 nextIncomingFrame(out);
60 }
61
62
63
64 }
65
66
67
68
69
70
71 @Override
72 public boolean isRsv1User()
73 {
74 return true;
75 }
76
77
78
79
80 @Override
81 public boolean isTextDataDecoder()
82 {
83 return true;
84 }
85
86 @Override
87 public synchronized void outgoingFrame(Frame frame, WriteCallback callback)
88 {
89 if (frame.getType().isControl())
90 {
91
92 nextOutgoingFrame(frame,callback);
93 return;
94 }
95
96 ByteBuffer data = frame.getPayload();
97
98
99 method.compress().input(data);
100 while (!method.compress().isDone())
101 {
102 ByteBuffer buf = method.compress().process();
103 WebSocketFrame out = new WebSocketFrame(frame).setPayload(buf);
104 out.setRsv1(true);
105 if (!method.compress().isDone())
106 {
107 out.setFin(false);
108 nextOutgoingFrame(frame,null);
109 }
110 else
111 {
112 nextOutgoingFrame(out,callback);
113 }
114 }
115
116
117 method.compress().end();
118 }
119
120 @Override
121 public void setConfig(ExtensionConfig config)
122 {
123 super.setConfig(config);
124 }
125
126 @Override
127 public String toString()
128 {
129 return this.getClass().getSimpleName() + "[]";
130 }
131 }