Pārlūkot izejas kodu

Implementation of custom endpoint IKnownEndpoint, which does not need to be HTTP for #1

Scrublord1336 6 gadi atpakaļ
vecāks
revīzija
ecb72e604d

+ 33 - 7
src/XUnity.AutoTranslator.Plugin.Core/AutoTranslationPlugin.cs

@@ -77,6 +77,8 @@ namespace XUnity.AutoTranslator.Plugin.Core
       /// </summary>
       private Func<string, bool> _symbolCheck;
 
+      private IKnownEndpoint _endpoint;
+
       private int[] _currentTranslationsQueuedPerSecondRollingWindow = new int[ Settings.TranslationQueueWatchWindow ];
       private float? _timeExceededThreshold;
 
@@ -91,7 +93,14 @@ namespace XUnity.AutoTranslator.Plugin.Core
 
          HooksSetup.InstallHooks( Override_TextChanged );
 
-         AutoTranslateClient.Configure();
+         try
+         {
+            _endpoint = KnownEndpoints.FindEndpoint( Settings.ServiceEndpoint );
+         }
+         catch( Exception e )
+         {
+            Console.WriteLine( "[XUnity.AutoTranslator][ERROR]: An unexpected error occurred during initialization of endpoint." + Environment.NewLine + e );
+         }
 
          _symbolCheck = TextHelper.GetSymbolCheck( Settings.FromLanguage );
 
@@ -571,7 +580,7 @@ namespace XUnity.AutoTranslator.Plugin.Core
                                  else
                                  {
                                     // Lets try not to spam a service that might not be there...
-                                    if( AutoTranslateClient.IsConfigured )
+                                    if( _endpoint != null )
                                     {
                                        if( _consecutiveErrors < Settings.MaxErrors && !Settings.IsShutdown )
                                        {
@@ -602,7 +611,7 @@ namespace XUnity.AutoTranslator.Plugin.Core
                      QueueNewUntranslatedForClipboard( textKey );
 
                      // Lets try not to spam a service that might not be there...
-                     if( AutoTranslateClient.IsConfigured )
+                     if( _endpoint != null )
                      {
                         if( _consecutiveErrors < Settings.MaxErrors && !Settings.IsShutdown )
                         {
@@ -665,7 +674,11 @@ namespace XUnity.AutoTranslator.Plugin.Core
       {
          try
          {
-            UnityWebClient.CleanupDefault();
+            if( _endpoint != null )
+            {
+               _endpoint.OnUpdate();
+            }
+
             CopyToClipboard();
 
             if( !Settings.IsShutdown )
@@ -706,9 +719,11 @@ namespace XUnity.AutoTranslator.Plugin.Core
 
       private void KickoffTranslations()
       {
+         if( _endpoint == null ) return;
+
          foreach( var kvp in _unstartedJobs )
          {
-            if( !AutoTranslateClient.HasAvailableClients ) break;
+            if( _endpoint.IsBusy ) break;
 
             var key = kvp.Key;
             var job = kvp.Value;
@@ -717,8 +732,19 @@ namespace XUnity.AutoTranslator.Plugin.Core
             // lets see if the text should still be translated before kicking anything off
             if( !job.AnyComponentsStillHasOriginalUntranslatedText() ) continue;
 
-            StartCoroutine( AutoTranslateClient.TranslateByWWW( job.Keys.GetDictionaryLookupKey(), Settings.FromLanguage, Settings.Language, translatedText =>
+            StartCoroutine( _endpoint.Translate( job.Keys.GetDictionaryLookupKey(), Settings.FromLanguage, Settings.Language, translatedText =>
             {
+               Settings.TranslationCount++;
+
+               if( !Settings.IsShutdown )
+               {
+                  if( Settings.TranslationCount > Settings.MaxTranslationsBeforeShutdown )
+                  {
+                     Settings.IsShutdown = true;
+                     Console.WriteLine( $"[XUnity.AutoTranslator][ERROR]: Maximum translations ({Settings.MaxTranslationsBeforeShutdown}) per session reached. Shutting plugin down." );
+                  }
+               }
+
                _consecutiveErrors = 0;
 
                if( Settings.ForceSplitTextAfterCharacters > 0 )
@@ -743,7 +769,7 @@ namespace XUnity.AutoTranslator.Plugin.Core
                {
                   if( _consecutiveErrors > Settings.MaxErrors )
                   {
-                     if( AutoTranslateClient.Fallback() )
+                     if( _endpoint.ShouldGetSecondChanceAfterFailure() )
                      {
                         Console.WriteLine( $"[XUnity.AutoTranslator][WARN]: More than {Settings.MaxErrors} consecutive errors occurred. Entering fallback mode." );
                         _consecutiveErrors = 0;

+ 1 - 0
src/XUnity.AutoTranslator.Plugin.Core/Configuration/Settings.cs

@@ -16,6 +16,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Configuration
       public static readonly int MaxUnstartedJobs = 3500;
 
       public static bool IsShutdown = false;
+      public static int TranslationCount = 0;
 
       public static readonly float MaxTranslationsQueuedPerSecond = 5;
       public static readonly int MaxSecondsAboveTranslationThreshold = 30;

+ 0 - 130
src/XUnity.AutoTranslator.Plugin.Core/Web/AutoTranslateClient.cs

@@ -1,130 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.IO;
-using System.Linq;
-using System.Net;
-using System.Reflection;
-using System.Text;
-using System.Threading;
-using Harmony;
-using UnityEngine.Networking;
-using XUnity.AutoTranslator.Plugin.Core.Configuration;
-using XUnity.AutoTranslator.Plugin.Core.Constants;
-
-namespace XUnity.AutoTranslator.Plugin.Core.Web
-{
-   public static class AutoTranslateClient
-   {
-      public static KnownEndpoint Endpoint;
-      private static int _runningTranslations = 0;
-      private static int _translationCount;
-      private static int _maxConcurrency;
-      private static bool _isSettingUp = false;
-
-      public static void Configure()
-      {
-         Endpoint = KnownEndpoints.FindEndpoint( Settings.ServiceEndpoint );
-         _maxConcurrency = 1; // WebClient does not support concurrency
-
-         if( Endpoint != null )
-         {
-            Endpoint.ConfigureServicePointManager();
-         }
-      }
-
-      public static bool IsConfigured
-      {
-         get
-         {
-            return Endpoint != null;
-         }
-      }
-
-      public static bool HasAvailableClients => !_isSettingUp && _runningTranslations < _maxConcurrency;
-
-      public static bool Fallback()
-      {
-         return Endpoint.Fallback();
-      }
-
-      public static IEnumerator TranslateByWWW( string untranslated, string from, string to, Action<string> success, Action failure )
-      {
-         UnityWebClient.TouchedDefault();
-
-         try
-         {
-            _isSettingUp = true;
-
-            var setup = Endpoint.Setup( _translationCount );
-            if( setup != null )
-            {
-               while( setup.MoveNext() )
-               {
-                  yield return setup.Current;
-               }
-            }
-         }
-         finally
-         {
-            _isSettingUp = false;
-         }
-
-         var url = Endpoint.GetServiceUrl( untranslated, from, to );
-         Endpoint.ApplyHeaders( UnityWebClient.Default.Headers );
-         var result = UnityWebClient.Default.GetDownloadResult( new Uri( url ) );
-         try
-         {
-            _runningTranslations++;
-            yield return result;
-            _runningTranslations--;
-
-            _translationCount++;
-
-            //if( !Settings.IsSlowdown )
-            //{
-            //   if( _translationCount > Settings.MaxTranslationsBeforeSlowdown )
-            //   {
-            //      Settings.IsSlowdown = true;
-            //      _maxConcurrency = 1;
-
-            //      Console.WriteLine( "[XUnity.AutoTranslator][WARN]: Maximum translations per session reached. Entering slowdown mode." );
-            //   }
-            //}
-
-            if( !Settings.IsShutdown )
-            {
-               if( _translationCount > Settings.MaxTranslationsBeforeShutdown )
-               {
-                  Settings.IsShutdown = true;
-                  Console.WriteLine( $"[XUnity.AutoTranslator][ERROR]: Maximum translations ({Settings.MaxTranslationsBeforeShutdown}) per session reached. Shutting plugin down." );
-               }
-            }
-
-
-            if( result.Succeeded )
-            {
-               if( Endpoint.TryExtractTranslated( result.Result, out var translatedText ) )
-               {
-                  translatedText = translatedText ?? string.Empty;
-                  success( translatedText );
-               }
-               else
-               {
-                  Console.WriteLine( "[XUnity.AutoTranslator][ERROR]: Error occurred while extracting translation." );
-                  failure();
-               }
-            }
-            else
-            {
-               Console.WriteLine( "[XUnity.AutoTranslator][ERROR]: Error occurred while retrieving translation." + Environment.NewLine + result.Error );
-               failure();
-            }
-         }
-         finally
-         {
-            UnityWebClient.TouchedDefault();
-         }
-      }
-   }
-}

+ 2 - 14
src/XUnity.AutoTranslator.Plugin.Core/Web/BaiduTranslateEndpoint.cs

@@ -12,16 +12,15 @@ using XUnity.AutoTranslator.Plugin.Core.Extensions;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
-   public class BaiduTranslateEndpoint : KnownEndpoint
+   public class BaiduTranslateEndpoint : KnownHttpEndpoint
    {
       private static readonly string HttpServicePointTemplateUrl = "http://api.fanyi.baidu.com/api/trans/vip/translate?q={0}&from={1}&to={2}&appid={3}&salt={4}&sign={5}";
 
       private static readonly MD5 HashMD5 = MD5.Create();
 
       public BaiduTranslateEndpoint()
-         : base( KnownEndpointNames.GoogleTranslate )
       {
-
+         ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "api.fanyi.baidu.com" );
       }
 
       private static string CreateMD5( string input )
@@ -37,23 +36,12 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          return sb.ToString().ToLower();
       }
 
-      public override void ApplyHeaders( Dictionary<string, string> headers )
-      {
-         headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
-         headers[ "Accept-Charset" ] = "UTF-8";
-      }
-
       public override void ApplyHeaders( WebHeaderCollection headers )
       {
          headers[ HttpRequestHeader.UserAgent ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
          headers[ HttpRequestHeader.AcceptCharset ] = "UTF-8";
       }
 
-      public override void ConfigureServicePointManager()
-      {
-         ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "api.fanyi.baidu.com" );
-      }
-
       public override bool TryExtractTranslated( string result, out string translated )
       {
          try

+ 5 - 12
src/XUnity.AutoTranslator.Plugin.Core/Web/DefaultEndpoint.cs

@@ -6,28 +6,21 @@ using XUnity.AutoTranslator.Plugin.Core.Configuration;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
-   public class DefaultEndpoint : KnownEndpoint
+   public class DefaultEndpoint : KnownHttpEndpoint
    {
-      private static ServicePoint ServicePoint;
       private static readonly string ServicePointTemplateUrl = "{0}?from={1}&to={2}&text={3}";
+      private string _endpoint;
 
       public DefaultEndpoint( string endpoint )
-         : base( endpoint )
-      {
-      }
-
-      public override void ApplyHeaders( Dictionary<string, string> headers )
       {
+         _endpoint = endpoint;
+         ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( new Uri( _endpoint ).Host );
       }
 
       public override void ApplyHeaders( WebHeaderCollection headers )
       {
       }
 
-      public override void ConfigureServicePointManager()
-      {
-      }
-
       public override bool TryExtractTranslated( string result, out string translated )
       {
          translated = result;
@@ -36,7 +29,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 
       public override string GetServiceUrl( string untranslatedText, string from, string to )
       {
-         return string.Format( ServicePointTemplateUrl, Identifier, from, to, WWW.EscapeURL( untranslatedText ) );
+         return string.Format( ServicePointTemplateUrl, _endpoint, from, to, WWW.EscapeURL( untranslatedText ) );
       }
    }
 }

+ 7 - 17
src/XUnity.AutoTranslator.Plugin.Core/Web/GoogleTranslateEndpoint.cs

@@ -16,7 +16,7 @@ using XUnity.AutoTranslator.Plugin.Core.Extensions;
 
 namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
-   public class GoogleTranslateEndpoint : KnownEndpoint
+   public class GoogleTranslateEndpoint : KnownHttpEndpoint
    {
       private static readonly string HttpsServicePointTemplateUrl = "https://translate.googleapis.com/translate_a/single?client=t&dt=t&sl={0}&tl={1}&ie=UTF-8&oe=UTF-8&tk={2}&q={3}";
       private static readonly string FallbackHttpsServicePointTemplateUrl = "https://translate.googleapis.com/translate_a/single?client=gtx&sl={0}&tl={1}&dt=t&q={2}";
@@ -29,15 +29,9 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
       private long s = 1953544246;
 
       public GoogleTranslateEndpoint()
-         : base( KnownEndpointNames.GoogleTranslate )
       {
          _cookieContainer = new CookieContainer();
-      }
-
-      public override void ApplyHeaders( Dictionary<string, string> headers )
-      {
-         headers[ "User-Agent" ] = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36";
-         headers[ "Accept" ] = "*/*";
+         ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "translate.google.com", "translate.googleapis.com" );
       }
 
       public override void ApplyHeaders( WebHeaderCollection headers )
@@ -46,7 +40,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          headers[ HttpRequestHeader.Accept ] = "*/*";
       }
 
-      public override IEnumerator Setup( int translationCount )
+      public override IEnumerator OnBeforeTranslate( int translationCount )
       {
          if( !_hasSetup || translationCount % 100 == 0 )
          {
@@ -69,10 +63,11 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 
          _cookieContainer = new CookieContainer();
 
+         var client = GetClient();
          try
          {
-            ApplyHeaders( UnityWebClient.Default.Headers );
-            downloadResult = UnityWebClient.Default.GetDownloadResult( new Uri( HttpsTranslateUserSite ) );
+            ApplyHeaders( client.Headers );
+            downloadResult = client.GetDownloadResult( new Uri( HttpsTranslateUserSite ) );
          }
          catch( Exception e )
          {
@@ -184,11 +179,6 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          return p.ToString( CultureInfo.InvariantCulture ) + "." + ( p ^ m ).ToString( CultureInfo.InvariantCulture );
       }
 
-      public override void ConfigureServicePointManager()
-      {
-         ServicePointManager.ServerCertificateValidationCallback += Security.AlwaysAllowByHosts( "translate.google.com", "translate.googleapis.com" );
-      }
-
       public override bool TryExtractTranslated( string result, out string translated )
       {
          try
@@ -228,7 +218,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          }
       }
 
-      public override bool Fallback()
+      public override bool ShouldGetSecondChanceAfterFailure()
       {
          if( !_hasFallenBack )
          {

+ 34 - 0
src/XUnity.AutoTranslator.Plugin.Core/Web/IKnownEndpoint.cs

@@ -0,0 +1,34 @@
+using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using System.Text;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Web
+{
+   public interface IKnownEndpoint
+   {
+      /// <summary>
+      /// Attempt to translated the provided untranslated text. Will be used in a "coroutine", so it can be implemented
+      /// in an async fashion.
+      /// </summary>
+      IEnumerator Translate( string untranslatedText, string from, string to, Action<string> success, Action failure );
+      
+      /// <summary>
+      /// Gets a boolean indicating if we are allowed to call "Translate".
+      /// </summary>
+      bool IsBusy { get; }
+
+      /// <summary>
+      /// Called before plugin shutdown and can return true to prevent plugin shutdown, if the plugin
+      /// can provide a secondary strategy for translation.
+      /// </summary>
+      /// <returns></returns>
+      bool ShouldGetSecondChanceAfterFailure();
+
+      /// <summary>
+      /// "Update" game loop method.
+      /// </summary>
+      void OnUpdate();
+   }
+}

+ 0 - 49
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownEndpoint.cs

@@ -1,49 +0,0 @@
-using System;
-using System.Collections;
-using System.Collections.Generic;
-using System.Linq;
-using System.Net;
-using System.Text;
-
-namespace XUnity.AutoTranslator.Plugin.Core.Web
-{
-   public abstract class KnownEndpoint
-   {
-      public KnownEndpoint( string identifier )
-      {
-         Identifier = identifier;
-      }
-
-      public string Identifier { get; }
-
-      public abstract void ConfigureServicePointManager();
-
-      public abstract string GetServiceUrl( string untranslatedText, string from, string to );
-
-      public abstract void ApplyHeaders( Dictionary<string, string> headers );
-
-      public abstract void ApplyHeaders( WebHeaderCollection headers );
-
-      public abstract bool TryExtractTranslated( string result, out string translated );
-
-      public virtual void WriteCookies( HttpWebResponse response )
-      {
-
-      }
-
-      public virtual CookieContainer ReadCookies()
-      {
-         return null;
-      }
-
-      public virtual bool Fallback()
-      {
-         return false;
-      }
-
-      public virtual IEnumerator Setup( int translationCount )
-      {
-         return null;
-      }
-   }
-}

+ 3 - 3
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownEndpoints.cs

@@ -8,10 +8,10 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
    public static class KnownEndpoints
    {
-      public static readonly KnownEndpoint GoogleTranslate = new GoogleTranslateEndpoint();
-      public static readonly KnownEndpoint BaiduTranslate = new BaiduTranslateEndpoint();
+      public static readonly KnownHttpEndpoint GoogleTranslate = new GoogleTranslateEndpoint();
+      public static readonly KnownHttpEndpoint BaiduTranslate = new BaiduTranslateEndpoint();
 
-      public static KnownEndpoint FindEndpoint( string identifier )
+      public static KnownHttpEndpoint FindEndpoint( string identifier )
       {
          if( string.IsNullOrEmpty( identifier ) ) return null;
 

+ 127 - 0
src/XUnity.AutoTranslator.Plugin.Core/Web/KnownHttpEndpoint.cs

@@ -0,0 +1,127 @@
+using System;
+using System.Collections;
+using System.Net;
+using XUnity.AutoTranslator.Plugin.Core.Configuration;
+
+namespace XUnity.AutoTranslator.Plugin.Core.Web
+{
+   public abstract class KnownHttpEndpoint : IKnownEndpoint
+   {
+      private static readonly TimeSpan MaxUnusedLifespan = TimeSpan.FromSeconds( 20 );
+
+      private static int _runningTranslations = 0;
+      private static int _maxConcurrency = 1;
+      private static bool _isSettingUp = false;
+      private UnityWebClient _client;
+      private DateTime _clientLastUse = DateTime.UtcNow;
+
+      public KnownHttpEndpoint()
+      {
+      }
+
+      public bool IsBusy => _isSettingUp || _runningTranslations >= _maxConcurrency;
+
+      public IEnumerator Translate( string untranslatedText, string from, string to, Action<string> success, Action failure )
+      {
+         _clientLastUse = DateTime.UtcNow;
+
+         try
+         {
+            _isSettingUp = true;
+
+            var setup = OnBeforeTranslate( Settings.TranslationCount );
+            if( setup != null )
+            {
+               while( setup.MoveNext() )
+               {
+                  yield return setup.Current;
+               }
+            }
+         }
+         finally
+         {
+            _isSettingUp = false;
+         }
+
+         var client = GetClient();
+         var url = GetServiceUrl( untranslatedText, from, to );
+         ApplyHeaders( client.Headers );
+         var result = client.GetDownloadResult( new Uri( url ) );
+         try
+         {
+            _runningTranslations++;
+            yield return result;
+            _runningTranslations--;
+
+            if( result.Succeeded )
+            {
+               if( TryExtractTranslated( result.Result, out var translatedText ) )
+               {
+                  translatedText = translatedText ?? string.Empty;
+                  success( translatedText );
+               }
+               else
+               {
+                  Console.WriteLine( "[XUnity.AutoTranslator][ERROR]: Error occurred while extracting translation." );
+                  failure();
+               }
+            }
+            else
+            {
+               Console.WriteLine( "[XUnity.AutoTranslator][ERROR]: Error occurred while retrieving translation." + Environment.NewLine + result.Error );
+               failure();
+            }
+         }
+         finally
+         {
+            _clientLastUse = DateTime.UtcNow;
+         }
+      }
+
+      public virtual void OnUpdate()
+      {
+         var client = _client;
+         if( client != null && DateTime.UtcNow - _clientLastUse > MaxUnusedLifespan )
+         {
+            _client = null;
+            client.Dispose();
+         }
+      }
+
+      public virtual bool ShouldGetSecondChanceAfterFailure()
+      {
+         return false;
+      }
+
+      public abstract string GetServiceUrl( string untranslatedText, string from, string to );
+
+      public abstract void ApplyHeaders( WebHeaderCollection headers );
+
+      public abstract bool TryExtractTranslated( string result, out string translated );
+
+      public virtual void WriteCookies( HttpWebResponse response )
+      {
+
+      }
+
+      public virtual CookieContainer ReadCookies()
+      {
+         return null;
+      }
+
+      public virtual IEnumerator OnBeforeTranslate( int translationCount )
+      {
+         return null;
+      }
+
+      public UnityWebClient GetClient()
+      {
+         if( _client == null )
+         {
+            _client = new UnityWebClient( this );
+            _clientLastUse = DateTime.UtcNow;
+         }
+         return _client;
+      }
+   }
+}

+ 5 - 35
src/XUnity.AutoTranslator.Plugin.Core/Web/UnityWebClient.cs

@@ -14,41 +14,11 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
 {
    public class UnityWebClient : WebClient
    {
-      private static readonly TimeSpan MaxUnusedLifespan = TimeSpan.FromSeconds( 20 );
+      private KnownHttpEndpoint _httpEndpoint;
 
-      private static DateTime _defaultLastUse = DateTime.UtcNow;
-      private static UnityWebClient _default;
-
-      public static UnityWebClient Default
-      {
-         get
-         {
-            if( _default == null )
-            {
-               _default = new UnityWebClient();
-               TouchedDefault();
-            }
-            return _default;
-         }
-      }
-
-      public static void TouchedDefault()
-      {
-         _defaultLastUse = DateTime.UtcNow;
-      }
-
-      public static void CleanupDefault()
-      {
-         var client = _default;
-         if( client != null && DateTime.UtcNow - _defaultLastUse > MaxUnusedLifespan )
-         {
-            _default = null;
-            client.Dispose();
-         }
-      }
-
-      public UnityWebClient()
+      public UnityWebClient( KnownHttpEndpoint endpoint )
       {
+         _httpEndpoint = endpoint;
          Encoding = Encoding.UTF8;
          DownloadStringCompleted += UnityWebClient_DownloadStringCompleted;
       }
@@ -86,7 +56,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          var httpRequest = request as HttpWebRequest;
          if( httpRequest != null )
          {
-            var cookies = AutoTranslateClient.Endpoint.ReadCookies();
+            var cookies = _httpEndpoint.ReadCookies();
             httpRequest.CookieContainer = cookies;
          }
          return request;
@@ -111,7 +81,7 @@ namespace XUnity.AutoTranslator.Plugin.Core.Web
          var response = r as HttpWebResponse;
          if( response != null )
          {
-            AutoTranslateClient.Endpoint.WriteCookies( response );
+            _httpEndpoint.WriteCookies( response );
          }
       }