#include "config.h"
#include "HTTPParsers.h"
#include "PlatformString.h"
namespace WebCore {
static inline bool skipWhiteSpace(const String& str, int& pos, bool fromHttpEquivMeta)
{
int len = str.length();
if (fromHttpEquivMeta)
while (pos != len && str[pos] <= ' ')
++pos;
else
while (pos != len && (str[pos] == '\t' || str[pos] == ' '))
++pos;
return pos != len;
}
bool parseHTTPRefresh(const String& refresh, bool fromHttpEquivMeta, double& delay, String& url)
{
int len = refresh.length();
int pos = 0;
if (!skipWhiteSpace(refresh, pos, fromHttpEquivMeta))
return false;
while (pos != len && refresh[pos] != ',' && refresh[pos] != ';')
++pos;
if (pos == len) { url = String();
bool ok;
delay = refresh.stripWhiteSpace().toDouble(&ok);
return ok;
} else {
bool ok;
delay = refresh.left(pos).stripWhiteSpace().toDouble(&ok);
if (!ok)
return false;
++pos;
skipWhiteSpace(refresh, pos, fromHttpEquivMeta);
int urlStartPos = pos;
if (refresh.find("url", urlStartPos, false) == urlStartPos) {
urlStartPos += 3;
skipWhiteSpace(refresh, urlStartPos, fromHttpEquivMeta);
if (refresh[urlStartPos] == '=') {
++urlStartPos;
skipWhiteSpace(refresh, urlStartPos, fromHttpEquivMeta);
} else
urlStartPos = pos; }
int urlEndPos = len;
if (refresh[urlStartPos] == '"' || refresh[urlStartPos] == '\'') {
UChar quotationMark = refresh[urlStartPos];
urlStartPos++;
while (urlEndPos > urlStartPos) {
urlEndPos--;
if (refresh[urlEndPos] == quotationMark)
break;
}
}
url = refresh.substring(urlStartPos, urlEndPos - urlStartPos).stripWhiteSpace();
return true;
}
}
String filenameFromHTTPContentDisposition(const String& value)
{
Vector<String> keyValuePairs = value.split(';');
unsigned length = keyValuePairs.size();
for (unsigned i = 0; i < length; i++) {
int valueStartPos = keyValuePairs[i].find('=');
if (valueStartPos < 0)
continue;
String key = keyValuePairs[i].left(valueStartPos).stripWhiteSpace();
if (key.isEmpty() || key != "filename")
continue;
String value = keyValuePairs[i].substring(valueStartPos + 1).stripWhiteSpace();
if (value[0] == '\"')
value = value.substring(1, value.length() - 2);
return value;
}
return String();
}
String extractMIMETypeFromMediaType(const String& mediaType)
{
String mimeType;
unsigned length = mediaType.length();
for (unsigned offset = 0; offset < length; offset++) {
UChar c = mediaType[offset];
if (c == ';')
break;
else if (isSpaceOrNewline(c)) continue;
mimeType += String(&c, 1);
}
return mimeType;
}
String extractCharsetFromMediaType(const String& mediaType)
{
int pos = 0;
int length = (int)mediaType.length();
while (pos < length) {
pos = mediaType.find("charset", pos, false);
if (pos <= 0)
return String();
if (mediaType[pos-1] > ' ' && mediaType[pos-1] != ';') {
pos += 7;
continue;
}
pos += 7;
while (pos != length && mediaType[pos] <= ' ')
++pos;
if (mediaType[pos++] != '=') continue;
while (pos != length && (mediaType[pos] <= ' ' || mediaType[pos] == '"' || mediaType[pos] == '\''))
++pos;
int endpos = pos;
while (pos != length && mediaType[endpos] > ' ' && mediaType[endpos] != '"' && mediaType[endpos] != '\'' && mediaType[endpos] != ';')
++endpos;
return mediaType.substring(pos, endpos-pos);
}
return String();
}
}