func HandleEvent(tags *event.EventHeaderTags, ev event.Event, ctx appengine.Context, sender EventSendService) error { res, err := handleRecvEvent(tags, ev, ctx) if nil != err { ctx.Errorf("Failed to handle event[%d:%d] for reason:%v", ev.GetType(), ev.GetVersion(), err) return err } if nil == res { var empty bytes.Buffer sender.Send(&empty) return nil } res.SetHash(ev.GetHash()) compressType := Cfg.CompressType if httpres, ok := res.(*event.HTTPResponseEvent); ok { v := httpres.GetHeader("Content-Type") if len(v) > 0 && Cfg.CompressType != event.COMPRESSOR_NONE { if isContentTypeInCompressFilter(v) { compressType = event.COMPRESSOR_NONE } } } x := new(event.CompressEvent) x.SetHash(ev.GetHash()) x.CompressType = compressType x.Ev = res y := new(event.EncryptEvent) y.SetHash(ev.GetHash()) y.EncryptType = Cfg.EncryptType y.Ev = x var buf bytes.Buffer tags.Encode(&buf) event.EncodeEvent(&buf, y) sender.Send(&buf) return nil }
func (gae *GAEHttpConnection) requestEvent(client *http.Client, conn *SessionConnection, ev event.Event) (err error, res event.Event) { auth := gae.gaeAuth if nil == auth { auth = gae.manager.auths.Select().(*GAEAuth) } domain := auth.appid + ".appspot.com" if strings.Contains(auth.appid, ".") { domain = auth.appid } addr, _ := getLocalHostMapping(domain) scheme := MODE_HTTP if strings.EqualFold(MODE_HTTPS, gae_cfg.ConnectionMode) { scheme = MODE_HTTPS } var buf bytes.Buffer var tags event.EventHeaderTags tags.Token = auth.token tags.Encode(&buf) if ev.GetType() == event.HTTP_REQUEST_EVENT_TYPE { var compress event.CompressEvent compress.SetHash(ev.GetHash()) compress.Ev = ev compress.CompressType = gae_cfg.Compressor var encrypt event.EncryptEvent encrypt.SetHash(ev.GetHash()) encrypt.EncryptType = gae_cfg.Encrypter encrypt.Ev = &compress event.EncodeEvent(&buf, &encrypt) } else { var encrypt event.EncryptEvent encrypt.SetHash(ev.GetHash()) encrypt.EncryptType = gae_cfg.Encrypter encrypt.Ev = ev event.EncodeEvent(&buf, &encrypt) } req := &http.Request{ Method: "POST", URL: &url.URL{Scheme: scheme, Host: addr, Path: "/invoke"}, ProtoMajor: 1, ProtoMinor: 1, Host: addr, Header: make(http.Header), Body: ioutil.NopCloser(&buf), ContentLength: int64(buf.Len()), } if len(gae_cfg.UA) > 0 { req.Header.Set("User-Agent", gae_cfg.UA) } req.Close = false req.Header.Set("Connection", "keep-alive") req.Header.Set("Content-Type", "image/jpeg") var response *http.Response response, err = gaeHttpClient.Do(req) if nil != err { log.Printf("Failed to request data from GAE:%s for:%s\n", domain, err.Error()) return err, nil } else { if response.StatusCode != 200 { log.Printf("Session[%d]Invalid response:%d\n", ev.GetHash(), response.StatusCode) return fmt.Errorf("Invalid response:%d", response.StatusCode), nil } else { var buf bytes.Buffer n, err := io.Copy(&buf, response.Body) if int64(n) < response.ContentLength { return fmt.Errorf("No sufficient space in body."), nil } if nil != err { return err, nil } response.Body.Close() if !tags.Decode(&buf) { return fmt.Errorf("Failed to decode event tag"), nil } err, res = event.DecodeEvent(&buf) if nil == err { res = event.ExtractEvent(res) } return err, res } } return nil, nil }