| /* | 
 | Copyright 2017 The apid Authors | 
 |  | 
 | Licensed 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 apigee | 
 |  | 
 | import ( | 
 | 	"bytes" | 
 | 	"encoding/json" | 
 | 	"fmt" | 
 | 	"io" | 
 | 	"net/http" | 
 | 	"os" | 
 |  | 
 | 	"github.com/apid/istioApigeeAdapter/adapter/config" | 
 | 	me "github.com/hashicorp/go-multierror" | 
 | 	"istio.io/mixer/pkg/adapter" | 
 | ) | 
 |  | 
 | type ( | 
 | 	builder struct{ adapter.DefaultBuilder } | 
 |  | 
 | 	logger struct{ logStream io.Writer } | 
 |  | 
 | 	analyticsRecord struct { | 
 | 		ClientReceivedStartTimestamp int    `json:"client_received_start_timestamp"` | 
 | 		ClientReceivedEndTimestamp   int    `json:"client_received_end_timestamp"` | 
 | 		RecordType                   string `json:"recordType"` | 
 | 		ApiProxy                     string `json:"apiproxy"` | 
 | 		RequestUri                   string `json:"request_uri"` | 
 | 		RequestPath                  string `json:"request_path"` | 
 | 		RequestVerb                  string `json:"request_verb"` | 
 | 		ClientIp                     string `json:"client_ip"` | 
 | 		UserAgent                    string `json:"useragent"` | 
 | 		ApiProxyRevision             string `json:"apiproxy_revision"` | 
 | 		ResponseStatusCode           int    `json:"response_status_code"` | 
 | 		ClientSentStartTimestamp     int    `json:"client_sent_start_timestamp"` | 
 | 		ClientSentEndTimestamp       int    `json:"client_sent_end_timestamp"` | 
 | 		DeveloperEmail               string `json:"developer_email,omitempty"` | 
 | 		DeveloperApp                 string `json:"developer_app"` | 
 | 		AccessToken                  string `json:"access_token,omitempty"` | 
 | 		ClientId                     string `json:"client_id,omitempty"` | 
 | 		ApiProduct                   string `json:"api_product"` | 
 | 	} | 
 |  | 
 | 	analyticsRecordCollection struct { | 
 | 		Records []analyticsRecord `json:"records"` | 
 | 	} | 
 |  | 
 | 	edgemicroKeys struct { | 
 | 		Key    string | 
 | 		Secret string | 
 | 	} | 
 | ) | 
 |  | 
 | func newReportBuilder() builder { | 
 | 	return builder{adapter.NewDefaultBuilder( | 
 | 		"apigeeReport", | 
 | 		"Report logs to apigee", | 
 | 		&config.ReportParams{}, | 
 | 	)} | 
 | } | 
 |  | 
 | func (builder) NewApplicationLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.ApplicationLogsAspect, error) { | 
 | 	return newLogger(cfg) | 
 | } | 
 |  | 
 | func (builder) NewAccessLogsAspect(env adapter.Env, cfg adapter.Config) (adapter.AccessLogsAspect, error) { | 
 | 	return newLogger(cfg) | 
 | } | 
 |  | 
 | func newLogger(cfg adapter.Config) (*logger, error) { | 
 | 	c := cfg.(*config.ReportParams) | 
 |  | 
 | 	w := os.Stderr | 
 | 	if c.LogStream == config.STDOUT { | 
 | 		w = os.Stdout | 
 | 	} | 
 |  | 
 | 	return &logger{w}, nil | 
 | } | 
 |  | 
 | func (l *logger) Log(entries []adapter.LogEntry) error { | 
 | 	return l.log(entries) | 
 | } | 
 |  | 
 | func (l *logger) LogAccess(entries []adapter.LogEntry) error { | 
 | 	fmt.Println("*** here") | 
 | 	return l.log(entries) | 
 | } | 
 |  | 
 | func (l *logger) log(entries []adapter.LogEntry) error { | 
 | 	var recordsCollection []analyticsRecord | 
 |  | 
 | 	var errors *me.Error | 
 | 	for _, entry := range entries { | 
 |  | 
 | 		if err := writeJSON(l.logStream, entry); err != nil { | 
 | 			errors = me.Append(errors, err) | 
 | 		} | 
 |  | 
 | 		ax_data := analyticsRecord{ | 
 | 			ClientReceivedStartTimestamp: 33, | 
 | 			DeveloperApp:                 "microgateway-demo", | 
 | 		} | 
 |  | 
 | 		recordsCollection = append(recordsCollection, ax_data) | 
 |  | 
 | 	} | 
 |  | 
 | 	res2B, _ := json.Marshal(recordsCollection) | 
 | 	fmt.Println(string(res2B)) | 
 |  | 
 | 	return errors.ErrorOrNil() | 
 | } | 
 |  | 
 | func (l *logger) Close() error { return nil } | 
 |  | 
 | func writeJSON(w io.Writer, le interface{}) error { | 
 | 	return json.NewEncoder(w).Encode(le) | 
 | } | 
 |  | 
 | func sendAnalyticsRecords(collection analyticsRecordCollection, keys edgemicroKeys, uri string) bool { | 
 | 	serializedBody, _ := json.Marshal(&collection) | 
 | 	req, _ := http.NewRequest("POST", uri, bytes.NewBuffer(serializedBody)) | 
 | 	req.SetBasicAuth(keys.Key, keys.Secret) | 
 | 	req.Header.Add("content-type", "application/json") | 
 | 	client := &http.Client{} | 
 | 	resp, _ := client.Do(req) | 
 | 	if resp.StatusCode != 200 { | 
 | 		return false | 
 | 	} else { | 
 | 		return true | 
 | 	} | 
 | } |