1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20 package org.apache.mina.proxy.event;
21
22 import java.util.LinkedList;
23 import java.util.Queue;
24
25 import org.apache.mina.proxy.handlers.socks.SocksProxyRequest;
26 import org.apache.mina.proxy.session.ProxyIoSession;
27 import org.slf4j.Logger;
28 import org.slf4j.LoggerFactory;
29
30
31
32
33
34
35
36
37 public class IoSessionEventQueue {
38 private static final Logger logger = LoggerFactory.getLogger(IoSessionEventQueue.class);
39
40
41
42
43 private ProxyIoSession proxyIoSession;
44
45
46
47
48 private Queue<IoSessionEvent> sessionEventsQueue = new LinkedList<>();
49
50
51
52
53
54
55 public IoSessionEventQueue(ProxyIoSession proxyIoSession) {
56 this.proxyIoSession = proxyIoSession;
57 }
58
59
60
61
62 private void discardSessionQueueEvents() {
63 synchronized (sessionEventsQueue) {
64
65 sessionEventsQueue.clear();
66 logger.debug("Event queue CLEARED");
67 }
68 }
69
70
71
72
73
74
75
76
77
78
79
80
81 public void enqueueEventIfNecessary(final IoSessionEvent evt) {
82 logger.debug("??? >> Enqueue {}", evt);
83
84 if (proxyIoSession.getRequest() instanceof SocksProxyRequest) {
85
86 evt.deliverEvent();
87
88 return;
89 }
90
91 if (proxyIoSession.getHandler().isHandshakeComplete()) {
92 evt.deliverEvent();
93 } else {
94 if (evt.getType() == IoSessionEventType.CLOSED) {
95 if (proxyIoSession.isAuthenticationFailed()) {
96 proxyIoSession.getConnector().cancelConnectFuture();
97 discardSessionQueueEvents();
98 evt.deliverEvent();
99 } else {
100 discardSessionQueueEvents();
101 }
102 } else if (evt.getType() == IoSessionEventType.OPENED) {
103
104
105 enqueueSessionEvent(evt);
106 evt.deliverEvent();
107 } else {
108 enqueueSessionEvent(evt);
109 }
110 }
111 }
112
113
114
115
116
117
118
119
120 public void flushPendingSessionEvents() throws Exception {
121 synchronized (sessionEventsQueue) {
122 IoSessionEvent evt;
123
124 while ((evt = sessionEventsQueue.poll()) != null) {
125 logger.debug(" Flushing buffered event: {}", evt);
126 evt.deliverEvent();
127 }
128 }
129 }
130
131
132
133
134
135
136 private void enqueueSessionEvent(final IoSessionEvent evt) {
137 synchronized (sessionEventsQueue) {
138 logger.debug("Enqueuing event: {}", evt);
139 sessionEventsQueue.offer(evt);
140 }
141 }
142 }