Add Option<&'static [u8]> method for header names

Aberta
#611 0 comentários 0 reações 0 responsáveis Ver no GitHub

Ninguém assumiu esta issue ainda.

Avaliação

Dificuldade
3/5
Tempo estimado
1-2 dias
Facilidade para iniciantes
45/100
Tipo de issue
Funcionalidade
Clareza
Razoavelmente clara
Status de atividade
Estagnada
Stack de tecnologia
rust
Domínio
api

Direção de pesquisa

Comece localizando a representação do nome do cabeçalho e seu método as_bytes existente; em seguida, inspecione como os nomes de cabeçalho padrão são identificados. Adicione o método proposto para que nomes ASCII padrão possam expor bytes estáticos, enquanto outros nomes retornem None, e adicione testes cobrindo ambos os casos. Nenhum arquivo ou caminho de teste específico é mencionado na issue.

Escrita pelo modelo de indexação a partir do texto da issue.

Descrição

Description

This enhancement focuses on improving the usability of the http crate when integrating Rust HTTP libraries with other VM engines, such as V8 (specifically for, but not limited to Deno). The goal is to provide embedding users with a specific method that allows extracting a static 7-bit string from a well-known ASCII header name. By treating header strings as interned strings in scripting engines [1] [2], we can effectively reduce garbage collection pressure, leading to enhanced performance and efficiency.

To achieve this, we propose introducing an Option<&'static [u8]> method for header names. This approach offers a more efficient means of passing header names across embedding boundaries. When working with static ASCII header names, this method allows direct access to the header name bytes across embedding boundaries, without the need for additional memory allocation or garbage collection overhead.

This may also be useful for Python embedders [2], as (I believe) the CPython engine allows creation of strings from const 1-byte buffers.

Alternatives

While we do have an as_bytes method on a header name, this does not tell us the provenance of those bytes, and whether the header is a StandardHeader. We cannot use these as "externally interned" strings in an embedding context because they may be allocated.

The hash function of the header could be used allow us to map between standard headers and interned strings in the embedded engine, but this requires an additional string comparison operation.

References

[1] V8's NewExternalOneByte method:

https://v8docs.nodesource.com/node-15.0/d2/db3/classv8_1_1_string.html#a2b9afa662981b864fdadbc4fe1eb7480

[2] Python's PyUnicode_FromKindAndData method (which I believe will avoid copies where necessary):

https://docs.python.org/3/c-api/unicode.html#c.PyUnicode_FromKindAndData

Linguagem predominante
Rust
Estrelas
1.4k
Forks
387
Métricas de merge de PRs
Nenhum PR com merge em 30d

Preparar o ambiente

Este projeto não oferece contêiner de desenvolvimento, Dockerfile nem guia de contribuição, então a configuração fica por sua conta: comece pelo README e veja nosso guia da primeira contribuição para os passos gerais.

Primeiros passos

  1. Leia a issue inteira e depois o guia de contribuição do projeto.
  2. Comente na issue dizendo que vai assumir — evita que duas pessoas façam o mesmo trabalho.
  3. Faça um fork do repositório e trabalhe em uma branch.
  4. Abra um pull request que referencie o número da issue.

Mais de hyperium/http

Todas as issues de hyperium/http

Issues semelhantes

Mais issues de Rust

Receba novas issues na sua caixa de entrada

Um resumo curto de issues do GitHub para quem está começando.