// Copyright 2014 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#include "mojo/services/network/network_context.h"

#include "base/base_paths.h"
#include "base/path_service.h"
#include "net/proxy/proxy_service.h"
#include "net/url_request/url_request_context.h"
#include "net/url_request/url_request_context_builder.h"

namespace mojo {

NetworkContext::NetworkContext(
    scoped_ptr<net::URLRequestContext> url_request_context)
    : url_request_context_(url_request_context.Pass()) {
}

NetworkContext::NetworkContext(const base::FilePath& base_path)
    : NetworkContext(MakeURLRequestContext(base_path)) {
}

NetworkContext::~NetworkContext() {
  // TODO(darin): Be careful about destruction order of member variables?
}

// static
scoped_ptr<net::URLRequestContext> NetworkContext::MakeURLRequestContext(
    const base::FilePath& base_path) {
  net::URLRequestContextBuilder builder;
  builder.set_accept_language("en-us,en");
  // TODO(darin): This is surely the wrong UA string.
  builder.set_user_agent("Mojo/0.1");
  builder.set_proxy_service(net::ProxyService::CreateDirect());
  builder.set_transport_security_persister_path(base_path);

  net::URLRequestContextBuilder::HttpCacheParams cache_params;
  cache_params.path = base_path.Append(FILE_PATH_LITERAL("Cache"));
  // TODO(esprehn): For now store the cache in memory so we can run many shells
  // in parallel when running tests, otherwise the network services in each
  // shell will corrupt the disk cache.
  cache_params.type = net::URLRequestContextBuilder::HttpCacheParams::IN_MEMORY;
  builder.EnableHttpCache(cache_params);

  builder.set_file_enabled(true);

  return make_scoped_ptr(builder.Build());
}

}  // namespace mojo
