443 l.append('%s' % k) |
443 l.append('%s' % k) |
444 else: |
444 else: |
445 l.append('%s=%s' % (k, v)) |
445 l.append('%s=%s' % (k, v)) |
446 return ";".join(l) |
446 return ";".join(l) |
447 |
447 |
|
448 def generateTrueFalse(value): |
|
449 """ |
|
450 Return 'true' or 'false' depending on the value. |
|
451 |
|
452 * 'true' values are `True`, `1`, `"true"` |
|
453 * 'false' values are `False`, `0`, `"false"` |
|
454 |
|
455 """ |
|
456 if (value in (True, 1) or |
|
457 isinstance(value, basestring) and value.lower() == 'true'): |
|
458 return 'true' |
|
459 if (value in (False, 0) or |
|
460 isinstance(value, basestring) and value.lower() == 'false'): |
|
461 return 'false' |
|
462 raise ValueError("Invalid true/false header value: %s" % value) |
448 |
463 |
449 class MimeType(object): |
464 class MimeType(object): |
450 def fromString(klass, mimeTypeString): |
465 def fromString(klass, mimeTypeString): |
451 """Generate a MimeType object from the given string. |
466 """Generate a MimeType object from the given string. |
452 |
467 |
1487 parser_request_headers = { |
1502 parser_request_headers = { |
1488 'Accept': (tokenize, listParser(parseAccept), dict), |
1503 'Accept': (tokenize, listParser(parseAccept), dict), |
1489 'Accept-Charset': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultCharset), |
1504 'Accept-Charset': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultCharset), |
1490 'Accept-Encoding': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultEncoding), |
1505 'Accept-Encoding': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultEncoding), |
1491 'Accept-Language': (tokenize, listParser(parseAcceptQvalue), dict), |
1506 'Accept-Language': (tokenize, listParser(parseAcceptQvalue), dict), |
1492 'Access-Control-Allow-Origin': (last, parseAllowOrigin,), |
|
1493 'Access-Control-Allow-Credentials': (last, parseAllowCreds,), |
|
1494 'Access-Control-Allow-Methods': (tokenize, listParser(parseHTTPMethod), list), |
|
1495 'Access-Control-Request-Method': (parseHTTPMethod, ), |
1507 'Access-Control-Request-Method': (parseHTTPMethod, ), |
1496 'Access-Control-Request-Headers': (filterTokens, ), |
1508 'Access-Control-Request-Headers': (filterTokens, ), |
1497 'Access-Control-Expose-Headers': (filterTokens, ), |
|
1498 'Authorization': (last, parseAuthorization), |
1509 'Authorization': (last, parseAuthorization), |
1499 'Cookie': (parseCookie,), |
1510 'Cookie': (parseCookie,), |
1500 'Expect': (tokenize, listParser(parseExpect), dict), |
1511 'Expect': (tokenize, listParser(parseExpect), dict), |
1501 'Origin': (last,), |
1512 'Origin': (last,), |
1502 'From': (last,), |
1513 'From': (last,), |
1519 'Accept-Charset': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1530 'Accept-Charset': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1520 'Accept-Encoding': (iteritems, removeDefaultEncoding, |
1531 'Accept-Encoding': (iteritems, removeDefaultEncoding, |
1521 listGenerator(generateAcceptQvalue), singleHeader), |
1532 listGenerator(generateAcceptQvalue), singleHeader), |
1522 'Accept-Language': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1533 'Accept-Language': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1523 'Access-Control-Request-Method': (unique, str, singleHeader, ), |
1534 'Access-Control-Request-Method': (unique, str, singleHeader, ), |
1524 'Access-Control-Expose-Headers': (listGenerator(str), ), |
|
1525 'Access-Control-Allow-Headers': (listGenerator(str), ), |
|
1526 'Authorization': (generateAuthorization,), # what is "credentials" |
1535 'Authorization': (generateAuthorization,), # what is "credentials" |
1527 'Cookie': (generateCookie, singleHeader), |
1536 'Cookie': (generateCookie, singleHeader), |
1528 'Expect': (iteritems, listGenerator(generateExpect), singleHeader), |
1537 'Expect': (iteritems, listGenerator(generateExpect), singleHeader), |
1529 'From': (unique, str, singleHeader), |
1538 'From': (unique, str, singleHeader), |
1530 'Host': (unique, str, singleHeader), |
1539 'Host': (unique, str, singleHeader), |
1542 'User-Agent': (unique, str, singleHeader), |
1551 'User-Agent': (unique, str, singleHeader), |
1543 } |
1552 } |
1544 |
1553 |
1545 parser_response_headers = { |
1554 parser_response_headers = { |
1546 'Accept-Ranges': (tokenize, filterTokens), |
1555 'Accept-Ranges': (tokenize, filterTokens), |
|
1556 'Access-Control-Allow-Origin': (last, parseAllowOrigin,), |
|
1557 'Access-Control-Allow-Credentials': (last, parseAllowCreds,), |
|
1558 'Access-Control-Allow-Methods': (tokenize, listParser(parseHTTPMethod), list), |
|
1559 'Access-Control-Allow-Headers': (listGenerator(str), ), |
|
1560 'Access-Control-Expose-Headers': (filterTokens, ), |
1547 'Age': (last, int), |
1561 'Age': (last, int), |
1548 'ETag': (tokenize, ETag.parse), |
1562 'ETag': (tokenize, ETag.parse), |
1549 'Location': (last,), # TODO: URI object? |
1563 'Location': (last,), # TODO: URI object? |
1550 # 'Proxy-Authenticate' |
1564 # 'Proxy-Authenticate' |
1551 'Retry-After': (last, parseRetryAfter), |
1565 'Retry-After': (last, parseRetryAfter), |
1557 parseWWWAuthenticate,) |
1571 parseWWWAuthenticate,) |
1558 } |
1572 } |
1559 |
1573 |
1560 generator_response_headers = { |
1574 generator_response_headers = { |
1561 'Accept-Ranges': (generateList, singleHeader), |
1575 'Accept-Ranges': (generateList, singleHeader), |
|
1576 'Access-Control-Allow-Origin': (unique, str, singleHeader), |
|
1577 'Access-Control-Allow-Credentials': (generateTrueFalse, singleHeader), |
|
1578 'Access-Control-Allow-Headers': (set, generateList, singleHeader), |
|
1579 'Access-Control-Allow-Methods': (set, generateList, singleHeader), |
|
1580 'Access-Control-Expose-Headers': (set, generateList, singleHeader), |
1562 'Age': (unique, str, singleHeader), |
1581 'Age': (unique, str, singleHeader), |
1563 'ETag': (ETag.generate, singleHeader), |
1582 'ETag': (ETag.generate, singleHeader), |
1564 'Location': (unique, str, singleHeader), |
1583 'Location': (unique, str, singleHeader), |
1565 # 'Proxy-Authenticate' |
1584 # 'Proxy-Authenticate' |
1566 'Retry-After': (generateRetryAfter, singleHeader), |
1585 'Retry-After': (generateRetryAfter, singleHeader), |