Skip to content

Commit

Permalink
Fix #460
Browse files Browse the repository at this point in the history
  • Loading branch information
RobertoPrevato authored Jan 7, 2024
1 parent b2ad6f1 commit 25320c9
Show file tree
Hide file tree
Showing 7 changed files with 30 additions and 27 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,10 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).

## [1.2.20] - 2024-01-07 :adhesive_bandage:

- Fixes #460, reported by @waweber.

## [1.2.19] - 2023-12-18 :gift:

- Fixes #450, about missing `Access-Control-Allow-Credentials` response header
Expand Down
2 changes: 1 addition & 1 deletion blacksheep/messages.pxd
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ from .url cimport URL


cdef class Message:
cdef list __headers
cdef list _raw_headers
cdef public Content content
cdef object __weakref__

Expand Down
1 change: 0 additions & 1 deletion blacksheep/messages.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,6 @@ class Response(Message):
headers: Optional[List[HeaderType]] = None,
content: Optional[Content] = None,
) -> None:
self.__headers = headers or []
self.status = status
self.content = content
def __repr__(self) -> str: ...
Expand Down
34 changes: 17 additions & 17 deletions blacksheep/messages.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -29,14 +29,14 @@ cpdef str parse_charset(bytes value):
cdef class Message:

def __init__(self, list headers):
self.__headers = headers or []
self._raw_headers = headers or []

@property
def headers(self):
cdef str key = '_headers'
if key in self.__dict__:
return self.__dict__[key]
self.__dict__[key] = Headers(self.__headers)
self.__dict__[key] = Headers(self._raw_headers)
return self.__dict__[key]

cpdef Message with_content(self, Content content):
Expand All @@ -46,15 +46,15 @@ cdef class Message:
cpdef bytes get_first_header(self, bytes key):
cdef tuple header
key = key.lower()
for header in self.__headers:
for header in self._raw_headers:
if header[0].lower() == key:
return header[1]

cpdef list get_headers(self, bytes key):
cdef list results = []
cdef tuple header
key = key.lower()
for header in self.__headers:
for header in self._raw_headers:
if header[0].lower() == key:
results.append(header[1])
return results
Expand All @@ -63,7 +63,7 @@ cdef class Message:
cdef list results = []
cdef tuple header
key = key.lower()
for header in self.__headers:
for header in self._raw_headers:
if header[0].lower() == key:
results.append(header)
return results
Expand All @@ -80,22 +80,22 @@ cdef class Message:
cdef tuple header
cdef list to_remove = []
key = key.lower()
for header in self.__headers:
for header in self._raw_headers:
if header[0].lower() == key:
to_remove.append(header)

for header in to_remove:
self.__headers.remove(header)
self._raw_headers.remove(header)

cdef void remove_headers(self, list headers):
cdef tuple header
for header in headers:
self.__headers.remove(header)
self._raw_headers.remove(header)

cdef bint _has_header(self, bytes key):
cdef bytes existing_key, existing_value
key = key.lower()
for existing_key, existing_value in self.__headers:
for existing_key, existing_value in self._raw_headers:
if existing_key.lower() == key:
return True
return False
Expand All @@ -104,18 +104,18 @@ cdef class Message:
return self._has_header(key)

cdef void _add_header(self, bytes key, bytes value):
self.__headers.append((key, value))
self._raw_headers.append((key, value))

cdef void _add_header_if_missing(self, bytes key, bytes value):
if not self._has_header(key):
self.__headers.append((key, value))
self._raw_headers.append((key, value))

cpdef void add_header(self, bytes key, bytes value):
self.__headers.append((key, value))
self._raw_headers.append((key, value))

cpdef void set_header(self, bytes key, bytes value):
self.remove_header(key)
self.__headers.append((key, value))
self._raw_headers.append((key, value))

cpdef bytes content_type(self):
if self.content and self.content.type:
Expand Down Expand Up @@ -267,7 +267,7 @@ cdef class Request(Message):
list headers
):
cdef URL _url = URL(url) if url else None
self.__headers = headers or []
self._raw_headers = headers or []
self.method = method
self._url = _url
self._session = None
Expand Down Expand Up @@ -458,7 +458,7 @@ cdef class Request(Message):
if existing_cookie:
self.set_header(b"cookie", existing_cookie + b";" + new_value)
else:
self.__headers.append((b"cookie", new_value))
self._raw_headers.append((b"cookie", new_value))

@property
def etag(self):
Expand All @@ -484,7 +484,7 @@ cdef class Response(Message):
list headers = None,
Content content = None
):
self.__headers = headers or []
self._raw_headers = headers or []
self.status = status
self.content = content

Expand Down Expand Up @@ -526,7 +526,7 @@ cdef class Response(Message):
return None

def set_cookie(self, Cookie cookie):
self.__headers.append((b'set-cookie', write_cookie_for_response(cookie)))
self._raw_headers.append((b'set-cookie', write_cookie_for_response(cookie)))

def set_cookies(self, list cookies):
cdef Cookie cookie
Expand Down
12 changes: 6 additions & 6 deletions blacksheep/scribe.pyx
Original file line number Diff line number Diff line change
Expand Up @@ -160,7 +160,7 @@ cpdef bytes write_request_without_body(Request request):

ensure_host_header(request)

extend_data_with_headers(request.__headers, data)
extend_data_with_headers(request._raw_headers, data)
data.extend(b'\r\n')
return bytes(data)

Expand All @@ -172,7 +172,7 @@ cpdef bytes write_small_request(Request request):
ensure_host_header(request)
set_headers_for_content(request)

extend_data_with_headers(request.__headers, data)
extend_data_with_headers(request._raw_headers, data)
data.extend(b'\r\n')
if request.content:
data.extend(request.content.body)
Expand All @@ -183,7 +183,7 @@ cdef bytes write_small_response(Response response):
cdef bytearray data = bytearray()
data.extend(STATUS_LINES[response.status])
set_headers_for_content(response)
extend_data_with_headers(response.__headers, data)
extend_data_with_headers(response._raw_headers, data)
data.extend(b'\r\n')
if response.content:
data.extend(response.content.body)
Expand Down Expand Up @@ -236,7 +236,7 @@ async def write_request(Request request):
set_headers_for_content(request)

yield HTTP_METHODS[request.method] + b' ' + write_request_uri(request) + b' HTTP/1.1\r\n' + \
write_headers(request.__headers) + b'\r\n'
write_headers(request._raw_headers) + b'\r\n'

content = request.content

Expand Down Expand Up @@ -297,7 +297,7 @@ async def write_response(Response response):
set_headers_for_content(response)

yield STATUS_LINES[response.status] + \
write_headers(response.__headers) + b'\r\n'
write_headers(response._raw_headers) + b'\r\n'

async for chunk in write_response_content(response):
yield chunk
Expand All @@ -312,7 +312,7 @@ async def send_asgi_response(Response response, object send):
await send({
'type': 'http.response.start',
'status': response.status,
'headers': response.__headers
'headers': response._raw_headers
})

if content:
Expand Down
2 changes: 1 addition & 1 deletion requirements.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ charset-normalizer==3.1.0
click==8.1.3
coverage==6.5.0
cryptography==40.0.2
Cython==0.29.34; platform_system != "Windows"
Cython==3.0.2; platform_system != "Windows"
essentials==1.1.5
essentials-openapi==1.0.6
Flask==2.2.3
Expand Down
2 changes: 1 addition & 1 deletion setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ def readme():

setup(
name="blacksheep",
version="1.2.19",
version="1.2.20",
description="Fast web framework for Python asyncio",
long_description=readme(),
long_description_content_type="text/markdown",
Expand Down

0 comments on commit 25320c9

Please sign in to comment.