OLD | NEW |
1 // Copyright (c) 2006-2008 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2006-2008 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 "webkit/glue/multipart_response_delegate.h" | 5 #include "webkit/glue/multipart_response_delegate.h" |
6 | 6 |
7 #include "base/logging.h" | 7 #include "base/logging.h" |
8 #include "base/string_util.h" | 8 #include "base/string_util.h" |
9 #include "net/base/net_util.h" | 9 #include "net/base/net_util.h" |
10 #include "webkit/api/public/WebHTTPHeaderVisitor.h" | 10 #include "webkit/api/public/WebHTTPHeaderVisitor.h" |
(...skipping 63 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
74 } | 74 } |
75 | 75 |
76 void MultipartResponseDelegate::OnReceivedData(const char* data, | 76 void MultipartResponseDelegate::OnReceivedData(const char* data, |
77 int data_len) { | 77 int data_len) { |
78 // stop_sending_ means that we've already received the final boundary token. | 78 // stop_sending_ means that we've already received the final boundary token. |
79 // The server should stop sending us data at this point, but if it does, we | 79 // The server should stop sending us data at this point, but if it does, we |
80 // just throw it away. | 80 // just throw it away. |
81 if (stop_sending_) | 81 if (stop_sending_) |
82 return; | 82 return; |
83 | 83 |
84 // TODO(tc): Figure out what to use for length_received. Maybe we can just | |
85 // pass the value on from our caller. | |
86 int length_received = -1; | |
87 | |
88 data_.append(data, data_len); | 84 data_.append(data, data_len); |
89 if (first_received_data_) { | 85 if (first_received_data_) { |
90 // Some servers don't send a boundary token before the first chunk of | 86 // Some servers don't send a boundary token before the first chunk of |
91 // data. We handle this case anyway (Gecko does too). | 87 // data. We handle this case anyway (Gecko does too). |
92 first_received_data_ = false; | 88 first_received_data_ = false; |
93 | 89 |
94 // Eat leading \r\n | 90 // Eat leading \r\n |
95 int pos = PushOverLine(data_, 0); | 91 int pos = PushOverLine(data_, 0); |
96 if (pos) | 92 if (pos) |
97 data_ = data_.substr(pos); | 93 data_ = data_.substr(pos); |
(...skipping 27 matching lines...) Expand all Loading... |
125 } | 121 } |
126 } | 122 } |
127 DCHECK(!processing_headers_); | 123 DCHECK(!processing_headers_); |
128 | 124 |
129 size_t boundary_pos; | 125 size_t boundary_pos; |
130 while ((boundary_pos = FindBoundary()) != std::string::npos) { | 126 while ((boundary_pos = FindBoundary()) != std::string::npos) { |
131 if (boundary_pos > 0) { | 127 if (boundary_pos > 0) { |
132 // Send the last data chunk. | 128 // Send the last data chunk. |
133 client_->didReceiveData(loader_, | 129 client_->didReceiveData(loader_, |
134 data_.data(), | 130 data_.data(), |
135 static_cast<int>(boundary_pos), | 131 static_cast<int>(boundary_pos)); |
136 length_received); | |
137 } | 132 } |
138 size_t boundary_end_pos = boundary_pos + boundary_.length(); | 133 size_t boundary_end_pos = boundary_pos + boundary_.length(); |
139 if (boundary_end_pos < data_.length() && '-' == data_[boundary_end_pos]) { | 134 if (boundary_end_pos < data_.length() && '-' == data_[boundary_end_pos]) { |
140 // This was the last boundary so we can stop processing. | 135 // This was the last boundary so we can stop processing. |
141 stop_sending_ = true; | 136 stop_sending_ = true; |
142 data_.clear(); | 137 data_.clear(); |
143 return; | 138 return; |
144 } | 139 } |
145 | 140 |
146 // We can now throw out data up through the boundary | 141 // We can now throw out data up through the boundary |
147 int offset = PushOverLine(data_, boundary_end_pos); | 142 int offset = PushOverLine(data_, boundary_end_pos); |
148 data_ = data_.substr(boundary_end_pos + offset); | 143 data_ = data_.substr(boundary_end_pos + offset); |
149 | 144 |
150 // Ok, back to parsing headers | 145 // Ok, back to parsing headers |
151 if (!ParseHeaders()) { | 146 if (!ParseHeaders()) { |
152 processing_headers_ = true; | 147 processing_headers_ = true; |
153 break; | 148 break; |
154 } | 149 } |
155 } | 150 } |
156 } | 151 } |
157 | 152 |
158 void MultipartResponseDelegate::OnCompletedRequest() { | 153 void MultipartResponseDelegate::OnCompletedRequest() { |
159 // If we have any pending data and we're not in a header, go ahead and send | 154 // If we have any pending data and we're not in a header, go ahead and send |
160 // it to WebCore. | 155 // it to WebCore. |
161 if (!processing_headers_ && !data_.empty()) { | 156 if (!processing_headers_ && !data_.empty()) { |
162 // TODO(tc): Figure out what to use for length_received. Maybe we can just | |
163 // pass the value on from our caller. | |
164 int length_received = -1; | |
165 client_->didReceiveData(loader_, | 157 client_->didReceiveData(loader_, |
166 data_.data(), | 158 data_.data(), |
167 static_cast<int>(data_.length()), | 159 static_cast<int>(data_.length())); |
168 length_received); | |
169 } | 160 } |
170 } | 161 } |
171 | 162 |
172 int MultipartResponseDelegate::PushOverLine(const std::string& data, | 163 int MultipartResponseDelegate::PushOverLine(const std::string& data, |
173 size_t pos) { | 164 size_t pos) { |
174 int offset = 0; | 165 int offset = 0; |
175 if (pos < data.length() && (data[pos] == '\r' || data[pos] == '\n')) { | 166 if (pos < data.length() && (data[pos] == '\r' || data[pos] == '\n')) { |
176 ++offset; | 167 ++offset; |
177 if (pos + 1 < data.length() && data[pos + 1] == '\n') | 168 if (pos + 1 < data.length() && data[pos + 1] == '\n') |
178 ++offset; | 169 ++offset; |
(...skipping 151 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
330 byte_range_upper_bound_characters); | 321 byte_range_upper_bound_characters); |
331 | 322 |
332 if (!StringToInt(byte_range_lower_bound, content_range_lower_bound)) | 323 if (!StringToInt(byte_range_lower_bound, content_range_lower_bound)) |
333 return false; | 324 return false; |
334 if (!StringToInt(byte_range_upper_bound, content_range_upper_bound)) | 325 if (!StringToInt(byte_range_upper_bound, content_range_upper_bound)) |
335 return false; | 326 return false; |
336 return true; | 327 return true; |
337 } | 328 } |
338 | 329 |
339 } // namespace webkit_glue | 330 } // namespace webkit_glue |
OLD | NEW |