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 final static 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<IoSessionEvent>();
49
50 public IoSessionEventQueue(ProxyIoSession proxyIoSession) {
51 this.proxyIoSession = proxyIoSession;
52 }
53
54
55
56
57 private void discardSessionQueueEvents() {
58 synchronized (sessionEventsQueue) {
59
60 sessionEventsQueue.clear();
61 logger.debug("Event queue CLEARED");
62 }
63 }
64
65
66
67
68
69
70
71
72
73
74
75
76 public void enqueueEventIfNecessary(final IoSessionEvent evt) {
77 logger.debug("??? >> Enqueue {}", evt);
78
79 if (proxyIoSession.getRequest() instanceof SocksProxyRequest) {
80
81 evt.deliverEvent();
82 return;
83 }
84
85 if (proxyIoSession.getHandler().isHandshakeComplete()) {
86 evt.deliverEvent();
87 } else {
88 if (evt.getType() == IoSessionEventType.CLOSED) {
89 if (proxyIoSession.isAuthenticationFailed()) {
90 proxyIoSession.getConnector().cancelConnectFuture();
91 discardSessionQueueEvents();
92 evt.deliverEvent();
93 } else {
94 discardSessionQueueEvents();
95 }
96 } else if (evt.getType() == IoSessionEventType.OPENED) {
97
98
99 enqueueSessionEvent(evt);
100 evt.deliverEvent();
101 } else {
102 enqueueSessionEvent(evt);
103 }
104 }
105 }
106
107
108
109
110
111
112 public void flushPendingSessionEvents() throws Exception {
113 synchronized (sessionEventsQueue) {
114 IoSessionEvent evt;
115
116 while ((evt = sessionEventsQueue.poll()) != null) {
117 logger.debug(" Flushing buffered event: {}", evt);
118 evt.deliverEvent();
119 }
120 }
121 }
122
123
124
125
126
127
128 private void enqueueSessionEvent(final IoSessionEvent evt) {
129 synchronized (sessionEventsQueue) {
130 logger.debug("Enqueuing event: {}", evt);
131 sessionEventsQueue.offer(evt);
132 }
133 }
134 }