jx/internal/transport/http_reader.go
Matthew Rich eaaf0f8931
All checks were successful
Lint / golangci-lint (push) Successful in 10m38s
Declarative Tests / test (push) Successful in 38s
collect resource/doc errors and add to result. Add readwritecloser support for HTTP transport reading response data
2024-10-02 20:26:02 +00:00

76 lines
1.6 KiB
Go

// Copyright 2024 Matthew Rich <matthewrich.conf@gmail.com>. All rights reserved.
package transport
import (
_ "errors"
"io"
_ "os"
"net/url"
"net/http"
"context"
"path/filepath"
"fmt"
)
type HTTPReader struct {
*HTTP
get *HTTPConnection
}
func NewHTTPReader(u *url.URL, ctx context.Context) (h *HTTPReader, err error) {
h = &HTTPReader {
HTTP: &HTTP {
ctx: ctx,
uri: u,
path: filepath.Join(u.Hostname(), u.RequestURI()),
Client: http.DefaultClient,
},
get: NewHTTPConnection(http.DefaultClient),
}
h.extension()
h.DetectGzip()
err = h.get.NewGetRequest(h.ctx, h.uri.String())
return
}
func (h *HTTPReader) Signature() (documentSignature string) {
if h.get.Response() != nil {
documentSignature = h.get.Response().Header.Get("Signature")
if documentSignature == "" {
signatureResp, signatureErr := h.Client.Get(fmt.Sprintf("%s.sig", h.uri.String()))
if signatureErr == nil {
defer signatureResp.Body.Close()
readSignatureBody, readSignatureErr := io.ReadAll(signatureResp.Body)
if readSignatureErr == nil {
documentSignature = string(readSignatureBody)
}
}
}
}
return documentSignature
}
func (h *HTTPReader) ContentType() (contenttype string) {
contenttype = h.get.Response().Header.Get("Content-Type")
switch contenttype {
case "application/octet-stream":
return h.exttype
default:
}
return
}
func (h *HTTPReader) Reader() io.ReadCloser {
return h.get
}
func (h *HTTPReader) GetRequest() *http.Request {
return h.get.Request()
}
func (h *HTTPReader) GetResponse() *http.Response {
return h.get.Response()
}