예제 #1
0
파일: Vndb.cs 프로젝트: Nikey646/VndbSharp
        /// <summary>
        /// Returns the latest version of the Vndb API that VndbSharp supports.
        /// This returns a Version object with fields for the API Date, and the completion status of VndbSharp toward that API version
        /// If the completion status is incomplete, there may be features from the Vndb API that have not been implemented yet.
        /// </summary>
        /// <returns></returns>
        public static Models.ApiVersionInfo GetApiVersion()
        {
            var version = new ApiVersionInfo()
            {
                ApiVersion = ApiVer, ApiStatus = ApiStatus
            };

            return(version);
        }
예제 #2
0
        protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request,
                                                                      CancellationToken cancellationToken)
        {
            var _swaggerstore = IocManager.Instance.Resolve <ISwaggerStore>();
            var setting       = Its.Configuration.Settings.Get <Config.SwaggerToolSettings>();
            //using refletions to internal
            var swaggerProvider =
                (ISwaggerProvider)
                _config.GetType()
                .GetMethod("GetSwaggerProvider",
                           System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
                .Invoke(_config, new object[] { request });

            var rootUrl =
                (string)
                _config.GetType()
                .GetMethod("GetRootUrl",
                           System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic)
                .Invoke(_config, new object[] { request });

            var apiVersion = request.GetRouteData().Values["apiVersion"].ToString();

            try {
                var            swaggerDoc = swaggerProvider.GetSwagger(rootUrl, apiVersion);
                var            last       = _swaggerstore.GetLastVersion();
                ApiVersionInfo info       = new ApiVersionInfo();
                info.GenDateTime = DateTime.Now.ToString();
                info.SwaggerDoc  = JsonConvert.SerializeObject(swaggerDoc, Formatting.Indented,
                                                               new JsonSerializerSettings()
                {
                    NullValueHandling = NullValueHandling.Ignore,
                    Converters        = new[] { new VendorExtensionsConverter() }
                });
                var md5 = MD5.Create();
                using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(info.SwaggerDoc))) {
                    info.md5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", "");
                }
                if (last != null)
                {
                    SwaggerDiff diff = new SwaggerDiff();
                    var         re   = await diff.Diff(info.SwaggerDoc, last.SwaggerDoc);

                    //info.BackwardsCompatible = re.Item2;
                    info.ChangeLogs = FormatChangelogDesc(re);
                }

                _swaggerstore.ImportNewVersion(info);

                var content = new StringContent(_swaggerstore.GetChangeLogInfo());
                return(new HttpResponseMessage {
                    Content = content
                });
            } catch (UnknownApiVersion ex) {
                return(request.CreateErrorResponse(HttpStatusCode.NotFound, ex));
            }
        }
예제 #3
0
    public virtual IDisposable Change(ApiVersionInfo apiVersionInfo)
    {
        var parent = ApiVersionInfo;

        _currentApiVersionInfo.Value = apiVersionInfo;
        return(new DisposeAction(() =>
        {
            _currentApiVersionInfo.Value = parent;
        }));
    }
예제 #4
0
        public void ImportNewVersion(ApiVersionInfo newswaggerdoc)
        {
            var last = GetLastVersion();

            if (last == null || last.md5 != newswaggerdoc.md5)
            {
                File.WriteAllText(basepath + "/" + filefolder + "/swagger" + newswaggerdoc.md5 + ".json", JsonConvert.SerializeObject(newswaggerdoc));

                //Append new changelogs
                string changelog = newswaggerdoc.GenDateTime.ToString() + "\r\n" + newswaggerdoc.ChangeLogs + "\r\n";
                File.AppendAllText(basepath + "/" + filefolder + "/changelogs.json", changelog);
            }
        }
예제 #5
0
    public virtual async Task <HttpContent> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion)
    {
        var body = await GenerateBodyAsync(action, methodArguments, jsonSerializer);

        if (body != null)
        {
            return(body);
        }

        body = await GenerateFormPostDataAsync(action, methodArguments);

        return(body);
    }
예제 #6
0
    protected virtual Task ReplacePathVariablesAsync(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
    {
        var pathParameters = actionParameters
                             .Where(p => p.BindingSourceId == ParameterBindingSources.Path)
                             .ToArray();

        if (!pathParameters.Any())
        {
            return(Task.CompletedTask);
        }

        if (pathParameters.Any(p => p.Name == "apiVersion"))
        {
            urlBuilder = urlBuilder.Replace("{apiVersion}", apiVersion.Version);
        }

        foreach (var pathParameter in pathParameters.Where(p => p.Name != "apiVersion")) //TODO: Constant!
        {
            var value = HttpActionParameterHelper.FindParameterValue(methodArguments, pathParameter);

            if (value == null)
            {
                if (pathParameter.IsOptional)
                {
                    urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", "");
                }
                else if (pathParameter.DefaultValue != null)
                {
                    urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", pathParameter.DefaultValue.ToString());
                }
                else
                {
                    throw new AbpException($"Missing path parameter value for {pathParameter.Name} ({pathParameter.NameOnMethod})");
                }
            }
            else
            {
                urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", value.ToString());
            }
        }

        return(Task.CompletedTask);
    }
예제 #7
0
    public async Task <string> GenerateUrlWithParametersAsync(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
    {
        // The ASP.NET Core route value provider and query string value provider:
        //  Treat values as invariant culture.
        //  Expect that URLs are culture-invariant.
        using (CultureHelper.Use(CultureInfo.InvariantCulture))
        {
            var urlBuilder = new StringBuilder(action.Url);

            await ReplacePathVariablesAsync(urlBuilder, action.Parameters, methodArguments, apiVersion);
            await AddQueryStringParametersAsync(urlBuilder, action.Parameters, methodArguments, apiVersion);

            return(urlBuilder.ToString());
        }
    }
예제 #8
0
    protected virtual async Task AddQueryStringParametersAsync(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
    {
        var queryStringParameters = actionParameters
                                    .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query))
                                    .ToArray();

        var isFirstParam = true;

        foreach (var queryStringParameter in queryStringParameters)
        {
            var value = HttpActionParameterHelper.FindParameterValue(methodArguments, queryStringParameter);
            if (value == null)
            {
                continue;
            }

            if (HttpClientProxyingOptions.QueryStringConverts.ContainsKey(value.GetType()))
            {
                using (var scope = ServiceScopeFactory.CreateScope())
                {
                    var queryString = await(Task <string>) CallObjectToQueryStringAsyncMethod
                                      .MakeGenericMethod(value.GetType())
                                      .Invoke(this, new object[]
                    {
                        scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.QueryStringConverts[value.GetType()]),
                        value
                    });

                    if (queryString != null)
                    {
                        urlBuilder.Append(isFirstParam ? "?" : "&");
                        urlBuilder.Append(queryString);
                        isFirstParam = false;
                        continue;
                    }
                }
            }

            if (await AddQueryStringParameterAsync(urlBuilder, isFirstParam, queryStringParameter.Name, value))
            {
                isFirstParam = false;
            }
        }

        if (apiVersion.ShouldSendInQueryString())
        {
            await AddQueryStringParameterAsync(urlBuilder, isFirstParam, "api-version", apiVersion.Version);  //TODO: Constant!
        }
    }
예제 #9
0
    protected virtual async Task ReplacePathVariablesAsync(StringBuilder urlBuilder, ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
    {
        var pathParameters = action.Parameters
                             .Where(p => p.BindingSourceId == ParameterBindingSources.Path)
                             .ToArray();

        if (!pathParameters.Any())
        {
            return;
        }

        if (pathParameters.Any(p => p.Name == "apiVersion"))
        {
            urlBuilder = urlBuilder.Replace("{apiVersion}", apiVersion.Version);
        }

        foreach (var pathParameter in pathParameters.Where(p => p.Name != "apiVersion")) //TODO: Constant!
        {
            var value = HttpActionParameterHelper.FindParameterValue(methodArguments, pathParameter);

            if (value == null)
            {
                if (pathParameter.IsOptional)
                {
                    urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", "");
                }
                else if (pathParameter.DefaultValue != null)
                {
                    urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", await ConvertValueToStringAsync(pathParameter.DefaultValue));
                }
                else
                {
                    throw new AbpException($"Missing path parameter value for {pathParameter.Name} ({pathParameter.NameOnMethod})");
                }
            }
            else
            {
                if (HttpClientProxyingOptions.PathConverts.ContainsKey(value.GetType()))
                {
                    using (var scope = ServiceScopeFactory.CreateScope())
                    {
                        var path = await(Task <string>) CallObjectToPathAsyncMethod
                                   .MakeGenericMethod(value.GetType())
                                   .Invoke(this, new object[]
                        {
                            scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.PathConverts[value.GetType()]),
                            action,
                            pathParameter,
                            value
                        });

                        if (path != null)
                        {
                            urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", path);
                            continue;
                        }
                    }
                }

                urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", await ConvertValueToStringAsync(value));
            }
        }
    }
        private static void AddQueryStringParameters(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
        {
            var queryStringParameters = actionParameters
                                        .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query))
                                        .ToArray();

            var isFirstParam = true;

            foreach (var queryStringParameter in queryStringParameters)
            {
                var value = HttpActionParameterHelper.FindParameterValue(methodArguments, queryStringParameter);
                if (value == null)
                {
                    continue;
                }

                if (AddQueryStringParameter(urlBuilder, isFirstParam, queryStringParameter.Name, value))
                {
                    isFirstParam = false;
                }
            }

            if (apiVersion.ShouldSendInQueryString())
            {
                AddQueryStringParameter(urlBuilder, isFirstParam, "api-version", apiVersion.Version);  //TODO: Constant!
            }
        }
        public static string GenerateUrlWithParameters(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion)
        {
            var urlBuilder = new StringBuilder(action.Url);

            ReplacePathVariables(urlBuilder, action.Parameters, methodArguments, apiVersion);
            AddQueryStringParameters(urlBuilder, action.Parameters, methodArguments, apiVersion);

            return(urlBuilder.ToString());
        }