public async Task <bool> RunTest(int testNumber) { var funcKey = _paramService.Get("key"); if (string.IsNullOrWhiteSpace(funcKey)) { _localLogService.LogWarning("Cannot perform test calls without a function key - pass in with the k option. More info on how to get key at project site"); return(false); } if (_settings == null) { return(false); } if (_settings.Count < testNumber) { return(false); } var setting = _settings[testNumber - 1]; //find the direction var binding = setting.config.bindings .FirstOrDefault(_ => _.direction == KsConstants.Functions.In && _.type.EndsWith(KsConstants.Functions.Trigger, StringComparison.Ordinal)); if (binding == null) { _localLogService.LogError($"Could not find an input binding for function {setting.name}"); //erm? return(false); } _localLogService.LogInfo($" > Running function {setting.name} ({binding.type}) with data {setting.test_data}"); var siteSettings = _pubSettingsService.GetSettingsByPublishMethod(PublishMethods.MSDeploy); if (binding.type == KsConstants.Functions.HttpTrigger) { //httptrigger, so this one needs to be called via direct http var confRaw = setting.test_data; var conf = JsonConvert.DeserializeObject <TestDataConfig>(confRaw); var urlBase = $"{siteSettings.LiveUrl}/api/{setting.name}?"; foreach (var qs in conf?.queryStringParams) { urlBase += $"{WebUtility.UrlEncode(qs.name)}={WebUtility.UrlEncode(qs.value)}&"; } urlBase += $"code={await _getKey(siteSettings, setting)}"; return(await _doRequest(urlBase, conf.method, conf.headers, conf.body, siteSettings)); } else { //other trigger, so call this one via admin api var urlBase = $"{siteSettings.LiveUrl}/admin/functions/{setting.name}"; var headers = new Dictionary <string, string>(); headers.Add("x-functions-key", funcKey); var post = $"{{\"input\":\"{setting.test_data}\"}}"; var result = await urlBase.Post(post, headers); } return(true); }
public async Task <bool> GetFiles(string subPath = null) { _siteSettings = _publishSettingsService.GetSettingsByPublishMethod(PublishMethods.MSDeploy); using (HttpClient httpClient = new HttpClient()) { httpClient.Timeout = TimeSpan.FromMilliseconds(10000); var requestUri = $"https://{_siteSettings.ApiUrl}/api/zip/site/wwwroot/"; if (!string.IsNullOrEmpty(subPath)) { subPath = subPath.Trim('/').Trim('\\'); requestUri += $"{subPath}/"; } _localLogService.Log($"Grabbing from {requestUri}"); var request = new HttpRequestMessage(HttpMethod.Get, requestUri); request.Headers.Authorization = new AuthenticationHeaderValue("Basic", HttpHelpers.GetAuthenticationString(_siteSettings)); var response = await httpClient.SendAsync( request, HttpCompletionOption.ResponseHeadersRead); if (!response.IsSuccessStatusCode) { _localLogService.Log($"Error: Count not get files from {requestUri}"); return(false); } var result = await response.Content.ReadAsByteArrayAsync(); var saveFile = Path.GetTempFileName(); File.WriteAllBytes(saveFile, result); try { var dir = Directory.GetCurrentDirectory(); if (!string.IsNullOrEmpty(subPath)) { dir += $"\\{subPath}"; } ZipFile.ExtractToDirectory(saveFile, dir); foreach (var f in Directory.GetFiles(dir, "*", SearchOption.AllDirectories)) { if (_fileWatcherService.Validate(f)) { _localLogService.Log($" - {f.Replace(dir, "")}"); } } } catch (System.IO.IOException ex) { _localLogService.LogWarning( "k-scratch will not overwrite existing files. Please 'get' in to an empty directory."); return(false); } finally { File.Delete(saveFile); } return(true); } }