LayoutTests:
[WebKit-https.git] / WebCore / platform / network / ResourceHandle.cpp
1 /*
2  * Copyright (C) 2004, 2006 Apple Computer, Inc.  All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions
6  * are met:
7  * 1. Redistributions of source code must retain the above copyright
8  *    notice, this list of conditions and the following disclaimer.
9  * 2. Redistributions in binary form must reproduce the above copyright
10  *    notice, this list of conditions and the following disclaimer in the
11  *    documentation and/or other materials provided with the distribution.
12  *
13  * THIS SOFTWARE IS PROVIDED BY APPLE COMPUTER, INC. ``AS IS'' AND ANY
14  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL APPLE COMPUTER, INC. OR
17  * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
18  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
19  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
20  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY
21  * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
22  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
23  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
24  */
25
26 #include "config.h"
27 #include "ResourceHandle.h"
28 #include "ResourceHandleInternal.h"
29
30 #include "Logging.h"
31 #include "ResourceHandleClient.h"
32 #include "Timer.h"
33
34 #include <wtf/HashSet.h>
35
36 namespace WebCore {
37
38 ResourceHandle::ResourceHandle(const ResourceRequest& request, ResourceHandleClient* client, bool defersLoading, bool mightDownloadFromHandle)
39     : d(new ResourceHandleInternal(this, request, client, defersLoading, mightDownloadFromHandle))
40 {
41 }
42
43 PassRefPtr<ResourceHandle> ResourceHandle::create(const ResourceRequest& request, ResourceHandleClient* client, Frame* frame, bool defersLoading, bool mightDownloadFromHandle)
44 {
45     RefPtr<ResourceHandle> newHandle(new ResourceHandle(request, client, defersLoading, mightDownloadFromHandle));
46
47     if (!portAllowed(request)) {
48         newHandle->scheduleBlockedFailure();
49         return newHandle.release();
50     }
51         
52     if (newHandle->start(frame))
53         return newHandle.release();
54
55     return 0;
56 }
57
58 void ResourceHandle::scheduleBlockedFailure()
59 {
60     Timer<ResourceHandle>* blockedTimer = new Timer<ResourceHandle>(this, &ResourceHandle::fireBlockedFailure);
61     blockedTimer->startOneShot(0);
62 }
63
64 void ResourceHandle::fireBlockedFailure(Timer<ResourceHandle>* timer)
65 {
66     client()->wasBlocked(this);
67     delete timer;
68 }
69
70 const HTTPHeaderMap& ResourceHandle::requestHeaders() const
71 {
72     return d->m_request.httpHeaderFields();
73 }
74
75 const KURL& ResourceHandle::url() const
76 {
77     return d->m_request.url();
78 }
79
80 PassRefPtr<FormData> ResourceHandle::postData() const
81 {
82     return d->m_request.httpBody();
83 }
84
85 const String& ResourceHandle::method() const
86 {
87     return d->m_request.httpMethod();
88 }
89
90 ResourceHandleClient* ResourceHandle::client() const
91 {
92     return d->m_client;
93 }
94
95 const ResourceRequest& ResourceHandle::request() const
96 {
97     return d->m_request;
98 }
99
100 void ResourceHandle::clearAuthentication()
101 {
102 #if PLATFORM(MAC)
103     d->m_currentMacChallenge = nil;
104 #endif
105     d->m_currentWebChallenge.nullify();
106 }
107
108 bool ResourceHandle::portAllowed(const ResourceRequest& request)
109 {
110     uint16_t port = request.url().port();
111     if (!port)
112         return true;
113         
114     // The blocked port list matches the port blocking mozilla implements
115     // See http://www.mozilla.org/projects/netlib/PortBanning.html for more information
116     static uint16_t blockedPortList[] = { 
117     1,    // tcpmux          
118     7,    // echo     
119     9,    // discard          
120     11,   // systat   
121     13,   // daytime          
122     15,   // netstat  
123     17,   // qotd             
124     19,   // chargen  
125     20,   // FTP-data 
126     21,   // FTP-control        
127     22,   // SSH              
128     23,   // telnet   
129     25,   // SMTP     
130     37,   // time     
131     42,   // name     
132     43,   // nicname  
133     53,   // domain  
134     77,   // priv-rjs 
135     79,   // finger   
136     87,   // ttylink  
137     95,   // supdup   
138     101,  // hostriame
139     102,  // iso-tsap 
140     103,  // gppitnp  
141     104,  // acr-nema 
142     109,  // POP2     
143     110,  // POP3     
144     111,  // sunrpc   
145     113,  // auth     
146     115,  // SFTP     
147     117,  // uucp-path
148     119,  // nntp     
149     123,  // NTP
150     135,  // loc-srv / epmap         
151     139,  // netbios
152     143,  // IMAP2  
153     179,  // BGP
154     389,  // LDAP
155     465,  // SMTP+SSL
156     512,  // print / exec          
157     513,  // login         
158     514,  // shell         
159     515,  // printer         
160     526,  // tempo         
161     530,  // courier        
162     531,  // Chat         
163     532,  // netnews        
164     540,  // UUCP       
165     556,  // remotefs    
166     563,  // NNTP+SSL
167     587,  // ESMTP
168     601,  // syslog-conn  
169     636,  // LDAP+SSL
170     993,  // IMAP+SSL
171     995,  // POP3+SSL
172     2049, // NFS
173     4045, // lockd
174     6000, // X11        
175     0 };   
176     
177     static HashSet<int>* blockedPortHash = 0;
178     if (!blockedPortHash) {
179         blockedPortHash = new HashSet<int>;
180         
181         for (int i = 0; blockedPortList[i]; ++i)
182             blockedPortHash->add(blockedPortList[i]);
183     }
184     
185     bool restricted = blockedPortHash->contains(port);
186     
187     if (restricted) {
188         // An exception in the mozilla port blocking is they allow 21 and 22 for FTP (and Secure FTP), which we have to do also
189         if ((port == 21 || port == 22) && request.url().url().startsWith("ftp:", false))
190             return true;
191     }
192         
193     return !restricted;
194 }
195
196
197 } // namespace WebCore
198