| /* |
| * 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 e2e |
| |
| import ( |
| "bytes" |
| "encoding/json" |
| "io" |
| "io/ioutil" |
| "mime/multipart" |
| "net/http" |
| "net/url" |
| "os" |
| "path/filepath" |
| "strings" |
| ) |
| |
| type UploadFile struct { |
| Name string |
| Filepath string |
| } |
| |
| var httpClient = &http.Client{} |
| |
| func PostFile(reqUrl string, reqParams map[string]string, files []UploadFile, headers map[string]string) ([]byte, int, error) { |
| return post(reqUrl, reqParams, "multipart/form-data", files, headers) |
| } |
| |
| func post(reqUrl string, reqParams map[string]string, contentType string, files []UploadFile, headers map[string]string) ([]byte, int, error) { |
| requestBody, realContentType := getReader(reqParams, contentType, files) |
| httpRequest, _ := http.NewRequest("POST", reqUrl, requestBody) |
| httpRequest.Header.Add("Content-Type", realContentType) |
| if headers != nil { |
| for k, v := range headers { |
| httpRequest.Header.Add(k, v) |
| } |
| } |
| resp, err := httpClient.Do(httpRequest) |
| if err != nil { |
| panic(err) |
| } |
| |
| defer resp.Body.Close() |
| |
| body, err := ioutil.ReadAll(resp.Body) |
| if err != nil { |
| return nil, 0, err |
| } |
| |
| return body, resp.StatusCode, nil |
| } |
| |
| func getReader(reqParams map[string]string, contentType string, files []UploadFile) (io.Reader, string) { |
| if strings.Index(contentType, "json") > -1 { |
| bytesData, _ := json.Marshal(reqParams) |
| return bytes.NewReader(bytesData), contentType |
| } |
| if files != nil { |
| body := &bytes.Buffer{} |
| writer := multipart.NewWriter(body) |
| for _, uploadFile := range files { |
| file, err := os.Open(uploadFile.Filepath) |
| if err != nil { |
| panic(err) |
| } |
| part, err := writer.CreateFormFile(uploadFile.Name, filepath.Base(uploadFile.Filepath)) |
| if err != nil { |
| panic(err) |
| } |
| _, err = io.Copy(part, file) |
| file.Close() |
| } |
| for k, v := range reqParams { |
| if err := writer.WriteField(k, v); err != nil { |
| panic(err) |
| } |
| } |
| if err := writer.Close(); err != nil { |
| panic(err) |
| } |
| return body, writer.FormDataContentType() |
| } |
| |
| urlValues := url.Values{} |
| for key, val := range reqParams { |
| urlValues.Set(key, val) |
| } |
| |
| reqBody := urlValues.Encode() |
| |
| return strings.NewReader(reqBody), contentType |
| } |