blob: bc85ec453d92e828e1f4d21f91df3859b1db039e [file] [log] [blame]
// Copyright 2016 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "fake_ppapi/fake_util.h"
#include <strings.h>
#include <string>
#include <ppapi/c/pp_completion_callback.h>
#include <ppapi/c/pp_errors.h>
// Helper function to call the completion callback if it is defined (an
// asynchronous call), or return the result directly if it isn't (a synchronous
// call).
//
// Use like this:
// if (<some error condition>)
// return RunCompletionCallback(callback, PP_ERROR_FUBAR);
//
// /* Everything worked OK */
// return RunCompletionCallback(callback, PP_OK);
int32_t RunCompletionCallback(PP_CompletionCallback* callback, int32_t result) {
if (callback->func) {
PP_RunCompletionCallback(callback, result);
return PP_OK_COMPLETIONPENDING;
}
return result;
}
void SetHeader(const std::string& key,
const std::string& value,
std::string* out_headers) {
std::string old_value;
if (!GetHeaderValue(*out_headers, key, &old_value)) {
*out_headers += key + ": " + value + "\n";
return;
}
size_t offset = 0;
while (offset != std::string::npos) {
// Find the next colon; this separates the key from the value.
size_t colon = out_headers->find(':', offset);
// Find the newline; this separates the value from the next header.
size_t newline = out_headers->find('\n', offset);
if (strncasecmp(key.c_str(), &out_headers->data()[offset], key.size()) ==
0) {
*out_headers = out_headers->substr(0, colon) + ": " + value +
out_headers->substr(newline);
return;
}
// Key doesn't match, skip to next header.
offset = newline + 1;
}
}
bool GetHeaderValue(const std::string& headers,
const std::string& key,
std::string* out_value) {
out_value->clear();
size_t offset = 0;
while (offset != std::string::npos) {
// Find the next colon; this separates the key from the value.
size_t colon = headers.find(':', offset);
if (colon == std::string::npos)
return false;
// Find the newline; this separates the value from the next header.
size_t newline = headers.find('\n', offset);
if (strncasecmp(key.c_str(), &headers.data()[offset], key.size()) != 0) {
// Key doesn't match, skip to next header.
offset = newline + 1;
continue;
}
// Key matches, extract value. First, skip leading spaces.
size_t nonspace = headers.find_first_not_of(' ', colon + 1);
if (nonspace == std::string::npos)
return false;
out_value->assign(headers, nonspace, newline - nonspace);
return true;
}
return false;
}