Understanding CGI with C# – The Code Project – C# Programming

Wer immer wie ich grade ein eigenes CGI für den IIS schreiben bzw. programmieren möchte. Aber vorsicht stellenweise wirklich sehr ehm – bastelig ;) .

Understanding CGI with C# – The Code Project – C# Programming

Im folgenden angehängt habe ich auch noch die .NET Klasse die ich zum Verwalten der Variablen verwende, vielleicht kann ja jemand auszugsweise was davon gebrauchen :-)

/*
 * Created by Application-Factory (http://www.application-factory.de).
 * User: AM
 * Date: 10.10.2005
 * Time: 16:29
 *
 */

using System;
using System.Collections;
using System.Runtime.InteropServices;
using System.Threading;
using System.Web;

namespace CGIIIS
{

		public struct IValList {

		public string Name,Wert,Typ;

		public IValList(string N,string W, string T) {
			Name = N;
			Wert = W;
			Typ = T;
		}
	}

	/// <summary>
	/// Description of VarLocalizer.
	/// </summary>
	public class VarLocalizer
	{

		[DllImport("kernel32", SetLastError=true)]
        static extern int SetConsoleMode (int hConsoleHandle, int dwMode);
		private static string PostData;
  		private static int PostLength;
  		private static int LengthCompare;

		private static ArrayList dvar = new ArrayList();

		public static void SetConsoleForPost()
		{
			SetConsoleMode(3, 0);
		}

		public static string Sanitize(string Raw)
		  {
		  string Clean = "";
		  int Walk;
		  char[] ByCharacter;
		  if(Raw == null)return Clean;
		  Raw=Raw.Replace("%22", "\"");
		  Raw=Raw.Replace("%27", "'");
		  Raw=Raw.Replace(",", ",");Raw=Raw.Replace("%2C", ",");
		  Raw=Raw.Replace(""", "\"");Raw=Raw.Replace(""", "\"");Raw=Raw.Replace("%5C", "\\");
		  Raw=Raw.Replace("<", "<");Raw=Raw.Replace("<", "<");Raw=Raw.Replace("+", " ");Raw=Raw.Replace("%3C", "<");
		  Raw=Raw.Replace(">", ">");Raw=Raw.Replace(">", ">");Raw=Raw.Replace("3E", ">");
		  Raw=Raw.Replace(" ", " ");Raw=Raw.Replace(" ", " ");
		  Raw=Raw.Replace("%21", "!");Raw=Raw.Replace("%40", "@");Raw=Raw.Replace("%23", "#");
		  Raw=Raw.Replace("%24", "$");Raw=Raw.Replace("%5E", "^");Raw=Raw.Replace("%28", "(");
		  Raw=Raw.Replace("%29", ")");Raw=Raw.Replace("%25", "%");Raw=Raw.Replace("%2F", "/");
		  Raw=Raw.Replace("%3F", "?");Raw=Raw.Replace("%3B", ";");Raw=Raw.Replace("%3A", ":");
		  Raw=Raw.Replace("%5D", "]");Raw=Raw.Replace("%5B", "[");Raw=Raw.Replace("%7D", "}");
		  Raw=Raw.Replace("%7B", "{");Raw=Raw.Replace("%7C", "|");Raw=Raw.Replace("%3D", "=");
		  Raw=Raw.Replace("%2B", "+");Raw=Raw.Replace("%7E", "~");Raw=Raw.Replace("%60", "`");
		  Raw=Raw.Replace("&", "&");Raw=Raw.Replace("&", "&");Raw=Raw.Replace("%26", "^");

		  ByCharacter = Raw.ToCharArray();
		  for(Walk = 0; Walk < Raw.Length;Walk++)
		    {
		    if(ByCharacter[Walk] == '\'') Clean += "'";
		    else if(ByCharacter[Walk] == '"') Clean += "\"";
		    else if(ByCharacter[Walk] == ' ') Clean += " ";
		    else if(ByCharacter[Walk] == '&') Clean += "<br />";
		    else if(ByCharacter[Walk] >= 'A' && ByCharacter[Walk] <= 'z' ||
		            ByCharacter[Walk] >= '0' && ByCharacter[Walk] <= '9' ||
		            ByCharacter[Walk] == '=' || ByCharacter[Walk] == ',' ||
		            ByCharacter[Walk] == '.' || ByCharacter[Walk] == '@' ||
		            ByCharacter[Walk] == '#')
		              Clean += ByCharacter[Walk].ToString();
		    else Clean += "^";
		    }

		  return Clean;
		  }  // End of sanitize() method.

		public static void SetPostLength(int length)
		{
			PostLength = length;
		}

		public static void StartPostDataThread()
		{
			ThreadStart ThreadDelegate = new ThreadStart(GatherPostThread);
			Thread PostThread = new Thread(ThreadDelegate);
			LengthCompare = PostLength;

			if(PostLength>0) PostThread.Start();
		}

		public static void GatherPostThread()
		{
		    if(PostLength > 2048) PostLength = 2048;
		    // Max length for POST data for security.

		    for(;PostLength>0;PostLength--)
		      PostData += Convert.ToChar(Console.Read()).ToString();
		}

		public static void checkPostThread()
		{
			while(PostLength > 0)
		    {
			    Thread.Sleep(100);
			    if(PostLength < LengthCompare)
			    {
			    	LengthCompare = PostLength;
			    }
			    else
			      {
				      PostData += "Error with POST data or connection problem.";
				      break;
			      }
		    }
		}

		public static string getPostData()
		{
			return PostData;
		}

		public static void CloseAllThreads()
		{
			Environment.Exit(0);
		}

		public static string getValue(string name)
		{
			string backout = "";
			if (dvar.Count > 0) {
				for (int i=0; i < dvar.Count; i++) {
					IValList neu = (IValList)dvar[i];
					if (neu.Name == name) {
						backout = neu.Wert;
					}
				}
			}
			return backout;
		}

		public static bool ValExists(string name)
		{
			bool backout = false;
			if (dvar.Count > 0) {
				for (int i=0; i < dvar.Count; i++) {
					IValList neu = (IValList)dvar[i];
					if (neu.Name == name) {
						backout = true;
					}
				}
			}
			return backout;
		}

		public static int getInt(string name)
		{
			return int.Parse(getValue(name));
		}

		public static float getFloat(string name)
		{
			return float.Parse(getValue(name));
		}

		public static string getString(string name)
		{
			return getValue(name);
		}

		public static byte getByte(string name)
		{
			return byte.Parse(getValue(name));

		}

		public static void setValue(string n,string w, string typ)
		{
			if ((n != null) && (w != null)) {
				IValList neu = new IValList(n,w,typ.ToUpper());
				dvar.Add(neu);
			}
		}

		public static void setValue(string n,string w)
		{
			setValue(n,w,"INTERNAL");
		}

		public static void reWorkGetData(string QueryGet)
		{
			if (QueryGet != null)
			{

				if (QueryGet.Length > 0)
				{

					string delimiterVar = "&";
					char[] delimArrVar = delimiterVar.ToCharArray();
					string[] VarSplit;

					VarSplit = QueryGet.Split(delimArrVar);

					foreach (string s in VarSplit) {
						string delimSingle = "=";
						char[] delimSArr = delimSingle.ToCharArray();
						string[] VarSingle;

						if (s.Length > 0) {
							VarSingle = s.Split(delimSArr);
							IValList neu = new IValList(VarSingle[0],HttpUtility.UrlDecode(VarSingle[1],System.Text.Encoding.Default),"GET");
							dvar.Add(neu);
						}

					}
				}
			}
		}

		public static void reWorkPostData(string PostString)
		{
			if (PostString != null) {

				if (PostString.Length > 0)
				{
					string delimiterVar = "&";
					char[] delimArrVar = delimiterVar.ToCharArray();
					string[] VarSplit;

					VarSplit = PostString.Split(delimArrVar);

					foreach (string s in VarSplit) {
						string delimSingle = "=";
						char[] delimSArr = delimSingle.ToCharArray();
						string[] VarSingle;

						VarSingle = s.Split(delimSArr);
						IValList neu = new IValList(VarSingle[0],HttpUtility.UrlDecode(VarSingle[1],System.Text.Encoding.Default),"POST");
						dvar.Add(neu);
					}
				}
			}
		}

		public static void reWorkParameters(string[] lvar) {
			// should localize string
			int i = 0;
			foreach (string s in lvar) {
				dvar.Add(new IValList(s,s,"PARAMETER"));
				i++;
			}
		}

		public static ArrayList getList()
		{
			return dvar;
		}

		private static string LinkString(string newset, string vtyp)
		{

			string outp = "";
			bool firstone = true;
			if (dvar.Count > 0) {
				for (int i=0; i < dvar.Count; i++) {
					IValList neu = (IValList)dvar[i];
					if ((neu.Typ.ToLower() == vtyp.ToLower()) && (neu.Name.ToLower() != newset.ToLower()) ) {
						if (firstone) {
							if (neu.Wert.Length > 0) {
								outp += neu.Name+"="+neu.Wert;
								firstone = false;
							}
						} else {
							if (neu.Wert.Length > 0) {
								outp += "&" + neu.Name+"="+HttpUtility.UrlEncode(neu.Wert,System.Text.Encoding.Default);
							}
						}
					}
				}
			}
			return outp;
		}

		private static string LinkString(string[] newset, string vtyp)
		{

			string outp = "";
			bool firstone = true;
			if (dvar.Count > 0) {
				for (int i=0; i < dvar.Count; i++) {
					IValList neu = (IValList)dvar[i];
					if (neu.Typ.ToLower() == vtyp.ToLower()) {

						bool isIn = false;

						for (int j=0; j < newset.Length; j++) {
							if (neu.Name.ToLower() == newset[j].ToLower()) isIn = true;
						}

						if (isIn == false) {

							if (firstone) {
								if (neu.Wert.Length > 0) {
									outp += neu.Name+"="+neu.Wert;
									firstone = false;
								}
							} else {
								if (neu.Wert.Length > 0) {
									outp += "&" + neu.Name+"="+HttpUtility.UrlEncode(neu.Wert,System.Text.Encoding.Default);
								}
							}
						}
					}
				}
			}
			return outp;
		}		

		public static string LinkGetString(string newset)
		{
			return LinkString(newset,"get");
		}

		public static string LinkGetString(string[] newset)
		{
			return LinkString(newset,"get");
		}		

		public static string LinkGetString()
		{
			return LinkGetString("");
		}

		public static string LinkPostString(string newset)
		{

			return LinkString(newset,"post");
		}

		public static string LinkPostString(string[] newset)
		{
			return LinkString(newset,"post");
		}		

		public static string LinkPostString()
		{
			return LinkPostString("");
		}

		public static string LinkAllString(string newsset)
		{
			string outp = LinkGetString(newsset);
			outp += "&" + LinkPostString(newsset);
			return outp;
		}

		public static string LinkAllString(string[] newsset)
		{
			string outp = LinkGetString(newsset);
			outp += "&" + LinkPostString(newsset);
			return outp;
		}		

		public static string LinkAllString()
		{
			return LinkAllString("");
		}

		public VarLocalizer()
		{
		}
	}
}

Tags: , ,

Kommentare sind geschlossen.