@@ -310,9 +310,10 @@ cdef class URL:
310
310
self .query, self .fragment, self .userinfo))
311
311
312
312
313
- def parse_url (const char* url ):
313
+ def parse_url (url ):
314
314
cdef:
315
- size_t url_len = len (url)
315
+ Py_buffer py_buf
316
+ char * buf_data
316
317
cparser.http_parser_url* parsed
317
318
int res
318
319
bytes schema = None
@@ -330,44 +331,48 @@ def parse_url(const char* url):
330
331
PyMem_Malloc(sizeof(cparser.http_parser_url))
331
332
cparser.http_parser_url_init(parsed)
332
333
334
+ PyObject_GetBuffer(url, & py_buf, PyBUF_SIMPLE)
333
335
try :
334
- res = cparser.http_parser_parse_url(url, url_len, 0 , parsed)
336
+ buf_data = < char * > py_buf.buf
337
+ res = cparser.http_parser_parse_url(buf_data, py_buf.len, 0 , parsed)
338
+
335
339
if res == 0 :
336
340
if parsed.field_set & (1 << cparser.UF_SCHEMA):
337
341
off = parsed.field_data[< int > cparser.UF_SCHEMA].off
338
342
ln = parsed.field_data[< int > cparser.UF_SCHEMA].len
339
- schema = url [off:off+ ln]
343
+ schema = buf_data [off:off+ ln]
340
344
341
345
if parsed.field_set & (1 << cparser.UF_HOST):
342
346
off = parsed.field_data[< int > cparser.UF_HOST].off
343
347
ln = parsed.field_data[< int > cparser.UF_HOST].len
344
- host = url [off:off+ ln]
348
+ host = buf_data [off:off+ ln]
345
349
346
350
if parsed.field_set & (1 << cparser.UF_PORT):
347
351
port = parsed.port
348
352
349
353
if parsed.field_set & (1 << cparser.UF_PATH):
350
354
off = parsed.field_data[< int > cparser.UF_PATH].off
351
355
ln = parsed.field_data[< int > cparser.UF_PATH].len
352
- path = url [off:off+ ln]
356
+ path = buf_data [off:off+ ln]
353
357
354
358
if parsed.field_set & (1 << cparser.UF_QUERY):
355
359
off = parsed.field_data[< int > cparser.UF_QUERY].off
356
360
ln = parsed.field_data[< int > cparser.UF_QUERY].len
357
- query = url [off:off+ ln]
361
+ query = buf_data [off:off+ ln]
358
362
359
363
if parsed.field_set & (1 << cparser.UF_FRAGMENT):
360
364
off = parsed.field_data[< int > cparser.UF_FRAGMENT].off
361
365
ln = parsed.field_data[< int > cparser.UF_FRAGMENT].len
362
- fragment = url [off:off+ ln]
366
+ fragment = buf_data [off:off+ ln]
363
367
364
368
if parsed.field_set & (1 << cparser.UF_USERINFO):
365
369
off = parsed.field_data[< int > cparser.UF_USERINFO].off
366
370
ln = parsed.field_data[< int > cparser.UF_USERINFO].len
367
- userinfo = url [off:off+ ln]
371
+ userinfo = buf_data [off:off+ ln]
368
372
369
373
return URL(schema, host, port, path, query, fragment, userinfo)
370
374
else :
371
375
raise HttpParserInvalidURLError(" invalid url {!r}" .format(url))
372
376
finally :
377
+ PyBuffer_Release(& py_buf)
373
378
PyMem_Free(parsed)
0 commit comments