public static void MaybeEnvelope(this HttpResponse response, HttpRequest request, PublicApiOptions apiOptions, QueryOptions queryOptions, IPageHeader data, IList <Error> errors, out object body) { if (FeatureRequested(request, apiOptions.JsonConversion.EnvelopeOperator, apiOptions.JsonConversion.EnvelopeEnabled)) { body = new EnvelopeBody { Data = data, Status = response.StatusCode, Headers = response.Headers, Paging = new PagingInfo { TotalCount = data.TotalCount, TotalPages = data.TotalPages, NextPage = GetNextPage(request, data, queryOptions), PreviousPage = GetPreviousPage(request, data, queryOptions), LastPage = GetLastPage(request, data, queryOptions) }, Errors = errors, HasErrors = errors?.Count > 0 }; response.StatusCode = (int)HttpStatusCode.OK; return; } var link = StringBuilderPool.Scoped(sb => { if (data.TotalPages > 1) { var firstPage = $"<{GetFirstPage(request, data, queryOptions)}>; rel=\"first\""; sb.Append(firstPage); } if (data.HasNextPage) { var nextPage = $"<{GetNextPage(request, data, queryOptions)}>; rel=\"next\""; if (sb.Length > 0) { sb.Append(", "); } sb.Append(nextPage); } if (data.HasPreviousPage) { var previousPage = $"<{GetPreviousPage(request, data, queryOptions)}>; rel=\"previous\""; if (sb.Length > 0) { sb.Append(", "); } sb.Append(previousPage); } if (data.TotalPages > 1) { var lastPage = $"<{GetLastPage(request, data, queryOptions)}>; rel=\"last\""; if (sb.Length > 0) { sb.Append(", "); } sb.Append(lastPage); } }); if (link.Length > 0) { response.Headers.Add(Constants.HttpHeaders.Link, link); } response.Headers.Add(queryOptions.TotalCountHeader, data.TotalCount.ToString()); response.Headers.Add(queryOptions.TotalPagesHeader, data.TotalPages.ToString()); body = new NestedBody { Data = data, Errors = errors, HasErrors = errors?.Count > 0 }; }
public static void MaybePrettyPrint(this HttpResponse response, HttpRequest request, PublicApiOptions options) { if (FeatureRequested(request, options.JsonConversion.PrettyPrintOperator, options.JsonConversion.PrettyPrintEnabled)) { request.HttpContext.Items[Constants.ContextKeys.JsonPrettyPrint] = true; } }
public static void MaybeEnvelope(this HttpResponse response, HttpRequest request, PublicApiOptions apiOptions, QueryOptions queryOptions, object data, IList <Error> errors, out object body) { if (FeatureRequested(request, apiOptions.JsonConversion.EnvelopeOperator, apiOptions.JsonConversion.EnvelopeEnabled)) { body = new EnvelopeBody { Data = data, Status = response.StatusCode, Headers = response.Headers, Errors = errors, HasErrors = errors?.Count > 0 }; } else { body = new NestedBody { Data = data, Errors = errors, HasErrors = errors?.Count > 0 }; } response.StatusCode = (int)HttpStatusCode.OK; }
public static void MaybeTrim(this HttpResponse response, HttpRequest request, PublicApiOptions options) { if (FeatureRequested(request, options.JsonConversion.TrimOperator, options.JsonConversion.TrimEnabled)) { request.HttpContext.Items[Constants.ContextKeys.JsonTrim] = true; } }
public static string CreateToken <TUser>(TUser user, IEnumerable <Claim> userClaims, SecurityOptions security, PublicApiOptions api) where TUser : IUserIdProvider { var now = DateTimeOffset.Now; var expires = now.AddSeconds(security.Tokens.TimeToLiveSeconds); /* * See: https://tools.ietf.org/html/rfc7519#section-4.1 * All claims are optional, but since our JSON conventions elide null values, * We need to ensure any optional claims are emitted as empty strings. */ // JWT.io claims: var sub = user.Id ?? string.Empty; var jti = $"{Guid.NewGuid()}"; var iat = now.ToUnixTimeSeconds().ToString(); var exp = expires.ToUnixTimeSeconds().ToString(); var nbf = now.ToUnixTimeSeconds().ToString(); var iss = security.Tokens?.Issuer ?? string.Empty; var aud = security.Tokens?.Audience ?? string.Empty; var claims = new List <Claim> { new Claim(JwtRegisteredClaimNames.Sub, sub, ClaimValueTypes.String), new Claim(JwtRegisteredClaimNames.Jti, jti, ClaimValueTypes.String), new Claim(JwtRegisteredClaimNames.Iat, iat, ClaimValueTypes.Integer64), new Claim(JwtRegisteredClaimNames.Nbf, nbf, ClaimValueTypes.Integer64), new Claim(JwtRegisteredClaimNames.Exp, exp, ClaimValueTypes.Integer64) }; claims.AddRange(userClaims); claims.TryAddClaim(security.Claims.ApplicationIdClaim, api.ApiVersion); claims.TryAddClaim(security.Claims.ApplicationNameClaim, api.ApiName); _signing = _signing ?? BuildSigningCredentials(security); _encrypting = _encrypting ?? BuildEncryptingCredentials(security); var handler = new JwtSecurityTokenHandler(); if (security.Tokens.Encrypt) { var descriptor = new SecurityTokenDescriptor { Audience = aud, Issuer = iss, Subject = new ClaimsIdentity(claims), EncryptingCredentials = _encrypting }; return(handler.CreateEncodedJwt(descriptor)); } return(handler.WriteToken(new JwtSecurityToken(iss, aud, claims, now.UtcDateTime, expires.UtcDateTime, _signing))); }