사실 .. 머 꿀 팁이라는 것이 없어요.
자꾸 깃허브에 커밋을 안 하여요.
지난 코드는 이케 되어있쩌.
public override long ReadPostCallback(Span<byte> buf, long count_bytes) {
var count_bytes2 = (int)count_bytes;
int buf_size = 0;
var req_stream = Ctx.Request.BodyReader.AsStream(true);
int read_size;
do {
var span = buf.Slice(buf_size, count_bytes2 - buf_size);
read_size = req_stream.Read(span);
buf_size += read_size;
if(read_size <= 0) {
Finish();
break;
}
} while(buf_size < count_bytes);
return buf_size;
async void Finish() {
await req_stream.DisposeAsync();
await Ctx.Request.BodyReader.CompleteAsync();
}
}이렇게 변경 하였다가 ..
public override long ReadPostCallback(Span<byte> buf, long count_bytes) {
var count_bytes2 = (int)count_bytes;
int buf_size = 0;
using (var req_stream = reader.AsStream(true)) {
do {
var span = buf.Slice(buf_size, count_bytes2 - buf_size);
var read_size = req_stream.Read(span);
if (read_size <= 0) {
break;
}
buf_size += read_size;
} while (buf_size < count_bytes);
}
reader.Complete();
return buf_size;
}그냥 async 함수로 변경하였어요. 이렇게 하면 BodyReader에서 PipeReader객체를 가져와서 사용할 수 있어요. 비동기 함수에 Span<byte>를 넘길 수 없어서 주소 값을 넘기고 ToSpan은 그냥 unsafe 함수로 구현을 하였쩌.
public async override ValueTask<long> ReadPostCallback(nint buf, long count_bytes) {
var reader = Ctx.Request.BodyReader;
var result = await reader.ReadAsync();
var buffer = result.Buffer;
var length = Math.Min(buffer.Length, count_bytes);
var span = ToSpan(buf, (int)count_bytes);
buffer.Slice(0, length).CopyTo(span);
reader.AdvanceTo(buffer.Start, buffer.GetPosition(length));
if (result.IsCompleted == true) {
reader.Complete();
}
return length;
}꿀 팁이라는 것이 애초에 없지 않나요. 계속 건드릴 것 같은데요. 몇 해 동안은 안 건드렸으면 ..
