|
1 | 1 | using System;
|
2 | 2 | using System.Collections.Generic;
|
3 | 3 | using System.Diagnostics;
|
| 4 | +using System.Linq; |
4 | 5 | using System.Net;
|
5 | 6 | using System.Net.Sockets;
|
6 | 7 | using System.Text;
|
@@ -108,106 +109,60 @@ public void Connect()
|
108 | 109 | }
|
109 | 110 |
|
110 | 111 | greeting = string.Concat(greeting, receiveResult.Value);
|
111 |
| - |
112 |
| - if (!IsValidGreetingPart(greeting)) |
113 |
| - GreetingFailed(greeting); |
114 |
| - |
115 | 112 | QueryType? queryType = GetQueryTypeFromGreeting(greeting);
|
116 | 113 |
|
117 | 114 | if (!queryType.HasValue)
|
118 |
| - continue; |
119 |
| - |
120 |
| - int requiredGreetingLength = queryType == QueryType.Client ? CLIENT_GREETING.Length : SERVER_GREETING.Length; |
121 |
| - |
122 |
| - if (greeting.Length < requiredGreetingLength) |
123 |
| - continue; |
| 115 | + { |
| 116 | + GreetingFailed(); |
| 117 | + return; |
| 118 | + } |
124 | 119 |
|
125 |
| - bool greetingCorrect; |
126 | 120 | switch (queryType.Value)
|
127 | 121 | {
|
128 | 122 | case QueryType.Client:
|
129 |
| - greetingCorrect = HandleClientQueryGreeting(greeting); |
| 123 | + HandleClientQueryGreeting(greeting); |
130 | 124 | break;
|
131 | 125 | case QueryType.Server:
|
132 |
| - greetingCorrect = HandleServerQueryGreeting(greeting); |
| 126 | + HandleServerQueryGreeting(greeting); |
133 | 127 | break;
|
134 | 128 | default:
|
135 | 129 | throw new InvalidOperationException("Forgott to implement query type: " + queryType);
|
136 | 130 | }
|
137 | 131 |
|
138 |
| - if (!greetingCorrect) |
139 |
| - GreetingFailed(greeting); |
140 |
| - |
141 | 132 | break;
|
142 | 133 | }
|
143 | 134 | }
|
144 | 135 |
|
145 |
| - private bool HandleClientQueryGreeting(string greeting) |
| 136 | + private void HandleClientQueryGreeting(string greeting) |
146 | 137 | {
|
147 |
| - if (!greeting.StartsWith(CLIENT_GREETING, StringComparison.InvariantCultureIgnoreCase)) |
148 |
| - return false; |
149 |
| - |
150 |
| - greeting = greeting.Substring(CLIENT_GREETING.Length); |
151 |
| - |
152 |
| - const string PATTERN_STATIC_PART = "selected schandlerid="; |
153 |
| - const string PATTERN = PATTERN_STATIC_PART+@"(?<id>\d+)" + Ts3Util.QUERY_REGEX_LINE_BREAK; |
154 |
| - |
155 |
| - while (true) |
156 |
| - { |
157 |
| - if (!PATTERN_STATIC_PART.StartsWith(greeting, StringComparison.InvariantCultureIgnoreCase) && !greeting.StartsWith(PATTERN_STATIC_PART, StringComparison.InvariantCultureIgnoreCase)) |
158 |
| - return false; |
159 |
| - |
160 |
| - if (!greeting.Contains(Ts3Util.QUERY_LINE_BREAK)) |
161 |
| - { |
162 |
| - KeyValuePair<SocketError, string> receiveResult = ReceiveMessage(SocketAsyncEventArgs); |
163 |
| - |
164 |
| - if (receiveResult.Key != SocketError.Success) |
165 |
| - { |
166 |
| - Disconnect(); |
167 |
| - throw new SocketException((int)receiveResult.Key); |
168 |
| - } |
169 |
| - |
170 |
| - greeting = string.Concat(greeting, receiveResult.Value); |
171 |
| - continue; |
172 |
| - } |
| 138 | + string[] greetingLines = greeting.Split(new[] { Ts3Util.QUERY_LINE_BREAK }, StringSplitOptions.RemoveEmptyEntries); |
| 139 | + const string PATTERN = @"selected schandlerid=(?<id>\d+)"; |
173 | 140 |
|
174 |
| - Match match = Regex.Match(greeting, PATTERN, RegexOptions.IgnoreCase | RegexOptions.Singleline); |
175 |
| - |
176 |
| - if (!match.Success) |
177 |
| - return false; |
| 141 | + Match match = greetingLines.Select(l => Regex.Match(l, PATTERN, RegexOptions.IgnoreCase | RegexOptions.Singleline)).FirstOrDefault(m => m.Success); |
178 | 142 |
|
| 143 | + if (match?.Success == true) |
179 | 144 | LastServerConnectionHandlerId = Convert.ToInt32(match.Groups["id"].Value);
|
180 |
| - |
181 |
| - break; |
182 |
| - } |
183 |
| - |
184 |
| - return true; |
185 | 145 | }
|
186 | 146 |
|
187 |
| - private static bool HandleServerQueryGreeting(string greeting) |
| 147 | + private static void HandleServerQueryGreeting(string greeting) |
188 | 148 | {
|
189 |
| - if (!greeting.StartsWith(SERVER_GREETING, StringComparison.InvariantCultureIgnoreCase)) |
190 |
| - return false; |
191 |
| - |
192 |
| - greeting = greeting.Substring(SERVER_GREETING.Length); |
| 149 | + string lastGreetingLine = greeting.Split(new[] { Ts3Util.QUERY_LINE_BREAK }, StringSplitOptions.RemoveEmptyEntries).LastOrDefault(); |
193 | 150 |
|
194 |
| - if (greeting.Length > 0) |
195 |
| - { |
196 |
| - SimpleResponse response = SimpleResponse.Parse(greeting); |
| 151 | + if (lastGreetingLine == null || !lastGreetingLine.Contains("=")) |
| 152 | + return; |
197 | 153 |
|
198 |
| - if (response.IsBanned) |
199 |
| - throw new InvalidOperationException("You are banned from the server: " + response.BanExtraMessage); |
200 |
| - } |
| 154 | + SimpleResponse response = SimpleResponse.Parse(lastGreetingLine); |
201 | 155 |
|
202 |
| - return true; |
| 156 | + if (response.IsBanned) |
| 157 | + throw new InvalidOperationException("You are banned from the server: " + response.BanExtraMessage); |
203 | 158 | }
|
204 | 159 |
|
205 |
| - private void GreetingFailed(string greeting) |
| 160 | + private void GreetingFailed() |
206 | 161 | {
|
207 | 162 | Disconnect();
|
208 | 163 |
|
209 | 164 | #if !SILVERLIGHT
|
210 |
| - Trace.WriteLine("Greeting was wrong! Greeting was: " + greeting); |
| 165 | + Trace.WriteLine("Greeting was wrong! "); |
211 | 166 | #endif
|
212 | 167 |
|
213 | 168 | throw new SocketException((int)SocketError.ProtocolNotSupported);
|
|
0 commit comments