@Override
    public void handleMessage(final Message msg) {
      final ApplicationService appService = ApiMethodsImpl.this.appService;
      if (appService == null) {
        return;
      } // we are destroyed

      if (msg.what == MSG_FINISH) {
        workingFlag.set(false);
        appService.checkForStop();
        return;
      }
      workingFlag.set(true);

      final Application app = appService.getApp();
      final RequestMethodHelper h = app.getRequestMethodHelper();

      final RequestDescription description = (RequestDescription) msg.obj;

      final ParserContext pContext = h.createParserContext(description);
      pContext.setSystemContext(appService);
      final int opCode = description.getOperationCode();
      if (DEBUG) {
        Log.d(TAG, "Current context: " + pContext + ", op " + opCode);
      }
      final int token = description.getToken();

      before(description, pContext, appService);

      pending.set(NULL_OPERATION_DATA);
      pending.set(opCode, token);
      try {
        // execute request method
        final RequestMethod rm = h.createRequestMethod(description);
        rm.setup(app);
        rm.start(appService, description, pContext);
        rm.stop(app);

        // process results
        final ResponseData response = pContext.processResults();

        // report results
        if (pContext.isSuccessful()) {
          reportApiSuccess(token, opCode, response);
        } else {
          Log.e(TAG, "Server error: " + response.getErrorCode() + ", " + response.getMessage());
          reportError(token, opCode, response);
        }

      } catch (final RequestMethodException e) {
        Log.e(TAG, "Request method error", e);
        pContext.defineResponse(e);
        reportError(token, opCode, pContext.processResults());
      } finally {
        after(description, pContext, appService);
        dumpLastOperation(lastOperation);
        pending.set(NULL_OPERATION_DATA);
        pContext.destroy();
      }
    }
  @Override
  public void sendRequest(
      final Context context,
      final URLConnection connection,
      final RequestDescription requestDescription)
      throws IOException {
    final LinkedList<ParameterValue> parameters = new LinkedList<ParameterValue>();
    for (final Parameter p : requestDescription.getSimpleParameters().getChildren()) {
      if (p instanceof ParameterValue) {
        parameters.add((ParameterValue) p);
      }
    }
    final String encoding = requestDescription.getEncoding().name();
    final byte[] content = URLEncodedUtils.format(parameters, encoding).getBytes(encoding);

    final OutputStream stream = connection.getOutputStream();
    stream.write(content);
    stream.flush();

    if (DEBUG) {
      Log.d(TAG, "(" + requestDescription.getId() + ")" + ": " + parameters.toString());
    }
  }