mirror of
				https://github.com/jellyfin/jellyfin.git
				synced 2025-10-31 16:21:08 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			924 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			924 lines
		
	
	
		
			37 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
| using System;
 | |
| using System.Collections;
 | |
| using System.Collections.Generic;
 | |
| using System.Text;
 | |
| using MediaBrowser.Model.Services;
 | |
| using MediaBrowser.Model.Extensions;
 | |
| 
 | |
| namespace Emby.Server.Implementations.HttpServer.SocketSharp
 | |
| {
 | |
|     public static class MyHttpUtility
 | |
|     {
 | |
|         // Must be sorted
 | |
|         static readonly long[] entities = new long[] {
 | |
| 			(long)'A' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
 | |
| 			(long)'A' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'A' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'A' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'A' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 
 | |
| 			(long)'A' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 
 | |
| 			(long)'A' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'A' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'B' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'C' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 
 | |
| 			(long)'C' << 56 | (long)'h' << 48 | (long)'i' << 40, 
 | |
| 			(long)'D' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 
 | |
| 			(long)'D' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 
 | |
| 			(long)'E' << 56 | (long)'T' << 48 | (long)'H' << 40, 
 | |
| 			(long)'E' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'E' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'E' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'E' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'E' << 56 | (long)'t' << 48 | (long)'a' << 40, 
 | |
| 			(long)'E' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'G' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 
 | |
| 			(long)'I' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'I' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'I' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'I' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'I' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'K' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 
 | |
| 			(long)'L' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 
 | |
| 			(long)'M' << 56 | (long)'u' << 48, 
 | |
| 			(long)'N' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'N' << 56 | (long)'u' << 48, 
 | |
| 			(long)'O' << 56 | (long)'E' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
 | |
| 			(long)'O' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'O' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'O' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'O' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 
 | |
| 			(long)'O' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'O' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 
 | |
| 			(long)'O' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'O' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'P' << 56 | (long)'h' << 48 | (long)'i' << 40, 
 | |
| 			(long)'P' << 56 | (long)'i' << 48, 
 | |
| 			(long)'P' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 
 | |
| 			(long)'P' << 56 | (long)'s' << 48 | (long)'i' << 40, 
 | |
| 			(long)'R' << 56 | (long)'h' << 48 | (long)'o' << 40, 
 | |
| 			(long)'S' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 
 | |
| 			(long)'S' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 
 | |
| 			(long)'T' << 56 | (long)'H' << 48 | (long)'O' << 40 | (long)'R' << 32 | (long)'N' << 24, 
 | |
| 			(long)'T' << 56 | (long)'a' << 48 | (long)'u' << 40, 
 | |
| 			(long)'T' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 
 | |
| 			(long)'U' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'U' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'U' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'U' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'U' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'X' << 56 | (long)'i' << 48, 
 | |
| 			(long)'Y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'Y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'Z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'a' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'a' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'a' << 56 | (long)'c' << 48 | (long)'u' << 40 | (long)'t' << 32 | (long)'e' << 24, 
 | |
| 			(long)'a' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
 | |
| 			(long)'a' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'a' << 56 | (long)'l' << 48 | (long)'e' << 40 | (long)'f' << 32 | (long)'s' << 24 | (long)'y' << 16 | (long)'m' << 8, 
 | |
| 			(long)'a' << 56 | (long)'l' << 48 | (long)'p' << 40 | (long)'h' << 32 | (long)'a' << 24, 
 | |
| 			(long)'a' << 56 | (long)'m' << 48 | (long)'p' << 40, 
 | |
| 			(long)'a' << 56 | (long)'n' << 48 | (long)'d' << 40, 
 | |
| 			(long)'a' << 56 | (long)'n' << 48 | (long)'g' << 40, 
 | |
| 			(long)'a' << 56 | (long)'p' << 48 | (long)'o' << 40 | (long)'s' << 32,
 | |
| 			(long)'a' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'g' << 24, 
 | |
| 			(long)'a' << 56 | (long)'s' << 48 | (long)'y' << 40 | (long)'m' << 32 | (long)'p' << 24, 
 | |
| 			(long)'a' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'a' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'b' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'b' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'b' << 56 | (long)'r' << 48 | (long)'v' << 40 | (long)'b' << 32 | (long)'a' << 24 | (long)'r' << 16, 
 | |
| 			(long)'b' << 56 | (long)'u' << 48 | (long)'l' << 40 | (long)'l' << 32, 
 | |
| 			(long)'c' << 56 | (long)'a' << 48 | (long)'p' << 40, 
 | |
| 			(long)'c' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'d' << 32 | (long)'i' << 24 | (long)'l' << 16, 
 | |
| 			(long)'c' << 56 | (long)'e' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'l' << 24, 
 | |
| 			(long)'c' << 56 | (long)'e' << 48 | (long)'n' << 40 | (long)'t' << 32, 
 | |
| 			(long)'c' << 56 | (long)'h' << 48 | (long)'i' << 40, 
 | |
| 			(long)'c' << 56 | (long)'i' << 48 | (long)'r' << 40 | (long)'c' << 32, 
 | |
| 			(long)'c' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'b' << 32 | (long)'s' << 24, 
 | |
| 			(long)'c' << 56 | (long)'o' << 48 | (long)'n' << 40 | (long)'g' << 32, 
 | |
| 			(long)'c' << 56 | (long)'o' << 48 | (long)'p' << 40 | (long)'y' << 32, 
 | |
| 			(long)'c' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'r' << 24, 
 | |
| 			(long)'c' << 56 | (long)'u' << 48 | (long)'p' << 40, 
 | |
| 			(long)'c' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'n' << 16, 
 | |
| 			(long)'d' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'d' << 56 | (long)'a' << 48 | (long)'g' << 40 | (long)'g' << 32 | (long)'e' << 24 | (long)'r' << 16, 
 | |
| 			(long)'d' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'d' << 56 | (long)'e' << 48 | (long)'g' << 40, 
 | |
| 			(long)'d' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'t' << 32 | (long)'a' << 24, 
 | |
| 			(long)'d' << 56 | (long)'i' << 48 | (long)'a' << 40 | (long)'m' << 32 | (long)'s' << 24, 
 | |
| 			(long)'d' << 56 | (long)'i' << 48 | (long)'v' << 40 | (long)'i' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'e' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'e' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'e' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'e' << 56 | (long)'m' << 48 | (long)'p' << 40 | (long)'t' << 32 | (long)'y' << 24, 
 | |
| 			(long)'e' << 56 | (long)'m' << 48 | (long)'s' << 40 | (long)'p' << 32, 
 | |
| 			(long)'e' << 56 | (long)'n' << 48 | (long)'s' << 40 | (long)'p' << 32, 
 | |
| 			(long)'e' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'e' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'i' << 32 | (long)'v' << 24, 
 | |
| 			(long)'e' << 56 | (long)'t' << 48 | (long)'a' << 40, 
 | |
| 			(long)'e' << 56 | (long)'t' << 48 | (long)'h' << 40, 
 | |
| 			(long)'e' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'e' << 56 | (long)'u' << 48 | (long)'r' << 40 | (long)'o' << 32, 
 | |
| 			(long)'e' << 56 | (long)'x' << 48 | (long)'i' << 40 | (long)'s' << 32 | (long)'t' << 24, 
 | |
| 			(long)'f' << 56 | (long)'n' << 48 | (long)'o' << 40 | (long)'f' << 32, 
 | |
| 			(long)'f' << 56 | (long)'o' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'l' << 24 | (long)'l' << 16, 
 | |
| 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'2' << 16, 
 | |
| 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'1' << 24 | (long)'4' << 16, 
 | |
| 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'c' << 32 | (long)'3' << 24 | (long)'4' << 16, 
 | |
| 			(long)'f' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'l' << 24, 
 | |
| 			(long)'g' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'m' << 32 | (long)'a' << 24, 
 | |
| 			(long)'g' << 56 | (long)'e' << 48, 
 | |
| 			(long)'g' << 56 | (long)'t' << 48, 
 | |
| 			(long)'h' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'h' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'h' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'t' << 24 | (long)'s' << 16, 
 | |
| 			(long)'h' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'l' << 32 | (long)'i' << 24 | (long)'p' << 16, 
 | |
| 			(long)'i' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'i' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'i' << 56 | (long)'e' << 48 | (long)'x' << 40 | (long)'c' << 32 | (long)'l' << 24, 
 | |
| 			(long)'i' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'i' << 56 | (long)'m' << 48 | (long)'a' << 40 | (long)'g' << 32 | (long)'e' << 24, 
 | |
| 			(long)'i' << 56 | (long)'n' << 48 | (long)'f' << 40 | (long)'i' << 32 | (long)'n' << 24, 
 | |
| 			(long)'i' << 56 | (long)'n' << 48 | (long)'t' << 40, 
 | |
| 			(long)'i' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'i' << 56 | (long)'q' << 48 | (long)'u' << 40 | (long)'e' << 32 | (long)'s' << 24 | (long)'t' << 16, 
 | |
| 			(long)'i' << 56 | (long)'s' << 48 | (long)'i' << 40 | (long)'n' << 32, 
 | |
| 			(long)'i' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'k' << 56 | (long)'a' << 48 | (long)'p' << 40 | (long)'p' << 32 | (long)'a' << 24, 
 | |
| 			(long)'l' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'l' << 56 | (long)'a' << 48 | (long)'m' << 40 | (long)'b' << 32 | (long)'d' << 24 | (long)'a' << 16, 
 | |
| 			(long)'l' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 
 | |
| 			(long)'l' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'l' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'l' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 
 | |
| 			(long)'l' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'l' << 56 | (long)'e' << 48, 
 | |
| 			(long)'l' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 
 | |
| 			(long)'l' << 56 | (long)'o' << 48 | (long)'w' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'t' << 16, 
 | |
| 			(long)'l' << 56 | (long)'o' << 48 | (long)'z' << 40, 
 | |
| 			(long)'l' << 56 | (long)'r' << 48 | (long)'m' << 40, 
 | |
| 			(long)'l' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 
 | |
| 			(long)'l' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'l' << 56 | (long)'t' << 48, 
 | |
| 			(long)'m' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'r' << 32, 
 | |
| 			(long)'m' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 
 | |
| 			(long)'m' << 56 | (long)'i' << 48 | (long)'c' << 40 | (long)'r' << 32 | (long)'o' << 24, 
 | |
| 			(long)'m' << 56 | (long)'i' << 48 | (long)'d' << 40 | (long)'d' << 32 | (long)'o' << 24 | (long)'t' << 16, 
 | |
| 			(long)'m' << 56 | (long)'i' << 48 | (long)'n' << 40 | (long)'u' << 32 | (long)'s' << 24, 
 | |
| 			(long)'m' << 56 | (long)'u' << 48, 
 | |
| 			(long)'n' << 56 | (long)'a' << 48 | (long)'b' << 40 | (long)'l' << 32 | (long)'a' << 24, 
 | |
| 			(long)'n' << 56 | (long)'b' << 48 | (long)'s' << 40 | (long)'p' << 32, 
 | |
| 			(long)'n' << 56 | (long)'d' << 48 | (long)'a' << 40 | (long)'s' << 32 | (long)'h' << 24, 
 | |
| 			(long)'n' << 56 | (long)'e' << 48, 
 | |
| 			(long)'n' << 56 | (long)'i' << 48, 
 | |
| 			(long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40, 
 | |
| 			(long)'n' << 56 | (long)'o' << 48 | (long)'t' << 40 | (long)'i' << 32 | (long)'n' << 24, 
 | |
| 			(long)'n' << 56 | (long)'s' << 48 | (long)'u' << 40 | (long)'b' << 32, 
 | |
| 			(long)'n' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'n' << 56 | (long)'u' << 48, 
 | |
| 			(long)'o' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'o' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'o' << 56 | (long)'e' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
 | |
| 			(long)'o' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'o' << 56 | (long)'l' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'e' << 24, 
 | |
| 			(long)'o' << 56 | (long)'m' << 48 | (long)'e' << 40 | (long)'g' << 32 | (long)'a' << 24, 
 | |
| 			(long)'o' << 56 | (long)'m' << 48 | (long)'i' << 40 | (long)'c' << 32 | (long)'r' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'o' << 56 | (long)'p' << 48 | (long)'l' << 40 | (long)'u' << 32 | (long)'s' << 24, 
 | |
| 			(long)'o' << 56 | (long)'r' << 48, 
 | |
| 			(long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'f' << 32, 
 | |
| 			(long)'o' << 56 | (long)'r' << 48 | (long)'d' << 40 | (long)'m' << 32, 
 | |
| 			(long)'o' << 56 | (long)'s' << 48 | (long)'l' << 40 | (long)'a' << 32 | (long)'s' << 24 | (long)'h' << 16, 
 | |
| 			(long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'l' << 32 | (long)'d' << 24 | (long)'e' << 16, 
 | |
| 			(long)'o' << 56 | (long)'t' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24 | (long)'s' << 16, 
 | |
| 			(long)'o' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'a' << 32, 
 | |
| 			(long)'p' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'t' << 32, 
 | |
| 			(long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'m' << 32 | (long)'i' << 24 | (long)'l' << 16, 
 | |
| 			(long)'p' << 56 | (long)'e' << 48 | (long)'r' << 40 | (long)'p' << 32, 
 | |
| 			(long)'p' << 56 | (long)'h' << 48 | (long)'i' << 40, 
 | |
| 			(long)'p' << 56 | (long)'i' << 48, 
 | |
| 			(long)'p' << 56 | (long)'i' << 48 | (long)'v' << 40, 
 | |
| 			(long)'p' << 56 | (long)'l' << 48 | (long)'u' << 40 | (long)'s' << 32 | (long)'m' << 24 | (long)'n' << 16, 
 | |
| 			(long)'p' << 56 | (long)'o' << 48 | (long)'u' << 40 | (long)'n' << 32 | (long)'d' << 24, 
 | |
| 			(long)'p' << 56 | (long)'r' << 48 | (long)'i' << 40 | (long)'m' << 32 | (long)'e' << 24, 
 | |
| 			(long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'d' << 32, 
 | |
| 			(long)'p' << 56 | (long)'r' << 48 | (long)'o' << 40 | (long)'p' << 32, 
 | |
| 			(long)'p' << 56 | (long)'s' << 48 | (long)'i' << 40, 
 | |
| 			(long)'q' << 56 | (long)'u' << 48 | (long)'o' << 40 | (long)'t' << 32, 
 | |
| 			(long)'r' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'r' << 56 | (long)'a' << 48 | (long)'d' << 40 | (long)'i' << 32 | (long)'c' << 24, 
 | |
| 			(long)'r' << 56 | (long)'a' << 48 | (long)'n' << 40 | (long)'g' << 32, 
 | |
| 			(long)'r' << 56 | (long)'a' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'r' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'r' << 56 | (long)'c' << 48 | (long)'e' << 40 | (long)'i' << 32 | (long)'l' << 24, 
 | |
| 			(long)'r' << 56 | (long)'d' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'r' << 56 | (long)'e' << 48 | (long)'a' << 40 | (long)'l' << 32, 
 | |
| 			(long)'r' << 56 | (long)'e' << 48 | (long)'g' << 40, 
 | |
| 			(long)'r' << 56 | (long)'f' << 48 | (long)'l' << 40 | (long)'o' << 32 | (long)'o' << 24 | (long)'r' << 16, 
 | |
| 			(long)'r' << 56 | (long)'h' << 48 | (long)'o' << 40, 
 | |
| 			(long)'r' << 56 | (long)'l' << 48 | (long)'m' << 40, 
 | |
| 			(long)'r' << 56 | (long)'s' << 48 | (long)'a' << 40 | (long)'q' << 32 | (long)'u' << 24 | (long)'o' << 16, 
 | |
| 			(long)'r' << 56 | (long)'s' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'s' << 56 | (long)'b' << 48 | (long)'q' << 40 | (long)'u' << 32 | (long)'o' << 24, 
 | |
| 			(long)'s' << 56 | (long)'c' << 48 | (long)'a' << 40 | (long)'r' << 32 | (long)'o' << 24 | (long)'n' << 16, 
 | |
| 			(long)'s' << 56 | (long)'d' << 48 | (long)'o' << 40 | (long)'t' << 32, 
 | |
| 			(long)'s' << 56 | (long)'e' << 48 | (long)'c' << 40 | (long)'t' << 32, 
 | |
| 			(long)'s' << 56 | (long)'h' << 48 | (long)'y' << 40, 
 | |
| 			(long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24, 
 | |
| 			(long)'s' << 56 | (long)'i' << 48 | (long)'g' << 40 | (long)'m' << 32 | (long)'a' << 24 | (long)'f' << 16, 
 | |
| 			(long)'s' << 56 | (long)'i' << 48 | (long)'m' << 40, 
 | |
| 			(long)'s' << 56 | (long)'p' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24 | (long)'s' << 16, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'b' << 40 | (long)'e' << 32, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'m' << 40, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'1' << 32, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'2' << 32, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'3' << 32, 
 | |
| 			(long)'s' << 56 | (long)'u' << 48 | (long)'p' << 40 | (long)'e' << 32, 
 | |
| 			(long)'s' << 56 | (long)'z' << 48 | (long)'l' << 40 | (long)'i' << 32 | (long)'g' << 24, 
 | |
| 			(long)'t' << 56 | (long)'a' << 48 | (long)'u' << 40, 
 | |
| 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'r' << 32 | (long)'e' << 24 | (long)'4' << 16, 
 | |
| 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24, 
 | |
| 			(long)'t' << 56 | (long)'h' << 48 | (long)'e' << 40 | (long)'t' << 32 | (long)'a' << 24 | (long)'s' << 16 | (long)'y' << 8 | (long)'m' << 0, 
 | |
| 			(long)'t' << 56 | (long)'h' << 48 | (long)'i' << 40 | (long)'n' << 32 | (long)'s' << 24 | (long)'p' << 16, 
 | |
| 			(long)'t' << 56 | (long)'h' << 48 | (long)'o' << 40 | (long)'r' << 32 | (long)'n' << 24, 
 | |
| 			(long)'t' << 56 | (long)'i' << 48 | (long)'l' << 40 | (long)'d' << 32 | (long)'e' << 24, 
 | |
| 			(long)'t' << 56 | (long)'i' << 48 | (long)'m' << 40 | (long)'e' << 32 | (long)'s' << 24, 
 | |
| 			(long)'t' << 56 | (long)'r' << 48 | (long)'a' << 40 | (long)'d' << 32 | (long)'e' << 24, 
 | |
| 			(long)'u' << 56 | (long)'A' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'u' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'u' << 56 | (long)'a' << 48 | (long)'r' << 40 | (long)'r' << 32, 
 | |
| 			(long)'u' << 56 | (long)'c' << 48 | (long)'i' << 40 | (long)'r' << 32 | (long)'c' << 24, 
 | |
| 			(long)'u' << 56 | (long)'g' << 48 | (long)'r' << 40 | (long)'a' << 32 | (long)'v' << 24 | (long)'e' << 16, 
 | |
| 			(long)'u' << 56 | (long)'m' << 48 | (long)'l' << 40, 
 | |
| 			(long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'h' << 24, 
 | |
| 			(long)'u' << 56 | (long)'p' << 48 | (long)'s' << 40 | (long)'i' << 32 | (long)'l' << 24 | (long)'o' << 16 | (long)'n' << 8, 
 | |
| 			(long)'u' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'w' << 56 | (long)'e' << 48 | (long)'i' << 40 | (long)'e' << 32 | (long)'r' << 24 | (long)'p' << 16, 
 | |
| 			(long)'x' << 56 | (long)'i' << 48, 
 | |
| 			(long)'y' << 56 | (long)'a' << 48 | (long)'c' << 40 | (long)'u' << 32 | (long)'t' << 24 | (long)'e' << 16, 
 | |
| 			(long)'y' << 56 | (long)'e' << 48 | (long)'n' << 40, 
 | |
| 			(long)'y' << 56 | (long)'u' << 48 | (long)'m' << 40 | (long)'l' << 32, 
 | |
| 			(long)'z' << 56 | (long)'e' << 48 | (long)'t' << 40 | (long)'a' << 32, 
 | |
| 			(long)'z' << 56 | (long)'w' << 48 | (long)'j' << 40, 
 | |
| 			(long)'z' << 56 | (long)'w' << 48 | (long)'n' << 40 | (long)'j' << 32
 | |
| 		};
 | |
| 
 | |
|         static readonly char[] entities_values = new char[] {
 | |
| 			'\u00C6',
 | |
| 			'\u00C1',
 | |
| 			'\u00C2',
 | |
| 			'\u00C0',
 | |
| 			'\u0391',
 | |
| 			'\u00C5',
 | |
| 			'\u00C3',
 | |
| 			'\u00C4',
 | |
| 			'\u0392',
 | |
| 			'\u00C7',
 | |
| 			'\u03A7',
 | |
| 			'\u2021',
 | |
| 			'\u0394',
 | |
| 			'\u00D0',
 | |
| 			'\u00C9',
 | |
| 			'\u00CA',
 | |
| 			'\u00C8',
 | |
| 			'\u0395',
 | |
| 			'\u0397',
 | |
| 			'\u00CB',
 | |
| 			'\u0393',
 | |
| 			'\u00CD',
 | |
| 			'\u00CE',
 | |
| 			'\u00CC',
 | |
| 			'\u0399',
 | |
| 			'\u00CF',
 | |
| 			'\u039A',
 | |
| 			'\u039B',
 | |
| 			'\u039C',
 | |
| 			'\u00D1',
 | |
| 			'\u039D',
 | |
| 			'\u0152',
 | |
| 			'\u00D3',
 | |
| 			'\u00D4',
 | |
| 			'\u00D2',
 | |
| 			'\u03A9',
 | |
| 			'\u039F',
 | |
| 			'\u00D8',
 | |
| 			'\u00D5',
 | |
| 			'\u00D6',
 | |
| 			'\u03A6',
 | |
| 			'\u03A0',
 | |
| 			'\u2033',
 | |
| 			'\u03A8',
 | |
| 			'\u03A1',
 | |
| 			'\u0160',
 | |
| 			'\u03A3',
 | |
| 			'\u00DE',
 | |
| 			'\u03A4',
 | |
| 			'\u0398',
 | |
| 			'\u00DA',
 | |
| 			'\u00DB',
 | |
| 			'\u00D9',
 | |
| 			'\u03A5',
 | |
| 			'\u00DC',
 | |
| 			'\u039E',
 | |
| 			'\u00DD',
 | |
| 			'\u0178',
 | |
| 			'\u0396',
 | |
| 			'\u00E1',
 | |
| 			'\u00E2',
 | |
| 			'\u00B4',
 | |
| 			'\u00E6',
 | |
| 			'\u00E0',
 | |
| 			'\u2135',
 | |
| 			'\u03B1',
 | |
| 			'\u0026',
 | |
| 			'\u2227',
 | |
| 			'\u2220',
 | |
| 			'\u0027',
 | |
| 			'\u00E5',
 | |
| 			'\u2248',
 | |
| 			'\u00E3',
 | |
| 			'\u00E4',
 | |
| 			'\u201E',
 | |
| 			'\u03B2',
 | |
| 			'\u00A6',
 | |
| 			'\u2022',
 | |
| 			'\u2229',
 | |
| 			'\u00E7',
 | |
| 			'\u00B8',
 | |
| 			'\u00A2',
 | |
| 			'\u03C7',
 | |
| 			'\u02C6',
 | |
| 			'\u2663',
 | |
| 			'\u2245',
 | |
| 			'\u00A9',
 | |
| 			'\u21B5',
 | |
| 			'\u222A',
 | |
| 			'\u00A4',
 | |
| 			'\u21D3',
 | |
| 			'\u2020',
 | |
| 			'\u2193',
 | |
| 			'\u00B0',
 | |
| 			'\u03B4',
 | |
| 			'\u2666',
 | |
| 			'\u00F7',
 | |
| 			'\u00E9',
 | |
| 			'\u00EA',
 | |
| 			'\u00E8',
 | |
| 			'\u2205',
 | |
| 			'\u2003',
 | |
| 			'\u2002',
 | |
| 			'\u03B5',
 | |
| 			'\u2261',
 | |
| 			'\u03B7',
 | |
| 			'\u00F0',
 | |
| 			'\u00EB',
 | |
| 			'\u20AC',
 | |
| 			'\u2203',
 | |
| 			'\u0192',
 | |
| 			'\u2200',
 | |
| 			'\u00BD',
 | |
| 			'\u00BC',
 | |
| 			'\u00BE',
 | |
| 			'\u2044',
 | |
| 			'\u03B3',
 | |
| 			'\u2265',
 | |
| 			'\u003E',
 | |
| 			'\u21D4',
 | |
| 			'\u2194',
 | |
| 			'\u2665',
 | |
| 			'\u2026',
 | |
| 			'\u00ED',
 | |
| 			'\u00EE',
 | |
| 			'\u00A1',
 | |
| 			'\u00EC',
 | |
| 			'\u2111',
 | |
| 			'\u221E',
 | |
| 			'\u222B',
 | |
| 			'\u03B9',
 | |
| 			'\u00BF',
 | |
| 			'\u2208',
 | |
| 			'\u00EF',
 | |
| 			'\u03BA',
 | |
| 			'\u21D0',
 | |
| 			'\u03BB',
 | |
| 			'\u2329',
 | |
| 			'\u00AB',
 | |
| 			'\u2190',
 | |
| 			'\u2308',
 | |
| 			'\u201C',
 | |
| 			'\u2264',
 | |
| 			'\u230A',
 | |
| 			'\u2217',
 | |
| 			'\u25CA',
 | |
| 			'\u200E',
 | |
| 			'\u2039',
 | |
| 			'\u2018',
 | |
| 			'\u003C',
 | |
| 			'\u00AF',
 | |
| 			'\u2014',
 | |
| 			'\u00B5',
 | |
| 			'\u00B7',
 | |
| 			'\u2212',
 | |
| 			'\u03BC',
 | |
| 			'\u2207',
 | |
| 			'\u00A0',
 | |
| 			'\u2013',
 | |
| 			'\u2260',
 | |
| 			'\u220B',
 | |
| 			'\u00AC',
 | |
| 			'\u2209',
 | |
| 			'\u2284',
 | |
| 			'\u00F1',
 | |
| 			'\u03BD',
 | |
| 			'\u00F3',
 | |
| 			'\u00F4',
 | |
| 			'\u0153',
 | |
| 			'\u00F2',
 | |
| 			'\u203E',
 | |
| 			'\u03C9',
 | |
| 			'\u03BF',
 | |
| 			'\u2295',
 | |
| 			'\u2228',
 | |
| 			'\u00AA',
 | |
| 			'\u00BA',
 | |
| 			'\u00F8',
 | |
| 			'\u00F5',
 | |
| 			'\u2297',
 | |
| 			'\u00F6',
 | |
| 			'\u00B6',
 | |
| 			'\u2202',
 | |
| 			'\u2030',
 | |
| 			'\u22A5',
 | |
| 			'\u03C6',
 | |
| 			'\u03C0',
 | |
| 			'\u03D6',
 | |
| 			'\u00B1',
 | |
| 			'\u00A3',
 | |
| 			'\u2032',
 | |
| 			'\u220F',
 | |
| 			'\u221D',
 | |
| 			'\u03C8',
 | |
| 			'\u0022',
 | |
| 			'\u21D2',
 | |
| 			'\u221A',
 | |
| 			'\u232A',
 | |
| 			'\u00BB',
 | |
| 			'\u2192',
 | |
| 			'\u2309',
 | |
| 			'\u201D',
 | |
| 			'\u211C',
 | |
| 			'\u00AE',
 | |
| 			'\u230B',
 | |
| 			'\u03C1',
 | |
| 			'\u200F',
 | |
| 			'\u203A',
 | |
| 			'\u2019',
 | |
| 			'\u201A',
 | |
| 			'\u0161',
 | |
| 			'\u22C5',
 | |
| 			'\u00A7',
 | |
| 			'\u00AD',
 | |
| 			'\u03C3',
 | |
| 			'\u03C2',
 | |
| 			'\u223C',
 | |
| 			'\u2660',
 | |
| 			'\u2282',
 | |
| 			'\u2286',
 | |
| 			'\u2211',
 | |
| 			'\u2283',
 | |
| 			'\u00B9',
 | |
| 			'\u00B2',
 | |
| 			'\u00B3',
 | |
| 			'\u2287',
 | |
| 			'\u00DF',
 | |
| 			'\u03C4',
 | |
| 			'\u2234',
 | |
| 			'\u03B8',
 | |
| 			'\u03D1',
 | |
| 			'\u2009',
 | |
| 			'\u00FE',
 | |
| 			'\u02DC',
 | |
| 			'\u00D7',
 | |
| 			'\u2122',
 | |
| 			'\u21D1',
 | |
| 			'\u00FA',
 | |
| 			'\u2191',
 | |
| 			'\u00FB',
 | |
| 			'\u00F9',
 | |
| 			'\u00A8',
 | |
| 			'\u03D2',
 | |
| 			'\u03C5',
 | |
| 			'\u00FC',
 | |
| 			'\u2118',
 | |
| 			'\u03BE',
 | |
| 			'\u00FD',
 | |
| 			'\u00A5',
 | |
| 			'\u00FF',
 | |
| 			'\u03B6',
 | |
| 			'\u200D',
 | |
| 			'\u200C'
 | |
| 		};
 | |
| 
 | |
|         #region Methods
 | |
| 
 | |
|         static void WriteCharBytes(IList buf, char ch, Encoding e)
 | |
|         {
 | |
|             if (ch > 255)
 | |
|             {
 | |
|                 foreach (byte b in e.GetBytes(new char[] { ch }))
 | |
|                     buf.Add(b);
 | |
|             }
 | |
|             else
 | |
|                 buf.Add((byte)ch);
 | |
|         }
 | |
| 
 | |
|         public static string UrlDecode(string s, Encoding e)
 | |
|         {
 | |
|             if (null == s)
 | |
|                 return null;
 | |
| 
 | |
|             if (s.IndexOf('%') == -1 && s.IndexOf('+') == -1)
 | |
|                 return s;
 | |
| 
 | |
|             if (e == null)
 | |
|                 e = Encoding.UTF8;
 | |
| 
 | |
|             long len = s.Length;
 | |
|             var bytes = new List<byte>();
 | |
|             int xchar;
 | |
|             char ch;
 | |
| 
 | |
|             for (int i = 0; i < len; i++)
 | |
|             {
 | |
|                 ch = s[i];
 | |
|                 if (ch == '%' && i + 2 < len && s[i + 1] != '%')
 | |
|                 {
 | |
|                     if (s[i + 1] == 'u' && i + 5 < len)
 | |
|                     {
 | |
|                         // unicode hex sequence
 | |
|                         xchar = GetChar(s, i + 2, 4);
 | |
|                         if (xchar != -1)
 | |
|                         {
 | |
|                             WriteCharBytes(bytes, (char)xchar, e);
 | |
|                             i += 5;
 | |
|                         }
 | |
|                         else
 | |
|                             WriteCharBytes(bytes, '%', e);
 | |
|                     }
 | |
|                     else if ((xchar = GetChar(s, i + 1, 2)) != -1)
 | |
|                     {
 | |
|                         WriteCharBytes(bytes, (char)xchar, e);
 | |
|                         i += 2;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         WriteCharBytes(bytes, '%', e);
 | |
|                     }
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (ch == '+')
 | |
|                     WriteCharBytes(bytes, ' ', e);
 | |
|                 else
 | |
|                     WriteCharBytes(bytes, ch, e);
 | |
|             }
 | |
| 
 | |
|             byte[] buf = bytes.ToArray(bytes.Count);
 | |
|             bytes = null;
 | |
|             return e.GetString(buf, 0, buf.Length);
 | |
| 
 | |
|         }
 | |
| 
 | |
|         static int GetInt(byte b)
 | |
|         {
 | |
|             char c = (char)b;
 | |
|             if (c >= '0' && c <= '9')
 | |
|                 return c - '0';
 | |
| 
 | |
|             if (c >= 'a' && c <= 'f')
 | |
|                 return c - 'a' + 10;
 | |
| 
 | |
|             if (c >= 'A' && c <= 'F')
 | |
|                 return c - 'A' + 10;
 | |
| 
 | |
|             return -1;
 | |
|         }
 | |
| 
 | |
|         static int GetChar(string str, int offset, int length)
 | |
|         {
 | |
|             int val = 0;
 | |
|             int end = length + offset;
 | |
|             for (int i = offset; i < end; i++)
 | |
|             {
 | |
|                 char c = str[i];
 | |
|                 if (c > 127)
 | |
|                     return -1;
 | |
| 
 | |
|                 int current = GetInt((byte)c);
 | |
|                 if (current == -1)
 | |
|                     return -1;
 | |
|                 val = (val << 4) + current;
 | |
|             }
 | |
| 
 | |
|             return val;
 | |
|         }
 | |
| 
 | |
|         static bool TryConvertKeyToEntity(string key, out char value)
 | |
|         {
 | |
|             var token = CalculateKeyValue(key);
 | |
|             if (token == 0)
 | |
|             {
 | |
|                 value = '\0';
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             var idx = Array.BinarySearch(entities, token);
 | |
|             if (idx < 0)
 | |
|             {
 | |
|                 value = '\0';
 | |
|                 return false;
 | |
|             }
 | |
| 
 | |
|             value = entities_values[idx];
 | |
|             return true;
 | |
|         }
 | |
| 
 | |
|         static long CalculateKeyValue(string s)
 | |
|         {
 | |
|             if (s.Length > 8)
 | |
|                 return 0;
 | |
| 
 | |
|             long key = 0;
 | |
|             for (int i = 0; i < s.Length; ++i)
 | |
|             {
 | |
|                 long ch = s[i];
 | |
|                 if (ch > 'z' || ch < '0')
 | |
|                     return 0;
 | |
| 
 | |
|                 key |= ch << ((7 - i) * 8);
 | |
|             }
 | |
| 
 | |
|             return key;
 | |
|         }
 | |
| 
 | |
|         /// <summary>
 | |
|         /// Decodes an HTML-encoded string and returns the decoded string.
 | |
|         /// </summary>
 | |
|         /// <param name="s">The HTML string to decode. </param>
 | |
|         /// <returns>The decoded text.</returns>
 | |
|         public static string HtmlDecode(string s)
 | |
|         {
 | |
|             if (s == null)
 | |
|                 throw new ArgumentNullException("s");
 | |
| 
 | |
|             if (s.IndexOf('&') == -1)
 | |
|                 return s;
 | |
| 
 | |
|             StringBuilder entity = new StringBuilder();
 | |
|             StringBuilder output = new StringBuilder();
 | |
|             int len = s.Length;
 | |
|             // 0 -> nothing,
 | |
|             // 1 -> right after '&'
 | |
|             // 2 -> between '&' and ';' but no '#'
 | |
|             // 3 -> '#' found after '&' and getting numbers
 | |
|             int state = 0;
 | |
|             int number = 0;
 | |
|             int digit_start = 0;
 | |
|             bool hex_number = false;
 | |
| 
 | |
|             for (int i = 0; i < len; i++)
 | |
|             {
 | |
|                 char c = s[i];
 | |
|                 if (state == 0)
 | |
|                 {
 | |
|                     if (c == '&')
 | |
|                     {
 | |
|                         entity.Append(c);
 | |
|                         state = 1;
 | |
|                     }
 | |
|                     else
 | |
|                     {
 | |
|                         output.Append(c);
 | |
|                     }
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 if (c == '&')
 | |
|                 {
 | |
|                     state = 1;
 | |
|                     if (digit_start > 0)
 | |
|                     {
 | |
|                         entity.Append(s, digit_start, i - digit_start);
 | |
|                         digit_start = 0;
 | |
|                     }
 | |
| 
 | |
|                     output.Append(entity.ToString());
 | |
|                     entity.Length = 0;
 | |
|                     entity.Append('&');
 | |
|                     continue;
 | |
|                 }
 | |
| 
 | |
|                 switch (state)
 | |
|                 {
 | |
|                     case 1:
 | |
|                         if (c == ';')
 | |
|                         {
 | |
|                             state = 0;
 | |
|                             output.Append(entity.ToString());
 | |
|                             output.Append(c);
 | |
|                             entity.Length = 0;
 | |
|                             break;
 | |
|                         }
 | |
| 
 | |
|                         number = 0;
 | |
|                         hex_number = false;
 | |
|                         if (c != '#')
 | |
|                         {
 | |
|                             state = 2;
 | |
|                         }
 | |
|                         else
 | |
|                         {
 | |
|                             state = 3;
 | |
|                         }
 | |
|                         entity.Append(c);
 | |
| 
 | |
|                         break;
 | |
|                     case 2:
 | |
|                         entity.Append(c);
 | |
|                         if (c == ';')
 | |
|                         {
 | |
|                             string key = entity.ToString();
 | |
|                             state = 0;
 | |
|                             entity.Length = 0;
 | |
| 
 | |
|                             if (key.Length > 1)
 | |
|                             {
 | |
|                                 var skey = key.Substring(1, key.Length - 2);
 | |
|                                 if (TryConvertKeyToEntity(skey, out c))
 | |
|                                 {
 | |
|                                     output.Append(c);
 | |
|                                     break;
 | |
|                                 }
 | |
|                             }
 | |
| 
 | |
|                             output.Append(key);
 | |
|                         }
 | |
| 
 | |
|                         break;
 | |
|                     case 3:
 | |
|                         if (c == ';')
 | |
|                         {
 | |
|                             if (number < 0x10000)
 | |
|                             {
 | |
|                                 output.Append((char)number);
 | |
|                             }
 | |
|                             else
 | |
|                             {
 | |
|                                 output.Append((char)(0xd800 + ((number - 0x10000) >> 10)));
 | |
|                                 output.Append((char)(0xdc00 + ((number - 0x10000) & 0x3ff)));
 | |
|                             }
 | |
|                             state = 0;
 | |
|                             entity.Length = 0;
 | |
|                             digit_start = 0;
 | |
|                             break;
 | |
|                         }
 | |
| 
 | |
|                         if (c == 'x' || c == 'X' && !hex_number)
 | |
|                         {
 | |
|                             digit_start = i;
 | |
|                             hex_number = true;
 | |
|                             break;
 | |
|                         }
 | |
| 
 | |
|                         if (Char.IsDigit(c))
 | |
|                         {
 | |
|                             if (digit_start == 0)
 | |
|                                 digit_start = i;
 | |
| 
 | |
|                             number = number * (hex_number ? 16 : 10) + ((int)c - '0');
 | |
|                             break;
 | |
|                         }
 | |
| 
 | |
|                         if (hex_number)
 | |
|                         {
 | |
|                             if (c >= 'a' && c <= 'f')
 | |
|                             {
 | |
|                                 number = number * 16 + 10 + ((int)c - 'a');
 | |
|                                 break;
 | |
|                             }
 | |
|                             if (c >= 'A' && c <= 'F')
 | |
|                             {
 | |
|                                 number = number * 16 + 10 + ((int)c - 'A');
 | |
|                                 break;
 | |
|                             }
 | |
|                         }
 | |
| 
 | |
|                         state = 2;
 | |
|                         if (digit_start > 0)
 | |
|                         {
 | |
|                             entity.Append(s, digit_start, i - digit_start);
 | |
|                             digit_start = 0;
 | |
|                         }
 | |
| 
 | |
|                         entity.Append(c);
 | |
|                         break;
 | |
|                 }
 | |
|             }
 | |
| 
 | |
|             if (entity.Length > 0)
 | |
|             {
 | |
|                 output.Append(entity);
 | |
|             }
 | |
|             else if (digit_start > 0)
 | |
|             {
 | |
|                 output.Append(s, digit_start, s.Length - digit_start);
 | |
|             }
 | |
|             return output.ToString();
 | |
|         }
 | |
| 
 | |
|         public static QueryParamCollection ParseQueryString(string query)
 | |
|         {
 | |
|             return ParseQueryString(query, Encoding.UTF8);
 | |
|         }
 | |
| 
 | |
|         public static QueryParamCollection ParseQueryString(string query, Encoding encoding)
 | |
|         {
 | |
|             if (query == null)
 | |
|                 throw new ArgumentNullException("query");
 | |
|             if (encoding == null)
 | |
|                 throw new ArgumentNullException("encoding");
 | |
|             if (query.Length == 0 || (query.Length == 1 && query[0] == '?'))
 | |
|                 return new QueryParamCollection();
 | |
|             if (query[0] == '?')
 | |
|                 query = query.Substring(1);
 | |
| 
 | |
|             QueryParamCollection result = new QueryParamCollection();
 | |
|             ParseQueryString(query, encoding, result);
 | |
|             return result;
 | |
|         }
 | |
| 
 | |
|         internal static void ParseQueryString(string query, Encoding encoding, QueryParamCollection result)
 | |
|         {
 | |
|             if (query.Length == 0)
 | |
|                 return;
 | |
| 
 | |
|             string decoded = HtmlDecode(query);
 | |
|             int decodedLength = decoded.Length;
 | |
|             int namePos = 0;
 | |
|             bool first = true;
 | |
|             while (namePos <= decodedLength)
 | |
|             {
 | |
|                 int valuePos = -1, valueEnd = -1;
 | |
|                 for (int q = namePos; q < decodedLength; q++)
 | |
|                 {
 | |
|                     if (valuePos == -1 && decoded[q] == '=')
 | |
|                     {
 | |
|                         valuePos = q + 1;
 | |
|                     }
 | |
|                     else if (decoded[q] == '&')
 | |
|                     {
 | |
|                         valueEnd = q;
 | |
|                         break;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 if (first)
 | |
|                 {
 | |
|                     first = false;
 | |
|                     if (decoded[namePos] == '?')
 | |
|                         namePos++;
 | |
|                 }
 | |
| 
 | |
|                 string name, value;
 | |
|                 if (valuePos == -1)
 | |
|                 {
 | |
|                     name = null;
 | |
|                     valuePos = namePos;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     name = UrlDecode(decoded.Substring(namePos, valuePos - namePos - 1), encoding);
 | |
|                 }
 | |
|                 if (valueEnd < 0)
 | |
|                 {
 | |
|                     namePos = -1;
 | |
|                     valueEnd = decoded.Length;
 | |
|                 }
 | |
|                 else
 | |
|                 {
 | |
|                     namePos = valueEnd + 1;
 | |
|                 }
 | |
|                 value = UrlDecode(decoded.Substring(valuePos, valueEnd - valuePos), encoding);
 | |
| 
 | |
|                 result.Add(name, value);
 | |
|                 if (namePos == -1)
 | |
|                     break;
 | |
|             }
 | |
|         }
 | |
|         #endregion // Methods
 | |
|     }
 | |
| }
 |