Skip to content

Commit 0a73c45

Browse files
committed
#118 Hack into continue param to avoid returning more than 1 imageinfo entry to the caller.
1 parent 7407291 commit 0a73c45

File tree

3 files changed

+34
-5
lines changed

3 files changed

+34
-5
lines changed

UnitTestProject1/Tests/ValidationTests.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ public async Task Issue118()
101101
// Just in case RefreshAsync gets into an infinite loop.
102102
using var cts = new CancellationTokenSource(TimeSpan.FromSeconds(10));
103103

104-
await Assert.ThrowsAsync<UnexpectedContinuationLoopException>(() => page.RefreshAsync(new WikiPageQueryProvider
104+
await page.RefreshAsync(new WikiPageQueryProvider
105105
{
106106
Properties =
107107
{
@@ -111,7 +111,11 @@ await Assert.ThrowsAsync<UnexpectedContinuationLoopException>(() => page.Refresh
111111
new PageInfoPropertyProvider(),
112112
new PagePropertiesPropertyProvider(),
113113
},
114-
}, cts.Token));
114+
}, cts.Token);
115+
116+
ShallowTrace(page.LastFileRevision);
117+
Assert.NotNull(page.LastFileRevision);
118+
Assert.Equal("image/jpeg", page.LastFileRevision!.Mime, StringComparer.OrdinalIgnoreCase);
115119
}
116120

117121
}

WikiClientLibrary/Pages/Queries/Properties/FileInfoPropertyProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ public class FileInfoPropertyProvider : WikiPagePropertyProvider<FileInfoPropert
2828
"url",
2929
"size",
3030
"sha1",
31+
"mime",
3132
};
3233
if (QueryExtMetadata)
3334
properties.Add("extmetadata");

WikiClientLibrary/RequestHelper.cs

Lines changed: 27 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -97,7 +97,7 @@ public static int ParseContinuationParameters(JsonNode jresult, IDictionary<stri
9797
return null;
9898
}
9999

100-
#region Page/Revision query
100+
#region Page/Revision query
101101

102102
public static async IAsyncEnumerable<JsonObject> QueryWithContinuation(WikiSite site,
103103
IEnumerable<KeyValuePair<string, object?>> parameters,
@@ -178,6 +178,13 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
178178
var site = sitePages.Key.Site;
179179
var queryParams = options.EnumParameters(site.SiteInfo.Version).ToDictionary();
180180
var titleLimit = options.GetMaxPaginationSize(site.SiteInfo.Version, site.AccountInfo.HasRight(UserRights.ApiHighLimits));
181+
// Workaround https://github.com/CXuesong/WikiClientLibrary/issues/118
182+
// Currently, `prop=revisions` itself does not trigger continuation unless `rvlimit` has been specified. Good.
183+
// However, `prop=imageinfo` insists it return all the items eventually
184+
// meaning it will trigger continuation even if WCL consumer is only refreshing 1 page and
185+
// might only be interested in the latest n versions.
186+
var needPropImageInfoContinueHack = queryParams.GetValueOrDefault("prop")?.ToString()
187+
?.Contains("imageinfo", StringComparison.Ordinal) ?? false;
181188
using (site.BeginActionScope(sitePages, options))
182189
{
183190
foreach (var partition in sitePages.Partition(titleLimit))
@@ -208,6 +215,20 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
208215
ParseContinuationParameters(jobj1, queryParams1, continuationParams);
209216
while (continuationStatus != CONTINUATION_DONE)
210217
{
218+
if (needPropImageInfoContinueHack
219+
&& partition.Count == 1
220+
&& continuationParams.ContainsKey("iistart"))
221+
{
222+
var continueValue = continuationParams.GetValueOrDefault("continue");
223+
if (continueValue != null && !continueValue.Contains("imageinfo", StringComparison.Ordinal))
224+
{
225+
// Workaround https://github.com/CXuesong/WikiClientLibrary/issues/118
226+
// Fiddle with `continue` so it won't return old file revisions.
227+
continuationParams["continue"] = string.IsNullOrEmpty(continueValue)
228+
? "||imageinfo"
229+
: continueValue + "|imageinfo";
230+
}
231+
}
211232
if (continuationStatus == CONTINUATION_LOOP)
212233
throw new UnexpectedContinuationLoopException();
213234
Debug.Assert(continuationStatus == CONTINUATION_AVAILABLE);
@@ -323,7 +344,7 @@ public static async Task RefreshPagesAsync(IEnumerable<WikiPage> pages, IWikiPag
323344
}
324345
}
325346

326-
#endregion
347+
#endregion
327348

328349
/// <summary>
329350
/// Asynchronously purges the pages.
@@ -408,7 +429,10 @@ public static async Task PatrolAsync(WikiSite site, long? recentChangeId, long?
408429
{
409430
var jresult = await site.InvokeMediaWikiApiAsync(new MediaWikiFormRequestMessage(new
410431
{
411-
action = "patrol", rcid = recentChangeId, revid = revisionId, token = WikiSiteToken.Patrol,
432+
action = "patrol",
433+
rcid = recentChangeId,
434+
revid = revisionId,
435+
token = WikiSiteToken.Patrol,
412436
}), cancellationToken);
413437
if (recentChangeId != null) Debug.Assert((int)jresult["patrol"]["rcid"] == recentChangeId.Value);
414438
}

0 commit comments

Comments
 (0)