Fix POST ctx.ParseBody(); (Actually fixed it this time)
This commit is contained in:
parent
0ff38b0211
commit
8a912e2a86
|
@ -12,6 +12,21 @@ namespace Tesses.WebServer.ConsoleApp
|
|||
}
|
||||
Random rand = new Random();
|
||||
int count = 0;
|
||||
public override async Task PostAsync(ServerContext ctx)
|
||||
{
|
||||
ctx.ParseBody();
|
||||
foreach(var item in ctx.QueryParams)
|
||||
{
|
||||
Console.WriteLine($"{item.Key}:");
|
||||
foreach(var p in item.Value)
|
||||
{
|
||||
Console.WriteLine($"\t{p}");
|
||||
}
|
||||
Console.WriteLine();
|
||||
|
||||
}
|
||||
await ctx.SendTextAsync("HELLO");
|
||||
}
|
||||
public override async Task GetAsync(ServerContext ctx)
|
||||
{
|
||||
//Console.WriteLine("HANDLE");
|
||||
|
|
|
@ -17,6 +17,11 @@ internal class SizedStream : Stream
|
|||
this.len=len;
|
||||
}
|
||||
|
||||
public override int ReadByte()
|
||||
{
|
||||
if(pos >= len) return -1;
|
||||
return strm.ReadByte();
|
||||
}
|
||||
public override bool CanRead => strm.CanRead;
|
||||
|
||||
public override bool CanSeek => false;
|
||||
|
@ -35,8 +40,10 @@ internal class SizedStream : Stream
|
|||
public override int Read(byte[] buffer, int offset, int count)
|
||||
{
|
||||
int read=(int)Math.Min(count,len-pos);
|
||||
if(read == 0) return 0;
|
||||
|
||||
read=strm.Read(buffer,offset,read);
|
||||
|
||||
pos+=read;
|
||||
|
||||
return read;
|
||||
|
@ -219,9 +226,11 @@ internal class SizedStream : Stream
|
|||
{
|
||||
if(long.TryParse(len_Str,out len))
|
||||
{
|
||||
//DajuricSimpleHttpExtensions.Print($"Content-Length: {len}");
|
||||
return new SizedStream(NetworkStream,len);
|
||||
}
|
||||
}
|
||||
//DajuricSimpleHttpExtensions.Print("Returns NetworkStream");
|
||||
return NetworkStream;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,7 @@ using System.Collections.Generic;
|
|||
using System.IO;
|
||||
using System.Linq;
|
||||
using System.Net;
|
||||
using System.Runtime.CompilerServices;
|
||||
using System.Text;
|
||||
using System.Text.RegularExpressions;
|
||||
using System.Threading.Tasks;
|
||||
|
@ -22,6 +23,11 @@ namespace Tesses.WebServer
|
|||
|
||||
public static class DajuricSimpleHttpExtensions
|
||||
{
|
||||
/* Thanks to you we fixed this
|
||||
public static void Print(string text,[CallerLineNumber] int lineNumber = 0)
|
||||
{
|
||||
Console.WriteLine($"[LINE {lineNumber}] {text}");
|
||||
}*/
|
||||
static void Deconstruct<T1, T2>(this KeyValuePair<T1, T2> tuple, out T1 key, out T2 value)
|
||||
{
|
||||
key = tuple.Key;
|
||||
|
@ -31,22 +37,26 @@ namespace Tesses.WebServer
|
|||
|
||||
static bool ParseForm(this ServerContext ctx)
|
||||
{
|
||||
//Print("Enter ParseForm(this ServerContext ctx)");
|
||||
var args = ctx.QueryParams;
|
||||
string content_type = ctx.RequestHeaders.GetFirst("Content-Type");
|
||||
if (content_type != "application/x-www-form-urlencoded")
|
||||
return false;
|
||||
|
||||
//Print("Before BodyAsString");
|
||||
var str = ctx.BodyAsString();
|
||||
//Print("After BodyAsString");
|
||||
if (str == null)
|
||||
return false;
|
||||
|
||||
//Print("Before For Loop");
|
||||
foreach (var pair in str.Split('&'))
|
||||
{
|
||||
var nameValue = pair.Split('=');
|
||||
if (nameValue.Length != (1 + 1))
|
||||
continue;
|
||||
|
||||
//Print($"Before Add: {nameValue[0]}: {nameValue[1]}");
|
||||
args.Add(nameValue[0], WebUtility.UrlDecode(nameValue[1]));
|
||||
//Print($"After Add: {nameValue[0]}: {nameValue[1]}");
|
||||
|
||||
}
|
||||
|
||||
return true;
|
||||
|
@ -59,7 +69,11 @@ namespace Tesses.WebServer
|
|||
string str = null;
|
||||
using (var reader = new StreamReader(ctx.GetRequestStream()))
|
||||
{
|
||||
//Print("Before ReadToEnd");
|
||||
|
||||
str = reader.ReadToEnd();
|
||||
//Print("After ReadToEnd");
|
||||
|
||||
}
|
||||
|
||||
return str;
|
||||
|
@ -125,11 +139,15 @@ namespace Tesses.WebServer
|
|||
|
||||
var files = new Dictionary<string, HttpFile>();
|
||||
var inputStream = new BufferedStream(serverCtx.GetRequestStream());
|
||||
//Print("Before ParseUntillBoundaryEnd");
|
||||
|
||||
parseUntillBoundaryEnd(inputStream, new MemoryStream(), boundary);
|
||||
//Print("After ParseUntillBoundaryEnd");
|
||||
while (true)
|
||||
{
|
||||
//Print("Before ParseSection");
|
||||
var (n, v, fn, ct) = parseSection(inputStream, "\r\n" + boundary, onFile);
|
||||
//Print("After ParseSection");
|
||||
if (String.IsNullOrEmpty(n)) break;
|
||||
|
||||
v.Position = 0;
|
||||
|
@ -144,15 +162,17 @@ namespace Tesses.WebServer
|
|||
|
||||
private static (string Name, Stream Value, string FileName, string ContentType) parseSection(Stream source, string boundary, OnFile onFile)
|
||||
{
|
||||
//Print("Before ReadContentDisposition");
|
||||
var (n, fn, ct) = readContentDisposition(source);
|
||||
//Print("After ReadContentDisposition");
|
||||
source.ReadByte(); source.ReadByte(); //\r\n (empty row)
|
||||
|
||||
var dst = String.IsNullOrEmpty(fn) ? new MemoryStream() : onFile(n, fn, ct);
|
||||
if (dst == null)
|
||||
throw new ArgumentException(nameof(onFile), "The on-file callback must return a stream.");
|
||||
|
||||
//Print("Before ParseUntillBodyEnd");
|
||||
parseUntillBoundaryEnd(source, dst, boundary);
|
||||
|
||||
//Print("Before ParseUntillBodyEnd");
|
||||
return (n, dst, fn, ct);
|
||||
}
|
||||
|
||||
|
@ -248,6 +268,7 @@ namespace Tesses.WebServer
|
|||
/// <returns>Name-file pair collection.</returns>
|
||||
public static Dictionary<string, HttpFile> ParseBody(this ServerContext ctx)
|
||||
{
|
||||
|
||||
return ctx.ParseBody( (n, fn, ct) => new MemoryStream());
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue