Ubuntu One: PUT para fazer upload de um arquivo que é maior que 16302 bytes falha sistematicamente [fechado]

2

Estou tentando criar um aplicativo para fazer o upload / download de arquivos para o Ubuntu One, usando a API da nuvem. Agora estou no ponto de implementar a parte de upload do aplicativo, e tenho esse problema com meu caso de teste:

Todos os arquivos com menos de 16303 bytes são enviados sem nenhum problema.

Todos os arquivos acima de 16303 bytes falham sistematicamente no upload, com um código de status 500 sendo retornado.

Passei horas procurando na web por um problema semelhante, sem sucesso.

Estou usando a linguagem Go, e aqui está a chamada para a API REST do Ubuntu One (manipulação de erros e código de limpeza removido para concisão):

// 'n' is an object which describes the file to upload (path, size, etc.)
file, _ := os.Open(localTargetDir + n.Path)
apiUrl, _ := url.Parse("https://files.one.ubuntu.com/content" + remoteTargetDir + n.Path)
// Following line returns a pointer to a Request object with the "Authorization" 
// fields in the header all properly set
request, _ := ubuntuoneGetSignedRequest("PUT", apiUrl.String(), file)
request.Header.Add("Content-Length", fmt.Sprintf("%d", n.Size))
request.Header.Add("Content-Type", "application/octet-stream")
response, _ := http.DefaultClient.Do(request)
if response.StatusCode >= 300 {
    return errors.New(fmt.Sprintf("Error (status=%d) creating remote file: %s", response.StatusCode, n.Path))
}
// ...

Como dito, um tamanho de arquivo de 16303-16304 bytes é o ponto dinâmico em que o upload começará a falhar sistematicamente. Não tenho ideia de onde está o problema.

    
por rhill 15.01.2013 / 18:39

1 resposta

1

Finalmente encontrei o problema. É uma coisa da linguagem Go, não uma coisa do Ubuntu One.

Aparentemente, o campo request.ContentLength precisa ser definido corretamente:

request.Header.Add("Content-Type", "application/octet-stream")
request.ContentLength = n.Size
response, _ := http.DefaultClient.Do(request)

Pode parecer óbvio em retrospecto (não realmente porque estava funcionando bem para arquivos menores que 16304 ...), mas eu não vi isso documentado no documento Go.

Espero que isso seja útil para alguém que, em algum momento, tenha um problema semelhante.

    
por rhill 22.01.2013 / 00:59