@@ -100,30 +100,24 @@ cdef inline int _write_str(Writer* writer, str s):
100
100
# --------------- _serialize_headers ----------------------
101
101
102
102
cdef str to_str(object s):
103
- typ = type (s)
104
- if typ is str :
103
+ if type (s) is str :
105
104
return < str > s
106
- elif typ is _istr:
105
+ elif type (s) is _istr:
107
106
return PyObject_Str(s)
108
107
elif not isinstance (s, str ):
109
108
raise TypeError (" Cannot serialize non-str key {!r}" .format(s))
110
109
else :
111
110
return str (s)
112
111
113
112
114
- cdef void _safe_header(str string) except * :
115
- if " \r " in string or " \n " in string:
116
- raise ValueError (
117
- " Newline or carriage return character detected in HTTP status message or "
118
- " header. This is a potential security issue."
119
- )
120
-
121
113
122
114
def _serialize_headers (str status_line , headers ):
123
115
cdef Writer writer
124
116
cdef object key
125
117
cdef object val
126
118
cdef bytes ret
119
+ cdef str key_str
120
+ cdef str val_str
127
121
128
122
_init_writer(& writer)
129
123
@@ -136,16 +130,22 @@ def _serialize_headers(str status_line, headers):
136
130
raise
137
131
138
132
for key, val in headers.items():
139
- _safe_header(to_str(key))
140
- _safe_header(to_str(val))
133
+ key_str = to_str(key)
134
+ val_str = to_str(val)
135
+
136
+ if " \r " in key_str or " \n " in key_str or " \r " in val_str or " \n " in val_str:
137
+ raise ValueError (
138
+ " Newline or carriage return character detected in HTTP status message or "
139
+ " header. This is a potential security issue."
140
+ )
141
141
142
- if _write_str(& writer, to_str(key) ) < 0 :
142
+ if _write_str(& writer, key_str ) < 0 :
143
143
raise
144
144
if _write_byte(& writer, b' :' ) < 0 :
145
145
raise
146
146
if _write_byte(& writer, b' ' ) < 0 :
147
147
raise
148
- if _write_str(& writer, to_str(val) ) < 0 :
148
+ if _write_str(& writer, val_str ) < 0 :
149
149
raise
150
150
if _write_byte(& writer, b' \r ' ) < 0 :
151
151
raise
0 commit comments