blob: 81c122664972c34fc6a073affb59021ed19ce658 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package base
import (
"bytes"
"encoding/json"
"io"
"io/ioutil"
"mime/multipart"
"net/http"
"net/url"
"os"
"path/filepath"
"strings"
"github.com/stretchr/testify/assert"
)
type UploadFile struct {
Name string
Filepath string
}
func HttpGet(url string, headers map[string]string) ([]byte, int, error) {
return httpRequest(http.MethodGet, url, headers, "")
}
func HttpDelete(url string, headers map[string]string) ([]byte, int, error) {
return httpRequest(http.MethodDelete, url, headers, "")
}
func HttpPut(url string, headers map[string]string, reqBody string) ([]byte, int, error) {
return httpRequest(http.MethodPut, url, headers, reqBody)
}
func HttpPost(url string, headers map[string]string, reqBody string) ([]byte, int, error) {
return httpRequest(http.MethodPost, url, headers, reqBody)
}
func httpRequest(method, url string, headers map[string]string, reqBody string) ([]byte, int, error) {
var requestBody = new(bytes.Buffer)
if reqBody != "" {
requestBody = bytes.NewBuffer([]byte(reqBody))
}
req, err := http.NewRequest(method, url, requestBody)
if err != nil {
return nil, 0, err
}
req.Close = true
// set header
for key, val := range headers {
req.Header.Add(key, val)
}
client := &http.Client{}
resp, err := client.Do(req)
if err != nil {
return nil, 0, err
}
defer resp.Body.Close()
body, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, 0, err
}
return body, resp.StatusCode, nil
}
func BatchTestServerPort(times int) map[string]int {
t := getTestingHandle()
url := APISIXSingleWorkerHost + "/server_port"
res := map[string]int{}
for i := 0; i < times; i++ {
bodyByte, status, err := HttpGet(url, nil)
assert.Nil(t, err)
assert.Equal(t, 200, status)
body := string(bodyByte)
if _, ok := res[body]; !ok {
res[body] = 1
} else {
res[body] += 1
}
}
return res
}
func GetReader(reqParams map[string]string, contentType string, files []UploadFile) (io.Reader, string, error) {
if strings.Index(contentType, "json") > -1 {
bytesData, _ := json.Marshal(reqParams)
return bytes.NewReader(bytesData), contentType, nil
}
if files != nil {
body := &bytes.Buffer{}
writer := multipart.NewWriter(body)
for _, uploadFile := range files {
file, err := os.Open(uploadFile.Filepath)
if err != nil {
return nil, "", err
}
defer file.Close()
part, err := writer.CreateFormFile(uploadFile.Name, filepath.Base(uploadFile.Filepath))
if err != nil {
return nil, "", err
}
_, err = io.Copy(part, file)
}
for k, v := range reqParams {
if err := writer.WriteField(k, v); err != nil {
return nil, "", err
}
}
if err := writer.Close(); err != nil {
return nil, "", err
}
return body, writer.FormDataContentType(), nil
}
urlValues := url.Values{}
for key, val := range reqParams {
urlValues.Set(key, val)
}
reqBody := urlValues.Encode()
return strings.NewReader(reqBody), contentType, nil
}