321 lines
9.8 KiB
C#
321 lines
9.8 KiB
C#
using System;
|
|
using System.IO;
|
|
using System.Text;
|
|
using System.Collections.Generic;
|
|
using System.Net;
|
|
using ln.types.net;
|
|
using ln.http.message;
|
|
using ln.http.io;
|
|
using ln.http.message.parser;
|
|
|
|
namespace ln.http
|
|
{
|
|
//public class HttpReader
|
|
//{
|
|
// delegate bool ReadCondition(int b);
|
|
|
|
// public Stream Stream { get; }
|
|
|
|
// private byte[] buffer = new byte[8192];
|
|
// private int hlen;
|
|
// private int blen;
|
|
// private int bptr;
|
|
|
|
// public Endpoint RemoteEndpoint { get; private set; }
|
|
|
|
// public HeaderContainer Headers { get; private set; }
|
|
|
|
// public String Method { get; private set; }
|
|
// public String URL { get; private set; }
|
|
// public String Protocol { get; private set; }
|
|
|
|
// //public Dictionary<string, string> Headers { get; } = new Dictionary<string, string>();
|
|
|
|
// public bool Valid { get; private set; } = false;
|
|
|
|
// public HttpReader(Stream stream)
|
|
// {
|
|
// Stream = stream;
|
|
// }
|
|
// public HttpReader(Stream stream,Endpoint remoteEndpoint)
|
|
// {
|
|
// Stream = stream;
|
|
// RemoteEndpoint = remoteEndpoint;
|
|
// }
|
|
|
|
// public void Read()
|
|
// {
|
|
// UnbufferedStreamReader reader = new UnbufferedStreamReader(Stream);
|
|
// string requestLine = reader.ReadLine();
|
|
// string[] requestTokens = requestLine.Split(new char[0], StringSplitOptions.RemoveEmptyEntries);
|
|
|
|
// if (requestTokens.Length != 3)
|
|
// throw new FormatException("request line malformed");
|
|
|
|
// Method = requestTokens[0];
|
|
// URL = requestTokens[1];
|
|
// Protocol = requestTokens[2];
|
|
|
|
// Headers = HTTP.ReadHeader(reader);
|
|
|
|
// Valid = true;
|
|
// }
|
|
|
|
// public int ReadByte()
|
|
// {
|
|
// if (bptr >= blen)
|
|
// return -1;
|
|
// return buffer[bptr++];
|
|
// }
|
|
|
|
// public int Current
|
|
// {
|
|
// get
|
|
// {
|
|
// if (bptr >= blen)
|
|
// return -1;
|
|
// return buffer[bptr];
|
|
// }
|
|
// }
|
|
|
|
// public void Reverse()
|
|
// {
|
|
// if ((bptr > 0) && (bptr < blen))
|
|
// bptr--;
|
|
// }
|
|
|
|
// public void ReadRequestHead()
|
|
// {
|
|
// bptr = 0;
|
|
// do
|
|
// {
|
|
// int rlen = Stream.Read(buffer, blen, buffer.Length - blen);
|
|
// if (rlen == 0)
|
|
// throw new IOException();
|
|
|
|
// blen += rlen;
|
|
// while (bptr <= (blen - 4))
|
|
// {
|
|
// if (
|
|
// (buffer[bptr + 0] == '\r') &&
|
|
// (buffer[bptr + 1] == '\n') &&
|
|
// (buffer[bptr + 2] == '\r') &&
|
|
// (buffer[bptr + 3] == '\n')
|
|
// )
|
|
// {
|
|
// hlen = bptr;
|
|
// bptr = 0;
|
|
// return;
|
|
// }
|
|
// bptr++;
|
|
// }
|
|
|
|
// byte[] nbuffer = new byte[buffer.Length << 1];
|
|
// Array.Copy(buffer, nbuffer, buffer.Length);
|
|
// buffer = nbuffer;
|
|
// } while (blen >= buffer.Length);
|
|
// bptr = 0;
|
|
// }
|
|
|
|
// private String ReadConditional(ReadCondition readCondition,bool reverse = true)
|
|
// {
|
|
// StringBuilder stringBuilder = new StringBuilder();
|
|
// int b = ReadByte();
|
|
// while ((b != -1) && (readCondition(b)) )
|
|
// {
|
|
// stringBuilder.Append((char)b);
|
|
// b = ReadByte();
|
|
// }
|
|
// if (reverse)
|
|
// Reverse();
|
|
|
|
// return stringBuilder.ToString();
|
|
// }
|
|
|
|
// public void SkipWhiteSpace()
|
|
// {
|
|
// while (Char.IsWhiteSpace((char)ReadByte())) { };
|
|
// Reverse();
|
|
// }
|
|
|
|
// public String ReadToken()
|
|
// {
|
|
// return ReadConditional((b) => !Char.IsWhiteSpace((char)b));
|
|
// }
|
|
|
|
// public String ReadLine()
|
|
// {
|
|
// int p = bptr;
|
|
// while (p < blen - 1)
|
|
// {
|
|
// if ((buffer[p] == '\r') && (buffer[p + 1] == '\n'))
|
|
// {
|
|
// break;
|
|
// }
|
|
// p++;
|
|
// }
|
|
|
|
// string result = Encoding.ASCII.GetString(buffer, bptr, p - bptr);
|
|
// bptr = p + 2;
|
|
// return result;
|
|
// }
|
|
|
|
// public String ReadHeaderName()
|
|
// {
|
|
// return ReadConditional((b) => b != ':', false).ToUpper();
|
|
// }
|
|
// public String ReadHeaderValue()
|
|
// {
|
|
// String value = ReadLine();
|
|
// while (Char.IsWhiteSpace((char)Current))
|
|
// {
|
|
// value = value + ReadLine();
|
|
// }
|
|
// return value.Trim();
|
|
// }
|
|
|
|
// //public void ReadHeaders()
|
|
// //{
|
|
// // while (bptr < hlen)
|
|
// // {
|
|
// // String name = ReadHeaderName();
|
|
// // String value = ReadHeaderValue();
|
|
|
|
// // Headers.Add(name, value);
|
|
// // }
|
|
// //}
|
|
|
|
// public int ReadRequestBody(byte[] dst,int offset,int length)
|
|
// {
|
|
// //int nRead = 0;
|
|
// //if (bptr < blen)
|
|
// //{
|
|
// // int len = Math.Min(length, blen - bptr);
|
|
// // Array.Copy(buffer, bptr, dst, offset, len);
|
|
// // bptr += len;
|
|
// // length -= len;
|
|
// // offset += len;
|
|
// // nRead += len;
|
|
// //}
|
|
// int nRead = 0;
|
|
// while (length > 0)
|
|
// {
|
|
// int nr = Stream.Read(dst, offset, length);
|
|
// if (nr > 0)
|
|
// {
|
|
// nRead += nr;
|
|
// length -= nr;
|
|
// offset += nr;
|
|
// }
|
|
// }
|
|
// return nRead;
|
|
// }
|
|
|
|
|
|
|
|
// /*
|
|
// byte[] buffer;
|
|
// int blen = 0;
|
|
// int bptr = 0;
|
|
|
|
// public HttpReader(Stream stream)
|
|
// {
|
|
// Stream = stream;
|
|
// buffer = new byte[1024];
|
|
// }
|
|
// public HttpReader(Stream stream, int buffersize)
|
|
// {
|
|
// Stream = stream;
|
|
// buffer = new byte[buffersize];
|
|
// }
|
|
|
|
// private int read()
|
|
// {
|
|
// if (bptr >= blen)
|
|
// {
|
|
// bptr = 0;
|
|
// blen = Stream.Read(buffer, 0, buffer.Length);
|
|
// if (blen <= 0)
|
|
// throw new EndOfStreamException();
|
|
// }
|
|
// return buffer[bptr++];
|
|
// }
|
|
|
|
// private int ReadTo(byte[] b,int offset,byte[] mark)
|
|
// {
|
|
// int pm = 0;
|
|
// int p = offset;
|
|
// while (p < b.Length)
|
|
// {
|
|
// b[p] = (byte)read();
|
|
// if (b[p] == mark[pm])
|
|
// {
|
|
// pm++;
|
|
// if (pm >= mark.Length)
|
|
// {
|
|
// p++;
|
|
// break;
|
|
// }
|
|
// }
|
|
// else
|
|
// {
|
|
// pm = 0;
|
|
// }
|
|
// p++;
|
|
// }
|
|
// return p;
|
|
// }
|
|
|
|
|
|
// public String ReadRequestLine(int maxSize = 1024)
|
|
// {
|
|
// byte[] b = new byte[maxSize];
|
|
// int l = ReadTo(b, 0, new byte[] { 0x0d, 0x0a });
|
|
// return Encoding.ASCII.GetString(b, 0, l);
|
|
// }
|
|
|
|
// public Dictionary<string,string> ReadHTTPHeaders()
|
|
// {
|
|
// byte[] b = new byte[8192];
|
|
// int hlen = ReadTo(b, 0, new byte[] { 0x0d, 0x0a, 0x0d, 0x0a });
|
|
|
|
// Dictionary<string, string> headers = new Dictionary<string, string>();
|
|
|
|
// string rawHeaders = Encoding.ASCII.GetString(b, 0, hlen);
|
|
// String[] rawLines = rawHeaders.Split(new String[] { "\r\n" }, StringSplitOptions.None);
|
|
|
|
// for (int n = rawLines.Length-1; n >= 0 ; n--)
|
|
// {
|
|
// if ((rawLines[n].Length > 0) && (Char.IsWhiteSpace(rawLines[n][0])))
|
|
// {
|
|
// rawLines[n - 1] = rawLines[n - 1] + rawLines[n];
|
|
// rawLines[n] = null;
|
|
// }
|
|
// }
|
|
|
|
// foreach (String rawLine in rawLines)
|
|
// {
|
|
// if (rawLine != null)
|
|
// {
|
|
// int colon = rawLine.IndexOf(':');
|
|
// if (colon > 0)
|
|
// {
|
|
// String name = rawLine.Substring(0, colon).Trim().ToUpper();
|
|
// String value = rawLine.Substring(colon + 1).Trim();
|
|
// headers.Add(name, value);
|
|
// }
|
|
// }
|
|
// }
|
|
|
|
// return headers;
|
|
// }
|
|
|
|
// public byte[] ReadRequestBody(byte[] buffer)
|
|
// {
|
|
// return null;
|
|
// }
|
|
// */
|
|
//}
|
|
|
|
}
|