//export applyTestHooks func applyTestHooks(objectPtr unsafe.Pointer) { var objectStruct *C.struct_CoProcessMessage objectStruct = (*C.struct_CoProcessMessage)(objectPtr) objectBytes := C.GoBytes(objectStruct.p_data, objectStruct.length) object := &coprocess.Object{} proto.Unmarshal(objectBytes, object) if strings.Index(object.HookName, "hook_test") != 0 { return } switch object.HookName { case "hook_test_object_postprocess": object.Request.SetHeaders = map[string]string{ "test": "value", } object.Request.DeleteHeaders = []string{"Deletethisheader"} object.Request.AddParams = map[string]string{ "customparam": "customvalue", } object.Request.DeleteParams = []string{"remove"} case "hook_test_bad_auth": object.Request.ReturnOverrides = &coprocess.ReturnOverrides{ ResponseCode: 403, ResponseError: "Key not authorised", } case "hook_test_bad_auth_using_id_extractor": break case "hook_test_bad_auth_cp_error": break case "hook_test_successful_auth": break case "hook_test_successful_auth_using_id_extractor": break } newObject, _ := proto.Marshal(object) newObjectStr := string(newObject) newObjectBytes := C.CString(newObjectStr) newObjectLength := C.int(len(newObject)) objectStruct.p_data = unsafe.Pointer(newObjectBytes) objectStruct.length = newObjectLength }
func (d *TestDispatcher) ToCoProcessMessage(object *coprocess.Object) unsafe.Pointer { objectMsg, _ := proto.Marshal(object) objectMsgStr := string(objectMsg) var CObjectStr *C.char CObjectStr = C.CString(objectMsgStr) var messagePtr *C.struct_CoProcessMessage messagePtr = (*C.struct_CoProcessMessage)(C.malloc(C.size_t(unsafe.Sizeof(C.struct_CoProcessMessage{})))) messagePtr.p_data = unsafe.Pointer(CObjectStr) messagePtr.length = C.int(len(objectMsg)) return unsafe.Pointer(messagePtr) }
// Dispatch prepares a CoProcessMessage, sends it to the GlobalDispatcher and gets a reply. func (c *CoProcessor) Dispatch(object *coprocess.Object) (newObject *coprocess.Object, err error) { var objectMsg []byte if MessageType == coprocess.ProtobufMessage { objectMsg, _ = proto.Marshal(object) } else if MessageType == coprocess.JsonMessage { objectMsg, _ = json.Marshal(object) } objectMsgStr := string(objectMsg) var CObjectStr *C.char CObjectStr = C.CString(objectMsgStr) var objectPtr *C.struct_CoProcessMessage objectPtr = (*C.struct_CoProcessMessage)(C.malloc(C.size_t(unsafe.Sizeof(C.struct_CoProcessMessage{})))) objectPtr.p_data = unsafe.Pointer(CObjectStr) objectPtr.length = C.int(len(objectMsg)) var newObjectPtr *C.struct_CoProcessMessage newObjectPtr = (*C.struct_CoProcessMessage)(GlobalDispatcher.Dispatch(unsafe.Pointer(objectPtr))) var newObjectBytes []byte newObjectBytes = C.GoBytes(newObjectPtr.p_data, newObjectPtr.length) newObject = &coprocess.Object{} if MessageType == coprocess.ProtobufMessage { proto.Unmarshal(newObjectBytes, newObject) } else if MessageType == coprocess.JsonMessage { json.Unmarshal(newObjectBytes, newObject) } C.free(unsafe.Pointer(CObjectStr)) C.free(unsafe.Pointer(objectPtr)) C.free(unsafe.Pointer(newObjectPtr)) return newObject, err }