Skip to content

Commit 836246c

Browse files
committed
Multipart/form-data parsing
1 parent 63cd5f4 commit 836246c

6 files changed

Lines changed: 68 additions & 13 deletions

File tree

SmartImage.Lib/Engines/Impl/Search/IqdbEngine.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ protected IqdbEngine(string b, string e) : base(b, e)
3636
{
3737
MaxSize = MAX_FILE_SIZE; // NOTE: assuming IQDB uses kilobytes instead of kibibytes
3838

39-
Timeout = TimeSpan.FromSeconds(15);
39+
Timeout = TimeSpan.FromSeconds(25);
4040
}
4141

4242
private const int MAX_FILE_SIZE = 8_388_608;

SmartImage.Lib/Results/Data/ICookiesProvider.cs

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Net;
55
using Flurl.Http;
66
using Kantan.Net.Web;
7+
using SmartImage.Lib.Utilities.Integration;
78

89
namespace SmartImage.Lib.Results.Data;
910

@@ -14,4 +15,13 @@ public interface ICookiesProvider : IDisposable
1415

1516
public static ICookiesProvider Default { get; set; }
1617

18+
public static ICookiesProvider GetProvider()
19+
{
20+
if (BaseOSIntegration.Integration.IsFirefoxInstalled) {
21+
return new BrowserCookiesProvider(new FirefoxCookieReader());
22+
}
23+
24+
return null;
25+
}
26+
1727
}

SmartImage.Lib/SearchConfig.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,10 @@ public bool ReadCookies
161161

162162

163163
// TODO: cookies.txt support
164+
// TODO: specify cookies source
165+
166+
[CBN]
167+
public ICookiesProvider CookiesProvider { get; set; } = ICookiesProvider.Default;
164168

165169
/// <remarks>
166170
///
@@ -200,8 +204,6 @@ public SearchConfig()
200204
};
201205
}
202206

203-
public ICookiesProvider CookiesProvider { get; set; } = ICookiesProvider.Default;
204-
205207
public static readonly Configuration Configuration =
206208
ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
207209

SmartImage.Lib/SearchServer.cs

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@
77
using System.Net.Mime;
88
using System.Net.NetworkInformation;
99
using System.Net.Sockets;
10+
using System.Text;
1011
using System.Text.Json;
1112
using System.Text.Json.Serialization;
1213
using EmptyFiles;
14+
using HttpMultipartParser;
1315
using Kantan.Net;
1416
using Kantan.Net.Utilities;
1517
using Novus.Streams;
1618
using SmartImage.Lib.Images;
19+
using SmartImage.Lib.Images.Uni;
1720
using SmartImage.Lib.Results;
1821
using SmartImage.Lib.Utilities;
1922

@@ -64,6 +67,7 @@ public SearchServer(SearchClient client, int port)
6467

6568

6669
private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpListenerResponse response)
70+
6771
{
6872
object ok;
6973

@@ -74,24 +78,61 @@ private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpL
7478
var ct = request.Headers.Get("Content-Type");
7579
Debug.WriteLine($"{ct}");
7680

77-
switch (ct) {
81+
/*byte[] buf;
82+
83+
using var memoryStream = new MemoryStream();
84+
await request.InputStream.CopyToAsync(memoryStream);
85+
buf = memoryStream.ToArray();
86+
87+
memoryStream.TrySeek();
88+
Debug.WriteLine($"read {memoryStream.Length}");*/
89+
90+
SearchQuery sq;
91+
object sqInput = null;
92+
93+
var mthv = MediaTypeHeaderValue.Parse(ct);
94+
using var sc = new StreamContent(request.InputStream);
95+
96+
var mpfd = await MultipartFormDataParser.ParseAsync(request.InputStream);
97+
98+
// var parser = new StreamingMultipartFormDataParser(request.InputStream);
99+
// byte[] buf1 = null;
100+
// FileStream fs = new FileStream(Path.GetTempFileName(), FileMode.CreateNew);
101+
102+
/*parser.FileHandler += (name, fileName, type, disposition, buffer, bytes, number, properties) =>
103+
{
104+
// buf1 = buffer;
105+
// buffer.CopyTo(buf1,0);
106+
fs.Write(buffer, 0, bytes);
107+
};*/
108+
109+
switch (mthv.MediaType) {
78110
case MediaTypeNames.Text.Plain:
79-
break;
111+
goto default;
80112

81113
case MediaTypeNames.Image.Bmp:
82114
break;
83115

116+
case MediaTypeNames.Multipart.FormData:
117+
// sqInput = mpfd.Files[0].Data;
118+
119+
// await parser.RunAsync();
120+
121+
// sqInput = buf1;
122+
// sqInput = fs;
123+
124+
var file = mpfd.Files.First();
125+
string filename = file.FileName;
126+
Stream data = file.Data;
127+
sqInput = data;
128+
129+
break;
130+
84131
default:
132+
sqInput = await sc.ReadAsStringAsync();
85133
break;
86134
}
87135

88-
using var memoryStream = new MemoryStream();
89-
await request.InputStream.CopyToAsync(memoryStream);
90-
var buf = memoryStream.ToArray();
91-
92-
memoryStream.TrySeek();
93-
Debug.WriteLine($"read {memoryStream.Length}");
94-
95136
/*var sz = await request.ReadRequestStringAsync();
96137
97138
if (String.IsNullOrWhiteSpace(sz)) {
@@ -100,7 +141,7 @@ private async Task<object> HandleRequestAsync(HttpListenerRequest request, HttpL
100141
101142
Debug.WriteLine($"{sz}");*/
102143

103-
var sq = await SearchQuery.TryCreateAsync(memoryStream);
144+
sq = await SearchQuery.TryCreateAsync(sqInput);
104145

105146
if (sq == SearchQuery.Null) {
106147
srvResponse.Message = R1.Err_Query;

SmartImage.Lib/SmartImage.Lib.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@
4545
<PackageReference Include="CoenM.ImageSharp.ImageHash" Version="1.3.6" />
4646
<PackageReference Include="CommunityToolkit.Common" Version="8.4.0" />
4747
<PackageReference Include="Flurl.Http" Version="4.0.2" />
48+
<PackageReference Include="HttpMultipartParser" Version="9.0.0" />
4849
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
4950
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
5051
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />

SmartImage.Rdx/SmartImage.Rdx.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
<PackageReference Include="CoenM.ImageSharp.ImageHash" Version="1.3.6" />
4949
<PackageReference Include="CommunityToolkit.Common" Version="8.4.0" />
5050
<PackageReference Include="Flurl.Http" Version="4.0.2" />
51+
<PackageReference Include="HttpMultipartParser" Version="9.0.0" />
5152
<PackageReference Include="JetBrains.Annotations" Version="2024.3.0" />
5253
<PackageReference Include="Microsoft.Data.Sqlite" Version="9.0.0" />
5354
<PackageReference Include="Microsoft.Extensions.Configuration" Version="9.0.0" />

0 commit comments

Comments
 (0)