Home | History | Annotate | Download | only in local_discovery
      1 // Copyright 2013 The Chromium Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style license that can be
      3 // found in the LICENSE file.
      4 
      5 #include "chrome/browser/local_discovery/privet_url_fetcher.h"
      6 
      7 #include "base/json/json_reader.h"
      8 #include "chrome/browser/browser_process.h"
      9 #include "chrome/browser/local_discovery/privet_constants.h"
     10 #include "net/http/http_status_code.h"
     11 #include "net/url_request/url_request_status.h"
     12 
     13 namespace local_discovery {
     14 
     15 namespace {
     16 const char kXPrivetTokenHeaderPrefix[] = "X-Privet-Token: ";
     17 }
     18 
     19 PrivetURLFetcher::PrivetURLFetcher(
     20     const std::string& token,
     21     const GURL& url,
     22     net::URLFetcher::RequestType request_type,
     23     net::URLRequestContextGetter* request_context,
     24     PrivetURLFetcher::Delegate* delegate)
     25     : privet_access_token_(token), delegate_(delegate) {
     26   url_fetcher_.reset(net::URLFetcher::Create(url, request_type, this));
     27   url_fetcher_->SetRequestContext(request_context);
     28   url_fetcher_->AddExtraRequestHeader(std::string(kXPrivetTokenHeaderPrefix) +
     29                                       token);
     30 
     31   // URLFetcher requires us to set upload data for POST requests.
     32   if (request_type == net::URLFetcher::POST)
     33       url_fetcher_->SetUploadData(std::string(), std::string());
     34 }
     35 
     36 PrivetURLFetcher::~PrivetURLFetcher() {
     37 }
     38 
     39 void PrivetURLFetcher::Start() {
     40   url_fetcher_->Start();
     41 }
     42 
     43 void PrivetURLFetcher::OnURLFetchComplete(const net::URLFetcher* source) {
     44   if (source->GetStatus().status() != net::URLRequestStatus::SUCCESS) {
     45     delegate_->OnError(this, URL_FETCH_ERROR);
     46     return;
     47   }
     48 
     49   if (source->GetResponseCode() != net::HTTP_OK) {
     50     delegate_->OnError(this, RESPONSE_CODE_ERROR);
     51     return;
     52   }
     53 
     54   std::string response_str;
     55 
     56   if (!source->GetResponseAsString(&response_str)) {
     57     delegate_->OnError(this, URL_FETCH_ERROR);
     58     return;
     59   }
     60 
     61   base::JSONReader json_reader(base::JSON_ALLOW_TRAILING_COMMAS);
     62   scoped_ptr<base::Value> value;
     63 
     64   value.reset(json_reader.ReadToValue(response_str));
     65 
     66   if (!value) {
     67     delegate_->OnError(this, JSON_PARSE_ERROR);
     68     return;
     69   }
     70 
     71   const base::DictionaryValue* dictionary_value;
     72 
     73   if (!value->GetAsDictionary(&dictionary_value)) {
     74     delegate_->OnError(this, JSON_PARSE_ERROR);
     75     return;
     76   }
     77 
     78   delegate_->OnParsedJson(this, dictionary_value,
     79                           dictionary_value->HasKey(kPrivetKeyError));
     80 }
     81 
     82 PrivetURLFetcherFactory::PrivetURLFetcherFactory(
     83     net::URLRequestContextGetter* request_context)
     84     : request_context_(request_context) {
     85 }
     86 
     87 PrivetURLFetcherFactory::~PrivetURLFetcherFactory() {
     88 }
     89 
     90 scoped_ptr<PrivetURLFetcher> PrivetURLFetcherFactory::CreateURLFetcher(
     91     const GURL& url, net::URLFetcher::RequestType request_type,
     92     PrivetURLFetcher::Delegate* delegate) const {
     93   return scoped_ptr<PrivetURLFetcher>(
     94       new PrivetURLFetcher(token_, url, request_type,
     95                            request_context_.get(), delegate));
     96 }
     97 
     98 }  // namespace local_discovery
     99