Skip to content

Commit 713d2b5

Browse files
committed
Improvements about ContentType, MediaType and Charset in JWT, Swagger and static file middlewares
1 parent 7b47bbd commit 713d2b5

File tree

10 files changed

+377
-218
lines changed

10 files changed

+377
-218
lines changed

samples/swagger_api_versioning_primer/MyControllerU.pas

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -120,7 +120,7 @@ procedure TMyControllerV1.DeleteCustomer(id: Integer);
120120

121121
procedure TMyControllerV2.GetCustomers;
122122
begin
123-
GetCustomers;
123+
inherited GetCustomers;
124124
end;
125125

126126
end.

samples/swagger_api_versioning_primer/SwaggerPrimer.dpr renamed to samples/swagger_api_versioning_primer/SwaggerAPIVersioning.dpr

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
program SwaggerPrimer;
1+
program SwaggerAPIVersioning;
22

33
{$APPTYPE CONSOLE}
44

samples/swagger_api_versioning_primer/SwaggerPrimer.dproj renamed to samples/swagger_api_versioning_primer/SwaggerAPIVersioning.dproj

Lines changed: 277 additions & 142 deletions
Large diffs are not rendered by default.

samples/swagger_primer/SwaggerPrimer.dproj

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
22
<PropertyGroup>
33
<ProjectGuid>{53EA2B08-DB19-4D58-86AE-E3B7DB674D33}</ProjectGuid>
4-
<ProjectVersion>20.2</ProjectVersion>
4+
<ProjectVersion>20.3</ProjectVersion>
55
<FrameworkType>VCL</FrameworkType>
66
<MainSource>SwaggerPrimer.dpr</MainSource>
77
<Base>True</Base>
@@ -271,6 +271,16 @@
271271
<Operation>1</Operation>
272272
</Platform>
273273
</DeployClass>
274+
<DeployClass Name="AndroidSplashStylesV35">
275+
<Platform Name="Android">
276+
<RemoteDir>res\values-v35</RemoteDir>
277+
<Operation>1</Operation>
278+
</Platform>
279+
<Platform Name="Android64">
280+
<RemoteDir>res\values-v35</RemoteDir>
281+
<Operation>1</Operation>
282+
</Platform>
283+
</DeployClass>
274284
<DeployClass Name="Android_AdaptiveIcon">
275285
<Platform Name="Android">
276286
<RemoteDir>res\drawable-anydpi-v26</RemoteDir>

sources/MVCFramework.Middleware.JWT.pas

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -86,7 +86,7 @@ TMVCJWTAuthenticationMiddleware = class(TInterfacedObject, IMVCMiddleware)
8686
protected
8787
function NeedsToBeExtended(const JWTValue: TJWT): Boolean;
8888
procedure ExtendExpirationTime(const JWTValue: TJWT);
89-
procedure InternalRender(AJSONOb: TJDOJsonObject; AContentType: string; AContentEncoding: string;
89+
procedure InternalRender(AJSONOb: TJDOJsonObject; AMediaType: string; AContentCharset: string;
9090
AContext: TWebContext; AInstanceOwner: Boolean = True); virtual;
9191
procedure OnBeforeRouting(AContext: TWebContext; var AHandled: Boolean); virtual;
9292
procedure OnBeforeControllerAction(AContext: TWebContext; const AControllerQualifiedClassName: string;
@@ -272,35 +272,35 @@ procedure TMVCJWTAuthenticationMiddleware.ExtendExpirationTime(const JWTValue: T
272272
end;
273273

274274
procedure TMVCJWTAuthenticationMiddleware.InternalRender(AJSONOb: TJDOJsonObject;
275-
AContentType, AContentEncoding: string; AContext: TWebContext; AInstanceOwner: Boolean);
275+
AMediaType, AContentCharset: string; AContext: TWebContext; AInstanceOwner: Boolean);
276276
var
277-
Encoding: TEncoding;
278-
ContentType, JValue: string;
279-
Cookie: TCookie;
277+
lEncoding: TEncoding;
278+
lContentType, lJValue: string;
279+
lCookie: TCookie;
280280
begin
281-
JValue := AJSONOb.ToJSON;
281+
lJValue := AJSONOb.ToJSON;
282282

283283
if FUseHttpOnly then
284284
begin
285-
Cookie := AContext.Response.Cookies.Add;
286-
Cookie.Expires := FTokenHttpOnlyExpires;
287-
Cookie.Path := '/';
288-
Cookie.Name := 'token';
289-
Cookie.Value := AJSONOb.S['token'];
290-
Cookie.HttpOnly := True;
285+
lCookie := AContext.Response.Cookies.Add;
286+
lCookie.Expires := FTokenHttpOnlyExpires;
287+
lCookie.Path := '/';
288+
lCookie.Name := 'token';
289+
lCookie.Value := AJSONOb.S['token'];
290+
lCookie.HttpOnly := True;
291291
// Cookie.Secure := True;
292292
// Cookie.SameSite := 'none';
293293
end;
294294

295-
AContext.Response.RawWebResponse.ContentType := AContentType + '; charset=' + AContentEncoding;
296-
ContentType := AContentType + '; charset=' + AContentEncoding;
295+
lContentType := BuildContentType(AMediaType, AContentCharset);
296+
AContext.Response.RawWebResponse.ContentType := lContentType;
297297

298-
Encoding := TEncoding.GetEncoding(AContentEncoding);
298+
lEncoding := TEncoding.GetEncoding(AContentCharset);
299299
try
300-
AContext.Response.SetContentStream(TBytesStream.Create(TEncoding.Convert(TEncoding.Default, Encoding,
301-
TEncoding.Default.GetBytes(JValue))), ContentType);
300+
AContext.Response.SetContentStream(TBytesStream.Create(TEncoding.Convert(TEncoding.Default, lEncoding,
301+
TEncoding.Default.GetBytes(lJValue))), lContentType);
302302
finally
303-
Encoding.Free;
303+
lEncoding.Free;
304304
end;
305305

306306
if AInstanceOwner then

sources/MVCFramework.Middleware.StaticFiles.pas

Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -52,10 +52,6 @@ TMVCStaticFilesDefaults = class sealed
5252
/// </summary>
5353
INDEX_DOCUMENT = 'index.html';
5454

55-
/// <summary>
56-
/// Charset of static files
57-
/// </summary>
58-
STATIC_FILES_CONTENT_CHARSET = TMVCConstants.DEFAULT_CONTENT_CHARSET;
5955
end;
6056

6157
TMVCStaticFileRulesProc = reference to procedure(const Context: TWebContext; var PathInfo: String; var Handled: Boolean);
@@ -81,7 +77,6 @@ TMVCStaticFilesMiddleware = class(TInterfacedObject, IMVCMiddleware)
8177
const ADocumentRoot: string = TMVCStaticFilesDefaults.DOCUMENT_ROOT;
8278
const AIndexDocument: string = TMVCStaticFilesDefaults.INDEX_DOCUMENT;
8379
const ASPAWebAppSupport: Boolean = True;
84-
const AStaticFilesCharset: string = TMVCStaticFilesDefaults.STATIC_FILES_CONTENT_CHARSET;
8580
const ARules: TMVCStaticFileRulesProc = nil;
8681
const AMediaTypesCustomizer: TMVCStaticFileMediaTypesCustomizer = nil);
8782
destructor Destroy; override;
@@ -102,7 +97,6 @@ TMVCStaticFilesMiddleware = class(TInterfacedObject, IMVCMiddleware)
10297
const ADocumentRoot: string = TMVCStaticFilesDefaults.DOCUMENT_ROOT;
10398
const AIndexDocument: string = TMVCStaticFilesDefaults.INDEX_DOCUMENT;
10499
const ASPAWebAppSupport: Boolean = True;
105-
const AStaticFilesCharset: string = TMVCStaticFilesDefaults.STATIC_FILES_CONTENT_CHARSET;
106100
const ARules: TMVCStaticFileRulesProc = nil;
107101
const AMediaTypesCustomizer: TMVCStaticFileMediaTypesCustomizer = nil): IMVCMiddleware;
108102

@@ -120,7 +114,6 @@ function UseStaticFilesMiddleware(
120114
const aDocumentRoot: string = TMVCStaticFilesDefaults.DOCUMENT_ROOT;
121115
const aIndexDocument: string = TMVCStaticFilesDefaults.INDEX_DOCUMENT;
122116
const aSPAWebAppSupport: Boolean = True;
123-
const aStaticFilesCharset: string = TMVCStaticFilesDefaults.STATIC_FILES_CONTENT_CHARSET;
124117
const aRules: TMVCStaticFileRulesProc = nil;
125118
const aMediaTypesCustomizer: TMVCStaticFileMediaTypesCustomizer = nil): IMVCMiddleware;
126119
begin
@@ -129,7 +122,6 @@ function UseStaticFilesMiddleware(
129122
aDocumentRoot,
130123
aIndexDocument,
131124
aSPAWebAppSupport,
132-
aStaticFilesCharset,
133125
aRules,
134126
aMediaTypesCustomizer
135127
);
@@ -139,24 +131,24 @@ function UseStaticFilesMiddleware(
139131

140132
procedure TMVCStaticFilesMiddleware.AddMediaTypes;
141133
begin
142-
fMediaTypes.Add('.html', TMVCMediaType.TEXT_HTML);
143-
fMediaTypes.Add('.htm', TMVCMediaType.TEXT_HTML);
144-
fMediaTypes.Add('.txt', TMVCMediaType.TEXT_PLAIN);
145-
fMediaTypes.Add('.text', TMVCMediaType.TEXT_PLAIN);
146-
fMediaTypes.Add('.csv', TMVCMediaType.TEXT_CSV);
147-
fMediaTypes.Add('.css', TMVCMediaType.TEXT_CSS);
148-
fMediaTypes.Add('.js', TMVCMediaType.TEXT_JAVASCRIPT);
149-
fMediaTypes.Add('.json', TMVCMediaType.APPLICATION_JSON);
134+
fMediaTypes.Add('.html', TMVCMediaType.TEXT_HTML + ';charset=' + TMVCCharSet.UTF_8);
135+
fMediaTypes.Add('.htm', TMVCMediaType.TEXT_HTML + ';charset=' + TMVCCharSet.UTF_8);
136+
fMediaTypes.Add('.txt', TMVCMediaType.TEXT_PLAIN + ';charset=' + TMVCCharSet.US_ASCII);
137+
fMediaTypes.Add('.text', TMVCMediaType.TEXT_PLAIN + ';charset=' + TMVCCharSet.US_ASCII);
138+
fMediaTypes.Add('.csv', TMVCMediaType.TEXT_CSV + ';charset=' + TMVCCharSet.UTF_8);
139+
fMediaTypes.Add('.css', TMVCMediaType.TEXT_CSS + ';charset=' + TMVCCharSet.UTF_8);
140+
fMediaTypes.Add('.js', TMVCMediaType.TEXT_JAVASCRIPT + ';charset=' + TMVCCharSet.UTF_8);
141+
fMediaTypes.Add('.json', TMVCMediaType.APPLICATION_JSON + ';charset=' + TMVCCharSet.UTF_8);
150142
fMediaTypes.Add('.jpg', TMVCMediaType.IMAGE_JPEG);
151143
fMediaTypes.Add('.jpeg', TMVCMediaType.IMAGE_JPEG);
152144
fMediaTypes.Add('.jpe', TMVCMediaType.IMAGE_JPEG);
153145
fMediaTypes.Add('.png', TMVCMediaType.IMAGE_PNG);
154146
fMediaTypes.Add('.ico', TMVCMediaType.IMAGE_X_ICON);
155147
fMediaTypes.Add('.appcache', TMVCMediaType.TEXT_CACHEMANIFEST);
156148
fMediaTypes.Add('.svg', TMVCMediaType.IMAGE_SVG_XML);
157-
fMediaTypes.Add('.xml', TMVCMediaType.TEXT_XML);
149+
fMediaTypes.Add('.xml', TMVCMediaType.TEXT_XML + ';charset=' + TMVCCharSet.UTF_8);
158150
fMediaTypes.Add('.pdf', TMVCMediaType.APPLICATION_PDF);
159-
fMediaTypes.Add('.svgz', TMVCMediaType.IMAGE_SVG_XML);
151+
fMediaTypes.Add('.svgz', TMVCMediaType.IMAGE_SVG_XML + ';charset=' + TMVCCharSet.UTF_8);
160152
fMediaTypes.Add('.gif', TMVCMediaType.IMAGE_GIF);
161153
end;
162154

@@ -165,7 +157,6 @@ constructor TMVCStaticFilesMiddleware.Create(
165157
const ADocumentRoot: string;
166158
const AIndexDocument: string;
167159
const ASPAWebAppSupport: Boolean;
168-
const AStaticFilesCharset: string;
169160
const ARules: TMVCStaticFileRulesProc;
170161
const AMediaTypesCustomizer: TMVCStaticFileMediaTypesCustomizer);
171162
begin
@@ -184,7 +175,6 @@ constructor TMVCStaticFilesMiddleware.Create(
184175
fDocumentRoot := TPath.Combine(AppPath, ADocumentRoot);
185176
end;
186177
fIndexDocument := AIndexDocument;
187-
fStaticFilesCharset := AStaticFilesCharset;
188178
fSPAWebAppSupport := ASPAWebAppSupport;
189179
fMediaTypes := TMVCStringDictionary.Create;
190180
fRules := ARules;

sources/MVCFramework.Middleware.Swagger.pas

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -582,19 +582,11 @@ procedure TMVCSwaggerMiddleware.DocumentApiSettings(AContext: TWebContext; ASwag
582582

583583
procedure TMVCSwaggerMiddleware.InternalRender(AContent: string; AContext: TWebContext);
584584
var
585-
LContentType: string;
586-
LEncoding: TEncoding;
585+
lContentType: String;
587586
begin
588-
LContentType := BuildContentType(TMVCMediaType.APPLICATION_JSON, TMVCConstants.DEFAULT_CONTENT_CHARSET);
587+
lContentType := BuildContentType(TMVCMediaType.APPLICATION_JSON, TMVCCharSet.UTF_8);
589588
AContext.Response.RawWebResponse.ContentType := LContentType;
590-
591-
LEncoding := TEncoding.GetEncoding(TMVCConstants.DEFAULT_CONTENT_CHARSET);
592-
try
593-
AContext.Response.SetContentStream(TBytesStream.Create(TEncoding.Convert(TEncoding.Default, LEncoding,
594-
TEncoding.Default.GetBytes(AContent))), LContentType);
595-
finally
596-
LEncoding.Free;
597-
end;
589+
AContext.Response.SetContentStream(TStringStream.Create(AContent, TEncoding.UTF8), lContentType);
598590
end;
599591

600592
procedure TMVCSwaggerMiddleware.OnAfterControllerAction(AContext: TWebContext;

sources/MVCFramework.pas

Lines changed: 41 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -479,6 +479,7 @@ TMVCWebResponse = class
479479
procedure SetContentType(const AValue: string);
480480
procedure SetLocation(const AValue: string);
481481
procedure SetContent(const AValue: string);
482+
procedure SetContentEncoding(const Value: string);
482483
public
483484
constructor Create(const AWebResponse: TWebResponse);
484485
destructor Destroy; override;
@@ -489,7 +490,7 @@ TMVCWebResponse = class
489490
property StatusCode: Integer read GetStatusCode write SetStatusCode;
490491
property ReasonString: string read GetReasonString write SetReasonString;
491492
property ContentType: string read GetContentType write SetContentType;
492-
property ContentEncoding: string read GetContentEncoding;
493+
property ContentEncoding: string read GetContentEncoding write SetContentEncoding;
493494
property CustomHeaders: TStrings read GetCustomHeaders;
494495
property Cookies: TCookieCollection read GetCookies;
495496
property Location: string read GetLocation write SetLocation;
@@ -715,6 +716,7 @@ TMVCRenderer = class(TMVCBase)
715716
procedure SetContext(const Context: TWebContext);
716717
procedure Redirect(const AUrl: string); virtual;
717718
procedure ResponseStatus(const AStatusCode: Integer; const AReasonString: string = ''); virtual;
719+
property ContentType: string read GetContentType write SetContentType;
718720
class procedure InternalRenderMVCResponse(const Controller: TMVCRenderer; const MVCResponse: TMVCResponse);
719721

720722
////////////////////////////////////////////////////////////////////////////
@@ -967,7 +969,6 @@ TMVCController = class(TMVCRenderer)
967969
// Properties
968970
property Context: TWebContext read GetContext write SetContext;
969971
property Session: TMVCWebSession read GetSession;
970-
property ContentType: string read GetContentType write SetContentType;
971972
property StatusCode: Integer read GetStatusCode write SetStatusCode;
972973
procedure PushObjectToView(const aModelName: string; const AModel: TObject);
973974
deprecated 'Use "ViewData"';
@@ -2059,7 +2060,7 @@ function TMVCWebResponse.GetContentEncoding: string;
20592060

20602061
function TMVCWebResponse.GetContentType: string;
20612062
begin
2062-
Result := BuildContentType(FWebResponse.ContentType, FWebResponse.ContentEncoding);
2063+
Result := FWebResponse.ContentType;
20632064
end;
20642065

20652066
function TMVCWebResponse.GetCookies: TCookieCollection;
@@ -2092,6 +2093,11 @@ procedure TMVCWebResponse.SetContent(const AValue: string);
20922093
FWebResponse.Content := AValue;
20932094
end;
20942095

2096+
procedure TMVCWebResponse.SetContentEncoding(const Value: string);
2097+
begin
2098+
FWebResponse.ContentEncoding := Value;
2099+
end;
2100+
20952101
procedure TMVCWebResponse.SetContentStream(const AStream: TStream; const AContentType: string);
20962102
begin
20972103
FWebResponse.ContentStream := AStream;
@@ -4069,12 +4075,12 @@ function TMVCRenderer.CreatedResponse(const Location: string;
40694075
function TMVCRenderer.GetContentType: string;
40704076
begin
40714077
Result := GetContext.Response.ContentType;
4072-
if Result.IsEmpty or FContentCharset.IsEmpty then
4073-
begin
4074-
Result := FContext.FConfig[MVCFramework.Commons.TMVCConfigKey.DefaultContentType];
4075-
GetContext.Response.ContentType := Result;
4076-
SplitContentMediaTypeAndCharset(Result, FContentMediaType, FContentCharset); //update FContentMediaType, FContentCharset
4077-
end;
4078+
// if Result.IsEmpty then
4079+
// begin
4080+
// Result := FContext.FConfig[MVCFramework.Commons.TMVCConfigKey.DefaultContentType];
4081+
// GetContext.Response.ContentType := Result;
4082+
// SplitContentMediaTypeAndCharset(Result, FContentMediaType, FContentCharset); //update FContentMediaType, FContentCharset
4083+
// end;
40784084
end;
40794085

40804086
function TMVCRenderer.GetContext: TWebContext;
@@ -4419,18 +4425,24 @@ procedure TMVCRenderer.Render(const AContent: string);
44194425
end
44204426
else
44214427
begin
4422-
lOutEncoding := TEncoding.GetEncoding(FContentCharset);
4423-
try
4424-
GetContext
4425-
.Response
4426-
.SetContentStream(
4427-
TBytesStream.Create(
4428-
TEncoding.Convert(
4429-
TEncoding.Default,
4430-
lOutEncoding,
4431-
TEncoding.Default.GetBytes(AContent))), GetContentType);
4432-
finally
4433-
lOutEncoding.Free;
4428+
if FContentCharset.IsEmpty then
4429+
begin
4430+
lWebResponse.SetContentStream(TStringStream.Create(AContent, TEncoding.Default, False), GetContentType);
4431+
end
4432+
else
4433+
begin
4434+
lOutEncoding := TEncoding.GetEncoding(FContentCharset);
4435+
try
4436+
lWebResponse
4437+
.SetContentStream(
4438+
TBytesStream.Create(
4439+
TEncoding.Convert(
4440+
TEncoding.Default,
4441+
lOutEncoding,
4442+
TEncoding.Default.GetBytes(AContent))), GetContentType);
4443+
finally
4444+
lOutEncoding.Free;
4445+
end;
44344446
end;
44354447
end;
44364448
end;
@@ -4531,7 +4543,7 @@ procedure TMVCRenderer.SendStream(const AStream: TStream; const AOwns: Boolean;
45314543
end;
45324544

45334545
GetContext.Response.RawWebResponse.Content := EmptyStr;
4534-
GetContext.Response.RawWebResponse.ContentType := GetContentType;
4546+
// GetContext.Response.RawWebResponse.ContentType := GetContentType;
45354547
GetContext.Response.RawWebResponse.ContentStream := lTemp;
45364548
GetContext.Response.RawWebResponse.FreeContentStream := True;
45374549
end;
@@ -4549,8 +4561,14 @@ function TMVCController.SessionAs<T>: T;
45494561
end;
45504562

45514563
procedure TMVCRenderer.SetContentType(const AValue: string);
4564+
var
4565+
lContentType, lContentMediaType, lContentCharset: String;
45524566
begin
4553-
GetContext.Response.ContentType := AValue.Trim;
4567+
lContentType := AValue.Trim;
4568+
GetContext.Response.ContentType := lContentType;
4569+
SplitContentMediaTypeAndCharset(lContentType, lContentMediaType, lContentCharset);
4570+
FContentCharset := lContentCharset;
4571+
FContentMediaType := lContentMediaType;
45544572
end;
45554573

45564574
procedure TMVCRenderer.SetContext(const Context: TWebContext);

unittests/general/TestClient/DMVCFrameworkTests.dpr

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,8 @@ uses
8282
TestDataSetCSVSerializer in 'TestDataSetCSVSerializer.pas',
8383
MVCFramework.BloomFilter in '..\..\..\sources\MVCFramework.BloomFilter.pas',
8484
TestsBloomFilterU in 'TestsBloomFilterU.pas',
85-
DotEnvTestU in 'DotEnvTestU.pas';
85+
DotEnvTestU in 'DotEnvTestU.pas',
86+
MVCFramework.Middleware.RateLimit in '..\..\..\sources\MVCFramework.Middleware.RateLimit.pas';
8687

8788
{$R *.RES}
8889

unittests/general/TestClient/DMVCFrameworkTests.dproj

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,7 @@
281281
<DCCReference Include="..\..\..\sources\MVCFramework.BloomFilter.pas"/>
282282
<DCCReference Include="TestsBloomFilterU.pas"/>
283283
<DCCReference Include="DotEnvTestU.pas"/>
284+
<DCCReference Include="..\..\..\sources\MVCFramework.Middleware.RateLimit.pas"/>
284285
<BuildConfiguration Include="Base">
285286
<Key>Base</Key>
286287
</BuildConfiguration>
@@ -375,13 +376,25 @@
375376
<DeployFile LocalName="Win32\Debug\DMVCFrameworkTests.rsm" Configuration="Debug" Class="DebugSymbols"/>
376377
<DeployFile LocalName="bin32\DMVCFrameworkTests.exe" Configuration="TESTINSIGHT" Class="ProjectOutput"/>
377378
<DeployFile LocalName="bin32\DMVCFrameworkTests.rsm" Configuration="TESTINSIGHT" Class="DebugSymbols"/>
379+
<DeployFile LocalName="bin64\DMVCFrameworkTests.exe" Configuration="CI" Class="ProjectOutput">
380+
<Platform Name="Win64">
381+
<RemoteName>DMVCFrameworkTests.exe</RemoteName>
382+
<Overwrite>true</Overwrite>
383+
</Platform>
384+
</DeployFile>
378385
<DeployFile LocalName="bin64\DMVCFrameworkTests.exe" Configuration="TESTINSIGHT" Class="ProjectOutput"/>
379386
<DeployFile LocalName="bin64\DMVCFrameworkTests.exe" Configuration="TESTINSIGHT" Class="ProjectOutput">
380387
<Platform Name="Win64">
381388
<RemoteName>DMVCFrameworkTests.exe</RemoteName>
382389
<Overwrite>true</Overwrite>
383390
</Platform>
384391
</DeployFile>
392+
<DeployFile LocalName="bin64\DMVCFrameworkTests.rsm" Configuration="CI" Class="DebugSymbols">
393+
<Platform Name="Win64">
394+
<RemoteName>DMVCFrameworkTests.rsm</RemoteName>
395+
<Overwrite>true</Overwrite>
396+
</Platform>
397+
</DeployFile>
385398
<DeployFile LocalName="bin64\DMVCFrameworkTests.rsm" Configuration="TESTINSIGHT" Class="DebugSymbols"/>
386399
<DeployFile LocalName="bin64\DMVCFrameworkTests.rsm" Configuration="TESTINSIGHT" Class="DebugSymbols">
387400
<Platform Name="Win64">

0 commit comments

Comments
 (0)