C标准库HTTP 301使用Objective-C上的套接字重定向
我是Objective-C中使用C标准库的sockets的初学者。我试图通过HTTP请求在自行开发的浏览器上获取页面,为此,我们使用如下查询请求:C标准库HTTP 301使用Objective-C上的套接字重定向,c,objective-c,sockets,redirect,c-standard-library,C,Objective C,Sockets,Redirect,C Standard Library,我是Objective-C中使用C标准库的sockets的初学者。我试图通过HTTP请求在自行开发的浏览器上获取页面,为此,我们使用如下查询请求: +(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError { //[...] const char* query = [[NSString stringWithFormat:@"GET /%s HTTP/1.1\r\nHost: %s\r\nUser-Agen
+(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError {
//[...]
const char* query = [[NSString stringWithFormat:@"GET /%s HTTP/1.1\r\nHost: %s\r\nUser-Agent: %@\r\nConnection: close\r\n\r\n",
page, hostname, userAgentAsNSString] cStringUsingEncoding:NSUTF8StringEncoding];
//[...]
}
其中page是路径(如果存在),hostname是URL,user agent是一些设备信息,如iOS版本、设备名称等。
已使用以下协议和类型创建套接字:
+(NSData*)fetchWebPageForURL:(NSURL*)url error:(NSError **)anError {
//socket creation with TCP protocol and IPv4.
int sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
//[...]
//send request query to the server
size_t sentSoFar = 0;
do {
size_t bytesSent = write(sockfd, query + sentSoFar, strlen(query) - sentSoFar);
if(bytesSent == -1)
{
//send error message
close(sockfd);
return nil;
}
else if (bytesSent == 0)
{
// All done.
break;
}
sentSoFar += bytesSent;
} while (sentSoFar < strlen(query));
//[...]
// Read the response from the server.
int BUFFER_SIZE = 1024;
char response[BUFFER_SIZE];
fd_set rfds;
struct timeval tv;
bool htmlStarted = false;
int done = 0;;
size_t bytesRead = read(sockfd, response, BUFFER_SIZE);
//parsing response
}
当我们点击链接并发送带有HTTPS方案的新URL时,仍然会出现状态为301的响应。我们已经尝试将查询更改为HTTP/2,但仍然收到相同的响应(使用HTTP/1.1)。
我认为这可能是我的套接字配置的一个问题,但这里进入了我不熟悉的部分,因此我不知道该怎么办。看起来您正在从http重定向到https,它使用不同的端口,当然还有TLS加密,如果您使用的话还不清楚。简单的方法是使用libcurl这样的库来处理请求,而不是手动执行。如果苹果提供的话,我也不会感到惊讶。是的,我试图了解如何处理这些HSTS重定向,但我从来没有听说过libcurl。那我就试着用它。谢谢你的帮助suggestion@Romãomartine查看301响应的
位置
标题,将其与您请求的原始URL进行比较。您可能会看到它们之间的差异(HTTP与HTTPS、缺少尾随反斜杠与所需尾随反斜杠等)。为什么您要手动执行此操作而不是使用?HTTP从零开始实现并不是件小事,当你真正开始深入研究它时,它是相当复杂的。@RemyLebeau我有一个场景,其中一些网络测试已经使用了苹果的HTTP API,但你对复杂性的看法是对的,我将尝试使用其他库来避免这个手动请求。谢谢
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="https://www.stackoverflow.com/">here</A>.
</BODY></HTML>