Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(287)

Side by Side Diff: chrome/browser/extensions/api/log_private/syslog_parser.cc

Issue 266193002: Extend PR_ParseTimeString() to accept some ISO 8601 formats to fix timezone parsing in SyslogParser. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 6 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | chrome/browser/extensions/api/log_private/syslog_parser_unittest.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 The Chromium Authors. All rights reserved. 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 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "chrome/browser/extensions/api/log_private/syslog_parser.h" 5 #include "chrome/browser/extensions/api/log_private/syslog_parser.h"
6 6
7 #include <string> 7 #include <string>
8 #include <vector> 8 #include <vector>
9 9
10 #include "base/logging.h" 10 #include "base/logging.h"
11 #include "base/memory/linked_ptr.h" 11 #include "base/memory/linked_ptr.h"
12 #include "base/memory/singleton.h" 12 #include "base/memory/singleton.h"
13 #include "base/strings/string_number_conversions.h" 13 #include "base/strings/string_number_conversions.h"
14 #include "base/strings/string_split.h" 14 #include "base/strings/string_split.h"
15 #include "base/strings/string_tokenizer.h" 15 #include "base/strings/string_tokenizer.h"
16 #include "base/time/time.h" 16 #include "base/time/time.h"
17 #include "chrome/browser/extensions/api/log_private/filter_handler.h" 17 #include "chrome/browser/extensions/api/log_private/filter_handler.h"
18 #include "chrome/browser/extensions/api/log_private/log_parser.h" 18 #include "chrome/browser/extensions/api/log_private/log_parser.h"
19 #include "chrome/browser/extensions/api/log_private/log_private_api.h" 19 #include "chrome/browser/extensions/api/log_private/log_private_api.h"
20 #include "chrome/common/extensions/api/log_private.h" 20 #include "chrome/common/extensions/api/log_private.h"
21 21
22 namespace extensions { 22 namespace extensions {
23 23
24 namespace { 24 namespace {
25 25
26 const int kExpectedTimeTokenNum = 7; 26 const int kExpectedTimeTokenNum = 17;
27 const char kLogEntryDelimiters[] = "-:T"; 27 const char kLogEntryDelimiters[] = "-+.:T";
28 const char kProcessInfoDelimiters[] = "[]"; 28 const char kProcessInfoDelimiters[] = "[]";
29 29
30 } // namespace 30 } // namespace
31 31
32 SyslogParser::SyslogParser() {} 32 SyslogParser::SyslogParser() {}
33 33
34 SyslogParser::~SyslogParser() {} 34 SyslogParser::~SyslogParser() {}
35 35
36 SyslogParser::Error SyslogParser::ParseEntry( 36 SyslogParser::Error SyslogParser::ParseEntry(
37 const std::string& input, 37 const std::string& input,
(...skipping 26 matching lines...) Expand all
64 ParseLevel(input, entry.get()); 64 ParseLevel(input, entry.get());
65 entry->full_entry = input; 65 entry->full_entry = input;
66 66
67 if (filter_handler->IsValidLogEntry(*(entry.get()))) { 67 if (filter_handler->IsValidLogEntry(*(entry.get()))) {
68 output->push_back(entry); 68 output->push_back(entry);
69 } 69 }
70 70
71 return SyslogParser::SUCCESS; 71 return SyslogParser::SUCCESS;
72 } 72 }
73 73
74 SyslogParser::Error ParseTimeHelper(base::StringTokenizer* tokenizer, 74 SyslogParser::Error ParseTimeHelper(base::StringTokenizer& tokenizer,
75 std::string* output) { 75 std::string& output) {
not at google - send to devlin 2014/05/05 19:36:24 if these are refs they need to be const. but give
Thiemo Nagel 2014/05/06 18:15:49 I wasn't aware of that convention. Thanks a lot!
76 if (!tokenizer->GetNext()) { 76 if (!tokenizer.GetNext()) {
77 LOG(ERROR) << "Error when parsing time"; 77 LOG(ERROR) << "Error when parsing time";
78 return SyslogParser::PARSE_ERROR; 78 return SyslogParser::PARSE_ERROR;
79 } 79 }
80 *output = tokenizer->token(); 80 output = tokenizer.token();
81 return SyslogParser::SUCCESS; 81 return SyslogParser::SUCCESS;
82 } 82 }
83 83
84 SyslogParser::Error SyslogParser::ParseTime(const std::string& input, 84 SyslogParser::Error SyslogParser::ParseTime(const std::string& input,
85 double* output) const { 85 double* output) const {
86 base::StringTokenizer tokenizer(input, kLogEntryDelimiters); 86 base::StringTokenizer tokenizer(input, kLogEntryDelimiters);
87 tokenizer.set_options(base::StringTokenizer::RETURN_DELIMS);
87 std::string tokens[kExpectedTimeTokenNum]; 88 std::string tokens[kExpectedTimeTokenNum];
88 for (int i = 0; i < kExpectedTimeTokenNum; i++) { 89 for (int i = 0; i < kExpectedTimeTokenNum; i++) {
89 if (ParseTimeHelper(&tokenizer, &(tokens[i])) != SyslogParser::SUCCESS) 90 if (ParseTimeHelper(tokenizer, tokens[i]) != SyslogParser::SUCCESS)
90 return SyslogParser::PARSE_ERROR; 91 return SyslogParser::PARSE_ERROR;
91 } 92 }
92 93
93 std::string buffer = tokens[1] + '-' + tokens[2] + '-' + tokens[0] + ' ' + 94 DCHECK(tokens[1] == "-");
94 tokens[3] + ':' + tokens[4] + ":00"; 95 DCHECK(tokens[3] == "-");
96 DCHECK(tokens[5] == "T");
97 DCHECK(tokens[7] == ":");
98 DCHECK(tokens[9] == ":");
99 DCHECK(tokens[11] == ".");
100 DCHECK(tokens[15] == ":");
not at google - send to devlin 2014/05/05 19:36:24 DCHECKs here seem wrong especially since we can re
Thiemo Nagel 2014/05/06 18:15:49 OK. Done.
101
102 std::string buffer =
103 tokens[2] + "/" + tokens[4] + "/" + tokens[0] + " " + // month/day/year
104 tokens[6] + ":" + tokens[8] + ":" + tokens[10] + " " + // hour:min:sec
105 tokens[13] + tokens[14] + tokens[16]; // +/- tz offset
not at google - send to devlin 2014/05/05 19:36:24 maybe have a look at sscanf[_s] here? surely there
Thiemo Nagel 2014/05/06 18:15:49 Could you please explain what specifically you'd s
not at google - send to devlin 2014/05/06 18:24:51 The code is very hard to read. De-formatting it us
95 106
96 base::Time parsed_time; 107 base::Time parsed_time;
97 if (!base::Time::FromString(buffer.c_str(), &parsed_time)) { 108 if (!base::Time::FromString(buffer.c_str(), &parsed_time)) {
98 LOG(ERROR) << "Error when parsing time"; 109 LOG(ERROR) << "Error when parsing time";
99 return SyslogParser::PARSE_ERROR; 110 return SyslogParser::PARSE_ERROR;
100 } 111 }
101 112
102 double seconds; 113 double seconds;
103 base::StringToDouble(tokens[5], &seconds); 114 base::StringToDouble("." + tokens[12], &seconds);
104 *output = parsed_time.ToJsTime() + 115 *output = parsed_time.ToJsTime() +
105 (seconds * base::Time::kMillisecondsPerSecond); 116 (seconds * base::Time::kMillisecondsPerSecond);
106 117
107 return SyslogParser::SUCCESS; 118 return SyslogParser::SUCCESS;
108 } 119 }
109 120
110 SyslogParser::Error SyslogParser::ParseProcess( 121 SyslogParser::Error SyslogParser::ParseProcess(
111 const std::string& input, 122 const std::string& input,
112 api::log_private::LogEntry* entry) const { 123 api::log_private::LogEntry* entry) const {
113 base::StringTokenizer tokenizer(input, kProcessInfoDelimiters); 124 base::StringTokenizer tokenizer(input, kProcessInfoDelimiters);
(...skipping 21 matching lines...) Expand all
135 } else if (input.find("WARN") != std::string::npos) { 146 } else if (input.find("WARN") != std::string::npos) {
136 entry->level = "warning"; 147 entry->level = "warning";
137 } else if (input.find("INFO") != std::string::npos) { 148 } else if (input.find("INFO") != std::string::npos) {
138 entry->level = "info"; 149 entry->level = "info";
139 } else { 150 } else {
140 entry->level = "unknown"; 151 entry->level = "unknown";
141 } 152 }
142 } 153 }
143 154
144 } // namespace extensions 155 } // namespace extensions
OLDNEW
« no previous file with comments | « no previous file | chrome/browser/extensions/api/log_private/syslog_parser_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698