form_data_parser.h revision 1320f92c476a1ad9d19dba2a48c72b75566198e9
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 EXTENSIONS_BROWSER_API_WEB_REQUEST_FORM_DATA_PARSER_H_ 6#define EXTENSIONS_BROWSER_API_WEB_REQUEST_FORM_DATA_PARSER_H_ 7 8#include <string> 9 10#include "base/basictypes.h" 11#include "base/memory/scoped_ptr.h" 12// Cannot forward declare StringPiece because it is a typedef. 13#include "base/strings/string_piece.h" 14 15namespace net { 16class URLRequest; 17} 18 19namespace extensions { 20 21// Interface for the form data parsers. 22class FormDataParser { 23 public: 24 // Result encapsulates name-value pairs returned by GetNextNameValue. 25 class Result { 26 public: 27 Result(); 28 ~Result(); 29 30 const std::string& name() const { return name_; } 31 const std::string& value() const { return value_; } 32 33 void set_name(base::StringPiece str) { str.CopyToString(&name_); } 34 void set_value(base::StringPiece str) { str.CopyToString(&value_); } 35 36 private: 37 std::string name_; 38 std::string value_; 39 40 DISALLOW_COPY_AND_ASSIGN(Result); 41 }; 42 43 virtual ~FormDataParser(); 44 45 // Creates a correct parser instance based on the |request|. Returns NULL 46 // on failure. 47 static scoped_ptr<FormDataParser> Create(const net::URLRequest& request); 48 49 // Creates a correct parser instance based on |content_type_header|, the 50 // "Content-Type" request header value. If |content_type_header| is NULL, it 51 // defaults to "application/x-www-form-urlencoded". Returns NULL on failure. 52 static scoped_ptr<FormDataParser> CreateFromContentTypeHeader( 53 const std::string* content_type_header); 54 55 // Returns true if there was some data, it was well formed and all was read. 56 virtual bool AllDataReadOK() = 0; 57 58 // Gets the next name-value pair from the source data and stores it in 59 // |result|. Returns true if a pair was found. Callers must have previously 60 // succesfully called the SetSource method. 61 virtual bool GetNextNameValue(Result* result) = 0; 62 63 // Sets the |source| of the data to be parsed. One form data parser is only 64 // expected to be associated with one source, so generally, SetSource should 65 // be only called once. However, for technical reasons, the source might only 66 // be available in chunks for multipart encoded forms, in which case it is OK 67 // to call SetSource multiple times to add all chunks of a single source. The 68 // ownership of |source| is left with the caller and the source should live 69 // until |this| dies or |this->SetSource()| is called again, whichever comes 70 // sooner. Returns true on success. 71 virtual bool SetSource(base::StringPiece source) = 0; 72 73 protected: 74 FormDataParser(); 75 76 private: 77 DISALLOW_COPY_AND_ASSIGN(FormDataParser); 78}; 79 80} // namespace extensions 81 82#endif // EXTENSIONS_BROWSER_API_WEB_REQUEST_FORM_DATA_PARSER_H_ 83