Merge pull request #484 from roji/transactions_pspe
[mono.git] / mcs / tools / tuner / Mono.Tuner / PreserveHttps.cs
1 using System;
2 using System.IO;
3 using System.Xml.XPath;
4
5 using Mono.Linker;
6 using Mono.Linker.Steps;
7
8 using Mono.Cecil;
9
10 namespace Mono.Tuner {
11
12         public class PreserveHttps : BaseStep {
13
14                 static string [] types = new [] {
15                         "System.Net.WebRequest",
16                         "System.Net.WebClient",
17                         "System.Net.Security.RemoteCertificateValidationCallback",
18                         "System.Web.Services.Protocols.WebClientProtocol",
19                         "System.Security.Cryptography.X509Certificates.X509Certificate",
20                         "System.ServiceModel.ClientBase`1",
21                         "System.Web.Services.WebServiceBindingAttribute",
22                         "System.Web.Services.Protocols.SoapHttpClientProtocol",
23                         "System.Xml.XmlDocument"
24                 };
25
26                 bool need_https;
27
28                 protected override void ProcessAssembly (AssemblyDefinition assembly)
29                 {
30                         if (need_https)
31                                 return;
32
33                         if (Profile.IsSdkAssembly (assembly))
34                                 return;
35
36                         if (HasNeededReference (assembly.MainModule))
37                                 need_https = true;
38                 }
39
40                 static bool HasNeededReference (ModuleDefinition module)
41                 {
42                         foreach (var type in types)
43                                 if (module.HasTypeReference (type))
44                                         return true;
45
46                         return false;
47                 }
48
49                 protected override void EndProcess ()
50                 {
51                         if (!need_https)
52                                 return;
53
54                         var mono_security = Context.Resolve ("Mono.Security");
55                         if (mono_security == null)
56                                 return;
57
58                         if (Annotations.GetAction (mono_security) != AssemblyAction.Link)
59                                 return;
60
61                         var xml_preserve = CreatePreserveStep ();
62                         Context.Pipeline.AddStepAfter (typeof (PreserveHttps), xml_preserve);
63 //                      Context.Pipeline.AddStepAfter (xml_preserve, new PreserveCrypto ());
64                 }
65
66                 static IStep CreatePreserveStep ()
67                 {
68                         return new ResolveFromXmlStep (
69                                 new XPathDocument (
70                                         new StringReader (descriptor)));
71                 }
72
73                 const string descriptor = @"<?xml version=""1.0"" encoding=""utf-8"" ?>
74 <linker>
75         <assembly fullname=""Mono.Security"">
76                 <type fullname=""Mono.Security.Protocol.Tls.HttpsClientStream"" />
77                 <type fullname=""Mono.Security.Protocol.Tls.SslClientStream"" />
78                 <type fullname=""Mono.Security.Protocol.Tls.SslStreamBase"" />
79         </assembly>
80 </linker>
81 ";
82         }
83 }