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

Unified Diff: content/child/multipart_response_delegate.cc

Issue 1166953002: Use net's response header parser for parsing multipart headers. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Improved comments. Created 5 years, 6 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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: content/child/multipart_response_delegate.cc
diff --git a/content/child/multipart_response_delegate.cc b/content/child/multipart_response_delegate.cc
index 21d2d51e02a20bcd08bb487cb202fe916c271a46..fade2d3728d114db7f02327f771a1793beb415e4 100644
--- a/content/child/multipart_response_delegate.cc
+++ b/content/child/multipart_response_delegate.cc
@@ -8,6 +8,7 @@
#include "base/strings/string_number_conversions.h"
#include "base/strings/string_util.h"
#include "net/base/net_util.h"
+#include "net/http/http_response_headers.h"
#include "net/http/http_util.h"
#include "third_party/WebKit/public/platform/WebHTTPHeaderVisitor.h"
#include "third_party/WebKit/public/platform/WebString.h"
@@ -209,57 +210,55 @@ int MultipartResponseDelegate::PushOverLine(const std::string& data,
}
bool MultipartResponseDelegate::ParseHeaders() {
- int line_feed_increment = 1;
-
- // Grab the headers being liberal about line endings.
- size_t line_start_pos = 0;
- size_t line_end_pos = data_.find('\n');
- while (line_end_pos != std::string::npos) {
- // Handle CRLF
- if (line_end_pos > line_start_pos && data_[line_end_pos - 1] == '\r') {
- line_feed_increment = 2;
- --line_end_pos;
- } else {
- line_feed_increment = 1;
- }
- if (line_start_pos == line_end_pos) {
- // A blank line, end of headers
- line_end_pos += line_feed_increment;
- break;
- }
- // Find the next header line.
- line_start_pos = line_end_pos + line_feed_increment;
- line_end_pos = data_.find('\n', line_start_pos);
- }
- // Truncated in the middle of a header, stop parsing.
- if (line_end_pos == std::string::npos)
+ int headers_end_pos = -1;
+
+ size_t i = 0;
+ while ((data_[i] == '\r' || data_[i] == '\n') && i < data_.size())
+ i++;
mmenke 2015/06/05 16:01:42 This isn't correct (If we have a bunch of LFs or C
haavardm 2015/06/09 15:12:35 agh, of course..
+
+ if (i > 0)
+ headers_end_pos = i;
+ else
+ headers_end_pos =
+ net::HttpUtil::LocateEndOfHeaders(data_.c_str(), data_.size(), 0);
+
+ if (headers_end_pos < 0)
return false;
- // Eat headers
- std::string headers("\n");
- headers.append(data_, 0, line_end_pos);
- data_ = data_.substr(line_end_pos);
+ // Eat headers and prepend a status line as is required by
+ // HttpResponseHeaders.
+ std::string headers("HTTP/1.1 200 OK\r\n");
+ headers.append(data_, 0, headers_end_pos);
+ data_ = data_.substr(headers_end_pos);
+
+ scoped_refptr<net::HttpResponseHeaders> response_headers =
mmenke 2015/06/05 16:01:42 nit: include base/ref_counted.h
haavardm 2015/06/09 15:12:34 Done.
+ new net::HttpResponseHeaders(
+ net::HttpUtil::AssembleRawHeaders(headers.c_str(), headers.size()));
mmenke 2015/06/05 16:01:42 Again, suggest a method for HttpUtil that does thi
haavardm 2015/06/09 15:12:34 I'm a bit unsure about what you suggest to add a m
mmenke 2015/06/09 20:23:37 I was thinking of making a method that does this:
// Create a WebURLResponse based on the original set of headers + the
- // replacement headers. We only replace the same few headers that gecko
- // does. See netwerk/streamconv/converters/nsMultiMixedConv.cpp.
- std::string content_type = net::GetSpecificHeader(headers, "content-type");
+ // replacement headers. We only replace the same few headers that gecko
+ // does. See netwerk/streamconv/converters/nsMultiMixedConv.cpp.
+ std::string content_type;
+ WebURLResponse response(original_response_.url());
+
std::string mime_type;
+ if (response_headers->GetMimeType(&mime_type)) {
+ response.setMIMEType(WebString::fromUTF8(mime_type));
+ }
std::string charset;
- bool has_charset = false;
- net::HttpUtil::ParseContentType(content_type, &mime_type, &charset,
- &has_charset, NULL);
- WebURLResponse response(original_response_.url());
- response.setMIMEType(WebString::fromUTF8(mime_type));
- response.setTextEncodingName(WebString::fromUTF8(charset));
+ if (response_headers->GetCharset(&charset)) {
+ response.setTextEncodingName(WebString::fromUTF8(charset));
+ }
mmenke 2015/06/05 16:01:42 I don't feel like I can adequately review the impl
haavardm 2015/06/09 15:12:35 I think it should handle not setting the mime or t
+ // Copy the response headers from the original response.
HeaderCopier copier(&response);
original_response_.visitHTTPHeaderFields(&copier);
+ // Replace original headers with multipart headers listed in kReplaceHeaders.
for (size_t i = 0; i < arraysize(kReplaceHeaders); ++i) {
std::string name(kReplaceHeaders[i]);
- std::string value = net::GetSpecificHeader(headers, name);
- if (!value.empty()) {
+ std::string value;
+ if (response_headers->EnumerateHeader(NULL, name, &value)) {
response.setHTTPHeaderField(WebString::fromUTF8(name),
WebString::fromUTF8(value));
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698