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