diff options
author | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2003-12-12 06:32:55 +0300 |
---|---|---|
committer | Gonzalo Paniagua Javier <gonzalo.mono@gmail.com> | 2003-12-12 06:32:55 +0300 |
commit | 0e8a82b2eda3b8a2b34f1ba0582f7c3f85be53b9 (patch) | |
tree | 79495564b9ff7f88041ecdafa964e3a02c92c531 /mcs/class/Mono.Http | |
parent | 38764bc26bdb3be16ede773ac13b4338eb5844bf (diff) |
2003-12-12 Gonzalo Paniagua Javier <gonzalo@ximian.com>
* Makefile: reference Mono.Security.
* Mono.Http.dll.sources: added/renamed files.
* NEWS: updated.
* Assembly/AssemblyInfo.cs: assembly stuff.
* Mono.Http/AcceptEncodingConfig.cs: Removed file.
* Mono.Http/AcceptEncodingModule.cs:
* Mono.Http/AcceptEncodingSectionHandler.cs:
* Mono.Http.Configuration/AcceptEncodingConfig.cs:
* Mono.Http.Configuration/AcceptEncodingSectionHandler.cs: moved files
to new directory.
* Mono.Http/GZipWebRequest.cs: small fixes to inject gzip header.
* Mono.Http/GZipWebRequestCreator.cs: web request creator for gzip.
* Mono.Http/GZipWebResponse.cs: fixed dispose/close.
* Mono.Http/NtlmClient.cs: NTLM for HTTP. Used from System.Net.
* samples/http-get-gzip.cs:
* samples/http-get-gzip.exe.config: use the request creator.
svn path=/trunk/mcs/; revision=21050
Diffstat (limited to 'mcs/class/Mono.Http')
17 files changed, 266 insertions, 67 deletions
diff --git a/mcs/class/Mono.Http/Assembly/AssemblyInfo.cs b/mcs/class/Mono.Http/Assembly/AssemblyInfo.cs new file mode 100644 index 00000000000..b212d7f33db --- /dev/null +++ b/mcs/class/Mono.Http/Assembly/AssemblyInfo.cs @@ -0,0 +1,20 @@ +// +// AssemblyInfo.cs +// +// Author: +// Gonzalo Paniagua (gonzalo@ximian.com) +// +// (C) 2003 Novell, Inc. http://www.novell.com +// + +using System.Reflection; +using System.Runtime.CompilerServices; + +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyTitle("Mono.Http.dll")] +[assembly: AssemblyDescription("Http and ASP.NET utilities")] +[assembly: AssemblyConfiguration("Development version")] +[assembly: AssemblyCompany("MONO development team")] +[assembly: AssemblyProduct("MONO CLI")] +[assembly: AssemblyCopyright("(c) 2003 Various Authors")] + diff --git a/mcs/class/Mono.Http/Assembly/ChangeLog b/mcs/class/Mono.Http/Assembly/ChangeLog new file mode 100644 index 00000000000..76199015e4a --- /dev/null +++ b/mcs/class/Mono.Http/Assembly/ChangeLog @@ -0,0 +1,4 @@ +2003-12-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * AssemblyInfo.cs: assembly stuff. + diff --git a/mcs/class/Mono.Http/Makefile b/mcs/class/Mono.Http/Makefile index fa52b9dd723..820e4ce3009 100644 --- a/mcs/class/Mono.Http/Makefile +++ b/mcs/class/Mono.Http/Makefile @@ -3,8 +3,12 @@ SUBDIRS = include ../../build/rules.make LIBRARY = Mono.Http.dll -LIB_MCS_FLAGS = -r:$(corlib) -r:System.dll -r:System.Xml.dll \ - -r:System.Web.dll -r:ICSharpCode.SharpZipLib.dll +LIB_MCS_FLAGS = -r:$(corlib) \ + -r:System.dll \ + -r:System.Xml.dll \ + -r:System.Web.dll \ + -r:ICSharpCode.SharpZipLib.dll \ + -r:Mono.Security.dll NO_TEST = yes diff --git a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingConfig.cs b/mcs/class/Mono.Http/Mono.Http.Configuration/AcceptEncodingConfig.cs index 051909d70a1..7e799a0304c 100644 --- a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingConfig.cs +++ b/mcs/class/Mono.Http/Mono.Http.Configuration/AcceptEncodingConfig.cs @@ -13,7 +13,7 @@ using System.Collections.Specialized; using System.IO; using System.Web; -namespace Mono.Http +namespace Mono.Http.Configuration { public class AcceptEncodingConfig { diff --git a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingSectionHandler.cs b/mcs/class/Mono.Http/Mono.Http.Configuration/AcceptEncodingSectionHandler.cs index 86e5dacc6cb..de5079185e7 100644 --- a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingSectionHandler.cs +++ b/mcs/class/Mono.Http/Mono.Http.Configuration/AcceptEncodingSectionHandler.cs @@ -12,7 +12,7 @@ using System.Configuration; using System.IO; using System.Xml; -namespace Mono.Http +namespace Mono.Http.Configuration { public class AcceptEncodingSectionHandler : IConfigurationSectionHandler { diff --git a/mcs/class/Mono.Http/Mono.Http.Configuration/ChangeLog b/mcs/class/Mono.Http/Mono.Http.Configuration/ChangeLog new file mode 100644 index 00000000000..35b53dea225 --- /dev/null +++ b/mcs/class/Mono.Http/Mono.Http.Configuration/ChangeLog @@ -0,0 +1,5 @@ +2003-12-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * AcceptEncodingConfig.cs: + * AcceptEncodingSectionHandler.cs: moved these files here. + diff --git a/mcs/class/Mono.Http/Mono.Http.dll.sources b/mcs/class/Mono.Http/Mono.Http.dll.sources index 12d2366cf14..ba3f6122223 100644 --- a/mcs/class/Mono.Http/Mono.Http.dll.sources +++ b/mcs/class/Mono.Http/Mono.Http.dll.sources @@ -1,6 +1,8 @@ -Mono.Http/AcceptEncodingConfig.cs -Mono.Http/AcceptEncodingModule.cs -Mono.Http/AcceptEncodingSectionHandler.cs +Assembly/AssemblyInfo.cs Mono.Http/GZipWebRequest.cs Mono.Http/GZipWebResponse.cs Mono.Http/GZipWriteFilter.cs +Mono.Http/GZipWebRequestCreator.cs +Mono.Http/NtlmClient.cs +Mono.Http.Configuration/AcceptEncodingConfig.cs +Mono.Http.Configuration/AcceptEncodingSectionHandler.cs diff --git a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingModule.cs b/mcs/class/Mono.Http/Mono.Http/AcceptEncodingModule.cs deleted file mode 100644 index a46e9b779b0..00000000000 --- a/mcs/class/Mono.Http/Mono.Http/AcceptEncodingModule.cs +++ /dev/null @@ -1,46 +0,0 @@ -// -// AcceptEncodingModule.cs -// -// Authors: -// Gonzalo Paniagua Javier (gonzalo@ximian.com) -// -// (c) 2003 Ximian, Inc (http://www.ximian.com) -// - -using System; -using System.Configuration; -using System.IO; -using System.Web; - -namespace Mono.Http -{ - public class AcceptEncodingModule : IHttpModule - { - static readonly string configSection = "mono.aspnet/acceptEncoding"; - AcceptEncodingConfig config; - - public void Init (HttpApplication app) - { - app.BeginRequest += new EventHandler (CheckIfAddFilter); - } - - public void Dispose () - { - } - - void CheckIfAddFilter (object sender, EventArgs args) - { - HttpApplication app = (HttpApplication) sender; - HttpRequest request = app.Request; - HttpResponse response = app.Response; - - //FIXME: fix this when config is cached - if (config == null) - //config = (AcceptEncodingConfig) app.Context.GetConfig (configSection); - config = (AcceptEncodingConfig) ConfigurationSettings.GetConfig (configSection); - - config.SetFilter (response, request.Headers ["Accept-Encoding"]); - } - } -} - diff --git a/mcs/class/Mono.Http/Mono.Http/ChangeLog b/mcs/class/Mono.Http/Mono.Http/ChangeLog index 213fe969699..3d3471ed09f 100644 --- a/mcs/class/Mono.Http/Mono.Http/ChangeLog +++ b/mcs/class/Mono.Http/Mono.Http/ChangeLog @@ -1,3 +1,13 @@ +2003-12-12 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * AcceptEncodingModule.cs: + * AcceptEncodingSectionHandler.cs: moved files from here. + + * GZipWebRequest.cs: small fixes to inject gzip header. + * GZipWebRequestCreator.cs: web request creator for gzip. + * GZipWebResponse.cs: fixed dispose/close. + * NtlmClient.cs: NTLM for HTTP. Used from System.Net. + 2003-07-26 Gonzalo Paniagua Javier <gonzalo@ximian.com> * GZipWebRequest.cs: diff --git a/mcs/class/Mono.Http/Mono.Http/GZipWebRequest.cs b/mcs/class/Mono.Http/Mono.Http/GZipWebRequest.cs index 8948747c483..59700214c1d 100644 --- a/mcs/class/Mono.Http/Mono.Http/GZipWebRequest.cs +++ b/mcs/class/Mono.Http/Mono.Http/GZipWebRequest.cs @@ -109,6 +109,7 @@ namespace Mono.Http public override IAsyncResult BeginGetRequestStream (AsyncCallback callback, object state) { + CheckHeader (); return request.BeginGetRequestStream (callback, state); } @@ -119,6 +120,7 @@ namespace Mono.Http public override Stream GetRequestStream () { + CheckHeader (); return request.GetRequestStream (); } @@ -142,6 +144,9 @@ namespace Mono.Http { WebResponse response = request.EndGetResponse (asyncResult); bool compressed = (String.Compare (response.Headers ["Content-Encoding"], "gzip", true) == 0); + if (!compressed) + return response; + return new GZipWebResponse (response, compressed); } diff --git a/mcs/class/Mono.Http/Mono.Http/GZipWebRequestCreator.cs b/mcs/class/Mono.Http/Mono.Http/GZipWebRequestCreator.cs new file mode 100644 index 00000000000..9d7e354d203 --- /dev/null +++ b/mcs/class/Mono.Http/Mono.Http/GZipWebRequestCreator.cs @@ -0,0 +1,33 @@ +// +// Mono.Http.GZipWebRequestCreator +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// +// (C) 2003 Novell, Inc (http://www.novell.com) +// + +using System; +using System.Net; + +namespace Mono.Http +{ + public class GZipWebRequestCreator : IWebRequestCreate + { + public GZipWebRequestCreator () + { + } + + public WebRequest Create (Uri uri) + { + string scheme = uri.Scheme; + if (scheme != "gziphttp") + throw new ArgumentException ("Must be gziphttp", "uri"); + + Uri newuri = new Uri (uri.ToString ().Substring (4)); + WebRequest req = WebRequest.Create (newuri); + return new GZipWebRequest (req); + } + } +} + diff --git a/mcs/class/Mono.Http/Mono.Http/GZipWebResponse.cs b/mcs/class/Mono.Http/Mono.Http/GZipWebResponse.cs index 0aba1413f06..0a99222861c 100644 --- a/mcs/class/Mono.Http/Mono.Http/GZipWebResponse.cs +++ b/mcs/class/Mono.Http/Mono.Http/GZipWebResponse.cs @@ -72,9 +72,6 @@ namespace System.Net void SetStream () { - if (stream != null) - return; - lock (this) { if (stream != null) return; @@ -92,16 +89,25 @@ namespace System.Net void ISerializable.GetObjectData (SerializationInfo info, StreamingContext context) { info.AddValue ("response", response); + info.AddValue ("compressed", compressed); } public override void Close () { - response.Close (); + ((IDisposable) this).Dispose (); } void IDisposable.Dispose () { - response.Close (); + if (stream != null) { + stream.Close (); + stream = null; + } + + if (response != null) { + response.Close (); + response = null; + } } } } diff --git a/mcs/class/Mono.Http/Mono.Http/NtlmClient.cs b/mcs/class/Mono.Http/Mono.Http/NtlmClient.cs new file mode 100644 index 00000000000..18ca95095d1 --- /dev/null +++ b/mcs/class/Mono.Http/Mono.Http/NtlmClient.cs @@ -0,0 +1,129 @@ +// +// Mono.Http.NtlmClient +// +// Authors: +// Gonzalo Paniagua Javier (gonzalo@ximian.com) +// +// (c) 2003 Novell, Inc. (http://www.novell.com) +// + +using System; +using System.Collections; +using System.Net; +using Mono.Security.Protocol.Ntlm; + +namespace Mono.Http +{ + class NtlmSession + { + MessageBase message; + + public NtlmSession () + { + } + + public Authorization Authenticate (string challenge, WebRequest webRequest, ICredentials credentials) + { + HttpWebRequest request = webRequest as HttpWebRequest; + if (request == null) + return null; + + NetworkCredential cred = credentials.GetCredential (request.RequestUri, "NTLM"); + string userName = cred.UserName; + string domain = cred.Domain; + string password = cred.Password; + if (userName == null || userName == "" || domain == null || domain == "") + return null; + + bool completed = false; + if (message == null) { + Type1Message type1 = new Type1Message (); + type1.Domain = domain; + message = type1; + } else if (message.Type == 1) { + // Should I check the credentials? + if (challenge == null) { + message = null; + return null; + } + + Type2Message type2 = new Type2Message (Convert.FromBase64String (challenge)); + if (password == null) + password = ""; + + Type3Message type3 = new Type3Message (); + type3.Domain = domain; + type3.Username = userName; + type3.Challenge = type2.Nonce; + type3.Password = password; + message = type3; + completed = true; + } else { + // Should I check the credentials? + // type must be 3 here + completed = true; + } + + string token = "NTLM " + Convert.ToBase64String (message.GetBytes ()); + return new Authorization (token, completed); + } + } + + public class NtlmClient : IAuthenticationModule + { + static Hashtable cache; + + static NtlmClient () + { + cache = new Hashtable (); + } + + public NtlmClient () {} + + public Authorization Authenticate (string challenge, WebRequest webRequest, ICredentials credentials) + { + if (credentials == null || challenge == null) + return null; + + string header = challenge.Trim (); + int idx = header.ToLower ().IndexOf ("ntlm"); + if (idx == -1) + return null; + + idx = header.IndexOfAny (new char [] {' ', '\t'}); + if (idx != -1) { + header = header.Substring (idx).Trim (); + } else { + header = null; + } + + HttpWebRequest request = webRequest as HttpWebRequest; + if (request == null) + return null; + + lock (cache) { + NtlmSession ds = (NtlmSession) cache [request.RequestUri]; + if (ds == null) { + ds = new NtlmSession (); + cache.Add (request.RequestUri, ds); + } + + return ds.Authenticate (header, webRequest, credentials); + } + } + + public Authorization PreAuthenticate (WebRequest webRequest, ICredentials credentials) + { + return null; + } + + public string AuthenticationType { + get { return "NTLM"; } + } + + public bool CanPreAuthenticate { + get { return false; } + } + } +} + diff --git a/mcs/class/Mono.Http/NEWS b/mcs/class/Mono.Http/NEWS index 4bc0cf2dfed..e3d04b08da6 100644 --- a/mcs/class/Mono.Http/NEWS +++ b/mcs/class/Mono.Http/NEWS @@ -1,3 +1,9 @@ +December 12, 2003 - Gonzalo Paniagua +---------------------------------- + +* Added NtlmClient +* Added request creator for gzip. + July 26, 2003 - Gonzalo Paniagua ---------------------------------- diff --git a/mcs/class/Mono.Http/samples/ChangeLog b/mcs/class/Mono.Http/samples/ChangeLog index eb80bb49955..c067ee7c036 100644 --- a/mcs/class/Mono.Http/samples/ChangeLog +++ b/mcs/class/Mono.Http/samples/ChangeLog @@ -1,3 +1,8 @@ +2003-12-11 Gonzalo Paniagua Javier <gonzalo@ximian.com> + + * http-get-gzip.cs: + * http-get-gzip.exe.config: use the request creator. + 2003-07-26 Gonzalo Paniagua Javier <gonzalo@ximian.com> * ChangeLog: diff --git a/mcs/class/Mono.Http/samples/http-get-gzip.cs b/mcs/class/Mono.Http/samples/http-get-gzip.cs index f390896e9dc..1b7e595febc 100644 --- a/mcs/class/Mono.Http/samples/http-get-gzip.cs +++ b/mcs/class/Mono.Http/samples/http-get-gzip.cs @@ -15,28 +15,33 @@ using Mono.Http; class GZipTest { - static string url = "http://127.0.0.1/index.php"; - - static void GZWR () + static void GZWR (string url) { - WebRequest req = new GZipWebRequest (WebRequest.Create (url)); + WebRequest req = WebRequest.Create ("gziphttp://" + url); WebResponse wr = req.GetResponse (); - Console.WriteLine ("Content-Encoding: '{0}' (if empty, not compressed)", wr.Headers ["Content-Encoding"]); Stream st = wr.GetResponseStream (); byte [] b = new byte [4096]; long total = 0; int count; - while ((count = st.Read (b, 0, 4096)) != 0) + while ((count = st.Read (b, 0, 4096)) != 0) { Console.Write (Encoding.Default.GetString (b, 0, count)); + total += count; + } st.Close (); - // Console.WriteLine ("Read: {0}", total); + Console.WriteLine ("\nContent-Encoding: '{0}' (if empty, not compressed)", + wr.Headers ["Content-Encoding"]); } - static void Main () + static void Main (string [] args) { - GZWR (); + if (args.Length != 1) { + Console.WriteLine ("You should provide a HTTP URL without 'http://'"); + return; + } + + GZWR (args [0]); } } diff --git a/mcs/class/Mono.Http/samples/http-get-gzip.exe.config b/mcs/class/Mono.Http/samples/http-get-gzip.exe.config new file mode 100644 index 00000000000..4c6352c2e7b --- /dev/null +++ b/mcs/class/Mono.Http/samples/http-get-gzip.exe.config @@ -0,0 +1,11 @@ +<?xml version="1.0" encoding="utf-8"?> +<configuration> + <system.net> + <webRequestModules> + <add prefix="gziphttp" + type="Mono.Http.GZipWebRequestCreator, Mono.Http" /> + </webRequestModules> + </system.net> +</configuration> + + |