Skip to content

Commit 18803bd

Browse files
authored
Preserve dates when deserializing job message from Run Service (actions#3269)
* Preserve dates when deserializing job message from Run Service * Preserve dates when deserializing job message from "Actions Run Service"
1 parent 04b07b6 commit 18803bd

File tree

4 files changed

+114
-21
lines changed

4 files changed

+114
-21
lines changed

src/Runner.Common/ActionsRunServer.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,12 @@ public sealed class ActionsRunServer : RunnerService, IActionsRunServer
2020
{
2121
private bool _hasConnection;
2222
private VssConnection _connection;
23-
private TaskAgentHttpClient _taskAgentClient;
23+
private ActionsRunServerHttpClient _actionsRunServerClient;
2424

2525
public async Task ConnectAsync(Uri serverUrl, VssCredentials credentials)
2626
{
2727
_connection = await EstablishVssConnection(serverUrl, credentials, TimeSpan.FromSeconds(100));
28-
_taskAgentClient = _connection.GetClient<TaskAgentHttpClient>();
28+
_actionsRunServerClient = _connection.GetClient<ActionsRunServerHttpClient>();
2929
_hasConnection = true;
3030
}
3131

@@ -42,7 +42,7 @@ public Task<AgentJobRequestMessage> GetJobMessageAsync(string id, CancellationTo
4242
CheckConnection();
4343
var jobMessage = RetryRequest<AgentJobRequestMessage>(async () =>
4444
{
45-
return await _taskAgentClient.GetJobMessageAsync(id, cancellationToken);
45+
return await _actionsRunServerClient.GetJobMessageAsync(id, cancellationToken);
4646
}, cancellationToken);
4747

4848
return jobMessage;
Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Globalization;
4+
using System.IO;
5+
using System.IO.Compression;
6+
using System.Linq;
7+
using System.Net;
8+
using System.Net.Http;
9+
using System.Net.Http.Headers;
10+
using System.Threading;
11+
using System.Threading.Tasks;
12+
using GitHub.Services.Common;
13+
using GitHub.Services.Common.Diagnostics;
14+
using GitHub.Services.WebApi;
15+
using Newtonsoft.Json;
16+
17+
namespace GitHub.DistributedTask.WebApi
18+
{
19+
[ResourceArea(TaskResourceIds.AreaId)]
20+
public class ActionsRunServerHttpClient : TaskAgentHttpClient
21+
{
22+
private static readonly JsonSerializerSettings s_serializerSettings;
23+
24+
static ActionsRunServerHttpClient()
25+
{
26+
s_serializerSettings = new VssJsonMediaTypeFormatter().SerializerSettings;
27+
s_serializerSettings.DateParseHandling = DateParseHandling.None;
28+
s_serializerSettings.FloatParseHandling = FloatParseHandling.Double;
29+
}
30+
31+
public ActionsRunServerHttpClient(
32+
Uri baseUrl,
33+
VssCredentials credentials)
34+
: base(baseUrl, credentials)
35+
{
36+
}
37+
38+
public ActionsRunServerHttpClient(
39+
Uri baseUrl,
40+
VssCredentials credentials,
41+
VssHttpRequestSettings settings)
42+
: base(baseUrl, credentials, settings)
43+
{
44+
}
45+
46+
public ActionsRunServerHttpClient(
47+
Uri baseUrl,
48+
VssCredentials credentials,
49+
params DelegatingHandler[] handlers)
50+
: base(baseUrl, credentials, handlers)
51+
{
52+
}
53+
54+
public ActionsRunServerHttpClient(
55+
Uri baseUrl,
56+
VssCredentials credentials,
57+
VssHttpRequestSettings settings,
58+
params DelegatingHandler[] handlers)
59+
: base(baseUrl, credentials, settings, handlers)
60+
{
61+
}
62+
63+
public ActionsRunServerHttpClient(
64+
Uri baseUrl,
65+
HttpMessageHandler pipeline,
66+
Boolean disposeHandler)
67+
: base(baseUrl, pipeline, disposeHandler)
68+
{
69+
}
70+
71+
public Task<Pipelines.AgentJobRequestMessage> GetJobMessageAsync(
72+
string messageId,
73+
object userState = null,
74+
CancellationToken cancellationToken = default)
75+
{
76+
HttpMethod httpMethod = new HttpMethod("GET");
77+
Guid locationId = new Guid("25adab70-1379-4186-be8e-b643061ebe3a");
78+
object routeValues = new { messageId = messageId };
79+
80+
return SendAsync<Pipelines.AgentJobRequestMessage>(
81+
httpMethod,
82+
locationId,
83+
routeValues: routeValues,
84+
version: new ApiResourceVersion(6.0, 1),
85+
userState: userState,
86+
cancellationToken: cancellationToken);
87+
}
88+
89+
protected override async Task<T> ReadJsonContentAsync<T>(HttpResponseMessage response, CancellationToken cancellationToken = default(CancellationToken))
90+
{
91+
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
92+
return JsonConvert.DeserializeObject<T>(json, s_serializerSettings);
93+
}
94+
}
95+
}

src/Sdk/DTWebApi/WebApi/TaskAgentHttpClient.cs

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -141,24 +141,6 @@ public Task<TaskAgent> ReplaceAgentAsync(
141141
return ReplaceAgentAsync(poolId, agent.Id, agent, userState, cancellationToken);
142142
}
143143

144-
public Task<Pipelines.AgentJobRequestMessage> GetJobMessageAsync(
145-
string messageId,
146-
object userState = null,
147-
CancellationToken cancellationToken = default)
148-
{
149-
HttpMethod httpMethod = new HttpMethod("GET");
150-
Guid locationId = new Guid("25adab70-1379-4186-be8e-b643061ebe3a");
151-
object routeValues = new { messageId = messageId };
152-
153-
return SendAsync<Pipelines.AgentJobRequestMessage>(
154-
httpMethod,
155-
locationId,
156-
routeValues: routeValues,
157-
version: new ApiResourceVersion(6.0, 1),
158-
userState: userState,
159-
cancellationToken: cancellationToken);
160-
}
161-
162144
protected Task<T> SendAsync<T>(
163145
HttpMethod method,
164146
Guid locationId,

src/Sdk/RSWebApi/RunServiceHttpClient.cs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,23 @@
99
using GitHub.Services.Common;
1010
using GitHub.Services.OAuth;
1111
using GitHub.Services.WebApi;
12+
using Newtonsoft.Json;
1213
using Sdk.RSWebApi.Contracts;
1314
using Sdk.WebApi.WebApi;
1415

1516
namespace GitHub.Actions.RunService.WebApi
1617
{
1718
public class RunServiceHttpClient : RawHttpClientBase
1819
{
20+
private static readonly JsonSerializerSettings s_serializerSettings;
21+
22+
static RunServiceHttpClient()
23+
{
24+
s_serializerSettings = new VssJsonMediaTypeFormatter().SerializerSettings;
25+
s_serializerSettings.DateParseHandling = DateParseHandling.None;
26+
s_serializerSettings.FloatParseHandling = FloatParseHandling.Double;
27+
}
28+
1929
public RunServiceHttpClient(
2030
Uri baseUrl,
2131
VssOAuthCredential credentials)
@@ -174,5 +184,11 @@ public async Task<RenewJobResponse> RenewJobAsync(
174184
throw new Exception($"Failed to renew job: {result.Error}");
175185
}
176186
}
187+
188+
protected override async Task<T> ReadJsonContentAsync<T>(HttpResponseMessage response, CancellationToken cancellationToken = default(CancellationToken))
189+
{
190+
var json = await response.Content.ReadAsStringAsync(cancellationToken).ConfigureAwait(false);
191+
return JsonConvert.DeserializeObject<T>(json, s_serializerSettings);
192+
}
177193
}
178194
}

0 commit comments

Comments
 (0)