Skip to content

Commit e36c4b5

Browse files
committed
Updating from source commit d3c900a097e16377211871308025f04ca8b5566c on 2025-08-16T14:19:33-07:00
1 parent 1558edf commit e36c4b5

File tree

9 files changed

+34
-33
lines changed

9 files changed

+34
-33
lines changed

src/Codex.Application/Codex.Application.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@
2929
<PackageReference Include="LibGit2Sharp.NativeBinaries" />
3030
<PackageReference Include="Microsoft.Build.Locator" />
3131
<PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" />
32+
<PackageReference Include="Microsoft.Net.Http.Headers" />
3233

3334
<PackageReference Include="Mono.Options"/>
3435
</ItemGroup>

src/Codex.Application/Verbs/ZipPutOperation.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ protected override async ValueTask InitializeAsync()
2828
await base.InitializeAsync();
2929
SourcePath = Path.GetFullPath(SourcePath);
3030
TargetZipPath = Path.GetFullPath(TargetZipPath);
31-
EntryPathPrefix = EntryPathPrefix?.EnsureTrailingSlash("/", normalize: true);
31+
EntryPathPrefix = EntryPathPrefix?.EnsureTrailingSlash('/', normalize: true);
3232
}
3333

3434
protected override async ValueTask<int> ExecuteAsync()

src/Codex.Integration.Tests/CodexTestBase.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ public record CodexTestBase : IDisposable
2626

2727
public Action<AnalyzeOperation> UpdateAnalyze { get; set; }
2828

29+
public const string IndexContainer = "indexcontainer";
30+
2931
public bool CleanTestDir { get; set; }
3032
public ITestOutputHelper Output { get; }
3133
public TestLogger Logger { get; }

src/Codex.Integration.Tests/UtilitiesTests.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -30,16 +30,16 @@ public partial record UtilitiesTests(ITestOutputHelper output) : CodexTestBase(o
3030
{
3131
private static ISpanSerializer<SmallIntArray> ValueArraySerializer = new BinaryItemSerializer<SmallIntArray>();
3232

33-
[Fact]
34-
public void UriCombine()
33+
[Theory]
34+
[InlineData("https://local:234?hello=world", "relative/index", "https://local:234/relative/index?hello=world")]
35+
[InlineData(
36+
"http://127.0.0.1:33747/devstoreaccount1/testcontainer/index.zip?sv=2023-08-03&ss=b&srt=sco&se=2025-08-16T12%3A46%3A25Z&sp=rwdxylacuptfi&sig=rIFwMOwdtKWddOW6nTHNPrMB%2BSg724E%2BaM7HZ8%2BgRHE%3D",
37+
"",
38+
"http://127.0.0.1:33747/devstoreaccount1/testcontainer/index.zip?sv=2023-08-03&ss=b&srt=sco&se=2025-08-16T12%3A46%3A25Z&sp=rwdxylacuptfi&sig=rIFwMOwdtKWddOW6nTHNPrMB%2BSg724E%2BaM7HZ8%2BgRHE%3D")]
39+
public void UriCombine(string baseUri, string relativeUri, string expected, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
3540
{
36-
test("https://local:234?hello=world", "relative/index", "https://local:234/relative/index?hello=world");
37-
38-
void test(string baseUri, string relativeUri, string expected, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
39-
{
40-
var actual = PathUtilities.Combine(baseUri, relativeUri, preserveBaseQuery, forcePreserveBaseQuery);
41-
actual.ToString().Should().Be(expected);
42-
}
41+
var actual = PathUtilities.Combine(baseUri, relativeUri, preserveBaseQuery, forcePreserveBaseQuery);
42+
actual.ToString().Should().Be(expected);
4343
}
4444

4545
[Fact]

src/Codex.Lucene/Paging/FileSystemPageFileAccessor.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ public class FileSystemPageFileAccessor : IPageFileAccessor, IHttpClient
1818
public FileSystemPageFileAccessor(string rootDirectory)
1919
{
2020
RootDirectory = rootDirectory;
21-
BaseAddress = new Uri(RootDirectory);
21+
BaseAddress = new Uri(RootDirectory.EnsureTrailingSlash(normalize: true));
2222
}
2323

2424
public IPageFileState CreateState(string path, PagingFileEntry entry)
@@ -119,8 +119,10 @@ public async Task<HttpResponseMessage> SendMessageAsync(HttpRequestMessage reque
119119
{
120120
var range = request.ExtractRange();
121121

122+
var fullUri = BaseAddress.Combine(request.RequestUri.WithoutQuery().ToString(), preserveBaseQuery: false);
123+
122124
using var stream = await OpenStreamCoreAsync(
123-
request.RequestUri.OriginalString.AsSpan().SubstringFromFirstIndexOfAny("?").ToString(),
125+
fullUri.AbsolutePath,
124126
range,
125127
writable: false,
126128
httpMode: true) as MemoryStream;

src/Codex.ObjectModel/Utilities/PathUtilities.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,15 +46,22 @@ public static Url Combine(this Url baseUri, string relativeUri, bool preserveBas
4646
return baseUri.Uri.Combine(relativeUri, preserveBaseQuery, forcePreserveBaseQuery);
4747
}
4848

49-
public static Uri Combine(this Uri baseUri, string relativeUri, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false)
49+
public static Uri Combine(this Uri baseUri, string relativeUri, bool preserveBaseQuery = true, bool forcePreserveBaseQuery = false, bool treatBaseAsFolder = true)
5050
{
51+
if (string.IsNullOrEmpty(relativeUri))
52+
{
53+
return baseUri;
54+
}
55+
5156
if ((!forcePreserveBaseQuery || string.IsNullOrEmpty(baseUri.Query))
5257
&& relativeUri?.Contains(":") == true)
5358
{
5459
return new Uri(relativeUri);
5560
}
5661

57-
var result = new Uri(baseUri.EnsureTrailingSlash(), relativeUri);
62+
baseUri = treatBaseAsFolder ? baseUri.EnsureTrailingSlash() : baseUri;
63+
64+
var result = new Uri(baseUri, relativeUri);
5865
if (preserveBaseQuery && !string.IsNullOrEmpty(baseUri.Query))
5966
{
6067
var builder = new UriBuilder(result);

src/Codex.ObjectModel/Utilities/Paths.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,20 +141,20 @@ public static string NormalizeSlashes(this string path, char? slash = null)
141141
}
142142
}
143143

144-
public static string EnsureTrailingSlash(this string path, string slash = null, bool normalize = false)
144+
public static string EnsureTrailingSlash(this string path, char? slash = null, bool normalize = false)
145145
{
146-
slash ??= DirectorySeparator;
146+
slash ??= DirectorySeparatorChar;
147147
if (string.IsNullOrEmpty(path))
148148
{
149149
return path;
150150
}
151151

152152
if (normalize)
153153
{
154-
path = PathUtilities.NormalizePath(path);
154+
path = PathUtilities.NormalizePath(path, directorySeparator: slash);
155155
}
156156

157-
if (!path.EndsWith(slash))
157+
if (!path.EndsWith(slash.Value))
158158
{
159159
path += slash;
160160
}

src/Codex.Sdk/Http/HttpClient.cs

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,9 @@ private HttpResponseMessage HandleResponse(HttpResponseMessage response)
7575
uri = new Uri(uri.OriginalString.Replace('?', '&'), UriKind.RelativeOrAbsolute);
7676
}
7777

78-
// Only need to modify uri if both contain query strings
79-
if (string.IsNullOrEmpty(BaseAddress?.Query) || uri == null) return uri;
78+
if (uri == null) return uri;
8079

81-
var fullUri = new Uri(BaseAddress, uri);
82-
var builder = new UriBuilder(fullUri);
83-
84-
builder.Query = string.IsNullOrEmpty(builder.Query)
85-
? BaseAddress.Query
86-
: $"{builder.Query}&{BaseAddress.Query.AsSpan().TrimStart('?')}";
87-
88-
return builder.Uri;
80+
return BaseAddress.Combine(uri.ToString(), forcePreserveBaseQuery: true);
8981
}
9082
}
9183

src/Codex.Web.Common/WebProgramBase.cs

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -170,11 +170,8 @@ protected virtual string GetIndexSourceUrl(IndexSourceLocation indexSource)
170170
}
171171
else
172172
{
173-
var sourceUri = new Uri(url.Replace('\\', '/').TrimStart('/'), UriKind.Relative);
174-
var uriBuilder = new UriBuilder(args.RootUrl);
175-
uriBuilder.Path = PathUtilities.UriCombine(uriBuilder.Path, sourceUri.GetComponents(UriComponents.Path, UriFormat.Unescaped));
176-
uriBuilder.Query = sourceUri.Query;
177-
return uriBuilder.Uri.ToString();
173+
var result = args.RootUrl.Combine(args.IndexSourceJsonUri).Combine(url, treatBaseAsFolder: false);
174+
return result.ToString();
178175
}
179176
}
180177

0 commit comments

Comments
 (0)