| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 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 // The rules for parsing content-types were borrowed from Firefox: | 5 // The rules for parsing content-types were borrowed from Firefox: |
| 6 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 | 6 // http://lxr.mozilla.org/mozilla/source/netwerk/base/src/nsURLHelper.cpp#834 |
| 7 | 7 |
| 8 #include "net/http/http_util.h" | 8 #include "net/http/http_util.h" |
| 9 | 9 |
| 10 #include <algorithm> | 10 #include <algorithm> |
| (...skipping 803 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 814 base::StringTokenizer tokenizer(str, std::string(1, '\0')); | 814 base::StringTokenizer tokenizer(str, std::string(1, '\0')); |
| 815 while (tokenizer.GetNext()) { | 815 while (tokenizer.GetNext()) { |
| 816 disassembled_headers.append(tokenizer.token_begin(), tokenizer.token_end()); | 816 disassembled_headers.append(tokenizer.token_begin(), tokenizer.token_end()); |
| 817 disassembled_headers.append("\r\n"); | 817 disassembled_headers.append("\r\n"); |
| 818 } | 818 } |
| 819 disassembled_headers.append("\r\n"); | 819 disassembled_headers.append("\r\n"); |
| 820 | 820 |
| 821 return disassembled_headers; | 821 return disassembled_headers; |
| 822 } | 822 } |
| 823 | 823 |
| 824 // TODO(jungshik): 1. If the list is 'fr-CA,fr-FR,en,de', we have to add | |
| 825 // 'fr' after 'fr-CA' with the same q-value as 'fr-CA' because | |
| 826 // web servers, in general, do not fall back to 'fr' and may end up picking | |
| 827 // 'en' which has a lower preference than 'fr-CA' and 'fr-FR'. | |
| 828 // 2. This function assumes that the input is a comma separated list | |
| 829 // without any whitespace. As long as it comes from the preference and | |
| 830 // a user does not manually edit the preference file, it's the case. Still, | |
| 831 // we may have to make it more robust. | |
| 832 std::string HttpUtil::GenerateAcceptLanguageHeader( | |
| 833 const std::string& raw_language_list) { | |
| 834 // We use integers for qvalue and qvalue decrement that are 10 times | |
| 835 // larger than actual values to avoid a problem with comparing | |
| 836 // two floating point numbers. | |
| 837 const unsigned int kQvalueDecrement10 = 2; | |
| 838 unsigned int qvalue10 = 10; | |
| 839 base::StringTokenizer t(raw_language_list, ","); | |
| 840 std::string lang_list_with_q; | |
| 841 while (t.GetNext()) { | |
| 842 std::string language = t.token(); | |
| 843 if (qvalue10 == 10) { | |
| 844 // q=1.0 is implicit. | |
| 845 lang_list_with_q = language; | |
| 846 } else { | |
| 847 DCHECK_LT(qvalue10, 10U); | |
| 848 base::StringAppendF(&lang_list_with_q, ",%s;q=0.%d", language.c_str(), | |
| 849 qvalue10); | |
| 850 } | |
| 851 // It does not make sense to have 'q=0'. | |
| 852 if (qvalue10 > kQvalueDecrement10) | |
| 853 qvalue10 -= kQvalueDecrement10; | |
| 854 } | |
| 855 return lang_list_with_q; | |
| 856 } | |
| 857 | |
| 858 void HttpUtil::AppendHeaderIfMissing(const char* header_name, | 824 void HttpUtil::AppendHeaderIfMissing(const char* header_name, |
| 859 const std::string& header_value, | 825 const std::string& header_value, |
| 860 std::string* headers) { | 826 std::string* headers) { |
| 861 if (header_value.empty()) | 827 if (header_value.empty()) |
| 862 return; | 828 return; |
| 863 if (HttpUtil::HasHeader(*headers, header_name)) | 829 if (HttpUtil::HasHeader(*headers, header_name)) |
| 864 return; | 830 return; |
| 865 *headers += std::string(header_name) + ": " + header_value + "\r\n"; | 831 *headers += std::string(header_name) + ": " + header_value + "\r\n"; |
| 866 } | 832 } |
| 867 | 833 |
| (...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1147 return true; | 1113 return true; |
| 1148 } | 1114 } |
| 1149 | 1115 |
| 1150 bool HttpUtil::NameValuePairsIterator::IsQuote(char c) const { | 1116 bool HttpUtil::NameValuePairsIterator::IsQuote(char c) const { |
| 1151 if (strict_quotes_) | 1117 if (strict_quotes_) |
| 1152 return c == '"'; | 1118 return c == '"'; |
| 1153 return HttpUtil::IsQuote(c); | 1119 return HttpUtil::IsQuote(c); |
| 1154 } | 1120 } |
| 1155 | 1121 |
| 1156 } // namespace net | 1122 } // namespace net |
| OLD | NEW |