OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "net/http/disk_cache_based_ssl_host_info.h" | 5 #include "net/http/disk_cache_based_ssl_host_info.h" |
6 | 6 |
7 #include "base/callback.h" | 7 #include "base/callback.h" |
8 #include "base/logging.h" | 8 #include "base/logging.h" |
9 #include "net/base/io_buffer.h" | 9 #include "net/base/io_buffer.h" |
10 #include "net/base/net_errors.h" | 10 #include "net/base/net_errors.h" |
(...skipping 26 matching lines...) Expand all Loading... |
37 const std::string& hostname, | 37 const std::string& hostname, |
38 const SSLConfig& ssl_config, | 38 const SSLConfig& ssl_config, |
39 CertVerifier* cert_verifier, | 39 CertVerifier* cert_verifier, |
40 HttpCache* http_cache) | 40 HttpCache* http_cache) |
41 : SSLHostInfo(hostname, ssl_config, cert_verifier), | 41 : SSLHostInfo(hostname, ssl_config, cert_verifier), |
42 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), | 42 weak_ptr_factory_(ALLOW_THIS_IN_INITIALIZER_LIST(this)), |
43 callback_(new CallbackImpl(weak_ptr_factory_.GetWeakPtr(), | 43 callback_(new CallbackImpl(weak_ptr_factory_.GetWeakPtr(), |
44 &DiskCacheBasedSSLHostInfo::OnIOComplete)), | 44 &DiskCacheBasedSSLHostInfo::OnIOComplete)), |
45 state_(GET_BACKEND), | 45 state_(GET_BACKEND), |
46 ready_(false), | 46 ready_(false), |
| 47 found_entry_(false), |
47 hostname_(hostname), | 48 hostname_(hostname), |
48 http_cache_(http_cache), | 49 http_cache_(http_cache), |
49 backend_(NULL), | 50 backend_(NULL), |
50 entry_(NULL), | 51 entry_(NULL), |
51 user_callback_(NULL) { | 52 user_callback_(NULL) { |
52 } | 53 } |
53 | 54 |
54 void DiskCacheBasedSSLHostInfo::Start() { | 55 void DiskCacheBasedSSLHostInfo::Start() { |
55 DCHECK(CalledOnValidThread()); | 56 DCHECK(CalledOnValidThread()); |
56 DCHECK_EQ(GET_BACKEND, state_); | 57 DCHECK_EQ(GET_BACKEND, state_); |
(...skipping 18 matching lines...) Expand all Loading... |
75 DCHECK(state_ != GET_BACKEND); | 76 DCHECK(state_ != GET_BACKEND); |
76 | 77 |
77 DCHECK(new_data_.empty()); | 78 DCHECK(new_data_.empty()); |
78 CHECK(ready_); | 79 CHECK(ready_); |
79 DCHECK(user_callback_ == NULL); | 80 DCHECK(user_callback_ == NULL); |
80 new_data_ = Serialize(); | 81 new_data_ = Serialize(); |
81 | 82 |
82 if (!backend_) | 83 if (!backend_) |
83 return; | 84 return; |
84 | 85 |
85 state_ = CREATE; | 86 state_ = CREATE_OR_OPEN; |
86 DoLoop(OK); | 87 DoLoop(OK); |
87 } | 88 } |
88 | 89 |
89 DiskCacheBasedSSLHostInfo::~DiskCacheBasedSSLHostInfo() { | 90 DiskCacheBasedSSLHostInfo::~DiskCacheBasedSSLHostInfo() { |
90 DCHECK(!user_callback_); | 91 DCHECK(!user_callback_); |
91 if (entry_) | 92 if (entry_) |
92 entry_->Close(); | 93 entry_->Close(); |
93 if (!IsCallbackPending()) | 94 if (!IsCallbackPending()) |
94 delete callback_; | 95 delete callback_; |
95 } | 96 } |
(...skipping 29 matching lines...) Expand all Loading... |
125 break; | 126 break; |
126 case READ: | 127 case READ: |
127 rv = DoRead(); | 128 rv = DoRead(); |
128 break; | 129 break; |
129 case READ_COMPLETE: | 130 case READ_COMPLETE: |
130 rv = DoReadComplete(rv); | 131 rv = DoReadComplete(rv); |
131 break; | 132 break; |
132 case WAIT_FOR_DATA_READY_DONE: | 133 case WAIT_FOR_DATA_READY_DONE: |
133 rv = DoWaitForDataReadyDone(); | 134 rv = DoWaitForDataReadyDone(); |
134 break; | 135 break; |
135 case CREATE: | 136 case CREATE_OR_OPEN: |
136 rv = DoCreate(); | 137 rv = DoCreateOrOpen(); |
137 break; | 138 break; |
138 case CREATE_COMPLETE: | 139 case CREATE_OR_OPEN_COMPLETE: |
139 rv = DoCreateComplete(rv); | 140 rv = DoCreateOrOpenComplete(rv); |
140 break; | 141 break; |
141 case WRITE: | 142 case WRITE: |
142 rv = DoWrite(); | 143 rv = DoWrite(); |
143 break; | 144 break; |
144 case WRITE_COMPLETE: | 145 case WRITE_COMPLETE: |
145 rv = DoWriteComplete(rv); | 146 rv = DoWriteComplete(rv); |
146 break; | 147 break; |
147 case SET_DONE: | 148 case SET_DONE: |
148 rv = DoSetDone(); | 149 rv = DoSetDone(); |
149 break; | 150 break; |
(...skipping 13 matching lines...) Expand all Loading... |
163 } else { | 164 } else { |
164 state_ = WAIT_FOR_DATA_READY_DONE; | 165 state_ = WAIT_FOR_DATA_READY_DONE; |
165 } | 166 } |
166 return OK; | 167 return OK; |
167 } | 168 } |
168 | 169 |
169 int DiskCacheBasedSSLHostInfo::DoOpenComplete(int rv) { | 170 int DiskCacheBasedSSLHostInfo::DoOpenComplete(int rv) { |
170 if (rv == OK) { | 171 if (rv == OK) { |
171 entry_ = callback_->entry(); | 172 entry_ = callback_->entry(); |
172 state_ = READ; | 173 state_ = READ; |
| 174 found_entry_ = true; |
173 } else { | 175 } else { |
174 state_ = WAIT_FOR_DATA_READY_DONE; | 176 state_ = WAIT_FOR_DATA_READY_DONE; |
175 } | 177 } |
176 | 178 |
177 return OK; | 179 return OK; |
178 } | 180 } |
179 | 181 |
180 int DiskCacheBasedSSLHostInfo::DoReadComplete(int rv) { | 182 int DiskCacheBasedSSLHostInfo::DoReadComplete(int rv) { |
181 if (rv > 0) | 183 if (rv > 0) |
182 data_.assign(read_buffer_->data(), rv); | 184 data_.assign(read_buffer_->data(), rv); |
183 | 185 |
184 state_ = WAIT_FOR_DATA_READY_DONE; | 186 state_ = WAIT_FOR_DATA_READY_DONE; |
185 return OK; | 187 return OK; |
186 } | 188 } |
187 | 189 |
188 int DiskCacheBasedSSLHostInfo::DoWriteComplete(int rv) { | 190 int DiskCacheBasedSSLHostInfo::DoWriteComplete(int rv) { |
189 state_ = SET_DONE; | 191 state_ = SET_DONE; |
190 return OK; | 192 return OK; |
191 } | 193 } |
192 | 194 |
193 int DiskCacheBasedSSLHostInfo::DoCreateComplete(int rv) { | 195 int DiskCacheBasedSSLHostInfo::DoCreateOrOpenComplete(int rv) { |
194 if (rv != OK) { | 196 if (rv != OK) { |
195 state_ = SET_DONE; | 197 state_ = SET_DONE; |
196 } else { | 198 } else { |
197 entry_ = callback_->entry(); | 199 entry_ = callback_->entry(); |
198 state_ = WRITE; | 200 state_ = WRITE; |
199 } | 201 } |
200 return OK; | 202 return OK; |
201 } | 203 } |
202 | 204 |
203 int DiskCacheBasedSSLHostInfo::DoGetBackend() { | 205 int DiskCacheBasedSSLHostInfo::DoGetBackend() { |
(...skipping 21 matching lines...) Expand all Loading... |
225 | 227 |
226 int DiskCacheBasedSSLHostInfo::DoWrite() { | 228 int DiskCacheBasedSSLHostInfo::DoWrite() { |
227 write_buffer_ = new IOBuffer(new_data_.size()); | 229 write_buffer_ = new IOBuffer(new_data_.size()); |
228 memcpy(write_buffer_->data(), new_data_.data(), new_data_.size()); | 230 memcpy(write_buffer_->data(), new_data_.data(), new_data_.size()); |
229 state_ = WRITE_COMPLETE; | 231 state_ = WRITE_COMPLETE; |
230 | 232 |
231 return entry_->WriteData(0 /* index */, 0 /* offset */, write_buffer_, | 233 return entry_->WriteData(0 /* index */, 0 /* offset */, write_buffer_, |
232 new_data_.size(), callback_, true /* truncate */); | 234 new_data_.size(), callback_, true /* truncate */); |
233 } | 235 } |
234 | 236 |
235 int DiskCacheBasedSSLHostInfo::DoCreate() { | 237 int DiskCacheBasedSSLHostInfo::DoCreateOrOpen() { |
236 DCHECK(entry_ == NULL); | 238 DCHECK(entry_ == NULL); |
237 state_ = CREATE_COMPLETE; | 239 state_ = CREATE_OR_OPEN_COMPLETE; |
| 240 if (found_entry_) |
| 241 return backend_->OpenEntry(key(), callback_->entry_pointer(), callback_); |
| 242 |
238 return backend_->CreateEntry(key(), callback_->entry_pointer(), callback_); | 243 return backend_->CreateEntry(key(), callback_->entry_pointer(), callback_); |
239 } | 244 } |
240 | 245 |
241 int DiskCacheBasedSSLHostInfo::DoWaitForDataReadyDone() { | 246 int DiskCacheBasedSSLHostInfo::DoWaitForDataReadyDone() { |
242 DCHECK(!ready_); | 247 DCHECK(!ready_); |
243 state_ = NONE; | 248 state_ = NONE; |
244 ready_ = true; | 249 ready_ = true; |
245 // We close the entry because, if we shutdown before ::Persist is called, | 250 // We close the entry because, if we shutdown before ::Persist is called, |
246 // then we might leak a cache reference, which causes a DCHECK on shutdown. | 251 // then we might leak a cache reference, which causes a DCHECK on shutdown. |
247 if (entry_) | 252 if (entry_) |
248 entry_->Close(); | 253 entry_->Close(); |
249 entry_ = NULL; | 254 entry_ = NULL; |
250 Parse(data_); | 255 Parse(data_); |
251 return OK; | 256 return OK; |
252 } | 257 } |
253 | 258 |
254 int DiskCacheBasedSSLHostInfo::DoSetDone() { | 259 int DiskCacheBasedSSLHostInfo::DoSetDone() { |
255 if (entry_) | 260 if (entry_) |
256 entry_->Close(); | 261 entry_->Close(); |
257 entry_ = NULL; | 262 entry_ = NULL; |
258 state_ = NONE; | 263 state_ = NONE; |
259 return OK; | 264 return OK; |
260 } | 265 } |
261 | 266 |
262 bool DiskCacheBasedSSLHostInfo::IsCallbackPending() const { | 267 bool DiskCacheBasedSSLHostInfo::IsCallbackPending() const { |
263 switch (state_) { | 268 switch (state_) { |
264 case GET_BACKEND_COMPLETE: | 269 case GET_BACKEND_COMPLETE: |
265 case OPEN_COMPLETE: | 270 case OPEN_COMPLETE: |
266 case READ_COMPLETE: | 271 case READ_COMPLETE: |
267 case CREATE_COMPLETE: | 272 case CREATE_OR_OPEN_COMPLETE: |
268 case WRITE_COMPLETE: | 273 case WRITE_COMPLETE: |
269 return true; | 274 return true; |
270 default: | 275 default: |
271 return false; | 276 return false; |
272 } | 277 } |
273 } | 278 } |
274 | 279 |
275 } // namespace net | 280 } // namespace net |
OLD | NEW |