1// Copyright (c) 2012 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#ifndef NET_URL_REQUEST_URL_REQUEST_FTP_JOB_H_
6#define NET_URL_REQUEST_URL_REQUEST_FTP_JOB_H_
7
8#include <string>
9
10#include "base/memory/weak_ptr.h"
11#include "net/base/auth.h"
12#include "net/base/net_export.h"
13#include "net/ftp/ftp_request_info.h"
14#include "net/ftp/ftp_transaction.h"
15#include "net/http/http_request_info.h"
16#include "net/http/http_transaction.h"
17#include "net/proxy/proxy_info.h"
18#include "net/proxy/proxy_service.h"
19#include "net/url_request/url_request_job.h"
20
21namespace net {
22
23class NetworkDelegate;
24class FtpTransactionFactory;
25class FtpAuthCache;
26
27// A URLRequestJob subclass that is built on top of FtpTransaction. It
28// provides an implementation for FTP.
29class NET_EXPORT_PRIVATE URLRequestFtpJob : public URLRequestJob {
30 public:
31  URLRequestFtpJob(URLRequest* request,
32                   NetworkDelegate* network_delegate,
33                   FtpTransactionFactory* ftp_transaction_factory,
34                   FtpAuthCache* ftp_auth_cache);
35
36 protected:
37  virtual ~URLRequestFtpJob();
38
39  // Overridden from URLRequestJob:
40  virtual bool IsSafeRedirect(const GURL& location) OVERRIDE;
41  virtual bool GetMimeType(std::string* mime_type) const OVERRIDE;
42  virtual void GetResponseInfo(HttpResponseInfo* info) OVERRIDE;
43  virtual HostPortPair GetSocketAddress() const OVERRIDE;
44  virtual void SetPriority(RequestPriority priority) OVERRIDE;
45  virtual void Start() OVERRIDE;
46  virtual void Kill() OVERRIDE;
47
48  RequestPriority priority() const { return priority_; }
49
50 private:
51  void OnResolveProxyComplete(int result);
52
53  void StartFtpTransaction();
54  void StartHttpTransaction();
55
56  void OnStartCompleted(int result);
57  void OnStartCompletedAsync(int result);
58  void OnReadCompleted(int result);
59
60  void RestartTransactionWithAuth();
61
62  void LogFtpServerType(char server_type);
63
64  // Overridden from URLRequestJob:
65  virtual LoadState GetLoadState() const OVERRIDE;
66  virtual bool NeedsAuth() OVERRIDE;
67  virtual void GetAuthChallengeInfo(
68      scoped_refptr<AuthChallengeInfo>* auth_info) OVERRIDE;
69  virtual void SetAuth(const AuthCredentials& credentials) OVERRIDE;
70  virtual void CancelAuth() OVERRIDE;
71
72  // TODO(ibrar):  Yet to give another look at this function.
73  virtual UploadProgress GetUploadProgress() const OVERRIDE;
74  virtual bool ReadRawData(IOBuffer* buf,
75                           int buf_size,
76                           int *bytes_read) OVERRIDE;
77
78  void HandleAuthNeededResponse();
79
80  RequestPriority priority_;
81
82  ProxyService* proxy_service_;
83  ProxyInfo proxy_info_;
84  ProxyService::PacRequest* pac_request_;
85
86  FtpRequestInfo ftp_request_info_;
87  scoped_ptr<FtpTransaction> ftp_transaction_;
88
89  HttpRequestInfo http_request_info_;
90  scoped_ptr<HttpTransaction> http_transaction_;
91  const HttpResponseInfo* http_response_info_;
92
93  bool read_in_progress_;
94
95  scoped_refptr<AuthData> auth_data_;
96
97  FtpTransactionFactory* ftp_transaction_factory_;
98  FtpAuthCache* ftp_auth_cache_;
99
100  base::WeakPtrFactory<URLRequestFtpJob> weak_factory_;
101
102  DISALLOW_COPY_AND_ASSIGN(URLRequestFtpJob);
103};
104
105}  // namespace net
106
107#endif  // NET_URL_REQUEST_URL_REQUEST_FTP_JOB_H_
108