コード例 #1
0
        private void ProcessRequest(HttpListenerContext context)
        {
            string    url   = context.Request.RawUrl;
            RestRoute route = resources.Keys.Where(rt => rt.Matches(context.Request.HttpMethod,
                                                                    url))
                              .FirstOrDefault();

            try
            {
                if (route != null)
                {
                    RestLogger.LogInfo("RestServer::ProcessRequest: " + route + " found");
                    resources[route](new ResourceData(context, route));
                }
                else if (fileResponder.FileExists(url))
                {
                    RestLogger.LogInfo("RestServer::ProcessRequest: file {0} found", url);
                    fileResponder.SendFileResponse(context);
                }
                else
                {
                    RestLogger.LogWarning("RestServer::ProcessRequest: url {0} not found", url);
                    responseWriter.SendNotFound(context.Response);
                }
            }
            catch (Exception ex)
            {
                LogException("ProcessRequest", ex);
                responseWriter.SendInternalServerError(context.Response,
                                                       ex.ToString());
            }
        }
コード例 #2
0
 private string GetContent(HttpWebResponse httpResponse)
 {
     try
     {
         using (Stream stream = httpResponse.GetResponseStream())
         {
             Stream dataStream = stream;
             if (httpResponse.Headers.AllKeys.Contains("Content-Encoding") &&
                 httpResponse.Headers["Content-Encoding"].Contains("gzip"))
             {
                 dataStream = new GZipStream(stream, CompressionMode.Decompress);
             }
             using (StreamReader reader = new StreamReader(dataStream))
             {
                 string content = reader.ReadToEnd();
                 return(content);
             }
         }
     }
     catch (Exception ex)
     {
         RestLogger.Log("Response::GetContent", ex);
     }
     return(string.Empty);
 }
コード例 #3
0
        private void GetQueryString(string url)
        {
            string[] splittedUrl = url.IndexOf("?") > -1 ?
                                   url.Split('?') : url.Split('#');
            if (splittedUrl.Length <= 1)
            {
                return;
            }

            string allQueries = splittedUrl[1];

            string[] queries = allQueries.IndexOf("&") > -1 ?
                               allQueries.Split('&') : allQueries.Split(';');
            foreach (string query in queries)
            {
                string[] keyAndValues = query.Split('=');
                if (keyAndValues.Length != 2)
                {
                    RestLogger.LogWarning("RestRoute::GetQueryString: {0} does not contain an equal sign", query);
                    continue;
                }

                string   key    = Uri.UnescapeDataString(keyAndValues[0]);
                string[] values = keyAndValues[1].Split(',');
                foreach (string value in values)
                {
                    this.QueryString.Add(key, Uri.UnescapeDataString(value));
                }
            }
        }
コード例 #4
0
 public RestClient(string url, NetworkCredential credentialsOrNull)
 {
     this.Cookies = new CookieContainer();
     url          = SanitizeUrl(url);
     this.root    = url;
     RestLogger.LogInfo("Client root {0}", this.root);
     this.credentialsOrNull = credentialsOrNull;
 }
コード例 #5
0
        internal BaseTwitchClient(TwitchConfig config, TwitchRestApiClient client)
        {
            ApiClient           = client;
            LogManager          = new LogManager(config.LogLevel);
            LogManager.Message += async msg => await _logEvent.InvokeAsync(msg).ConfigureAwait(false);

            _stateLock             = new SemaphoreSlim(1, 1);
            RestLogger             = LogManager.CreateLogger("Rest");
            ApiClient.SentRequest += async(method, endpoint, ms) => await RestLogger.VerboseAsync($"{method} /{endpoint}: {ms} ms");
        }
コード例 #6
0
        internal virtual async Task OnLoginAsync(bool validateToken)
        {
            if (!validateToken)
            {
                return;
            }

            var tokenInfo = await GetTokenInfoAsync().ConfigureAwait(false);

            if (!tokenInfo.IsValid)
            {
                await RestLogger.ErrorAsync("Token is not valid").ConfigureAwait(false);
                await LogoutAsync().ConfigureAwait(false);

                return;
            }

            TokenInfo = tokenInfo;
        }
コード例 #7
0
 public void Start()
 {
     try
     {
         contextQueue = new ProducerConsumerQueue
                        <HttpListenerContext>(ProcessRequest, config.NumWorkerThreads);
         RestLogger.LogInfo("RestServer starting, {0}", config.BaseUrl);
         listener.Prefixes.Add(config.BaseUrl);
         IsListening = true;
         listener.Start();
         listenerThread.Start();
     }
     catch (Exception ex)
     {
         IsListening = false;
         LogException("Start", ex);
         throw;
     }
 }
コード例 #8
0
        public bool FileExists(string url)
        {
            if (!rootExists ||
                string.IsNullOrEmpty(url))
            {
                return(false);
            }

            if (url.Contains(".."))
            {
                RestLogger.LogWarning("FileResponder::FileExists: request with step back{0}{1}",
                                      Environment.NewLine, url);
                return(false);
            }

            string path = GetFullPath(url);

            return(File.Exists(path));
        }
コード例 #9
0
        public FileResponder(string root, ResponseWriter responseWriter)
        {
            if (!string.IsNullOrEmpty(root))
            {
                if (responseWriter == null)
                {
                    throw new ArgumentNullException("responseWriter");
                }
                this.responseWriter = responseWriter;

                root = Path.GetFullPath(root);
                if (!Directory.Exists(root))
                {
                    RestLogger.LogInfo("FileResponder: creating directory " + root);
                    Directory.CreateDirectory(root);
                }
                RestLogger.LogInfo("FileResponder: web root " + root);
                this.rootExists = true;
                this.root       = root;
            }
        }
コード例 #10
0
 private void LogException(string callingFunction, Exception ex)
 {
     RestLogger.Log("RestServer::" + callingFunction, ex);
 }