12a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 22a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 32a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// found in the LICENSE file. 42a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 52a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/streams/stream_handle_impl.h" 62a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 75d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/bind.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/location.h" 95d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "base/message_loop/message_loop_proxy.h" 102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/browser/streams/stream.h" 11effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch#include "net/http/http_response_headers.h" 122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)namespace content { 142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 15cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)namespace { 16cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 17cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void RunCloseListeners(const std::vector<base::Closure>& close_listeners) { 18cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) for (size_t i = 0; i < close_listeners.size(); ++i) 19cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) close_listeners[i].Run(); 20cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 21cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 22cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} // namespace 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 24effb81e5f8246d0db0270817048dc992db66e9fbBen MurdochStreamHandleImpl::StreamHandleImpl( 25effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const base::WeakPtr<Stream>& stream, 26effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const GURL& original_url, 27effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch const std::string& mime_type, 28effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch scoped_refptr<net::HttpResponseHeaders> response_headers) 292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : stream_(stream), 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) url_(stream->url()), 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) original_url_(original_url), 322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mime_type_(mime_type), 331320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci response_headers_(NULL), 341320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci stream_message_loop_(base::MessageLoopProxy::current().get()) { 351320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Make a copy of the response headers so it is safe to pass this across 361320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // threads. 371320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci if (response_headers.get()) { 381320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci response_headers_ = 391320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci new net::HttpResponseHeaders(response_headers->raw_headers()); 401320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 411320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci} 422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)StreamHandleImpl::~StreamHandleImpl() { 44cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) stream_message_loop_->PostTaskAndReply(FROM_HERE, 45cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&Stream::CloseHandle, stream_), 46cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::Bind(&RunCloseListeners, close_listeners_)); 472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& StreamHandleImpl::GetURL() { 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return url_; 512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const GURL& StreamHandleImpl::GetOriginalURL() { 542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return original_url_; 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const std::string& StreamHandleImpl::GetMimeType() { 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return mime_type_; 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 61effb81e5f8246d0db0270817048dc992db66e9fbBen Murdochscoped_refptr<net::HttpResponseHeaders> StreamHandleImpl::GetResponseHeaders() { 62a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) return response_headers_; 63a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 64a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 65cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)void StreamHandleImpl::AddCloseListener(const base::Closure& callback) { 66cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) close_listeners_.push_back(callback); 67cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)} 68cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} // namespace content 70