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 |
1481 parser_request_headers = { |
1496 parser_request_headers = { |
1482 'Accept': (tokenize, listParser(parseAccept), dict), |
1497 'Accept': (tokenize, listParser(parseAccept), dict), |
1483 'Accept-Charset': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultCharset), |
1498 'Accept-Charset': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultCharset), |
1484 'Accept-Encoding': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultEncoding), |
1499 'Accept-Encoding': (tokenize, listParser(parseAcceptQvalue), dict, addDefaultEncoding), |
1485 'Accept-Language': (tokenize, listParser(parseAcceptQvalue), dict), |
1500 'Accept-Language': (tokenize, listParser(parseAcceptQvalue), dict), |
1486 'Access-Control-Allow-Origin': (last, parseAllowOrigin,), |
|
1487 'Access-Control-Allow-Credentials': (last, parseAllowCreds,), |
|
1488 'Access-Control-Allow-Methods': (tokenize, listParser(parseHTTPMethod), list), |
|
1489 'Access-Control-Request-Method': (parseHTTPMethod, ), |
1501 'Access-Control-Request-Method': (parseHTTPMethod, ), |
1490 'Access-Control-Request-Headers': (filterTokens, ), |
1502 'Access-Control-Request-Headers': (filterTokens, ), |
1491 'Access-Control-Expose-Headers': (filterTokens, ), |
|
1492 'Authorization': (last, parseAuthorization), |
1503 'Authorization': (last, parseAuthorization), |
1493 'Cookie': (parseCookie,), |
1504 'Cookie': (parseCookie,), |
1494 'Expect': (tokenize, listParser(parseExpect), dict), |
1505 'Expect': (tokenize, listParser(parseExpect), dict), |
1495 'Origin': (last,), |
1506 'Origin': (last,), |
1496 'From': (last,), |
1507 'From': (last,), |
1513 'Accept-Charset': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1524 'Accept-Charset': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1514 'Accept-Encoding': (iteritems, removeDefaultEncoding, |
1525 'Accept-Encoding': (iteritems, removeDefaultEncoding, |
1515 listGenerator(generateAcceptQvalue), singleHeader), |
1526 listGenerator(generateAcceptQvalue), singleHeader), |
1516 'Accept-Language': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1527 'Accept-Language': (iteritems, listGenerator(generateAcceptQvalue), singleHeader), |
1517 'Access-Control-Request-Method': (unique, str, singleHeader, ), |
1528 'Access-Control-Request-Method': (unique, str, singleHeader, ), |
1518 'Access-Control-Expose-Headers': (listGenerator(str), ), |
|
1519 'Access-Control-Allow-Headers': (listGenerator(str), ), |
|
1520 'Authorization': (generateAuthorization,), # what is "credentials" |
1529 'Authorization': (generateAuthorization,), # what is "credentials" |
1521 'Cookie': (generateCookie, singleHeader), |
1530 'Cookie': (generateCookie, singleHeader), |
1522 'Expect': (iteritems, listGenerator(generateExpect), singleHeader), |
1531 'Expect': (iteritems, listGenerator(generateExpect), singleHeader), |
1523 'From': (unique, str, singleHeader), |
1532 'From': (unique, str, singleHeader), |
1524 'Host': (unique, str, singleHeader), |
1533 'Host': (unique, str, singleHeader), |
1536 'User-Agent': (unique, str, singleHeader), |
1545 'User-Agent': (unique, str, singleHeader), |
1537 } |
1546 } |
1538 |
1547 |
1539 parser_response_headers = { |
1548 parser_response_headers = { |
1540 'Accept-Ranges': (tokenize, filterTokens), |
1549 'Accept-Ranges': (tokenize, filterTokens), |
|
1550 'Access-Control-Allow-Origin': (last, parseAllowOrigin,), |
|
1551 'Access-Control-Allow-Credentials': (last, parseAllowCreds,), |
|
1552 'Access-Control-Allow-Methods': (tokenize, listParser(parseHTTPMethod), list), |
|
1553 'Access-Control-Allow-Headers': (listGenerator(str), ), |
|
1554 'Access-Control-Expose-Headers': (filterTokens, ), |
1541 'Age': (last, int), |
1555 'Age': (last, int), |
1542 'ETag': (tokenize, ETag.parse), |
1556 'ETag': (tokenize, ETag.parse), |
1543 'Location': (last,), # TODO: URI object? |
1557 'Location': (last,), # TODO: URI object? |
1544 # 'Proxy-Authenticate' |
1558 # 'Proxy-Authenticate' |
1545 'Retry-After': (last, parseRetryAfter), |
1559 'Retry-After': (last, parseRetryAfter), |
1551 parseWWWAuthenticate,) |
1565 parseWWWAuthenticate,) |
1552 } |
1566 } |
1553 |
1567 |
1554 generator_response_headers = { |
1568 generator_response_headers = { |
1555 'Accept-Ranges': (generateList, singleHeader), |
1569 'Accept-Ranges': (generateList, singleHeader), |
|
1570 'Access-Control-Allow-Origin': (unique, str, singleHeader), |
|
1571 'Access-Control-Allow-Credentials': (generateTrueFalse, singleHeader), |
|
1572 'Access-Control-Allow-Headers': (set, generateList, singleHeader), |
|
1573 'Access-Control-Allow-Methods': (set, generateList, singleHeader), |
|
1574 'Access-Control-Expose-Headers': (set, generateList, singleHeader), |
1556 'Age': (unique, str, singleHeader), |
1575 'Age': (unique, str, singleHeader), |
1557 'ETag': (ETag.generate, singleHeader), |
1576 'ETag': (ETag.generate, singleHeader), |
1558 'Location': (unique, str, singleHeader), |
1577 'Location': (unique, str, singleHeader), |
1559 # 'Proxy-Authenticate' |
1578 # 'Proxy-Authenticate' |
1560 'Retry-After': (generateRetryAfter, singleHeader), |
1579 'Retry-After': (generateRetryAfter, singleHeader), |