diff options
Diffstat (limited to 'OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs')
-rw-r--r-- | OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs | 551 |
1 files changed, 0 insertions, 551 deletions
diff --git a/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs b/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs deleted file mode 100644 index 9755e73..0000000 --- a/OpenSim/ApplicationPlugins/Rest/Inventory/Rest.cs +++ /dev/null | |||
@@ -1,551 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) Contributors, http://opensimulator.org/ | ||
3 | * See CONTRIBUTORS.TXT for a full list of copyright holders. | ||
4 | * | ||
5 | * Redistribution and use in source and binary forms, with or without | ||
6 | * modification, are permitted provided that the following conditions are met: | ||
7 | * * Redistributions of source code must retain the above copyright | ||
8 | * notice, this list of conditions and the following disclaimer. | ||
9 | * * Redistributions in binary form must reproduce the above copyright | ||
10 | * notice, this list of conditions and the following disclaimer in the | ||
11 | * documentation and/or other materials provided with the distribution. | ||
12 | * * Neither the name of the OpenSimulator Project nor the | ||
13 | * names of its contributors may be used to endorse or promote products | ||
14 | * derived from this software without specific prior written permission. | ||
15 | * | ||
16 | * THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS ``AS IS'' AND ANY | ||
17 | * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | ||
18 | * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | ||
19 | * DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY | ||
20 | * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | ||
21 | * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | ||
22 | * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | ||
23 | * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
24 | * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS | ||
25 | * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
26 | * | ||
27 | */ | ||
28 | |||
29 | using System; | ||
30 | using System.Collections.Generic; | ||
31 | using System.Reflection; | ||
32 | using System.Text; | ||
33 | using log4net; | ||
34 | using Nini.Config; | ||
35 | using OpenSim.Framework; | ||
36 | using OpenSim.Framework.Communications; | ||
37 | using OpenSim.Services.Interfaces; | ||
38 | using IAvatarService = OpenSim.Services.Interfaces.IAvatarService; | ||
39 | |||
40 | namespace OpenSim.ApplicationPlugins.Rest.Inventory | ||
41 | { | ||
42 | public class Rest | ||
43 | { | ||
44 | internal static readonly ILog Log = | ||
45 | LogManager.GetLogger(MethodBase.GetCurrentMethod().DeclaringType); | ||
46 | |||
47 | internal static bool DEBUG = Log.IsDebugEnabled; | ||
48 | |||
49 | /// <summary> | ||
50 | /// Supported authentication schemes | ||
51 | /// </summary> | ||
52 | |||
53 | public const string AS_BASIC = "Basic"; // simple user/password verification | ||
54 | public const string AS_DIGEST = "Digest"; // password safe authentication | ||
55 | |||
56 | /// Supported Digest algorithms | ||
57 | |||
58 | public const string Digest_MD5 = "MD5"; // assumed default if omitted | ||
59 | public const string Digest_MD5Sess = "MD5-sess"; // session-span - not good for REST? | ||
60 | |||
61 | public const string Qop_Auth = "auth"; // authentication only | ||
62 | public const string Qop_Int = "auth-int"; // TODO | ||
63 | |||
64 | /// <summary> | ||
65 | /// These values have a single value for the whole | ||
66 | /// domain and lifetime of the plugin handler. We | ||
67 | /// make them static for ease of reference within | ||
68 | /// the assembly. These are initialized by the | ||
69 | /// RestHandler class during start-up. | ||
70 | /// </summary> | ||
71 | |||
72 | internal static IRestHandler Plugin = null; | ||
73 | internal static OpenSimBase main = null; | ||
74 | internal static string Prefix = null; | ||
75 | internal static IConfig Config = null; | ||
76 | internal static string GodKey = null; | ||
77 | internal static bool Authenticate = true; | ||
78 | internal static bool Secure = true; | ||
79 | internal static bool ExtendedEscape = true; | ||
80 | internal static bool DumpAsset = false; | ||
81 | internal static bool Fill = true; | ||
82 | internal static bool FlushEnabled = true; | ||
83 | internal static string Realm = "OpenSim REST"; | ||
84 | internal static string Scheme = AS_BASIC; | ||
85 | internal static int DumpLineSize = 32; // Should be a multiple of 16 or (possibly) 4 | ||
86 | |||
87 | /// <summary> | ||
88 | /// These are all dependent upon the Comms manager | ||
89 | /// being initialized. So they have to be properties | ||
90 | /// because the comms manager is now a module and is | ||
91 | /// not guaranteed to be there when the rest handler | ||
92 | /// initializes. | ||
93 | /// </summary> | ||
94 | |||
95 | internal static IInventoryService InventoryServices | ||
96 | { | ||
97 | get { return main.SceneManager.CurrentOrFirstScene.InventoryService; } | ||
98 | } | ||
99 | |||
100 | internal static IUserAccountService UserServices | ||
101 | { | ||
102 | get { return main.SceneManager.CurrentOrFirstScene.UserAccountService; } | ||
103 | } | ||
104 | |||
105 | internal static IAuthenticationService AuthServices | ||
106 | { | ||
107 | get { return main.SceneManager.CurrentOrFirstScene.AuthenticationService; } | ||
108 | } | ||
109 | |||
110 | internal static IAvatarService AvatarServices | ||
111 | { | ||
112 | get { return main.SceneManager.CurrentOrFirstScene.AvatarService; } | ||
113 | } | ||
114 | |||
115 | internal static IAssetService AssetServices | ||
116 | { | ||
117 | get { return main.SceneManager.CurrentOrFirstScene.AssetService; } | ||
118 | } | ||
119 | |||
120 | /// <summary> | ||
121 | /// HTTP requires that status information be generated for PUT | ||
122 | /// and POST opertaions. This is in support of that. The | ||
123 | /// operation verb gets substituted into the first string, | ||
124 | /// and the completion code is inserted into the tail. The | ||
125 | /// strings are put here to encourage consistency. | ||
126 | /// </summary> | ||
127 | |||
128 | internal static string statusHead = "<html><body><title>{0} status</title><break>"; | ||
129 | internal static string statusTail = "</body></html>"; | ||
130 | |||
131 | internal static Dictionary<int,string> HttpStatusDesc; | ||
132 | |||
133 | static Rest() | ||
134 | { | ||
135 | HttpStatusDesc = new Dictionary<int,string>(); | ||
136 | if (HttpStatusCodeArray.Length != HttpStatusDescArray.Length) | ||
137 | { | ||
138 | Log.ErrorFormat("{0} HTTP Status Code and Description arrays do not match"); | ||
139 | throw new Exception("HTTP Status array discrepancy"); | ||
140 | } | ||
141 | |||
142 | // Repackage the data into something more tractable. The sparse | ||
143 | // nature of HTTP return codes makes an array a bad choice. | ||
144 | |||
145 | for (int i=0; i<HttpStatusCodeArray.Length; i++) | ||
146 | { | ||
147 | HttpStatusDesc.Add(HttpStatusCodeArray[i], HttpStatusDescArray[i]); | ||
148 | } | ||
149 | } | ||
150 | |||
151 | internal static int CreationDate | ||
152 | { | ||
153 | get { return (int) (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds; } | ||
154 | } | ||
155 | |||
156 | internal static string MsgId | ||
157 | { | ||
158 | get { return Plugin.MsgId; } | ||
159 | } | ||
160 | |||
161 | internal static string RequestId | ||
162 | { | ||
163 | get { return Plugin.RequestId; } | ||
164 | } | ||
165 | |||
166 | internal static Encoding Encoding = Util.UTF8; | ||
167 | |||
168 | /// <summary> | ||
169 | /// Version control for REST implementation. This | ||
170 | /// refers to the overall infrastructure represented | ||
171 | /// by the following classes | ||
172 | /// RequestData | ||
173 | /// RequestInventoryPlugin | ||
174 | /// Rest | ||
175 | /// It does no describe implementation classes such as | ||
176 | /// RestInventoryServices, which may morph much more | ||
177 | /// often. Such classes ARE dependent upon this however | ||
178 | /// and should check it in their Initialize method. | ||
179 | /// </summary> | ||
180 | |||
181 | public static readonly float Version = 1.0F; | ||
182 | public const string Name = "REST 1.0"; | ||
183 | |||
184 | /// <summary> | ||
185 | /// Currently defined HTTP methods. | ||
186 | /// Only GET and HEAD are required to be | ||
187 | /// supported by all servers. See Respond | ||
188 | /// to see how these are handled. | ||
189 | /// </summary> | ||
190 | |||
191 | // REST AGENT 1.0 interpretations | ||
192 | public const string GET = "get"; // information retrieval - server state unchanged | ||
193 | public const string HEAD = "head"; // same as get except only the headers are returned. | ||
194 | public const string POST = "post"; // Replace the URI designated resource with the entity. | ||
195 | public const string PUT = "put"; // Add the entity to the context represented by the URI | ||
196 | public const string DELETE = "delete"; // Remove the URI designated resource from the server. | ||
197 | |||
198 | public const string OPTIONS = "options"; // | ||
199 | public const string TRACE = "trace"; // | ||
200 | public const string CONNECT = "connect"; // | ||
201 | |||
202 | // Define this in one place... | ||
203 | |||
204 | public const string UrlPathSeparator = "/"; | ||
205 | public const string UrlMethodSeparator = ":"; | ||
206 | |||
207 | // Redirection qualifications | ||
208 | |||
209 | public const bool PERMANENT = false; | ||
210 | public const bool TEMPORARY = true; | ||
211 | |||
212 | // Constant arrays used by String.Split | ||
213 | |||
214 | public static readonly char C_SPACE = ' '; | ||
215 | public static readonly char C_SLASH = '/'; | ||
216 | public static readonly char C_PATHSEP = '/'; | ||
217 | public static readonly char C_COLON = ':'; | ||
218 | public static readonly char C_PLUS = '+'; | ||
219 | public static readonly char C_PERIOD = '.'; | ||
220 | public static readonly char C_COMMA = ','; | ||
221 | public static readonly char C_DQUOTE = '"'; | ||
222 | |||
223 | public static readonly string CS_SPACE = " "; | ||
224 | public static readonly string CS_SLASH = "/"; | ||
225 | public static readonly string CS_PATHSEP = "/"; | ||
226 | public static readonly string CS_COLON = ":"; | ||
227 | public static readonly string CS_PLUS = "+"; | ||
228 | public static readonly string CS_PERIOD = "."; | ||
229 | public static readonly string CS_COMMA = ","; | ||
230 | public static readonly string CS_DQUOTE = "\""; | ||
231 | |||
232 | public static readonly char[] CA_SPACE = { C_SPACE }; | ||
233 | public static readonly char[] CA_SLASH = { C_SLASH }; | ||
234 | public static readonly char[] CA_PATHSEP = { C_PATHSEP }; | ||
235 | public static readonly char[] CA_COLON = { C_COLON }; | ||
236 | public static readonly char[] CA_PERIOD = { C_PERIOD }; | ||
237 | public static readonly char[] CA_PLUS = { C_PLUS }; | ||
238 | public static readonly char[] CA_COMMA = { C_COMMA }; | ||
239 | public static readonly char[] CA_DQUOTE = { C_DQUOTE }; | ||
240 | |||
241 | // HTTP Code Values (in value order) | ||
242 | |||
243 | public const int HttpStatusCodeContinue = 100; | ||
244 | public const int HttpStatusCodeSwitchingProtocols = 101; | ||
245 | |||
246 | public const int HttpStatusCodeOK = 200; | ||
247 | public const int HttpStatusCodeCreated = 201; | ||
248 | public const int HttpStatusCodeAccepted = 202; | ||
249 | public const int HttpStatusCodeNonAuthoritative = 203; | ||
250 | public const int HttpStatusCodeNoContent = 204; | ||
251 | public const int HttpStatusCodeResetContent = 205; | ||
252 | public const int HttpStatusCodePartialContent = 206; | ||
253 | |||
254 | public const int HttpStatusCodeMultipleChoices = 300; | ||
255 | public const int HttpStatusCodePermanentRedirect = 301; | ||
256 | public const int HttpStatusCodeFound = 302; | ||
257 | public const int HttpStatusCodeSeeOther = 303; | ||
258 | public const int HttpStatusCodeNotModified = 304; | ||
259 | public const int HttpStatusCodeUseProxy = 305; | ||
260 | public const int HttpStatusCodeReserved306 = 306; | ||
261 | public const int HttpStatusCodeTemporaryRedirect = 307; | ||
262 | |||
263 | public const int HttpStatusCodeBadRequest = 400; | ||
264 | public const int HttpStatusCodeNotAuthorized = 401; | ||
265 | public const int HttpStatusCodePaymentRequired = 402; | ||
266 | public const int HttpStatusCodeForbidden = 403; | ||
267 | public const int HttpStatusCodeNotFound = 404; | ||
268 | public const int HttpStatusCodeMethodNotAllowed = 405; | ||
269 | public const int HttpStatusCodeNotAcceptable = 406; | ||
270 | public const int HttpStatusCodeProxyAuthenticate = 407; | ||
271 | public const int HttpStatusCodeTimeOut = 408; | ||
272 | public const int HttpStatusCodeConflict = 409; | ||
273 | public const int HttpStatusCodeGone = 410; | ||
274 | public const int HttpStatusCodeLengthRequired = 411; | ||
275 | public const int HttpStatusCodePreconditionFailed = 412; | ||
276 | public const int HttpStatusCodeEntityTooLarge = 413; | ||
277 | public const int HttpStatusCodeUriTooLarge = 414; | ||
278 | public const int HttpStatusCodeUnsupportedMedia = 415; | ||
279 | public const int HttpStatusCodeRangeNotSatsified = 416; | ||
280 | public const int HttpStatusCodeExpectationFailed = 417; | ||
281 | |||
282 | public const int HttpStatusCodeServerError = 500; | ||
283 | public const int HttpStatusCodeNotImplemented = 501; | ||
284 | public const int HttpStatusCodeBadGateway = 502; | ||
285 | public const int HttpStatusCodeServiceUnavailable = 503; | ||
286 | public const int HttpStatusCodeGatewayTimeout = 504; | ||
287 | public const int HttpStatusCodeHttpVersionError = 505; | ||
288 | |||
289 | public static readonly int[] HttpStatusCodeArray = { | ||
290 | HttpStatusCodeContinue, | ||
291 | HttpStatusCodeSwitchingProtocols, | ||
292 | HttpStatusCodeOK, | ||
293 | HttpStatusCodeCreated, | ||
294 | HttpStatusCodeAccepted, | ||
295 | HttpStatusCodeNonAuthoritative, | ||
296 | HttpStatusCodeNoContent, | ||
297 | HttpStatusCodeResetContent, | ||
298 | HttpStatusCodePartialContent, | ||
299 | HttpStatusCodeMultipleChoices, | ||
300 | HttpStatusCodePermanentRedirect, | ||
301 | HttpStatusCodeFound, | ||
302 | HttpStatusCodeSeeOther, | ||
303 | HttpStatusCodeNotModified, | ||
304 | HttpStatusCodeUseProxy, | ||
305 | HttpStatusCodeReserved306, | ||
306 | HttpStatusCodeTemporaryRedirect, | ||
307 | HttpStatusCodeBadRequest, | ||
308 | HttpStatusCodeNotAuthorized, | ||
309 | HttpStatusCodePaymentRequired, | ||
310 | HttpStatusCodeForbidden, | ||
311 | HttpStatusCodeNotFound, | ||
312 | HttpStatusCodeMethodNotAllowed, | ||
313 | HttpStatusCodeNotAcceptable, | ||
314 | HttpStatusCodeProxyAuthenticate, | ||
315 | HttpStatusCodeTimeOut, | ||
316 | HttpStatusCodeConflict, | ||
317 | HttpStatusCodeGone, | ||
318 | HttpStatusCodeLengthRequired, | ||
319 | HttpStatusCodePreconditionFailed, | ||
320 | HttpStatusCodeEntityTooLarge, | ||
321 | HttpStatusCodeUriTooLarge, | ||
322 | HttpStatusCodeUnsupportedMedia, | ||
323 | HttpStatusCodeRangeNotSatsified, | ||
324 | HttpStatusCodeExpectationFailed, | ||
325 | HttpStatusCodeServerError, | ||
326 | HttpStatusCodeNotImplemented, | ||
327 | HttpStatusCodeBadGateway, | ||
328 | HttpStatusCodeServiceUnavailable, | ||
329 | HttpStatusCodeGatewayTimeout, | ||
330 | HttpStatusCodeHttpVersionError | ||
331 | }; | ||
332 | |||
333 | // HTTP Status Descriptions (in status code order) | ||
334 | // This array must be kept strictly consistent with respect | ||
335 | // to the status code array above. | ||
336 | |||
337 | public static readonly string[] HttpStatusDescArray = { | ||
338 | "Continue Request", | ||
339 | "Switching Protocols", | ||
340 | "OK", | ||
341 | "CREATED", | ||
342 | "ACCEPTED", | ||
343 | "NON-AUTHORITATIVE INFORMATION", | ||
344 | "NO CONTENT", | ||
345 | "RESET CONTENT", | ||
346 | "PARTIAL CONTENT", | ||
347 | "MULTIPLE CHOICES", | ||
348 | "PERMANENT REDIRECT", | ||
349 | "FOUND", | ||
350 | "SEE OTHER", | ||
351 | "NOT MODIFIED", | ||
352 | "USE PROXY", | ||
353 | "RESERVED CODE 306", | ||
354 | "TEMPORARY REDIRECT", | ||
355 | "BAD REQUEST", | ||
356 | "NOT AUTHORIZED", | ||
357 | "PAYMENT REQUIRED", | ||
358 | "FORBIDDEN", | ||
359 | "NOT FOUND", | ||
360 | "METHOD NOT ALLOWED", | ||
361 | "NOT ACCEPTABLE", | ||
362 | "PROXY AUTHENTICATION REQUIRED", | ||
363 | "TIMEOUT", | ||
364 | "CONFLICT", | ||
365 | "GONE", | ||
366 | "LENGTH REQUIRED", | ||
367 | "PRECONDITION FAILED", | ||
368 | "ENTITY TOO LARGE", | ||
369 | "URI TOO LARGE", | ||
370 | "UNSUPPORTED MEDIA", | ||
371 | "RANGE NOT SATISFIED", | ||
372 | "EXPECTATION FAILED", | ||
373 | "SERVER ERROR", | ||
374 | "NOT IMPLEMENTED", | ||
375 | "BAD GATEWAY", | ||
376 | "SERVICE UNAVAILABLE", | ||
377 | "GATEWAY TIMEOUT", | ||
378 | "HTTP VERSION NOT SUPPORTED" | ||
379 | }; | ||
380 | |||
381 | // HTTP Headers | ||
382 | |||
383 | public const string HttpHeaderAccept = "Accept"; | ||
384 | public const string HttpHeaderAcceptCharset = "Accept-Charset"; | ||
385 | public const string HttpHeaderAcceptEncoding = "Accept-Encoding"; | ||
386 | public const string HttpHeaderAcceptLanguage = "Accept-Language"; | ||
387 | public const string HttpHeaderAcceptRanges = "Accept-Ranges"; | ||
388 | public const string HttpHeaderAge = "Age"; | ||
389 | public const string HttpHeaderAllow = "Allow"; | ||
390 | public const string HttpHeaderAuthorization = "Authorization"; | ||
391 | public const string HttpHeaderCacheControl = "Cache-Control"; | ||
392 | public const string HttpHeaderConnection = "Connection"; | ||
393 | public const string HttpHeaderContentEncoding = "Content-Encoding"; | ||
394 | public const string HttpHeaderContentLanguage = "Content-Language"; | ||
395 | public const string HttpHeaderContentLength = "Content-Length"; | ||
396 | public const string HttpHeaderContentLocation = "Content-Location"; | ||
397 | public const string HttpHeaderContentMD5 = "Content-MD5"; | ||
398 | public const string HttpHeaderContentRange = "Content-Range"; | ||
399 | public const string HttpHeaderContentType = "Content-Type"; | ||
400 | public const string HttpHeaderDate = "Date"; | ||
401 | public const string HttpHeaderETag = "ETag"; | ||
402 | public const string HttpHeaderExpect = "Expect"; | ||
403 | public const string HttpHeaderExpires = "Expires"; | ||
404 | public const string HttpHeaderFrom = "From"; | ||
405 | public const string HttpHeaderHost = "Host"; | ||
406 | public const string HttpHeaderIfMatch = "If-Match"; | ||
407 | public const string HttpHeaderIfModifiedSince = "If-Modified-Since"; | ||
408 | public const string HttpHeaderIfNoneMatch = "If-None-Match"; | ||
409 | public const string HttpHeaderIfRange = "If-Range"; | ||
410 | public const string HttpHeaderIfUnmodifiedSince = "If-Unmodified-Since"; | ||
411 | public const string HttpHeaderLastModified = "Last-Modified"; | ||
412 | public const string HttpHeaderLocation = "Location"; | ||
413 | public const string HttpHeaderMaxForwards = "Max-Forwards"; | ||
414 | public const string HttpHeaderPragma = "Pragma"; | ||
415 | public const string HttpHeaderProxyAuthenticate = "Proxy-Authenticate"; | ||
416 | public const string HttpHeaderProxyAuthorization = "Proxy-Authorization"; | ||
417 | public const string HttpHeaderRange = "Range"; | ||
418 | public const string HttpHeaderReferer = "Referer"; | ||
419 | public const string HttpHeaderRetryAfter = "Retry-After"; | ||
420 | public const string HttpHeaderServer = "Server"; | ||
421 | public const string HttpHeaderTE = "TE"; | ||
422 | public const string HttpHeaderTrailer = "Trailer"; | ||
423 | public const string HttpHeaderTransferEncoding = "Transfer-Encoding"; | ||
424 | public const string HttpHeaderUpgrade = "Upgrade"; | ||
425 | public const string HttpHeaderUserAgent = "User-Agent"; | ||
426 | public const string HttpHeaderVary = "Vary"; | ||
427 | public const string HttpHeaderVia = "Via"; | ||
428 | public const string HttpHeaderWarning = "Warning"; | ||
429 | public const string HttpHeaderWWWAuthenticate = "WWW-Authenticate"; | ||
430 | |||
431 | /// Utility routines | ||
432 | |||
433 | public static string StringToBase64(string str) | ||
434 | { | ||
435 | try | ||
436 | { | ||
437 | byte[] encData_byte = new byte[str.Length]; | ||
438 | encData_byte = Util.UTF8.GetBytes(str); | ||
439 | return Convert.ToBase64String(encData_byte); | ||
440 | } | ||
441 | catch | ||
442 | { | ||
443 | return String.Empty; | ||
444 | } | ||
445 | } | ||
446 | |||
447 | public static string Base64ToString(string str) | ||
448 | { | ||
449 | try | ||
450 | { | ||
451 | return Util.Base64ToString(str); | ||
452 | } | ||
453 | catch | ||
454 | { | ||
455 | return String.Empty; | ||
456 | } | ||
457 | } | ||
458 | |||
459 | private const string hvals = "0123456789abcdef"; | ||
460 | |||
461 | public static int Hex2Int(string hex) | ||
462 | { | ||
463 | int val = 0; | ||
464 | int sum = 0; | ||
465 | string tmp = null; | ||
466 | |||
467 | if (hex != null) | ||
468 | { | ||
469 | tmp = hex.ToLower(); | ||
470 | for (int i = 0; i < tmp.Length; i++) | ||
471 | { | ||
472 | val = hvals.IndexOf(tmp[i]); | ||
473 | if (val == -1) | ||
474 | break; | ||
475 | sum *= 16; | ||
476 | sum += val; | ||
477 | } | ||
478 | } | ||
479 | |||
480 | return sum; | ||
481 | } | ||
482 | |||
483 | // Nonce management | ||
484 | |||
485 | public static string NonceGenerator() | ||
486 | { | ||
487 | return StringToBase64(CreationDate + Guid.NewGuid().ToString()); | ||
488 | } | ||
489 | |||
490 | // Dump the specified data stream | ||
491 | |||
492 | public static void Dump(byte[] data) | ||
493 | { | ||
494 | char[] buffer = new char[DumpLineSize]; | ||
495 | int cc = 0; | ||
496 | |||
497 | for (int i = 0; i < data.Length; i++) | ||
498 | { | ||
499 | if (i % DumpLineSize == 0) Console.Write("\n{0}: ",i.ToString("d8")); | ||
500 | |||
501 | if (i % 4 == 0) Console.Write(" "); | ||
502 | |||
503 | Console.Write("{0}",data[i].ToString("x2")); | ||
504 | |||
505 | if (data[i] < 127 && data[i] > 31) | ||
506 | buffer[i % DumpLineSize] = (char) data[i]; | ||
507 | else | ||
508 | buffer[i % DumpLineSize] = '.'; | ||
509 | |||
510 | cc++; | ||
511 | |||
512 | if (i != 0 && (i + 1) % DumpLineSize == 0) | ||
513 | { | ||
514 | Console.Write(" |"+(new String(buffer))+"|"); | ||
515 | cc = 0; | ||
516 | } | ||
517 | } | ||
518 | |||
519 | // Finish off any incomplete line | ||
520 | |||
521 | if (cc != 0) | ||
522 | { | ||
523 | for (int i = cc ; i < DumpLineSize; i++) | ||
524 | { | ||
525 | if (i % 4 == 0) Console.Write(" "); | ||
526 | Console.Write(" "); | ||
527 | buffer[i % DumpLineSize] = ' '; | ||
528 | } | ||
529 | Console.WriteLine(" |"+(new String(buffer))+"|"); | ||
530 | } | ||
531 | else | ||
532 | { | ||
533 | Console.Write("\n"); | ||
534 | } | ||
535 | } | ||
536 | } | ||
537 | |||
538 | // Local exception type | ||
539 | |||
540 | public class RestException : Exception | ||
541 | { | ||
542 | internal int statusCode; | ||
543 | internal string statusDesc; | ||
544 | internal string httpmethod; | ||
545 | internal string httppath; | ||
546 | |||
547 | public RestException(string msg) : base(msg) | ||
548 | { | ||
549 | } | ||
550 | } | ||
551 | } | ||