diff --git a/Titanium.Web.Proxy/Helpers/HttpWriter.cs b/Titanium.Web.Proxy/Helpers/HttpWriter.cs index 9b1142a62..4b7f68b3e 100644 --- a/Titanium.Web.Proxy/Helpers/HttpWriter.cs +++ b/Titanium.Web.Proxy/Helpers/HttpWriter.cs @@ -16,7 +16,7 @@ internal class HttpWriter : ICustomStreamWriter private readonly Stream stream; private readonly IBufferPool bufferPool; - private static readonly byte[] newLine = ProxyConstants.NewLine; + private static readonly byte[] newLine = ProxyConstants.NewLineBytes; private static readonly Encoder encoder = Encoding.ASCII.GetEncoder(); @@ -109,9 +109,9 @@ internal async Task WriteHeadersAsync(HeaderCollection headers, bool flush = tru var headerBuilder = new StringBuilder(); foreach (var header in headers) { - headerBuilder.AppendLine(header.ToString()); + headerBuilder.Append($"{header.ToString()}{ProxyConstants.NewLine}"); } - headerBuilder.AppendLine(); + headerBuilder.Append(ProxyConstants.NewLine); await WriteAsync(headerBuilder.ToString(), cancellationToken); diff --git a/Titanium.Web.Proxy/Http/HttpWebClient.cs b/Titanium.Web.Proxy/Http/HttpWebClient.cs index 1247499b1..ab39d3bc4 100644 --- a/Titanium.Web.Proxy/Http/HttpWebClient.cs +++ b/Titanium.Web.Proxy/Http/HttpWebClient.cs @@ -8,6 +8,7 @@ using Titanium.Web.Proxy.Extensions; using Titanium.Web.Proxy.Models; using Titanium.Web.Proxy.Network.Tcp; +using Titanium.Web.Proxy.Shared; namespace Titanium.Web.Proxy.Http { @@ -16,7 +17,6 @@ namespace Titanium.Web.Proxy.Http /// public class HttpWebClient { - internal HttpWebClient(Request request = null, Response response = null) { Request = request ?? new Request(); @@ -103,14 +103,15 @@ await writer.WriteLineAsync(Request.CreateRequestLine(Request.Method, Request.HttpVersion), cancellationToken); var headerBuilder = new StringBuilder(); + // Send Authentication to Upstream proxy if needed if (!isTransparent && upstreamProxy != null && ServerConnection.IsHttps == false && !string.IsNullOrEmpty(upstreamProxy.UserName) && upstreamProxy.Password != null) { - headerBuilder.AppendLine(HttpHeader.ProxyConnectionKeepAlive.ToString()); - headerBuilder.AppendLine(HttpHeader.GetProxyAuthorizationHeader(upstreamProxy.UserName, upstreamProxy.Password).ToString()); + headerBuilder.Append($"{HttpHeader.ProxyConnectionKeepAlive}{ProxyConstants.NewLine}"); + headerBuilder.Append($"{HttpHeader.GetProxyAuthorizationHeader(upstreamProxy.UserName, upstreamProxy.Password)}{ProxyConstants.NewLine}"); } // write request headers @@ -118,11 +119,12 @@ await writer.WriteLineAsync(Request.CreateRequestLine(Request.Method, { if (isTransparent || header.Name != KnownHeaders.ProxyAuthorization) { - headerBuilder.AppendLine(header.ToString()); + headerBuilder.Append($"{header}{ProxyConstants.NewLine}"); } } - headerBuilder.AppendLine(); + headerBuilder.Append(ProxyConstants.NewLine); + await writer.WriteAsync(headerBuilder.ToString(), cancellationToken); if (enable100ContinueBehaviour) diff --git a/Titanium.Web.Proxy/Http/Request.cs b/Titanium.Web.Proxy/Http/Request.cs index 4aac30be9..28e4c1391 100644 --- a/Titanium.Web.Proxy/Http/Request.cs +++ b/Titanium.Web.Proxy/Http/Request.cs @@ -140,13 +140,13 @@ public override string HeaderText get { var sb = new StringBuilder(); - sb.AppendLine(CreateRequestLine(Method, OriginalUrl, HttpVersion)); + sb.Append($"{CreateRequestLine(Method, OriginalUrl, HttpVersion)}{ProxyConstants.NewLine}"); foreach (var header in Headers) { - sb.AppendLine(header.ToString()); + sb.Append($"{header.ToString()}{ProxyConstants.NewLine}"); } - sb.AppendLine(); + sb.Append(ProxyConstants.NewLine); return sb.ToString(); } } diff --git a/Titanium.Web.Proxy/Http/Response.cs b/Titanium.Web.Proxy/Http/Response.cs index 9c02f664d..9f2e175e4 100644 --- a/Titanium.Web.Proxy/Http/Response.cs +++ b/Titanium.Web.Proxy/Http/Response.cs @@ -110,13 +110,13 @@ public override string HeaderText get { var sb = new StringBuilder(); - sb.AppendLine(CreateResponseLine(HttpVersion, StatusCode, StatusDescription)); + sb.Append($"{CreateResponseLine(HttpVersion, StatusCode, StatusDescription)}{ProxyConstants.NewLine}"); foreach (var header in Headers) { - sb.AppendLine(header.ToString()); + sb.Append($"{header.ToString()}{ProxyConstants.NewLine}"); } - sb.AppendLine(); + sb.Append(ProxyConstants.NewLine); return sb.ToString(); } } @@ -145,7 +145,7 @@ internal static void ParseResponseLine(string httpStatus, out Version version, o out string statusDescription) { var httpResult = httpStatus.Split(ProxyConstants.SpaceSplit, 3); - if (httpResult.Length != 3) + if (httpResult.Length <= 1) { throw new Exception("Invalid HTTP status line: " + httpStatus); } @@ -159,7 +159,7 @@ internal static void ParseResponseLine(string httpStatus, out Version version, o } statusCode = int.Parse(httpResult[1]); - statusDescription = httpResult[2]; + statusDescription = httpResult.Length > 2 ? httpResult[2] : string.Empty; } } } diff --git a/Titanium.Web.Proxy/Network/Certificate/WinCertificateMaker.cs b/Titanium.Web.Proxy/Network/Certificate/WinCertificateMaker.cs index 847b2fb00..39827ed70 100644 --- a/Titanium.Web.Proxy/Network/Certificate/WinCertificateMaker.cs +++ b/Titanium.Web.Proxy/Network/Certificate/WinCertificateMaker.cs @@ -52,6 +52,7 @@ internal class WinCertificateMaker : ICertificateMaker internal WinCertificateMaker(ExceptionHandler exceptionFunc) { this.exceptionFunc = exceptionFunc; + typeX500DN = Type.GetTypeFromProgID("X509Enrollment.CX500DistinguishedName", true); typeX509PrivateKey = Type.GetTypeFromProgID("X509Enrollment.CX509PrivateKey", true); typeOID = Type.GetTypeFromProgID("X509Enrollment.CObjectId", true); @@ -74,13 +75,41 @@ internal WinCertificateMaker(ExceptionHandler exceptionFunc) /// /// Make certificate. /// - /// - /// - /// - /// public X509Certificate2 MakeCertificate(string sSubjectCN, bool isRoot, X509Certificate2 signingCert = null) { - return makeCertificateInternal(sSubjectCN, isRoot, true, signingCert); + return makeCertificate(sSubjectCN, isRoot, true, signingCert); + } + + private X509Certificate2 makeCertificate(string sSubjectCN, bool isRoot, + bool switchToMTAIfNeeded, X509Certificate2 signingCert = null, + CancellationToken cancellationToken = default) + { + if (switchToMTAIfNeeded && Thread.CurrentThread.GetApartmentState() != ApartmentState.MTA) + { + return Task.Run(() => makeCertificate(sSubjectCN, isRoot, false, signingCert), + cancellationToken).Result; + } + + // Subject + string fullSubject = $"CN={sSubjectCN}"; + + // Sig Algo + const string hashAlgo = "SHA256"; + + // Grace Days + const int graceDays = -366; + + // ValiDays + const int validDays = 1825; + + // KeyLength + const int keyLength = 2048; + + var graceTime = DateTime.Now.AddDays(graceDays); + var now = DateTime.Now; + var certificate = makeCertificate(isRoot, sSubjectCN, fullSubject, keyLength, hashAlgo, graceTime, + now.AddDays(validDays), isRoot ? null : signingCert); + return certificate; } private X509Certificate2 makeCertificate(bool isRoot, string subject, string fullSubject, @@ -271,39 +300,9 @@ private X509Certificate2 makeCertificate(bool isRoot, string subject, string ful string empty = (string)typeX509Enrollment.InvokeMember("CreatePFX", BindingFlags.InvokeMethod, null, x509Enrollment, typeValue); + return new X509Certificate2(Convert.FromBase64String(empty), string.Empty, X509KeyStorageFlags.Exportable); } - private X509Certificate2 makeCertificateInternal(string sSubjectCN, bool isRoot, - bool switchToMTAIfNeeded, X509Certificate2 signingCert = null, - CancellationToken cancellationToken = default) - { - if (switchToMTAIfNeeded && Thread.CurrentThread.GetApartmentState() != ApartmentState.MTA) - { - return Task.Run(() => makeCertificateInternal(sSubjectCN, isRoot, false, signingCert), - cancellationToken).Result; - } - - // Subject - string fullSubject = $"CN={sSubjectCN}"; - - // Sig Algo - const string hashAlgo = "SHA256"; - - // Grace Days - const int graceDays = -366; - - // ValiDays - const int validDays = 1825; - - // KeyLength - const int keyLength = 2048; - - var graceTime = DateTime.Now.AddDays(graceDays); - var now = DateTime.Now; - var certificate = makeCertificate(isRoot, sSubjectCN, fullSubject, keyLength, hashAlgo, graceTime, - now.AddDays(validDays), isRoot ? null : signingCert); - return certificate; - } } } diff --git a/Titanium.Web.Proxy/Network/CertificateManager.cs b/Titanium.Web.Proxy/Network/CertificateManager.cs index 4a4c69865..4fad840a2 100644 --- a/Titanium.Web.Proxy/Network/CertificateManager.cs +++ b/Titanium.Web.Proxy/Network/CertificateManager.cs @@ -25,7 +25,8 @@ public enum CertificateEngine BouncyCastle = 0, /// - /// Uses Windows Certification Generation API. + /// Uses Windows Certification Generation API and only valid in Windows OS. + /// Observed to be faster than BouncyCastle. /// Bug #468 Reported. /// DefaultWindows = 1 diff --git a/Titanium.Web.Proxy/RequestHandler.cs b/Titanium.Web.Proxy/RequestHandler.cs index 4657a8039..c73939635 100644 --- a/Titanium.Web.Proxy/RequestHandler.cs +++ b/Titanium.Web.Proxy/RequestHandler.cs @@ -16,6 +16,7 @@ using Titanium.Web.Proxy.Http; using Titanium.Web.Proxy.Models; using Titanium.Web.Proxy.Network.Tcp; +using Titanium.Web.Proxy.Shared; namespace Titanium.Web.Proxy { @@ -24,15 +25,6 @@ namespace Titanium.Web.Proxy /// public partial class ProxyServer { - private static readonly Regex uriSchemeRegex = - new Regex("^[a-z]*://", RegexOptions.IgnoreCase | RegexOptions.Compiled); - - private static readonly HashSet proxySupportedCompressions = - new HashSet(StringComparer.OrdinalIgnoreCase) - { - "gzip", - "deflate" - }; private bool isWindowsAuthenticationEnabledAndSupported => EnableWinAuth && RunTime.IsWindows && !RunTime.IsRunningOnMono; @@ -96,7 +88,7 @@ await HeaderParser.ReadHeaders(clientStream, args.WebSession.Request.Headers, cancellationToken); Uri httpRemoteUri; - if (uriSchemeRegex.IsMatch(httpUrl)) + if (ProxyConstants.UriSchemeRegex.IsMatch(httpUrl)) { try { @@ -228,7 +220,7 @@ await handleWebSocketUpgrade(httpCmd, args, request, } // construct the web request that we are going to issue on behalf of the client. - await handleHttpSessionRequestInternal(serverConnection, args); + await handleHttpSessionRequest(serverConnection, args); return true; }, generator, connection); @@ -312,7 +304,7 @@ await tcpConnectionFactory.Release(connection, /// The tcp connection. /// The session event arguments. /// - private async Task handleHttpSessionRequestInternal(TcpServerConnection serverConnection, SessionEventArgs args) + private async Task handleHttpSessionRequest(TcpServerConnection serverConnection, SessionEventArgs args) { var cancellationToken = args.CancellationTokenSource.Token; var request = args.WebSession.Request; @@ -400,7 +392,7 @@ private void prepareRequestHeaders(HeaderCollection requestHeaders) //only allow proxy supported compressions supportedAcceptEncoding.AddRange(acceptEncoding.Split(',') .Select(x => x.Trim()) - .Where(x => proxySupportedCompressions.Contains(x))); + .Where(x => ProxyConstants.ProxySupportedCompressions.Contains(x))); //uncompressed is always supported by proxy supportedAcceptEncoding.Add("identity"); diff --git a/Titanium.Web.Proxy/ResponseHandler.cs b/Titanium.Web.Proxy/ResponseHandler.cs index 40d90e52e..f0120012f 100644 --- a/Titanium.Web.Proxy/ResponseHandler.cs +++ b/Titanium.Web.Proxy/ResponseHandler.cs @@ -80,7 +80,7 @@ private async Task handleHttpSessionResponse(SessionEventArgs args) { // clear current response await args.ClearResponse(cancellationToken); - await handleHttpSessionRequestInternal(args.WebSession.ServerConnection, args); + await handleHttpSessionRequest(args.WebSession.ServerConnection, args); return; } diff --git a/Titanium.Web.Proxy/Shared/ProxyConstants.cs b/Titanium.Web.Proxy/Shared/ProxyConstants.cs index 596bfd76e..f55bc74db 100644 --- a/Titanium.Web.Proxy/Shared/ProxyConstants.cs +++ b/Titanium.Web.Proxy/Shared/ProxyConstants.cs @@ -1,4 +1,6 @@ -using System.Text.RegularExpressions; +using System; +using System.Collections.Generic; +using System.Text.RegularExpressions; namespace Titanium.Web.Proxy.Shared { @@ -14,9 +16,20 @@ internal class ProxyConstants internal static readonly char[] SemiColonSplit = { ';' }; internal static readonly char[] EqualSplit = { '=' }; - internal static readonly byte[] NewLine = { (byte)'\r', (byte)'\n' }; + internal static readonly string NewLine = "\r\n"; + internal static readonly byte[] NewLineBytes = { (byte)'\r', (byte)'\n' }; - public static readonly Regex CNRemoverRegex = + internal static readonly Regex UriSchemeRegex = + new Regex("^[a-z]*://", RegexOptions.IgnoreCase | RegexOptions.Compiled); + + internal static readonly HashSet ProxySupportedCompressions = + new HashSet(StringComparer.OrdinalIgnoreCase) + { + "gzip", + "deflate" + }; + + internal static readonly Regex CNRemoverRegex = new Regex(@"^CN\s*=\s*", RegexOptions.IgnoreCase | RegexOptions.Compiled); } } diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html b/docs/api/Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html index bd76b4821..b55dc7bcb 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.AsyncEventHandler-1.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html index cca2a82da..902fcb6f3 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.BeforeSslAuthenticateEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html index 449e96b90..e5e1bd3d6 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.CertificateSelectionEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html index 11cd0510f..95c9c871d 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.CertificateValidationEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html index 1874933c9..be4375204 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.MultipartRequestPartSentEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html index e98bb276b..643f567ad 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html index 90cd391e2..8d9271980 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.SessionEventArgsBase.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html b/docs/api/Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html index 30dc1d143..c326bcdac 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.TunnelConnectSessionEventArgs.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.EventArguments.html b/docs/api/Titanium.Web.Proxy.EventArguments.html index cfc08a591..a59a9a839 100644 --- a/docs/api/Titanium.Web.Proxy.EventArguments.html +++ b/docs/api/Titanium.Web.Proxy.EventArguments.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.ExceptionHandler.html b/docs/api/Titanium.Web.Proxy.ExceptionHandler.html index 3d29ac18b..d7db8b863 100644 --- a/docs/api/Titanium.Web.Proxy.ExceptionHandler.html +++ b/docs/api/Titanium.Web.Proxy.ExceptionHandler.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html b/docs/api/Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html index 11d638cc1..b1726a639 100644 --- a/docs/api/Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html +++ b/docs/api/Titanium.Web.Proxy.Exceptions.BodyNotFoundException.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html index 5d9a89001..e2f9afe6b 100644 --- a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html +++ b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyAuthorizationException.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyException.html b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyException.html index 84f18286b..ec4c2255f 100644 --- a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyException.html +++ b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyException.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyHttpException.html b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyHttpException.html index d486a677d..5f0551b84 100644 --- a/docs/api/Titanium.Web.Proxy.Exceptions.ProxyHttpException.html +++ b/docs/api/Titanium.Web.Proxy.Exceptions.ProxyHttpException.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Exceptions.html b/docs/api/Titanium.Web.Proxy.Exceptions.html index 9b8562f7c..9a2b93e92 100644 --- a/docs/api/Titanium.Web.Proxy.Exceptions.html +++ b/docs/api/Titanium.Web.Proxy.Exceptions.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.ConnectRequest.html b/docs/api/Titanium.Web.Proxy.Http.ConnectRequest.html index ab37a8fde..e8ed8bc8a 100644 --- a/docs/api/Titanium.Web.Proxy.Http.ConnectRequest.html +++ b/docs/api/Titanium.Web.Proxy.Http.ConnectRequest.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.ConnectResponse.html b/docs/api/Titanium.Web.Proxy.Http.ConnectResponse.html index fa8f1a9bd..ae1f281aa 100644 --- a/docs/api/Titanium.Web.Proxy.Http.ConnectResponse.html +++ b/docs/api/Titanium.Web.Proxy.Http.ConnectResponse.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.HeaderCollection.html b/docs/api/Titanium.Web.Proxy.Http.HeaderCollection.html index e82181e96..d052a84e1 100644 --- a/docs/api/Titanium.Web.Proxy.Http.HeaderCollection.html +++ b/docs/api/Titanium.Web.Proxy.Http.HeaderCollection.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.HttpWebClient.html b/docs/api/Titanium.Web.Proxy.Http.HttpWebClient.html index dc7c7c233..9719909c4 100644 --- a/docs/api/Titanium.Web.Proxy.Http.HttpWebClient.html +++ b/docs/api/Titanium.Web.Proxy.Http.HttpWebClient.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.KnownHeaders.html b/docs/api/Titanium.Web.Proxy.Http.KnownHeaders.html index 26ddbdf80..9fbd7efe8 100644 --- a/docs/api/Titanium.Web.Proxy.Http.KnownHeaders.html +++ b/docs/api/Titanium.Web.Proxy.Http.KnownHeaders.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Request.html b/docs/api/Titanium.Web.Proxy.Http.Request.html index 05632508f..710d5a2c2 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Request.html +++ b/docs/api/Titanium.Web.Proxy.Http.Request.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.RequestResponseBase.html b/docs/api/Titanium.Web.Proxy.Http.RequestResponseBase.html index 2f99714dc..42c9870dd 100644 --- a/docs/api/Titanium.Web.Proxy.Http.RequestResponseBase.html +++ b/docs/api/Titanium.Web.Proxy.Http.RequestResponseBase.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Response.html b/docs/api/Titanium.Web.Proxy.Http.Response.html index 432b63b52..41f41af41 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Response.html +++ b/docs/api/Titanium.Web.Proxy.Http.Response.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Responses.GenericResponse.html b/docs/api/Titanium.Web.Proxy.Http.Responses.GenericResponse.html index e89e26463..fc7fde99d 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Responses.GenericResponse.html +++ b/docs/api/Titanium.Web.Proxy.Http.Responses.GenericResponse.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Responses.OkResponse.html b/docs/api/Titanium.Web.Proxy.Http.Responses.OkResponse.html index 639df4a9b..4321effa8 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Responses.OkResponse.html +++ b/docs/api/Titanium.Web.Proxy.Http.Responses.OkResponse.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Responses.RedirectResponse.html b/docs/api/Titanium.Web.Proxy.Http.Responses.RedirectResponse.html index 44dbdd501..e1506b8a7 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Responses.RedirectResponse.html +++ b/docs/api/Titanium.Web.Proxy.Http.Responses.RedirectResponse.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.Responses.html b/docs/api/Titanium.Web.Proxy.Http.Responses.html index 4beda00ea..65668ffb2 100644 --- a/docs/api/Titanium.Web.Proxy.Http.Responses.html +++ b/docs/api/Titanium.Web.Proxy.Http.Responses.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Http.html b/docs/api/Titanium.Web.Proxy.Http.html index ee96f97d4..f9676618e 100644 --- a/docs/api/Titanium.Web.Proxy.Http.html +++ b/docs/api/Titanium.Web.Proxy.Http.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html b/docs/api/Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html index 4a64838e0..56960f231 100644 --- a/docs/api/Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html +++ b/docs/api/Titanium.Web.Proxy.Models.ExplicitProxyEndPoint.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.ExternalProxy.html b/docs/api/Titanium.Web.Proxy.Models.ExternalProxy.html index fdbd2b700..67138f088 100644 --- a/docs/api/Titanium.Web.Proxy.Models.ExternalProxy.html +++ b/docs/api/Titanium.Web.Proxy.Models.ExternalProxy.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.HttpHeader.html b/docs/api/Titanium.Web.Proxy.Models.HttpHeader.html index 4366a590e..a1214ffbc 100644 --- a/docs/api/Titanium.Web.Proxy.Models.HttpHeader.html +++ b/docs/api/Titanium.Web.Proxy.Models.HttpHeader.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.ProxyEndPoint.html b/docs/api/Titanium.Web.Proxy.Models.ProxyEndPoint.html index 112bf9686..31341bf95 100644 --- a/docs/api/Titanium.Web.Proxy.Models.ProxyEndPoint.html +++ b/docs/api/Titanium.Web.Proxy.Models.ProxyEndPoint.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html b/docs/api/Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html index 4ad3392ae..8207f9667 100644 --- a/docs/api/Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html +++ b/docs/api/Titanium.Web.Proxy.Models.TransparentProxyEndPoint.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Models.html b/docs/api/Titanium.Web.Proxy.Models.html index f6a2118a7..728bb914d 100644 --- a/docs/api/Titanium.Web.Proxy.Models.html +++ b/docs/api/Titanium.Web.Proxy.Models.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Network.CertificateEngine.html b/docs/api/Titanium.Web.Proxy.Network.CertificateEngine.html index 7d08fb254..8e4523bdd 100644 --- a/docs/api/Titanium.Web.Proxy.Network.CertificateEngine.html +++ b/docs/api/Titanium.Web.Proxy.Network.CertificateEngine.html @@ -10,7 +10,7 @@ - + @@ -110,7 +110,8 @@

Fields DefaultWindows -

Uses Windows Certification Generation API. +

Uses Windows Certification Generation API and only valid in Windows OS. +Observed to be faster than BouncyCastle. Bug #468 Reported.

diff --git a/docs/api/Titanium.Web.Proxy.Network.CertificateManager.html b/docs/api/Titanium.Web.Proxy.Network.CertificateManager.html index 0d83bd4b2..2e4bd36f9 100644 --- a/docs/api/Titanium.Web.Proxy.Network.CertificateManager.html +++ b/docs/api/Titanium.Web.Proxy.Network.CertificateManager.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.Network.html b/docs/api/Titanium.Web.Proxy.Network.html index 4eebd5824..d6449a2cd 100644 --- a/docs/api/Titanium.Web.Proxy.Network.html +++ b/docs/api/Titanium.Web.Proxy.Network.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.ProxyServer.html b/docs/api/Titanium.Web.Proxy.ProxyServer.html index 2c40d240e..379c47878 100644 --- a/docs/api/Titanium.Web.Proxy.ProxyServer.html +++ b/docs/api/Titanium.Web.Proxy.ProxyServer.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/Titanium.Web.Proxy.html b/docs/api/Titanium.Web.Proxy.html index 175173cab..22d62e9ef 100644 --- a/docs/api/Titanium.Web.Proxy.html +++ b/docs/api/Titanium.Web.Proxy.html @@ -10,7 +10,7 @@ - + diff --git a/docs/api/toc.html b/docs/api/toc.html index 841c262c6..a34a0a15a 100644 --- a/docs/api/toc.html +++ b/docs/api/toc.html @@ -11,145 +11,153 @@ +
  • + + Titanium.Web.Proxy + + +
  • +
  • + + Titanium.Web.Proxy.EventArguments + + +
  • +
  • + + Titanium.Web.Proxy.Exceptions + + +
  • +
  • + + Titanium.Web.Proxy.Http + + +
  • +
  • + + Titanium.Web.Proxy.Http.Responses + + +
  • +
  • + + Titanium.Web.Proxy.Models + + +
  • +
  • + + Titanium.Web.Proxy.Network + + +
  • + + \ No newline at end of file diff --git a/docs/index.json b/docs/index.json index aaeeb5325..e09fda245 100644 --- a/docs/index.json +++ b/docs/index.json @@ -177,7 +177,7 @@ "api/Titanium.Web.Proxy.Network.CertificateEngine.html": { "href": "api/Titanium.Web.Proxy.Network.CertificateEngine.html", "title": "Enum CertificateEngine | Titanium Web Proxy", - "keywords": "Enum CertificateEngine Certificate Engine option. Namespace : Titanium.Web.Proxy.Network Assembly : Titanium.Web.Proxy.dll Syntax public enum CertificateEngine Fields Name Description BouncyCastle Uses BouncyCastle 3rd party library. Default. DefaultWindows Uses Windows Certification Generation API. Bug #468 Reported." + "keywords": "Enum CertificateEngine Certificate Engine option. Namespace : Titanium.Web.Proxy.Network Assembly : Titanium.Web.Proxy.dll Syntax public enum CertificateEngine Fields Name Description BouncyCastle Uses BouncyCastle 3rd party library. Default. DefaultWindows Uses Windows Certification Generation API and only valid in Windows OS. Observed to be faster than BouncyCastle. Bug #468 Reported." }, "api/Titanium.Web.Proxy.Network.CertificateManager.html": { "href": "api/Titanium.Web.Proxy.Network.CertificateManager.html", diff --git a/docs/styles/docfx.js b/docs/styles/docfx.js index 29491bf76..54765fa40 100644 --- a/docs/styles/docfx.js +++ b/docs/styles/docfx.js @@ -387,7 +387,10 @@ $(function () { } } else { if (util.getAbsolutePath(href) === currentAbsPath) { - isActive = true; + var dropdown = $(e).attr('data-toggle') == "dropdown" + if (!dropdown) { + isActive = true; + } } } if (isActive) { diff --git a/docs/styles/docfx.vendor.js b/docs/styles/docfx.vendor.js index 8656f1ecd..71bd0cdfe 100644 --- a/docs/styles/docfx.vendor.js +++ b/docs/styles/docfx.vendor.js @@ -27,14 +27,15 @@ return{aliases:["styl"],cI:!1,k:"if else for in",i:"("+l.join("|")+")",c:[e.QSM, built_in:"ip eip rip al ah bl bh cl ch dl dh sil dil bpl spl r8b r9b r10b r11b r12b r13b r14b r15b ax bx cx dx si di bp sp r8w r9w r10w r11w r12w r13w r14w r15w eax ebx ecx edx esi edi ebp esp eip r8d r9d r10d r11d r12d r13d r14d r15d rax rbx rcx rdx rsi rdi rbp rsp r8 r9 r10 r11 r12 r13 r14 r15 cs ds es fs gs ss st st0 st1 st2 st3 st4 st5 st6 st7 mm0 mm1 mm2 mm3 mm4 mm5 mm6 mm7 xmm0 xmm1 xmm2 xmm3 xmm4 xmm5 xmm6 xmm7 xmm8 xmm9 xmm10 xmm11 xmm12 xmm13 xmm14 xmm15 xmm16 xmm17 xmm18 xmm19 xmm20 xmm21 xmm22 xmm23 xmm24 xmm25 xmm26 xmm27 xmm28 xmm29 xmm30 xmm31 ymm0 ymm1 ymm2 ymm3 ymm4 ymm5 ymm6 ymm7 ymm8 ymm9 ymm10 ymm11 ymm12 ymm13 ymm14 ymm15 ymm16 ymm17 ymm18 ymm19 ymm20 ymm21 ymm22 ymm23 ymm24 ymm25 ymm26 ymm27 ymm28 ymm29 ymm30 ymm31 zmm0 zmm1 zmm2 zmm3 zmm4 zmm5 zmm6 zmm7 zmm8 zmm9 zmm10 zmm11 zmm12 zmm13 zmm14 zmm15 zmm16 zmm17 zmm18 zmm19 zmm20 zmm21 zmm22 zmm23 zmm24 zmm25 zmm26 zmm27 zmm28 zmm29 zmm30 zmm31 k0 k1 k2 k3 k4 k5 k6 k7 bnd0 bnd1 bnd2 bnd3 cr0 cr1 cr2 cr3 cr4 cr8 dr0 dr1 dr2 dr3 dr8 tr3 tr4 tr5 tr6 tr7 r0 r1 r2 r3 r4 r5 r6 r7 r0b r1b r2b r3b r4b r5b r6b r7b r0w r1w r2w r3w r4w r5w r6w r7w r0d r1d r2d r3d r4d r5d r6d r7d r0h r1h r2h r3h r0l r1l r2l r3l r4l r5l r6l r7l r8l r9l r10l r11l r12l r13l r14l r15l db dw dd dq dt ddq do dy dz resb resw resd resq rest resdq reso resy resz incbin equ times byte word dword qword nosplit rel abs seg wrt strict near far a32 ptr",meta:"%define %xdefine %+ %undef %defstr %deftok %assign %strcat %strlen %substr %rotate %elif %else %endif %if %ifmacro %ifctx %ifidn %ifidni %ifid %ifnum %ifstr %iftoken %ifempty %ifenv %error %warning %fatal %rep %endrep %include %push %pop %repl %pathsearch %depend %use %arg %stacksize %local %line %comment %endcomment .nolist __FILE__ __LINE__ __SECT__ __BITS__ __OUTPUT_FORMAT__ __DATE__ __TIME__ __DATE_NUM__ __TIME_NUM__ __UTC_DATE__ __UTC_TIME__ __UTC_DATE_NUM__ __UTC_TIME_NUM__ __PASS__ struc endstruc istruc at iend align alignb sectalign daz nodaz up down zero default option assume public bits use16 use32 use64 default section segment absolute extern global common cpu float __utf16__ __utf16le__ __utf16be__ __utf32__ __utf32le__ __utf32be__ __float8__ __float16__ __float32__ __float64__ __float80m__ __float80e__ __float128l__ __float128h__ __Infinity__ __QNaN__ __SNaN__ Inf NaN QNaN SNaN float8 float16 float32 float64 float80m float80e float128l float128h __FLOAT_DAZ__ __FLOAT_ROUND__ __FLOAT__"},c:[e.C(";","$",{r:0}),{cN:"number",v:[{b:"\\b(?:([0-9][0-9_]*)?\\.[0-9_]*(?:[eE][+-]?[0-9_]+)?|(0[Xx])?[0-9][0-9_]*\\.?[0-9_]*(?:[pP](?:[+-]?[0-9_]+)?)?)\\b",r:0},{b:"\\$[0-9][0-9A-Fa-f]*",r:0},{b:"\\b(?:[0-9A-Fa-f][0-9A-Fa-f_]*[Hh]|[0-9][0-9_]*[DdTt]?|[0-7][0-7_]*[QqOo]|[0-1][0-1_]*[BbYy])\\b"},{b:"\\b(?:0[Xx][0-9A-Fa-f_]+|0[DdTt][0-9_]+|0[QqOo][0-7_]+|0[BbYy][0-1_]+)\\b"}]},e.QSM,{cN:"string",v:[{b:"'",e:"[^\\\\]'"},{b:"`",e:"[^\\\\]`"}],r:0},{cN:"symbol",v:[{b:"^\\s*[A-Za-z._?][A-Za-z0-9_$#@~.?]*(:|\\s+label)"},{b:"^\\s*%%[A-Za-z0-9_$#@~.?]*:"}],r:0},{cN:"subst",b:"%[0-9]+",r:0},{cN:"subst",b:"%!S+",r:0},{cN:"meta",b:/^\s*\.[\w_-]+/}]}}),e.registerLanguage("xl",function(e){var t="ObjectLoader Animate MovieCredits Slides Filters Shading Materials LensFlare Mapping VLCAudioVideo StereoDecoder PointCloud NetworkAccess RemoteControl RegExp ChromaKey Snowfall NodeJS Speech Charts",r={keyword:"if then else do while until for loop import with is as where when by data constant integer real text name boolean symbol infix prefix postfix block tree",literal:"true false nil",built_in:"in mod rem and or xor not abs sign floor ceil sqrt sin cos tan asin acos atan exp expm1 log log2 log10 log1p pi at text_length text_range text_find text_replace contains page slide basic_slide title_slide title subtitle fade_in fade_out fade_at clear_color color line_color line_width texture_wrap texture_transform texture scale_?x scale_?y scale_?z? translate_?x translate_?y translate_?z? rotate_?x rotate_?y rotate_?z? rectangle circle ellipse sphere path line_to move_to quad_to curve_to theme background contents locally time mouse_?x mouse_?y mouse_buttons "+t},a={cN:"string",b:'"',e:'"',i:"\\n"},i={cN:"string",b:"'",e:"'",i:"\\n"},n={cN:"string",b:"<<",e:">>"},o={cN:"number",b:"[0-9]+#[0-9A-Z_]+(\\.[0-9-A-Z_]+)?#?([Ee][+-]?[0-9]+)?"},s={bK:"import",e:"$",k:r,c:[a]},l={cN:"function",b:/[a-z][^\n]*->/,rB:!0,e:/->/,c:[e.inherit(e.TM,{starts:{eW:!0,k:r}})]};return{aliases:["tao"],l:/[a-zA-Z][a-zA-Z0-9_?]*/,k:r,c:[e.CLCM,e.CBCM,a,i,n,l,s,o,e.NM]}}),e.registerLanguage("xquery",function(e){var t="for let if while then else return where group by xquery encoding versionmodule namespace boundary-space preserve strip default collation base-uri orderingcopy-namespaces order declare import schema namespace function option in allowing emptyat tumbling window sliding window start when only end when previous next stable ascendingdescending empty greatest least some every satisfies switch case typeswitch try catch andor to union intersect instance of treat as castable cast map array delete insert intoreplace value rename copy modify update",r="false true xs:string xs:integer element item xs:date xs:datetime xs:float xs:double xs:decimal QName xs:anyURI xs:long xs:int xs:short xs:byte attribute",a={b:/\$[a-zA-Z0-9\-]+/},i={cN:"number",b:"(\\b0[0-7_]+)|(\\b0x[0-9a-fA-F_]+)|(\\b[1-9][0-9_]*(\\.[0-9_]+)?)|[0_]\\b",r:0},n={cN:"string",v:[{b:/"/,e:/"/,c:[{b:/""/,r:0}]},{b:/'/,e:/'/,c:[{b:/''/,r:0}]}]},o={cN:"meta",b:"%\\w+"},s={cN:"comment",b:"\\(:",e:":\\)",r:10,c:[{cN:"doctag",b:"@\\w+"}]},l={b:"{",e:"}"},c=[a,n,i,s,o,l];return l.c=c,{aliases:["xpath","xq"],cI:!1,l:/[a-zA-Z\$][a-zA-Z0-9_:\-]*/,i:/(proc)|(abstract)|(extends)|(until)|(#)/,k:{keyword:t,literal:r},c:c}}),e.registerLanguage("zephir",function(e){var t={cN:"string",c:[e.BE],v:[{b:'b"',e:'"'},{b:"b'",e:"'"},e.inherit(e.ASM,{i:null}),e.inherit(e.QSM,{i:null})]},r={v:[e.BNM,e.CNM]};return{aliases:["zep"],cI:!0,k:"and include_once list abstract global private echo interface as static endswitch array null if endwhile or const for endforeach self var let while isset public protected exit foreach throw elseif include __FILE__ empty require_once do xor return parent clone use __CLASS__ __LINE__ else break print eval new catch __METHOD__ case exception default die require __FUNCTION__ enddeclare final try switch continue endfor endif declare unset true false trait goto instanceof insteadof __DIR__ __NAMESPACE__ yield finally int uint long ulong char uchar double float bool boolean stringlikely unlikely",c:[e.CLCM,e.HCM,e.C("/\\*","\\*/",{c:[{cN:"doctag",b:"@[A-Za-z]+"}]}),e.C("__halt_compiler.+?;",!1,{eW:!0,k:"__halt_compiler",l:e.UIR}),{cN:"string",b:"<<<['\"]?\\w+['\"]?$",e:"^\\w+;",c:[e.BE]},{b:/(::|->)+[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*/},{cN:"function",bK:"function",e:/[;{]/,eE:!0,i:"\\$|\\[|%",c:[e.UTM,{cN:"params",b:"\\(",e:"\\)",c:["self",e.CBCM,t,r]}]},{cN:"class",bK:"class interface",e:"{",eE:!0,i:/[:\(\$"]/,c:[{bK:"extends implements"},e.UTM]},{bK:"namespace",e:";",i:/[\.']/,c:[e.UTM]},{bK:"use",e:";",c:[e.UTM]},{b:"=>"},t,r]}}),e}); /*! url - v1.8.6 - 2013-11-22 */window.url=function(){function a(a){return!isNaN(parseFloat(a))&&isFinite(a)}return function(b,c){var d=c||window.location.toString();if(!b)return d;b=b.toString(),"//"===d.substring(0,2)?d="http:"+d:1===d.split("://").length&&(d="http://"+d),c=d.split("/");var e={auth:""},f=c[2].split("@");1===f.length?f=f[0].split(":"):(e.auth=f[0],f=f[1].split(":")),e.protocol=c[0],e.hostname=f[0],e.port=f[1]||("https"===e.protocol.split(":")[0].toLowerCase()?"443":"80"),e.pathname=(c.length>3?"/":"")+c.slice(3,c.length).join("/").split("?")[0].split("#")[0];var g=e.pathname;"/"===g.charAt(g.length-1)&&(g=g.substring(0,g.length-1));var h=e.hostname,i=h.split("."),j=g.split("/");if("hostname"===b)return h;if("domain"===b)return/^(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])\.){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])$/.test(h)?h:i.slice(-2).join(".");if("sub"===b)return i.slice(0,i.length-2).join(".");if("port"===b)return e.port;if("protocol"===b)return e.protocol.split(":")[0];if("auth"===b)return e.auth;if("user"===b)return e.auth.split(":")[0];if("pass"===b)return e.auth.split(":")[1]||"";if("path"===b)return e.pathname;if("."===b.charAt(0)){if(b=b.substring(1),a(b))return b=parseInt(b,10),i[0>b?i.length+b:b-1]||""}else{if(a(b))return b=parseInt(b,10),j[0>b?j.length+b:b]||"";if("file"===b)return j.slice(-1)[0];if("filename"===b)return j.slice(-1)[0].split(".")[0];if("fileext"===b)return j.slice(-1)[0].split(".")[1]||"";if("?"===b.charAt(0)||"#"===b.charAt(0)){var k=d,l=null;if("?"===b.charAt(0)?k=(k.split("?")[1]||"").split("#")[0]:"#"===b.charAt(0)&&(k=k.split("#")[1]||""),!b.charAt(1))return k;b=b.substring(1),k=k.split("&");for(var m=0,n=k.length;n>m;m++)if(l=k[m].split("="),l[0]===b)return l[1]||"";return null}}return""}}(),"undefined"!=typeof jQuery&&jQuery.extend({url:function(a,b){return window.url(a,b)}}); /* - * jQuery pagination plugin v1.4.1 - * http://esimakin.github.io/twbs-pagination/ + * jQuery Bootstrap Pagination v1.4.2 + * https://github.com/josecebe/twbs-pagination * - * Copyright 2014-2016, Eugene Simakin - * Released under Apache 2.0 license + * Copyright 2014-2018, Eugene Simakin + * Released under Apache-2.0 license * http://apache.org/licenses/LICENSE-2.0.html */ -(function(e,d,a,f){var b=e.fn.twbsPagination;var c=function(i,g){this.$element=e(i);this.options=e.extend({},e.fn.twbsPagination.defaults,g);if(this.options.startPage<1||this.options.startPage>this.options.totalPages){throw new Error("Start page option is incorrect")}this.options.totalPages=parseInt(this.options.totalPages);if(isNaN(this.options.totalPages)){throw new Error("Total pages option is not correct!")}this.options.visiblePages=parseInt(this.options.visiblePages);if(isNaN(this.options.visiblePages)){throw new Error("Visible pages option is not correct!")}if(this.options.onPageClick instanceof Function){this.$element.first().on("page",this.options.onPageClick)}if(this.options.hideOnlyOnePage&&this.options.totalPages==1){this.$element.trigger("page",1);return this}if(this.options.totalPages")}this.$listContainer.addClass(this.options.paginationClass);if(h!=="UL"){this.$element.append(this.$listContainer)}if(this.options.initiateStartPageClick){this.show(this.options.startPage)}else{this.render(this.getPages(this.options.startPage));this.setupEvents()}return this};c.prototype={constructor:c,destroy:function(){this.$element.empty();this.$element.removeData("twbs-pagination");this.$element.off("page");return this},show:function(g){if(g<1||g>this.options.totalPages){throw new Error("Page is incorrect.")}this.currentPage=g;this.render(this.getPages(g));this.setupEvents();this.$element.trigger("page",g);return this},buildListItems:function(g){var l=[];if(this.options.first){l.push(this.buildItem("first",1))}if(this.options.prev){var k=g.currentPage>1?g.currentPage-1:this.options.loop?this.options.totalPages:1;l.push(this.buildItem("prev",k))}for(var h=0;h"),h=e(""),g=this.options[i]?this.makeText(this.options[i],j):j;k.addClass(this.options[i+"Class"]);k.data("page",j);k.data("page-type",i);k.append(h.attr("href",this.makeHref(j)).addClass(this.options.anchorClass).html(g));return k},getPages:function(j){var g=[];var k=Math.floor(this.options.visiblePages/2);var l=j-k+1-this.options.visiblePages%2;var h=j+k;if(l<=0){l=1;h=this.options.visiblePages}if(h>this.options.totalPages){l=this.options.totalPages-this.options.visiblePages+1;h=this.options.totalPages}var i=l;while(i<=h){g.push(i);i++}return{currentPage:j,numeric:g}},render:function(g){var i=this;this.$listContainer.children().remove();var h=this.buildListItems(g);jQuery.each(h,function(j,k){i.$listContainer.append(k)});this.$listContainer.children().each(function(){var k=e(this),j=k.data("page-type");switch(j){case"page":if(k.data("page")===g.currentPage){k.addClass(i.options.activeClass)}break;case"first":k.toggleClass(i.options.disabledClass,g.currentPage===1);break;case"last":k.toggleClass(i.options.disabledClass,g.currentPage===i.options.totalPages);break;case"prev":k.toggleClass(i.options.disabledClass,!i.options.loop&&g.currentPage===1);break;case"next":k.toggleClass(i.options.disabledClass,!i.options.loop&&g.currentPage===i.options.totalPages);break;default:break}})},setupEvents:function(){var g=this;this.$listContainer.off("click").on("click","li",function(h){var i=e(this);if(i.hasClass(g.options.disabledClass)||i.hasClass(g.options.activeClass)){return false}!g.options.href&&h.preventDefault();g.show(parseInt(i.data("page")))})},makeHref:function(g){return this.options.href?this.generateQueryString(g):"#"},makeText:function(h,g){return h.replace(this.options.pageVariable,g).replace(this.options.totalPagesVariable,this.options.totalPages)},getPageFromQueryString:function(g){var h=this.getSearchString(g),i=new RegExp(this.options.pageVariable+"(=([^&#]*)|&|#|$)"),j=i.exec(h);if(!j||!j[2]){return null}j=decodeURIComponent(j[2]);j=parseInt(j);if(isNaN(j)){return null}return j},generateQueryString:function(g,h){var i=this.getSearchString(h),j=new RegExp(this.options.pageVariable+"=*[^&#]*");if(!i){return""}return"?"+i.replace(j,this.options.pageVariable+"="+g)},getSearchString:function(g){var h=g||d.location.search;if(h===""){return null}if(h.indexOf("?")===0){h=h.substr(1)}return h}};e.fn.twbsPagination=function(i){var h=Array.prototype.slice.call(arguments,1);var k;var l=e(this);var j=l.data("twbs-pagination");var g=typeof i==="object"?i:{};if(!j){l.data("twbs-pagination",(j=new c(this,g)))}if(typeof i==="string"){k=j[i].apply(j,h)}return(k===f)?l:k};e.fn.twbsPagination.defaults={totalPages:1,startPage:1,visiblePages:5,initiateStartPageClick:true,hideOnlyOnePage:false,href:false,pageVariable:"{{page}}",totalPagesVariable:"{{total_pages}}",page:null,first:"First",prev:"Previous",next:"Next",last:"Last",loop:false,onPageClick:null,paginationClass:"pagination",nextClass:"page-item next",prevClass:"page-item prev",lastClass:"page-item last",firstClass:"page-item first",pageClass:"page-item",activeClass:"active",disabledClass:"disabled",anchorClass:"page-link"};e.fn.twbsPagination.Constructor=c;e.fn.twbsPagination.noConflict=function(){e.fn.twbsPagination=b;return this};e.fn.twbsPagination.version="1.4.1"})(window.jQuery,window,document); + +!function(o,e,t,s){"use strict";var i=o.fn.twbsPagination,r=function(t,s){if(this.$element=o(t),this.options=o.extend({},o.fn.twbsPagination.defaults,s),this.options.startPage<1||this.options.startPage>this.options.totalPages)throw new Error("Start page option is incorrect");if(this.options.totalPages=parseInt(this.options.totalPages),isNaN(this.options.totalPages))throw new Error("Total pages option is not correct!");if(this.options.visiblePages=parseInt(this.options.visiblePages),isNaN(this.options.visiblePages))throw new Error("Visible pages option is not correct!");if(this.options.beforePageClick instanceof Function&&this.$element.first().on("beforePage",this.options.beforePageClick),this.options.onPageClick instanceof Function&&this.$element.first().on("page",this.options.onPageClick),this.options.hideOnlyOnePage&&1==this.options.totalPages)return this.options.initiateStartPageClick&&this.$element.trigger("page",1),this;if(this.options.href&&(this.options.startPage=this.getPageFromQueryString(),this.options.startPage||(this.options.startPage=1)),"UL"===("function"==typeof this.$element.prop?this.$element.prop("tagName"):this.$element.attr("tagName")))this.$listContainer=this.$element;else{var e=this.$element,i=o([]);e.each(function(t){var s=o("
      ");o(this).append(s),i.push(s[0])}),this.$listContainer=i,this.$element=i}return this.$listContainer.addClass(this.options.paginationClass),this.options.initiateStartPageClick?this.show(this.options.startPage):(this.currentPage=this.options.startPage,this.render(this.getPages(this.options.startPage)),this.setupEvents()),this};r.prototype={constructor:r,destroy:function(){return this.$element.empty(),this.$element.removeData("twbs-pagination"),this.$element.off("page"),this},show:function(t){if(t<1||t>this.options.totalPages)throw new Error("Page is incorrect.");this.currentPage=t,this.$element.trigger("beforePage",t);var s=this.getPages(t);return this.render(s),this.setupEvents(),this.$element.trigger("page",t),s},enable:function(){this.show(this.currentPage)},disable:function(){var t=this;this.$listContainer.off("click").on("click","li",function(t){t.preventDefault()}),this.$listContainer.children().each(function(){o(this).hasClass(t.options.activeClass)||o(this).addClass(t.options.disabledClass)})},buildListItems:function(t){var s=[];if(this.options.first&&s.push(this.buildItem("first",1)),this.options.prev){var e=1"),i=o(""),a=this.options[t]?this.makeText(this.options[t],s):s;return e.addClass(this.options[t+"Class"]),e.data("page",s),e.data("page-type",t),e.append(i.attr("href",this.makeHref(s)).addClass(this.options.anchorClass).html(a)),e},getPages:function(t){var s=[],e=Math.floor(this.options.visiblePages/2),i=t-e+1-this.options.visiblePages%2,a=t+e,n=this.options.visiblePages;n>this.options.totalPages&&(n=this.options.totalPages),i<=0&&(i=1,a=n),a>this.options.totalPages&&(i=this.options.totalPages-n+1,a=this.options.totalPages);for(var o=i;o<=a;)s.push(o),o++;return{currentPage:t,numeric:s}},render:function(s){var e=this;this.$listContainer.children().remove();var t=this.buildListItems(s);o.each(t,function(t,s){e.$listContainer.append(s)}),this.$listContainer.children().each(function(){var t=o(this);switch(t.data("page-type")){case"page":t.data("page")===s.currentPage&&t.addClass(e.options.activeClass);break;case"first":t.toggleClass(e.options.disabledClass,1===s.currentPage);break;case"last":t.toggleClass(e.options.disabledClass,s.currentPage===e.options.totalPages);break;case"prev":t.toggleClass(e.options.disabledClass,!e.options.loop&&1===s.currentPage);break;case"next":t.toggleClass(e.options.disabledClass,!e.options.loop&&s.currentPage===e.options.totalPages)}})},setupEvents:function(){var e=this;this.$listContainer.off("click").on("click","li",function(t){var s=o(this);if(s.hasClass(e.options.disabledClass)||s.hasClass(e.options.activeClass))return!1;!e.options.href&&t.preventDefault(),e.show(parseInt(s.data("page")))})},changeTotalPages:function(t,s){return this.options.totalPages=t,this.show(s)},makeHref:function(t){return this.options.href?this.generateQueryString(t):"#"},makeText:function(t,s){return t.replace(this.options.pageVariable,s).replace(this.options.totalPagesVariable,this.options.totalPages)},getPageFromQueryString:function(t){var s=this.getSearchString(t),e=new RegExp(this.options.pageVariable+"(=([^&#]*)|&|#|$)").exec(s);return e&&e[2]?(e=decodeURIComponent(e[2]),e=parseInt(e),isNaN(e)?null:e):null},generateQueryString:function(t,s){var e=this.getSearchString(s),i=new RegExp(this.options.pageVariable+"=*[^&#]*");return e?"?"+e.replace(i,this.options.pageVariable+"="+t):""},getSearchString:function(t){var s=t||e.location.search;return""===s?null:(0===s.indexOf("?")&&(s=s.substr(1)),s)},getCurrentPage:function(){return this.currentPage},getTotalPages:function(){return this.options.totalPages}},o.fn.twbsPagination=function(t){var s,e=Array.prototype.slice.call(arguments,1),i=o(this),a=i.data("twbs-pagination"),n="object"==typeof t?t:{};return a||i.data("twbs-pagination",a=new r(this,n)),"string"==typeof t&&(s=a[t].apply(a,e)),void 0===s?i:s},o.fn.twbsPagination.defaults={totalPages:1,startPage:1,visiblePages:5,initiateStartPageClick:!0,hideOnlyOnePage:!1,href:!1,pageVariable:"{{page}}",totalPagesVariable:"{{total_pages}}",page:null,first:"First",prev:"Previous",next:"Next",last:"Last",loop:!1,beforePageClick:null,onPageClick:null,paginationClass:"pagination",nextClass:"page-item next",prevClass:"page-item prev",lastClass:"page-item last",firstClass:"page-item first",pageClass:"page-item",activeClass:"active",disabledClass:"disabled",anchorClass:"page-link"},o.fn.twbsPagination.Constructor=r,o.fn.twbsPagination.noConflict=function(){return o.fn.twbsPagination=i,this},o.fn.twbsPagination.version="1.4.2"}(window.jQuery,window,document); /*!*************************************************** * mark.js v8.11.1 * https://markjs.io/