Skip to content

Commit c363a50

Browse files
committed
Rdx 1.0.9-beta
1 parent 1330d42 commit c363a50

File tree

3 files changed

+201
-106
lines changed

3 files changed

+201
-106
lines changed

SmartImage.Lib/SearchClient.cs

Lines changed: 24 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,27 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query,
145145
var results = new SearchResult[tasks.Count];
146146
int i = 0;
147147

148-
while (tasks.Count > 0) {
148+
await foreach (var task in Task.WhenEach(tasks).WithCancellation(token)) {
149+
if (token.IsCancellationRequested) {
150+
151+
Debugger.Break();
152+
s_logger.LogWarning("Cancellation requested");
153+
goto ret;
154+
}
155+
156+
tasks.Remove(task);
157+
158+
if (task.IsFaulted) {
159+
Trace.WriteLine($"{task} faulted!", LogCategories.C_ERROR);
160+
}
161+
162+
SearchResult result = await task;
163+
164+
results[i] = result;
165+
i++;
166+
}
167+
168+
/*while (tasks.Count > 0) {
149169
if (token.IsCancellationRequested) {
150170
151171
Debugger.Break();
@@ -165,8 +185,8 @@ public async Task<SearchResult[]> RunSearchAsync(SearchQuery query,
165185
166186
results[i] = result;
167187
i++;
168-
}
169-
188+
}*/
189+
ret:
170190
CompleteSearchAsync();
171191
OnSearchComplete?.Invoke(this, results);
172192

@@ -313,7 +333,7 @@ public async ValueTask LoadEnginesAsync(CancellationToken token = default)
313333
if (bse is ISearchConfigReceiver cfg) {
314334
await cfg.ApplyConfigAsync(Config, token);
315335
}
316-
336+
317337
/*
318338
if (Config.ReadCookies && bse is ICookiesReceiver ce) {
319339

SmartImage.Rdx/Commands/ServerCommand.cs

Lines changed: 109 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,11 @@
1717
using Kantan.Net;
1818
using SmartImage.Lib.Utilities;
1919
using System.Text.Json.Serialization;
20+
using SmartImage.Lib.Engines;
2021
using SmartImage.Lib.Results;
2122
using Spectre.Console.Rendering;
23+
using System.Threading.Tasks;
24+
using Kantan.Text;
2225

2326
#nullable disable
2427
namespace SmartImage.Rdx.Commands;
@@ -65,7 +68,6 @@ public ServerCommand()
6568

6669
};
6770

68-
6971
m_scs = null;
7072
}
7173

@@ -92,19 +94,25 @@ public override async Task<int> ExecuteAsync(CommandContext context, ServerComma
9294
var uriPrefix = $"http://*:{m_scs.Port}/";
9395
Trace.WriteLine($"{uriPrefix}");
9496

95-
AnsiConsole.WriteLine("Loading...");
96-
await InitConfigAsync(null);
97+
await AnsiConsole.Progress().StartAsync(async ctx =>
98+
{
99+
var task = ctx.AddTask("Starting server");
100+
task.IsIndeterminate = true;
101+
// task.Description = "Initializing config";
102+
await InitConfigAsync(null);
103+
task.Increment(ConsoleFormat.COMPLETE);
104+
});
97105

98106
Listener = new SmartHttpListener(Handlers, uriPrefix);
99107

100-
AnsiConsole.WriteLine("Starting server");
108+
109+
AnsiConsole.WriteLine($"Listening on {Listener.Listener.Prefixes.QuickJoin()}");
101110

102111
await Listener.StartAsync();
103112

104113
return BaseOSIntegration.EC_OK;
105114
}
106115

107-
108116

109117
private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpListenerResponse response)
110118
{
@@ -113,127 +121,98 @@ private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpL
113121
object ok;
114122
var remEndpoint = request.RemoteEndPoint;
115123

116-
Trace.WriteLine($"Request endpoint: {remEndpoint}");
124+
AnsiConsole.WriteLine($"Received request {remEndpoint}");
125+
126+
// Trace.WriteLine($"Request endpoint: {remEndpoint}");
117127

118128
var redirHdr = request.Headers["Redirect"];
119129
var srvResponse = new SearchServerResponse();
120130

121131
try {
122-
var contentType = request.Headers["Content-Type"] ?? MediaTypeNames.Text.Plain;
123-
Debug.WriteLine($"{contentType}");
124-
125-
SearchQuery query;
126-
object sqInput = null;
127-
128-
// contentType??= MediaTypeNames.Multipart.FormData;
129-
130-
var mediaTypeHeaderValue = MediaTypeHeaderValue.Parse(contentType);
131-
132-
using var sc = new StreamContent(request.InputStream);
133-
134-
switch (mediaTypeHeaderValue.MediaType) {
135-
case MediaTypeNames.Text.Plain:
136-
goto default;
132+
SearchQuery query = await GetQuery(request);
137133

138-
case MediaTypeNames.Image.Bmp:
139-
break;
134+
if (query == SearchQuery.Null) {
135+
srvResponse.Message = R1.Err_Query;
136+
}
137+
else {
138+
var url = await query.UploadAsync();
140139

141-
case MediaTypeNames.Multipart.FormData:
142-
var parser = await MultipartFormDataParser.ParseAsync(request.InputStream);
140+
await Client.LoadEnginesAsync();
143141

144-
var file = parser.Files.FirstOrDefault();
142+
var layout = new Layout("Root")
143+
.SplitColumns(new Layout("Left")
144+
.SplitRows(new Layout("LT"), new Layout("LB")),
145+
new Layout("Right"));
145146

146-
if (file == null) {
147-
srvResponse.Message = R1.Err_Content;
148-
}
149-
else {
150-
string filename = file.FileName;
151-
Stream data = file.Data;
152-
sqInput = data;
147+
// LT
153148

154-
}
149+
var grid = ConsoleFormat.CreateConfigGrid(Client.Config, query);
150+
var padding = new Padding(vertical: 1, horizontal: 0);
155151

156-
break;
152+
var gridPanel = new Panel(grid)
153+
{
154+
Padding = padding,
155+
Expand = false
156+
};
157157

158-
default:
159-
sqInput = await sc.ReadAsStringAsync();
160-
break;
161-
}
158+
layout["LT"].Update(gridPanel);
162159

163-
query = await SearchQuery.TryCreateAsync(sqInput);
160+
// LB
164161

165-
if (query == SearchQuery.Null) {
166-
srvResponse.Message = R1.Err_Query;
167-
}
168-
else {
169-
var url = await query.UploadAsync();
162+
var (engineMap, table) = ConsoleFormat.GetEngineMapTable(Client.Engines);
163+
table.Expand = true;
170164

171-
var layout = new Layout("Root")
172-
.SplitColumns(new Layout("Left"),
173-
new Layout("Right"));
165+
layout["LB"].Update(table);
174166

167+
// Right
175168

176-
var grid = ConsoleFormat.CreateConfigGrid(Client.Config, query);
177-
var gridPanel = new Panel(grid) { Padding = null, Expand = false };
178-
layout["Left"].Update(gridPanel);
169+
var canvasImage = ConsoleFormat.GetQueryCanvasImage(query.Source);
179170

180-
var canvasImage = ConsoleFormat.GetQueryCanvasImage(query.Source);
181-
var canvasImagePanel = new Panel(canvasImage) { Padding = null };
171+
var canvasImagePanel = new Panel(canvasImage)
172+
{
173+
Padding = null
174+
};
182175
layout["Right"].Update(canvasImagePanel);
183176

184177
var results = new ConcurrentBag<SearchResult>();
185-
AnsiConsole.Write(layout);
186178

187-
// Console.WriteLine(layout);
188-
await Client.LoadEnginesAsync();
179+
AnsiConsole.Write(layout);
189180

190-
await AnsiConsole.Progress().StartAsync(async ctx =>
181+
await AnsiConsole.Live(layout).StartAsync(async ctx =>
191182
{
192-
var task = ctx.AddTask("Searching", maxValue: Client.Engines.Length);
193-
194-
// srvResponse.Results = await Client.RunSearchAsync(sq);
195-
196183
var search = Client.RunSearchAsync(query);
197184

198185
while (await Client.ResultChannel.Reader.WaitToReadAsync()) {
199186
var result = await Client.ResultChannel.Reader.ReadAsync();
200187

201188
results.Add(result);
189+
var b = engineMap.TryGetValue(result.Engine, out int r);
202190

203-
// m_results.Add(result);
204-
205-
206-
/*var txt = new Text(result.Engine.Name, GetEngineColor(result.Engine.EngineOption));
207-
var txt2 = new Text($"{result.Results.Count}");
191+
if (b) {
192+
table.Rows.Update(r, 1, new Text(result.Results.Count.ToString()));
193+
table.Rows.Update(r, 2, new Text(result.Status.ToString()));
208194

209-
m_mainTable.AddRow(txt, txt2);*/
210-
211-
212-
task.Increment(1);
213-
task.Description = $"{result.Engine.Name}";
214-
ctx.Refresh();
195+
// table.Rows.RemoveAt(r);
196+
ctx.Refresh();
197+
}
215198
}
216199

217200
await search;
218201
srvResponse.Results = results.ToArray();
219202
srvResponse.Best = SearchClient.GetBest(srvResponse.Results);
203+
});
220204

205+
engineMap.Clear();
221206

222-
});
223207
}
224208

225209

226-
/*
227-
var json = JsonSerializer.Serialize(allResults, Options2);
228-
ok = await response.WriteResponseStringAsync(json);
229-
*/
230-
231210
}
232211
catch (IOException io) {
233212
Trace.WriteLine($"{io}");
234213
}
235214
finally {
236-
215+
237216
var responseStr = JsonSerializer.Serialize(srvResponse, Options2);
238217
var responseBytes = Listener.Encoding.GetBytes(responseStr);
239218
var writeOk = await response.WriteResponseDataAsync(responseBytes);
@@ -252,6 +231,56 @@ await AnsiConsole.Progress().StartAsync(async ctx =>
252231
return ok;
253232
}
254233

234+
private static async Task<SearchQuery> GetQuery(HttpListenerRequest request)
235+
{
236+
var contentType = request.Headers["Content-Type"] ?? MediaTypeNames.Text.Plain;
237+
238+
Debug.WriteLine($"{contentType}");
239+
240+
SearchQuery query;
241+
object sqInput = null;
242+
243+
// contentType??= MediaTypeNames.Multipart.FormData;
244+
245+
var mediaTypeHeaderValue = MediaTypeHeaderValue.Parse(contentType);
246+
247+
using var sc = new StreamContent(request.InputStream);
248+
249+
switch (mediaTypeHeaderValue.MediaType) {
250+
case MediaTypeNames.Text.Plain:
251+
goto default;
252+
253+
case MediaTypeNames.Image.Bmp:
254+
break;
255+
256+
case MediaTypeNames.Multipart.FormData:
257+
var parser = await MultipartFormDataParser.ParseAsync(request.InputStream);
258+
259+
var file = parser.Files.FirstOrDefault();
260+
261+
if (file == null) {
262+
// srvResponse.Message = R1.Err_Content;
263+
264+
return null;
265+
}
266+
else {
267+
string filename = file.FileName;
268+
Stream data = file.Data;
269+
sqInput = data;
270+
271+
}
272+
273+
break;
274+
275+
default:
276+
sqInput = await sc.ReadAsStringAsync();
277+
break;
278+
}
279+
280+
query = await SearchQuery.TryCreateAsync(sqInput);
281+
return query;
282+
}
283+
255284
public Task StartAsync(CancellationToken ct = default)
256285
{
257286
return Listener.StartAsync(ct);
@@ -266,4 +295,5 @@ public void Dispose()
266295
}
267296

268297
}
298+
269299
#pragma warning restore IL2026

0 commit comments

Comments
 (0)