Skip to content

Commit

Permalink
Merge pull request #152 from bonitoo-io/fix/ulr-prefix
Browse files Browse the repository at this point in the history
fix: Allow connecting to a server on a URL path (#149)
  • Loading branch information
vlastahajek authored Jul 15, 2020
2 parents 0e978ae + 156c33c commit aba0a86
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 7 deletions.
4 changes: 4 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
## 1.4.0 [in progress]
### Bug fixes
1. [#152](https://github.com/influxdata/influxdb-client-go/pull/152) Allow connecting to server on a URL path

## 1.3.0 [2020-06-19]
### Features
1. [#131](https://github.com/influxdata/influxdb-client-go/pull/131) Labels API
Expand Down
12 changes: 9 additions & 3 deletions client.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,12 +9,13 @@ package influxdb2
import (
"context"
"errors"
"github.com/influxdata/influxdb-client-go/api"
"github.com/influxdata/influxdb-client-go/internal/log"
"strings"
"sync"

"github.com/influxdata/influxdb-client-go/api"
"github.com/influxdata/influxdb-client-go/domain"
ihttp "github.com/influxdata/influxdb-client-go/internal/http"
"github.com/influxdata/influxdb-client-go/internal/log"
)

// Client provides API to communicate with InfluxDBServer.
Expand Down Expand Up @@ -85,7 +86,12 @@ func NewClient(serverUrl string, authToken string) Client {
// Authentication token can be empty in case of connecting to newly installed InfluxDB server, which has not been set up yet.
// In such case Setup will set authentication token
func NewClientWithOptions(serverUrl string, authToken string, options *Options) Client {
service := ihttp.NewService(serverUrl, "Token "+authToken, options.httpOptions)
normServerURL := serverUrl
if !strings.HasSuffix(normServerURL, "/") {
// For subsequent path parts concatenation, url has to end with '/'
normServerURL = serverUrl + "/"
}
service := ihttp.NewService(normServerURL, "Token "+authToken, options.httpOptions)
client := &clientImpl{
serverUrl: serverUrl,
options: options,
Expand Down
51 changes: 48 additions & 3 deletions client_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,16 +6,45 @@ package influxdb2

import (
"context"
"fmt"
"net/http"
"net/http/httptest"
"testing"
"time"

http2 "github.com/influxdata/influxdb-client-go/internal/http"
iwrite "github.com/influxdata/influxdb-client-go/internal/write"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
)

func TestUrls(t *testing.T) {
urls := []struct {
serverURL string
serverAPIURL string
writeURLPrefix string
}{
{"http://host:9999", "http://host:9999/api/v2/", "http://host:9999/api/v2/write"},
{"http://host:9999/", "http://host:9999/api/v2/", "http://host:9999/api/v2/write"},
{"http://host:9999/path", "http://host:9999/path/api/v2/", "http://host:9999/path/api/v2/write"},
{"http://host:9999/path/", "http://host:9999/path/api/v2/", "http://host:9999/path/api/v2/write"},
{"http://host:9999/path1/path2/path3", "http://host:9999/path1/path2/path3/api/v2/", "http://host:9999/path1/path2/path3/api/v2/write"},
{"http://host:9999/path1/path2/path3/", "http://host:9999/path1/path2/path3/api/v2/", "http://host:9999/path1/path2/path3/api/v2/write"},
}
for _, url := range urls {
t.Run(url.serverURL, func(t *testing.T) {
c := NewClient(url.serverURL, "x")
ci := c.(*clientImpl)
assert.Equal(t, url.serverURL, ci.serverUrl)
assert.Equal(t, url.serverAPIURL, ci.httpService.ServerApiUrl())
ws := iwrite.NewService("org", "bucket", ci.httpService, c.Options().WriteOptions())
wu, err := ws.WriteUrl()
require.Nil(t, err)
assert.Equal(t, url.writeURLPrefix+"?bucket=bucket&org=org&precision=ns", wu)
})
}
}

func TestUserAgent(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(100 * time.Millisecond)
Expand All @@ -42,7 +71,7 @@ func TestServerError429(t *testing.T) {
w.Header().Set("Retry-After", "1")
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusTooManyRequests)
w.Write([]byte(`{"code":"too many requests", "message":"exceeded rate limit"}`))
_, _ = w.Write([]byte(`{"code":"too many requests", "message":"exceeded rate limit"}`))
}))

defer server.Close()
Expand All @@ -56,11 +85,27 @@ func TestServerError429(t *testing.T) {
assert.Equal(t, "exceeded rate limit", perror.Message)
}

func TestServerOnPath(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == "/proxy/0:0/influx/api/v2/write" {
w.WriteHeader(http.StatusNoContent)
} else {
w.WriteHeader(http.StatusInternalServerError)
_, _ = w.Write([]byte(fmt.Sprintf(`{"code":"internal server error", "message":"%s"}`, r.URL.Path)))
}
}))

defer server.Close()
c := NewClient(server.URL+"/proxy/0:0/influx/", "x")
err := c.WriteApiBlocking("o", "b").WriteRecord(context.Background(), "a,a=a a=1i")
require.Nil(t, err)
}

func TestServerErrorNonJSON(t *testing.T) {
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
time.Sleep(100 * time.Millisecond)
w.WriteHeader(http.StatusInternalServerError)
w.Write([]byte(`internal server error`))
_, _ = w.Write([]byte(`internal server error`))
}))

defer server.Close()
Expand All @@ -79,7 +124,7 @@ func TestServerErrorInflux1_8(t *testing.T) {
w.Header().Set("X-Influxdb-Error", "bruh moment")
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(404)
w.Write([]byte(`{"error": "bruh moment"}`))
_, _ = w.Write([]byte(`{"error": "bruh moment"}`))
}))

defer server.Close()
Expand Down
2 changes: 1 addition & 1 deletion internal/http/service.go
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,7 @@ func NewService(serverUrl, authorization string, httpOptions *http2.Options) Ser
apiUrl, err := url.Parse(serverUrl)
serverApiUrl := serverUrl
if err == nil {
apiUrl, err = apiUrl.Parse("/api/v2/")
apiUrl, err = apiUrl.Parse("api/v2/")
if err == nil {
serverApiUrl = apiUrl.String()
}
Expand Down

0 comments on commit aba0a86

Please sign in to comment.