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