Ejemplo n.º 1
0
void f_header_remove(CStrRef name /* = null_string */) {
    if (f_headers_sent()) {
        raise_warning("Cannot modify header information - headers already sent");
    }
    Transport *transport = g_context->getTransport();
    if (transport) {
        if (name.isNull()) {
            transport->removeAllHeaders();
        } else {
            transport->removeHeader(name.data());
        }
    }
}
Ejemplo n.º 2
0
bool TestExtNetwork::test_headers_sent() {
  f_header("Location: http://www.facebook.com");
  VERIFY(!f_headers_sent());
  return Count(true);
}
Ejemplo n.º 3
0
void f_header(CStrRef str, bool replace /* = true */,
              int http_response_code /* = 0 */) {
    if (f_headers_sent()) {
        raise_warning("Cannot modify header information - headers already sent");
    }

    String header = f_rtrim(str);

    // new line safety check
    // NOTE: PHP actually allows "\n " and "\n\t" to fall through. Is that bad
    // for security?
    if (header.find('\n') >= 0 || header.find('\r') >= 0) {
        raise_warning("Header may not contain more than a single header, "
                      "new line detected");
        return;
    }

    Transport *transport = g_context->getTransport();
    if (transport && header->size()) {
        const char *header_line = header->data();

        // handle single line of status code
        if (header->size() >= 5 && strncasecmp(header_line, "HTTP/", 5) == 0) {
            int code = 200;
            for (const char *ptr = header_line; *ptr; ptr++) {
                if (*ptr == ' ' && *(ptr + 1) != ' ') {
                    code = atoi(ptr + 1);
                    break;
                }
            }
            if (code) {
                transport->setResponse(code, "explicit_header");
            }
            return;
        }

        const char *colon_offset = strchr(header_line, ':');
        String newHeader;
        if (colon_offset) {
            if (!strncasecmp(header_line, "Content-Type",
                             colon_offset - header_line)) {
                const char *ptr = colon_offset+1, *mimetype = NULL;
                while (*ptr == ' ') ptr++;
                mimetype = ptr;
                if (strncmp(mimetype, "text/", 5) == 0 &&
                        strstr(mimetype, "charset=") == NULL) {
                    newHeader = header + ";charset=utf-8";
                }
            }
        }
        if (replace) {
            transport->replaceHeader(newHeader.empty() ? header : newHeader);
        } else {
            transport->addHeader(newHeader.empty() ? header : newHeader);
        }
        if (http_response_code) {
            transport->setResponse(http_response_code,
                                   "explicit_header_response_code");
        }
    }
}