Index: test_http_server.cc |
diff --git a/test_http_server.cc b/test_http_server.cc |
index 9573c31200920b7caf8ade9bb43bc9135c0233e7..de5c619cd694099a0752e3ff1f7fa2eb0a99da0c 100644 |
--- a/test_http_server.cc |
+++ b/test_http_server.cc |
@@ -10,19 +10,22 @@ |
// To use this, simply make an HTTP connection to localhost:port and |
// GET a url. |
-#include <netinet/in.h> |
-#include <sys/socket.h> |
-#include <sys/types.h> |
#include <errno.h> |
#include <inttypes.h> |
+#include <netinet/in.h> |
+#include <signal.h> |
#include <stdio.h> |
#include <stdlib.h> |
#include <string.h> |
+#include <sys/socket.h> |
+#include <sys/types.h> |
#include <unistd.h> |
+ |
#include <algorithm> |
#include <string> |
#include <vector> |
-#include "base/logging.h" |
+ |
+#include <base/logging.h> |
using std::min; |
using std::string; |
@@ -101,19 +104,19 @@ bool ParseRequest(int fd, HttpRequest* request) { |
return true; |
} |
-void WriteString(int fd, const string& str) { |
+bool WriteString(int fd, const string& str) { |
unsigned int bytes_written = 0; |
while (bytes_written < str.size()) { |
- ssize_t r = write(fd, str.c_str() + bytes_written, |
+ ssize_t r = write(fd, str.data() + bytes_written, |
str.size() - bytes_written); |
- LOG(INFO) << "write() wrote " << r << " bytes"; |
if (r < 0) { |
perror("write"); |
- return; |
+ LOG(INFO) << "write failed"; |
+ return false; |
} |
bytes_written += r; |
} |
- LOG(INFO) << "WriteString wrote " << bytes_written << " bytes"; |
+ return true; |
} |
string Itoa(off_t num) { |
@@ -145,16 +148,21 @@ void HandleQuitQuitQuit(int fd) { |
} |
void HandleBig(int fd, const HttpRequest& request, int big_length) { |
+ LOG(INFO) << "starting big"; |
const off_t full_length = big_length; |
WriteHeaders(fd, true, full_length, request.offset, request.return_code); |
- const off_t content_length = full_length - request.offset; |
int i = request.offset; |
- for (; i % 10; i++) |
- WriteString(fd, string(1, 'a' + (i % 10))); |
- CHECK_EQ(i % 10, 0); |
- for (; i < content_length; i += 10) |
- WriteString(fd, "abcdefghij"); |
- CHECK_EQ(i, full_length); |
+ bool success = true; |
+ for (; (i % 10) && success; i++) |
+ success = WriteString(fd, string(1, 'a' + (i % 10))); |
+ if (success) |
+ CHECK_EQ(i % 10, 0); |
+ for (; (i < full_length) && success; i += 10) { |
+ success = WriteString(fd, "abcdefghij"); |
+ } |
+ if (success) |
+ CHECK_EQ(i, full_length); |
+ LOG(INFO) << "Done w/ big"; |
} |
// This is like /big, but it writes at most 9000 bytes. Also, |
@@ -252,6 +260,9 @@ void HandleConnection(int fd) { |
using namespace chromeos_update_engine; |
int main(int argc, char** argv) { |
+ // Ignore SIGPIPE on write() to sockets. |
+ signal(SIGPIPE, SIG_IGN); |
+ |
socklen_t clilen; |
struct sockaddr_in server_addr; |
struct sockaddr_in client_addr; |